LUA.Бинарные файлы(3)

19 июля, 2014

В данной заметке размещена библиотека,
которая позволяет работать с двоичными файлами.

Немного теории

   32 разрядные процессоры работают с данными, которые представлены в виде, вещественное число — это 8 байт, целое число — 4 байта (32 разряда),
а строка — это на каждый символ -один байт, в конце строки ноль (кодировка ACIIZ) или длина строки в начале.


 В луа есть два вида данных — вещественные числа и строки. Целых чисел нет — они вещественные.


 Внутреннее представление данных в луа осуществляется не в основных форматах, а гораздо сложнее — в виде структур, которые занимают больше места, чем 8 байт для вещественных или байт на символ для строк.
В луа данные хранятся в виде структур содержащих тип и два массива , один из которых хеш.


   Когда Мы в луа сохраняем данные во внешний файл, то вещественные числа преобразуются в строки. Т е во внешних файлах в луа данные всегда хранятся в виде строк.
Поэтому во внешние файлы в луа данные можно вывести лишь в текстовом виде.

Вещественное число имеет точность 15 десятичных цифр плюс еще порядок 5 цифр.
Таким образом, если выводим максимальное вещественное число, то в файле целые числа могут занять до 15 байт, а вещественные до 20 байт. В сравнении со стандарным способом это примерно в три раза больше места занимает.

Кроме того, когда мы пишем в файл данные оператором file:write(x), то луа проверяет тип и преобразует в строку по формату для записи в файл .
Так вот, я написал и выложил модуль для луа для работы с двоичными файлами.
Т е в эти файлы вещественное число пишется в 8 байт, целое в 4 байта, а строки либо в формате ASCIIZ либо в формате с явной длиной.
В результате получилось, что запись в файл чисел происходит в 4-6 раз быстрее. 
Кроме того, файлы с числами имеют упорядоченную структуру, поэтому можно в луа осуществлять произвольный доступ к данным в файле. 
Т е использовать файлы как массивы неограниченного размера.
 

В библиотеке реализованы следующие функции:

open(имя,режим) — открыть файл
close()                             -закрыть файл
getf(x)                             -записать вещественное число
x=setf()                          —прочитать вещественное число
geti (x)                            — записать  целое число
x=seti (x)                      — прочитать целое число
gets(S)                            -записать строку
S=sets()                         -прочитать строку
getsn(S)                         -записать строку
S=setsn()                      -прочитать строку
pos=getpos()              -получить текущую позицию
setpos(pos)                  -yстановить текущую позицию
seek(off,org)               -переместить текущую позицию
flush ()                            -сбросить данные на диск
lenf ()                                — получить длину файла в байтах

Пример теста:

d1=»C:/»; — устройство
package.cpath =d1..»dll_lib/?.dll;»..package.cpath — путь к библиотеке
—————-
require «nklib» —— загрузка библиотеки

x=1000;
N=100000000;
—————————————-запись в текстовый файл
local nfile2=»C:/NK/testbin.txt»;
local file=io.open(nfile2,»wt»);
local t1=os.clock ()
local k=1; while (N>k) do file:write(tonumber(x)); k=k+1; end
local t2=os.clock ()
t3=os.difftime (t2,t1);
file:close();
print(t3);

—————————————-запись в двоичный файл
nfile=»C:/NK/testbin.bin»;
nklib.open(nfile,»w+»);
local t1=os.clock ()
local k=1; while (N>k) do nklib.seti(x); k=k+1; end
local t2=os.clock ()
t3=os.difftime (t2,t1);
nklib.close();
print(t3);

———————————

Работа с двоичными файлами примерно в 4-6 раз быстрее, чем с текстовыми.

Двоичные файлы можно использовать в качестве больших массивов с произвольным доступом.

Библиотеку можно взять здесь: NKlib

 

Робот Федя -третья неделя

18 июля, 2014

Продолжается тестирование робота в реале.

Пока результаты средние.

Процесс адаптации сходится очень медленно.

Остаются некоторые проблемы.

Картинки выкладываю для желающих изучать работу робота.

nk_2014_7_3_000

 

 

 

 

 

 

 

All trades Long trades Short trades
Initial capital 100000.00 100000.00 100000.00
Ending capital 2585427.31 1402273.65 1283153.66
Net Profit 2485427.31 1302273.65 1183153.66
Net Profit % 2485.43 % 1302.27 % 1183.15 %
Exposure % 9.68 % 4.72 % 4.96 %
Net Risk Adjusted Return % 25674.26 % 27561.79 % 23874.63 %
Annual Return % 64.61 % 49.88 % 47.85 %
Risk Adjusted Return % 667.38 % 1055.59 % 965.58 %
Total transaction costs 0.00 0.00 0.00

All trades 6576 3289 (50.02 %) 3287 (49.98 %)
 Avg. Profit/Loss 377.95 395.95 359.95
 Avg. Profit/Loss % 0.38 % 0.40 % 0.36 %
 Avg. Bars Held 25.65 25.66 25.64

Winners 3635 (55.28 %) 1796 (27.31 %) 1839 (27.97 %)
 Total Profit 4212802.73 2181245.02 2031557.71
 Avg. Profit 1158.96 1214.50 1104.71
 Avg. Profit % 1.16 % 1.21 % 1.11 %
 Avg. Bars Held 29.27 29.42 29.13
 Max. Consecutive 45 26 54
 Largest win 59986.80 59986.80 22877.40
 # bars in largest win 9 9 96

Losers 2941 (44.72 %) 1493 (22.70 %) 1448 (22.02 %)
 Total Loss -1727375.42 -878971.37 -848404.05
 Avg. Loss -587.34 -588.73 -585.91
 Avg. Loss % -0.59 % -0.59 % -0.59 %
 Avg. Bars Held 21.17 21.13 21.21
 Max. Consecutive 9 12 11
 Largest loss -6994.09 -6994.09 -6941.99
 # bars in largest loss 28 28 9

Max. trade drawdown -13020.00 -10686.43 -13020.00
Max. trade % drawdown -12.80 % -9.72 % -12.80 %
Max. system drawdown -17335.82 -15854.30 -18195.34
Max. system % drawdown -6.99 % -6.47 % -5.74 %
Recovery Factor 143.37 82.14 65.03
CAR/MaxDD 9.25 7.70 8.33
RAR/MaxDD 95.52 163.03 168.07
Profit Factor 2.44 2.48 2.39
Payoff Ratio 1.97 2.06 1.89
Standard Error 280324.36 152763.83 129558.40
Risk-Reward Ratio 1.03 1.04 1.00
Ulcer Index 0.54 0.63 0.66
Ulcer Performance Index 109.84 70.61 64.64
Sharpe Ratio of trades 5.95 5.74 6.27
K-Ratio 0.0048 0.0049 0.0047