Мой робот

Страницы: 1
RSS
Мой робот
 
Добрый день,
Решил замутить тему о том, как я строю робота.
-------------------
В данной теме, если не лень, буду описывать  основные блоки нового робота,
которого сейчас пишу.
--------------  
Данный робот обрабатывает информацию по всем инструментам, на которые мы подписываемся в терминале QUIK.
---------------------
В этом роботе, назовем его для определенности Петя (Вася у меня был 10 лет назад),
выделяю два основных блока(мозга)- спинной и головной.
-----------------
Спинной блок отвечает за обработку , которую необходимо выполнять для получения и отправки информации на биржу или брокеру. К этому блоку относится обработка информации о сделках и заявках.
Спинной блок занимается рутинной работой, без которой невозможно торговать.
---------------
Головной блок занимается управлением торговлей.
Он осуществляет прогноз движения рынка и формирование сигналов покупки/продажи.
Головной блок - это творческая часть робота, которая собственно либо сливает депозит, либо его увеличивает.  
==========
Спинной блок.
Здесь реализуется следующие блоки обработки:
1. OnTransReply  -  транзакций
2. OnStopOrder  -  информации о выставленных  стоп-заявках
3. OnOrder  -  информации о  выставленных заявок
4. OnTrade - информации о совершенных своих сделках
5. OnParam -информации об изменении состояния подписанных в терминале QUIK инструментов
--------------
OnParam
Пример реализации  функции:
Код
function OnParam(c,s)
if TLL and c~="SPBFUT" and c~="CETS"  then
     local Lev=tonumber(getParamEx(c,s,"LISTLEVEL").param_value); 
     if Lev>0 then
   local i=1; while #TLL>=i do if Lev==TLL[i] then break; end i=i+1 end
   if i>#TLL then  return; end
     end
end
   local t={14,c,s}; tprm[#tprm+1]=t;--if 2>#tprm then nkevent.Set(event);
end
Это основная функция, которая создает события event  при изменении параметров любого из инструментов.
Эти события обрабатываются в функции main, которая выполняется в отдельном потоке.
--------------------------
В данной реализации OnParam добавлено условие (оператор if) фильтрации инструментов по листингу.
--------------------
Можно добавить и другие фильтры. Например, можно задать список торгуемых инструментов из числа всех подписанных. В этом случае робот будет торговать и отслеживать лишь списочные инструменты.
-----------------
В роботе реализованы три механизма событий, которые вызывают функцию main.
событие №1  OnParam.
По этому событию выполняется регистрация параметров инструмента и подписка на свечи или тики для данного инструмента. Кроме того, по этому сигналу обрабатываются стоп-заявки и заявки.  
-----------------------------------
событие №2  таймер интервала свечей. Например, если головной блок использует свечи с интервалом 1 минута, то таймер выдает сигнал каждую минуту и по этому сигналу запускается для каждого торгуемого инструмента отдельный поток из пула потоков, в котором работает головной блок.  
----------------------------------
событие №3 . Так называемый Watchdog -"сторожевой пес".  Таймер, который выдает сигнал, если нет события №1 например в течении 30 секунд.   Это событие означает, что что-то не так и надо предпринимать соответствующие меры.
==================
Продолжение следует...
 
Какой уровень дохода прогнозируется? Сколько %% годовых чистыми от начального депозита?  :cool:  
 
А что конкретно даёт эта OnParam? Я сейчас глянул https://luaq.ru/OnParam.html и не понял, как узнать, какие параметры изменились? Их же вагон с тележкой... :sad:  
 
Цитата
Serge123 написал:
Какой уровень дохода прогнозируется? Сколько %% годовых чистыми от начального депозита?    
вот картинка робота на основе индикатора и нейронной сети.
Нижний график - это % изменения депозита
белый - итого
зеленый -лонг
синий - шорт
на картинках изменение депозита за год, за месяц и за день.




Это робот на одну бумагу -сбербанк. Тайм 30 минут.
Торгует без плеч и без реинвестирования прибыли.
Хочу сделать на произвольное число бумаг и с самообучением.
---------------
Планирую от достигнутого.
 
Цитата
Serge123 написал:
А что конкретно даёт эта OnParam? Я сейчас глянул  https://luaq.ru/OnParam.html  и не понял, как узнать, какие параметры изменились? Их же вагон с тележкой...  
Этот колбек я использую как индикатор движения рынка и что конкретно двигалось.
На основе этого колбека, как написал рвнее,  у меня будут работать стопы.
 
 
продолжаю свой рассказ.
Ранее я привел вариант фильтрации бумаг по листингу в колбеке OnParam.
Но после тестирования решил все же не делать в колбеках обработки, а передать ее в main и дополнительные потоки из пула потоков ОС.
В итоге все колбеки у меня стали близнецами и основные из них выглядят вот так:
Код
function OnOrder(t)  tprm[#tprm+1]={2,t}; nkevent.Set(event); end
function OnStopOrder(t) tprm[#tprm+1]={3,t}; nkevent.Set(event); end
function OnTrade(t)     tprm[#tprm+1]={4,t}; nkevent.Set(event);  end 
function OnParam(c,s)    tprm[#tprm+1]={14,{c,s}}; nkevent.Set(event); end
function OnTransReply(t) tprm[#tprm+1]={1,t};    nkevent.Set(event); end

Немного о быстродействии.
Задержка передачи данных их колбеков в main составляет примерно 30 мкс или 0.00003 сек.
Причем в начале работы скрипта создается большая очередь на регистрацию бумаг.
Вот пример лога  Ntp=116 -- это число бумаг в очереди на регистрацию
Первое число 27.9 - это время передачи из колбека в main
Второе число 326904 -это время регистрации в мкс
Регистрация каждого инструмента выполняется один раз в момент первого изменения его параметров в ТТП
Код
27.9; 326904.3,326879.3;     NVTK,jc=2,Ns=49,Ntp=116
27.9; 509953.5,509925.5;     YNDX,jc=2,Ns=50,Ntp=115
27.9; 15.5,13.8;     ROLO,jc=2,Ns=51,Ntp=114
27.9; 4.3,3.3;     GCHE,jc=2,Ns=51,Ntp=113
27.9; 515438.0,515414.0;     AFKS,jc=2,Ns=52,Ntp=112
27.9; 17.7,3.2;     SELG,jc=2,Ns=52,Ntp=111
27.9; 14.0,12.8;     MSTT,jc=2,Ns=53,Ntp=110
27.9; 251507.0,251481.2;     ETLN,jc=2,Ns=54,Ntp=109
27.9; 10.5,8.4;     TRMK,jc=2,Ns=54,Ntp=108
27.9; 446567.4,446545.8;     PIKK,jc=2,Ns=55,Ntp=107
27.9; 7.8,6.2;     YRSBP,jc=2,Ns=55,Ntp=106
27.9; 4.3,3.3;     RZSB,jc=2,Ns=55,Ntp=105
27.9; 11.6,10.8;     NMTP,jc=2,Ns=56,Ntp=104
27.9; 3.5,2.6;     BLNG,jc=2,Ns=56,Ntp=103
27.9; 468720.0,468695.7;     TRNFP,jc=2,Ns=57,Ntp=102
27.9; 7.8,6.0;     RKKE,jc=2,Ns=57,Ntp=101
27.9; 326269.2,326242.5;     POLY,jc=2,Ns=58,Ntp=100
27.9; 17.8,16.0;     SLEN,jc=2,Ns=59,Ntp=99
27.9; 5.4,4.1;     GECO,jc=2,Ns=59,Ntp=98
27.9; 7.6,6.6;     RBCM,jc=2,Ns=60,Ntp=97
27.9; 158920.9,158894.7;     MTLRP,jc=2,Ns=61,Ntp=96
27.9; 10.7,8.8;     ABIO,jc=2,Ns=61,Ntp=95
27.9; 3.3,1.9;     NKNCP,jc=2,Ns=61,Ntp=94
27.9; 178460.4,178431.0;     VKCO,jc=2,Ns=62,Ntp=93
 
Через некоторое время после пуска,большинство бумаг зарегистрированы и работа скрипта переходит в нормальный ритм.
Вот для наглядности лог файл
Код
4.4; 11.8,0.7;     IRH4,jc=1,Ns=31,Ntp=243
4.4; 10.4,0.4;     SiH4,jc=1,Ns=31,Ntp=242
4.4; 24.2,22.0;     SNGSP,jc=2,Ns=97,Ntp=241
4.4; 4.0,3.0;     CNTLP,jc=2,Ns=97,Ntp=240
4.4; 21.6,5.7;     ROSN,jc=2,Ns=97,Ntp=239
4.4; 2.3,1.4;     YRSB,jc=2,Ns=97,Ntp=238
4.4; 8.1,7.3;     VJGZP,jc=2,Ns=97,Ntp=237
4.4; 2.8,1.8;     USBN,jc=2,Ns=97,Ntp=236
4.4; 605685.7,605658.8;     ALRS,jc=2,Ns=98,Ntp=235
4.4; 17.1,1.9;     MTLR,jc=2,Ns=98,Ntp=234
4.4; 15.2,2.5;     CIAN,jc=2,Ns=98,Ntp=233
4.4; 163066.4,162987.6;     QIWI,jc=2,Ns=99,Ntp=232
4.4; 10.3,8.5;     GECO,jc=2,Ns=99,Ntp=231
4.4; 18.9,3.6;     TCSG,jc=2,Ns=99,Ntp=230
4.4; 6.6,5.6;     RASP,jc=2,Ns=99,Ntp=229
4.4; 4.4,3.6;     AKRN,jc=2,Ns=99,Ntp=228
4.4; 16.7,15.8;     KROTP,jc=2,Ns=100,Ntp=227
4.4; 2.2,1.4;     KLSB,jc=2,Ns=100,Ntp=226
4.4; 15.3,2.8;     VTBR,jc=2,Ns=100,Ntp=225
4.4; 5.6,4.7;     ROLO,jc=2,Ns=100,Ntp=224
4.4; 18.1,6.5;     BSPB,jc=2,Ns=100,Ntp=223
4.4; 65.5,1.8;     LSRG,jc=2,Ns=100,Ntp=222
4.4; 3.2,2.4;     RZSB,jc=2,Ns=100,Ntp=221
4.4; 6.9,6.2;     YAKG,jc=2,Ns=100,Ntp=220
4.4; 11.9,0.8;     SELG,jc=2,Ns=100,Ntp=219
4.4; 7.0,6.2;     UNAC,jc=2,Ns=100,Ntp=218
4.4; 3.4,2.4;     ASTR,jc=2,Ns=100,Ntp=217
4.4; 7.0,6.2;     IGST,jc=2,Ns=100,Ntp=216
4.4; 2.5,1.7;     RKKE,jc=2,Ns=100,Ntp=215
4.4; 18.5,4.4;     RIH4,jc=1,Ns=31,Ntp=214
4.4; 10.7,0.6;     EuH4,jc=1,Ns=31,Ntp=213
4.4; 11.5,1.1;     CRH4,jc=1,Ns=31,Ntp=212

но при этом очередь еще больная
еще через некоторое время очереди рассасывается .
Код
4.4; 1.9,1.1;     NKNCP,jc=2,Ns=107,Ntp=22
4.4; 2.3,1.6;     USBN,jc=2,Ns=107,Ntp=21
4.4; 2.4,1.7;     RKKE,jc=2,Ns=107,Ntp=20
4.4; 17.4,6.0;     HYDR,jc=2,Ns=107,Ntp=19
4.4; 2.0,1.1;     YRSB,jc=2,Ns=107,Ntp=18
4.4; 15.5,4.0;     TRNFP,jc=2,Ns=107,Ntp=17
4.4; 2.9,2.1;     MRKZ,jc=2,Ns=107,Ntp=16
4.4; 3.3,2.5;     ASTR,jc=2,Ns=107,Ntp=15
4.4; 2.2,1.5;     MRKV,jc=2,Ns=107,Ntp=14
4.4; 5.4,4.6;     SLEN,jc=2,Ns=107,Ntp=13
4.4; 3.5,2.7;     TRMK,jc=2,Ns=107,Ntp=12
4.4; 11.6,1.0;     CIAN,jc=2,Ns=107,Ntp=11
4.4; 9.8,8.9;     YKEN,jc=2,Ns=108,Ntp=10
NVTK,last=1486.000000,tlast=163435.0;osHMS=163448.0;bid=1485.800000,offer=1486.000000
4.4; 100.1,3.2;     NVTK,jc=2,Ns=108,Ntp=9
4.4; 16.3,4.0;     AFKS,jc=2,Ns=108,Ntp=8
4.4; 5.1,4.2;     TORS,jc=2,Ns=108,Ntp=7
4.4; 4.5,3.7;     CHGZ,jc=2,Ns=108,Ntp=6
4.4; 8.0,7.2;     SNGSP,jc=2,Ns=108,Ntp=5
4.4; 4.2,3.5;     AKRN,jc=2,Ns=108,Ntp=4
4.4; 11.0,0.4;     SiH4,jc=1,Ns=35,Ntp=3
4.4; 15.5,1.6;     MGH4,jc=1,Ns=35,Ntp=2
4.4; 11.1,0.8;     IRH4,jc=1,Ns=35,Ntp=1
4.4; 10.8,0.7;     TNH4,jc=1,Ns=35,Ntp=0
22.5; 45.7,1.8;     BRG4,jc=1,Ns=35,Ntp=2
22.5; 1378.7,1358.5;     MMH4,jc=1,Ns=36,Ntp=32
22.5; 15.1,1.7;     EDH4,jc=1,Ns=36,Ntp=31
22.5; 12.3,1.1;     CRH4,jc=1,Ns=36,Ntp=31
22.5; 10.8,1.0;     EDH4,jc=1,Ns=36,Ntp=30
22.5; 10.9,0.4;     GDH4,jc=1,Ns=36,Ntp=30
22.5; 15.6,4.1;     LKH4,jc=1,Ns=36,Ntp=30
22.5; 26.4,24.0;     UGLD,jc=2,Ns=108,Ntp=30
22.5; 11.8,0.5;     SiH4,jc=1,Ns=36,Ntp=29
22.5; 5.0,3.7;     ABIO,jc=2,Ns=108,Ntp=29
22.5; 11.1,1.3;     LKH4,jc=1,Ns=36,Ntp=28
22.5; 12.7,0.9;     SELG,jc=2,Ns=108,Ntp=27
22.5; 7.5,6.7;     UNAC,jc=2,Ns=108,Ntp=27
BRG4,last=79.270000,tlast=163439.0;osHMS=163449.0;bid=79.260000,offer=79.270000
22.5; 69.9,0.5;     BRG4,jc=1,Ns=36,Ntp=28
22.5; 13.9,0.6;     EuH4,jc=1,Ns=36,Ntp=29
22.5; 12.5,1.3;     RIH4,jc=1,Ns=36,Ntp=29
22.5; 11.5,1.5;     MXH4,jc=1,Ns=36,Ntp=29
22.5; 15.2,3.6;     MMH4,jc=1,Ns=36,Ntp=29
22.5; 9.4,0.4;     BRG4,jc=1,Ns=36,Ntp=28
22.5; 9.4,0.5;     EuH4,jc=1,Ns=36,Ntp=28
22.5; 9.6,0.5;     EuH4,jc=1,Ns=36,Ntp=28
22.5; 9.4,0.5;     EuH4,jc=1,Ns=36,Ntp=28
22.5; 11.5,1.0;     CRH4,jc=1,Ns=36,Ntp=28
22.5; 10.1,1.0;     CRH4,jc=1,Ns=36,Ntp=27
22.5; 9.5,0.4;     SiH4,jc=1,Ns=36,Ntp=27
22.5; 10.3,1.2;     LKH4,jc=1,Ns=36,Ntp=27
22.5; 12.3,2.5;     LKH4,jc=1,Ns=36,Ntp=27
22.5; 11.8,0.8;     TNH4,jc=1,Ns=36,Ntp=27
22.5; 1111.6,1091.7;     MVH4,jc=1,Ns=37,Ntp=65
22.5; 15.0,1.7;     RIH4,jc=1,Ns=37,Ntp=66
22.5; 11.4,1.3;     RIH4,jc=1,Ns=37,Ntp=65
22.5; 11.3,1.1;     CRH4,jc=1,Ns=37,Ntp=65
22.5; 10.4,0.6;     EuH4,jc=1,Ns=37,Ntp=65
22.5; 10.3,0.8;     TNH4,jc=1,Ns=37,Ntp=65

и так далее
Это работа скрипта на реально рынке
для каждого инструмента делается подписка на три свечи 1 мин 5 мин и 30 мин
Всего в КВИКЕ выбрано 350 инструментов и 51 параметр.
 
По картинке робота я не смог понять, насколько он прибылен...
 
Цитата
Serge123 написал:
По картинке робота я не смог понять, насколько он прибылен...
Поясняю.
Смотрим первую картинку.
Нижнее 3 окно в ней - это график прибыль/убыток за 2023 год.
линия зеленая на оси справа показывает положительные 220% -это профит лонг.
линия синяя на оси справа показывает положительные 150% - это профит short
линия белая на оси справа показывает положительные 370% - это профит long+short.
----------------
На других картинках график профита приведен по месяцам и по дням.
 
Цитата
Serge123 написал:
А что конкретно даёт эта OnParam? Я сейчас глянул  https://luaq.ru/OnParam.html  и не понял, как узнать, какие параметры изменились? Их же вагон с тележкой...  
Дает сигнал изменений на рынке. По этому сигналу управляю стопами
 
Продолжаю про робота.
----------
В функции main  реализую три режима работы.
1) на основе Onparam. При изменении параметров по инструменту, проверяется изменение цены и если есть, то выполняется алгоритм управления стопами.
--------------
2) По таймеру. Использую таймер OC, который установлен неа срабатывание через 1 минуту.
При возникновении этого сигнала, в цикле для каждого инструмента получаем текущее значение свечей, которые передаются в поток из пула потоков ОС для расчета головного блока.
Головной блок возвращает сигнал купить/продать.
Вот пример лога сигнала  таймера и запуск потоков инструментов.
NNsec - число торгуемых инструментов
Первое число в строке - запаздывание сигнала колбека.
Второе число в строке - время  прохода функции main.
Код
29.2; 15.7;     GDH4,NNsec=126,Ntp=2
29.2; 10.3;     RNH4,NNsec=126,Ntp=2
29.2; 10.1;     NKH4,NNsec=126,Ntp=2
29.2; 11.9;     TIH4,NNsec=126,Ntp=2
29.2; 21.3;     MCH4,NNsec=126,Ntp=3
29.2; 10.8;     GDH4,NNsec=126,Ntp=3
29.2; 9.7;     NKH4,NNsec=126,Ntp=3
29.2; 9.5;     RNH4,NNsec=126,Ntp=2
29.2; 9.8;     TIH4,NNsec=126,Ntp=1
29.2; 12.9;     MCH4,NNsec=126,Ntp=0
23.3; 45.9;     RNH4,NNsec=126,Ntp=2
23.3; 16.3;     EuH4,NNsec=126,Ntp=2
23.3; 23.5;     MCH4,NNsec=126,Ntp=3
23.3; 12.3;     TIH4,NNsec=126,Ntp=2
23.3; 11.7;     NKH4,NNsec=126,Ntp=1
23.3; 9.9;     RNH4,NNsec=126,Ntp=0
13.3; 53.2;     RNH4,NNsec=126,Ntp=0
8.4; 26.5;     RNH4,NNsec=126,Ntp=0
21.2; 41.3;     VKH4,NNsec=126,Ntp=1
21.2; 19.5;     GDH4,NNsec=126,Ntp=1
21.2; 16.1;     NKH4,NNsec=126,Ntp=0
Таймер 142000.039
GLH4;HMS=131900.0;HMS_os=142000.039,Ci=6010.5,pos=0
NAH4;HMS=131900.0;HMS_os=142000.039,Ci=16422.0,pos=0
RNH4;HMS=131800.0;HMS_os=142000.039,Ci=59162.0,pos=0
BRG4;HMS=131900.0;HMS_os=142000.039,Ci=78.81,pos=0
NKH4;HMS=131500.0;HMS_os=142000.039,Ci=153066.0,pos=0
BNH4;HMS=125500.0;HMS_os=142000.039,Ci=2351.0,pos=0
TIH4;HMS=124800.0;HMS_os=142000.039,Ci=33088.0,pos=0
VBH4;HMS=131900.0;HMS_os=142000.039,Ci=2429.0,pos=0
SiH4;HMS=131900.0;HMS_os=142000.039,Ci=91608.0,pos=0
PHH4;HMS=131700.0;HMS_os=142000.039,Ci=6876.0,pos=0
MXH4;HMS=131900.0;HMS_os=142000.039,Ci=322025.0,pos=0
EuH4;HMS=131900.0;HMS_os=142000.039,Ci=99734.0,pos=0
PDH4;HMS=131900.0;HMS_os=142000.039,Ci=1072.48,pos=0
SVH4;HMS=131900.0;HMS_os=142000.039,Ci=23.7,pos=0
SFH4;HMS=131900.0;HMS_os=142000.039,Ci=473.4,pos=0
ISH4;HMS=125800.0;HMS_os=142000.039,Ci=1147.0,pos=0
FLH4;HMS=131900.0;HMS_os=142000.039,Ci=14686.0,pos=0
RIH4;HMS=131900.0;HMS_os=142000.039,Ci=110600.0,pos=0
SOH4;HMS=130800.0;HMS_os=142000.039,Ci=8484.0,pos=0
MTH4;HMS=130300.0;HMS_os=142000.039,Ci=25953.0,pos=0
ALH4;HMS=131200.0;HMS_os=142000.039,Ci=7361.0,pos=0
MMH4;HMS=131800.0;HMS_os=142000.039,Ci=3220.15,pos=0
GDH4;HMS=131900.0;HMS_os=142000.039,Ci=2078.5,pos=0
EDH4;HMS=131900.0;HMS_os=142000.039,Ci=1.0875,pos=0
LKH4;HMS=131600.0;HMS_os=142000.039,Ci=70124.0,pos=0
CRH4;HMS=131900.0;HMS_os=142000.039,Ci=12.908,pos=0
SXH4;HMS=131200.0;HMS_os=142000.039,Ci=4419.8,pos=0
SPH4;HMS=131200.0;HMS_os=142000.039,Ci=28239.0,pos=0
GZH4;HMS=131900.0;HMS_os=142000.039,Ci=16731.0,pos=0
HSH4;HMS=131800.0;HMS_os=142000.039,Ci=17051.0,pos=0
PZH4;HMS=130700.0;HMS_os=142000.039,Ci=112138.0,pos=0
SNH4;HMS=123900.0;HMS_os=142000.039,Ci=28494.0,pos=0
MEH4;HMS=131500.0;HMS_os=142000.039,Ci=19960.0,pos=0
MNH4;HMS=131800.0;HMS_os=142000.039,Ci=6978.0,pos=0
UCH4;HMS=131800.0;HMS_os=142000.039,Ci=7.116,pos=0
NMH4;HMS=131400.0;HMS_os=142000.039,Ci=18854.0,pos=0
SGH4;HMS=131900.0;HMS_os=142000.039,Ci=58120.0,pos=0
FVH4;HMS=131500.0;HMS_os=142000.039,Ci=22802.0,pos=0
VKH4;HMS=131500.0;HMS_os=142000.039,Ci=6062.0,pos=0
GKH4;HMS=125500.0;HMS_os=142000.039,Ci=16812.0,pos=0
RMH4;HMS=131900.0;HMS_os=142000.039,Ci=1105.5,pos=0
FSH4;HMS=131700.0;HMS_os=142000.039,Ci=11669.0,pos=0
POH4;HMS=131400.0;HMS_os=142000.039,Ci=5063.0,pos=0
SSH4;HMS=131900.0;HMS_os=142000.039,Ci=3981.0,pos=0
RLH4;HMS=131900.0;HMS_os=142000.039,Ci=3638.0,pos=0
 
По ходу дела возник вопрос об организации хранения данных.
Сейчас реализовал mapping files для каждого инструмента 3 тайма и 6 параметров свечи.
Т е 21 файл на инструмент. Для 150 инструментов получи более 2000 файлов.
-----------------------
Прикольно то, что приходится дублировать файлы квика,
так как разработчики QUIK "зажали" формат этих файлов.
 
опечатка, параметров 7.
 
Про робота
------------------------  
Один раз в минуту робот вычисляет головной блок для всех зарегистрированных инструментов.
В результате этих вычислений получается очередь новых заявок .
---------------
Привожу результаты теста , который позволяет оценить эффективность применения дополнительного потока для этих вычислений , а также проведение вычислений в Luajit в дополнительном потоке
-------------
В первом тесте все вычисления выполняются в функции main для версии Lua5.3
Результат:
Код
23.2, 56.6, ,14,NKH4, 283, 0
25.5, 122.1, ,14,SiH4, 283, 1
25.5, 25.0, ,14,USD000UTSTOM, 283, 1
25.5, 21.5, ,14,USD000000TOD, 283, 1
25.5, 24.8, ,14,EUR_RUB__TOM, 283, 1
25.5, 15.6, ,14,EUR_RUB__TOD, 283, 0
24.8, 65.3, ,14,NKH4, 283, 1
24.8, 18.0, ,14,SiM4, 283, 0
27.9, 54.8, ,14,SiM4, 283, 0
Таймер 145800.01,Nc=3
завершение Таймер 145846.761,ncs=284
28.4, 46751279.6, ,14,NKH4, 283, 1854
28.4, 15.7, ,14,RTH4, 283, 1853
28.4, 12.6, ,14,CHH4, 283, 1852
28.4, 11.5, ,14,CHH4, 283, 1851
28.4, 13.9, ,14,SiM4, 283, 1850

Nc=3 - число торгуемых классов
ncs=284- число торгуемых инструментов.
Вычисление головного блока началось в 14:58:00 , закончилось в 14:58:48
------------------------
Обратите внимание на последнее число в стоках до и после вычислений головного блока.
это число инструментов, которые находятся в очереди на обработку в main.
----------------------------------
За 48 секунд вычислений очередь увеличилась с 0 элементов до 1854.
Т е за 48 секунд в ТТП изменились данные 1854 раза.
----------------------------------
 
Про робота
Результаты теста аналогичного предыдущему, но обработка выполняется скриптом в LuaJit и в дополнительном потоке пула таймера.
Код
7.7, 27.2, ,14,SPH4, 230, 0
7.7, 17.0, ,14,CHH4, 230, 0
Таймер 152500.011,Nc=3
26.7, 55.8, ,14,FLOT, 230, 1
26.7, 22.4, ,14,MTLR, 230, 2
26.7, 17.7, ,14,QIWI, 230, 2
26.7, 13.5, ,14,TATN, 230, 1
26.7, 15.5, ,14,VKCO, 230, 1
26.7, 97.7, ,14,VTBR, 230, 2
26.7, 15.9, ,14,ZVEZ, 230, 1
26.7, 83.0, ,14,IRAO, 230, 1
26.7, 15.4, ,14,CRH4, 230, 0
23.5, 84.9, ,14,SiH4, 230, 0
31.7, 116.2, ,14,CRH4, 230, 0
28.6, 50.5, ,14,RNH4, 230, 1
28.6, 17.9, ,14,CHH4, 230, 1
28.6, 29.2, ,14,SPH4, 230, 0
28.0, 46.3, ,14,SiH4, 230, 1
28.0, 15.9, ,14,SiH4, 230, 1
28.0, 11.8, ,14,SiH4, 230, 0
28.1, 48.5, ,14,SiH4, 230, 1
28.1, 16.7, ,14,CRH4, 230, 0
28.6, 53.4, ,14,RNH4, 230, 1
28.6, 15.7, ,14,CRH4, 230, 0
24.4, 83.5, ,14,CRH4, 230, 0
28.2, 49.2, ,14,CRH4, 230, 0
28.0, 46.8, ,14,CRH4, 230, 1
28.0, 15.7, ,14,SiH4, 230, 0
15.2, 33.0, ,14,SiH4, 230, 1
15.2, 15.4, ,14,SRH4, 230, 0
27.5, 132.5, ,14,USD000UTSTOM, 230, 2
27.5, 83.6, ,14,EUR_RUB__TOD, 230, 4
27.5, 75.9, ,14,GLDRUB_TOM, 230, 4
27.5, 19.5, ,14,SPH4, 230, 3
27.5, 13.9, ,14,USD000000TOD, 230, 2
27.5, 12.8, ,14,SiH4, 230, 1
27.5, 12.1, ,14,EUR_RUB__TOM, 230, 0
29.3, 49.1, ,14,SiH4, 230, 0
29.3, 80.3, ,14,SFH4, 230, 0
10.8, 56.0, ,14,SFH4, 230, 1
10.8, 22.5, ,14,RNH4, 230, 1
10.8, 14.2, ,14,SPH4, 230, 0
7.5, 23.3, ,14,CHH4, 230, 0
13.2, 62.9, ,14,RNH4, 230, 1
13.2, 20.6, ,14,SPH4, 230, 1
13.2, 14.8, ,14,RNH4, 230, 0
28.8, 48.5, ,14,CHH4, 230, 0
24.1, 43.8, ,14,SPH4, 230, 1
24.1, 25.0, ,14,SPH4, 230, 0
28.7, 103.8, ,14,CRH4, 230, 0
8.8, 59.9, ,14,RNH4, 230, 0
6.3, 25.4, ,14,SPH4, 230, 0
6.3, 17.1, ,14,CHH4, 230, 0
10.1, 49.8, ,14,CHH4, 230, 0
28.9, 49.2, ,14,EuH4, 230, 0
25.0, 36.2, ,14,RNH4, 230, 1
25.0, 16.0, ,14,SPH4, 230, 0
24.0, 30.3, ,14,CNYRUB_TOM, 230, 0
10.0, 102.6, ,14,USD000UTSTOM, 230, 0
28.0, 47.0, ,14,EUR_RUB__TOM, 230, 1
28.0, 20.7, ,14,BYNRUB_TOM, 230, 1
28.0, 13.4, ,14,EUR_RUB__TOD, 230, 0
28.4, 50.7, ,14,SiH4, 230, 0
12.6, 47.1, ,14,NKH4, 230, 0
12.6, 22.0, ,14,MMH4, 230, 0
12.4, 57.5, ,14,SiH4, 230, 0
28.7, 56.0, ,14,GKH4, 230, 0
10.9, 65.2, ,14,LKH4, 230, 1
10.9, 34.7, ,14,FIVE, 230, 2
10.9, 32.3, ,14,FLOT, 230, 2
10.9, 19.4, ,14,MRKV, 230, 2
10.9, 17.7, ,14,MTLR, 230, 2
10.9, 21.3, ,14,IRAO, 230, 2
10.9, 24.3, ,14,QIWI, 230, 2
10.9, 131.5, ,14,NKHP, 230, 4
10.9, 89.2, ,14,UNAC, 230, 6
10.9, 16.6, ,14,ZVEZ, 230, 5
10.9, 12.8, ,14,VKCO, 230, 4
10.9, 14.0, ,14,TATN, 230, 3
10.9, 20.5, ,14,SNGSP, 230, 2
10.9, 82.5, ,14,SGZH, 230, 1
10.9, 83.7, ,14,BELU, 230, 0
6.7, 25.2, ,14,MMH4, 230, 0
13.3, 123.9, ,14,SiH4, 230, 0
28.1, 47.8, ,14,SiH4, 230, 0
29.7, 52.3, ,14,SiH4, 230, 0
28.8, 49.3, ,14,EuH4, 230, 1
28.8, 15.5, ,14,SRH4, 230, 0
25.3, 50.5, ,14,USD000UTSTOM, 230, 1
25.3, 18.7, ,14,EUR_RUB__TOD, 230, 1
25.3, 21.1, ,14,SPH4, 230, 1
25.3, 14.4, ,14,USDCNY_TOM, 230, 0
26.6, 39.4, ,14,SPH4, 230, 0
26.6, 71.5, ,14,CRH4, 230, 0
46.2, 53.3, ,14,RNH4, 230, 1
46.2, 18.6, ,14,BRG4, 230, 0
28.5, 54.4, ,14,RIH4, 230, 0
37.4, 51.3, ,14,RNH4, 230, 1
37.4, 15.5, ,14,CHH4, 230, 0
27.9, 52.8, ,14,RNH4, 230, 1
27.9, 15.8, ,14,CHH4, 230, 0
29.1, 58.5, ,14,RIH4, 230, 0
50.1, 151.5, ,14,SiH4, 230, 0
27.0, 50.5, ,14,RNH4, 230, 0
10.1, 50.1, ,14,RNH4, 230, 0
10.2, 49.7, ,14,SiH4, 230, 0
26.7, 46.8, ,14,EuH4, 230, 1
26.7, 14.8, ,14,NKH4, 230, 0
28.9, 53.6, ,14,RNH4, 230, 0
29.0, 59.3, ,14,SGH4, 230, 0
44.0, 50.2, ,14,RNH4, 230, 0
28.6, 54.5, ,14,RIH4, 230, 0
25.5, 58.1, ,14,RIH4, 230, 1
25.5, 21.5, ,14,SiH4, 230, 1
25.5, 15.5, ,14,RNH4, 230, 0
35.5, 51.1, ,14,RNH4, 230, 0
29.5, 121.2, ,14,RIH4, 230, 1
29.5, 15.4, ,14,VBH4, 230, 0
28.8, 52.5, ,14,CRH4, 230, 1
28.8, 17.5, ,14,RNH4, 230, 0
10.9, 53.1, ,14,CHH4, 230, 1
10.9, 20.4, ,14,CRH4, 230, 0
25.0, 50.1, ,14,CRH4, 230, 0
6.5, 37.8, ,14,FESH, 230, 0
6.5, 28.2, ,14,IRAO, 230, 1
6.5, 128.7, ,14,LVHK, 230, 2
6.5, 17.2, ,14,MTLR, 230, 2
6.5, 92.2, ,14,MTSS, 230, 4
6.5, 15.1, ,14,QIWI, 230, 3
6.5, 76.6, ,14,POLY, 230, 4
6.5, 13.6, ,14,TATN, 230, 3
6.5, 89.5, ,14,ROSN, 230, 5
6.5, 103.0, ,14,USBN, 230, 7
6.5, 15.8, ,14,ZVEZ, 230, 6
6.5, 13.6, ,14,VTBR, 230, 5
6.5, 11.7, ,14,VKCO, 230, 4
6.5, 17.1, ,14,UNAC, 230, 3
6.5, 18.8, ,14,UGLD, 230, 2
6.5, 23.6, ,14,NKHP, 230, 1
6.5, 16.7, ,14,CRH4, 230, 1
6.5, 73.0, ,14,MRKV, 230, 0
6.7, 29.0, ,14,RNH4, 230, 0
6.7, 17.4, ,14,CHH4, 230, 0
15.5, 67.2, ,14,CHH4, 230, 0
27.2, 47.9, ,14,CRH4, 230, 1
27.2, 14.5, ,14,CRH4, 230, 0
27.2, 17.3, ,14,RNH4, 230, 0
28.6, 50.1, ,14,RNH4, 230, 0
28.6, 72.3, ,14,SiH4, 230, 0
28.8, 51.0, ,14,GDH4, 230, 0
24.9, 52.7, ,14,RNH4, 230, 1
24.9, 20.8, ,14,RIH4, 230, 0
27.1, 103.7, ,14,RIH4, 230, 0
27.0, 46.7, ,14,RNH4, 230, 0
11.1, 55.8, ,14,RNH4, 230, 0
27.6, 49.6, ,14,TTH4, 230, 0
16.4, 51.2, ,14,TTH4, 230, 0
24.9, 53.7, ,14,RNH4, 230, 0
44.6, 50.5, ,14,LKH4, 230, 1
44.6, 15.3, ,14,EuH4, 230, 0
26.9, 46.8, ,14,FSH4, 230, 0
27.9, 50.9, ,14,RNH4, 230, 0
27.4, 48.3, ,14,RNH4, 230, 0
28.3, 52.4, ,14,RNH4, 230, 0
26.6, 48.0, ,14,USD000UTSTOM, 230, 1
26.6, 17.3, ,14,GLDRUB_TOM, 230, 0
28.0, 50.7, ,14,RNH4, 230, 0
28.2, 52.0, ,14,TTH4, 230, 1
28.2, 15.3, ,14,CHH4, 230, 0
28.2, 51.5, ,14,TTH4, 230, 1
28.2, 17.8, ,14,CHH4, 230, 1
28.2, 14.5, ,14,RNH4, 230, 0
29.3, 49.4, ,14,CHH4, 230, 0
29.6, 49.3, ,14,SiH4, 230, 0
27.1, 50.6, ,14,TTH4, 230, 1
27.1, 28.5, ,14,RIH4, 230, 2
27.1, 15.5, ,14,MMH4, 230, 1
27.1, 14.5, ,14,RIH4, 230, 0
26.5, 150.4, ,14,AFLT, 230, 4
26.5, 27.1, ,14,IRAO, 230, 5
26.5, 108.0, ,14,NKHP, 230, 7
26.5, 23.6, ,14,TATN, 230, 6
26.5, 131.4, ,14,SVAV, 230, 8
26.5, 30.9, ,14,USBN, 230, 7
26.5, 18.5, ,14,VKCO, 230, 7
26.5, 16.8, ,14,VTBR, 230, 7
26.5, 96.3, ,14,ZVEZ, 230, 7
26.5, 20.6, ,14,UNAC, 230, 6
26.5, 92.9, ,14,TCSG, 230, 5
26.5, 66.4, ,14,POLY, 230, 4
26.5, 82.8, ,14,FLOT, 230, 3
26.5, 15.6, ,14,FIXP, 230, 2
26.5, 12.9, ,14,FESH, 230, 1
26.5, 18.3, ,14,AGRO, 230, 0
24.7, 28.2, ,14,SiH4, 230, 0
25.9, 32.7, ,14,CHH4, 230, 0
9.6, 106.1, ,14,SiH4, 230, 0
6.6, 26.4, ,14,RNH4, 230, 0
11.9, 60.3, ,14,CHH4, 230, 0
27.4, 56.8, ,14,RMH4, 230, 0
17.4, 48.9, ,14,NKH4, 230, 0
30.1, 50.5, ,14,CHH4, 230, 1
30.1, 23.3, ,14,RNH4, 230, 1
30.1, 13.8, ,14,CHH4, 230, 0
24.5, 51.6, ,14,NKH4, 230, 1
24.5, 21.5, ,14,CHH4, 230, 0
28.0, 49.7, ,14,SiH4, 230, 1
28.0, 22.2, ,14,LKH4, 230, 0
12.9, 68.0, ,14,GKH4, 230, 1
12.9, 20.3, ,14,NKH4, 230, 0
29.1, 49.5, ,14,CHH4, 230, 0
24.3, 55.0, ,14,RNH4, 230, 0
26.8, 46.5, ,14,NKH4, 230, 1
26.8, 18.2, ,14,NKH4, 230, 1
26.8, 14.5, ,14,CHH4, 230, 0
20.8, 36.3, ,14,RNH4, 230, 0
28.4, 57.7, ,14,GLDRUB_TOM, 230, 1
28.4, 26.7, ,14,CHH4, 230, 0
30.6, 54.1, ,14,SiH4, 230, 0
27.1, 54.7, ,14,RTH4, 230, 0
27.3, 51.4, ,14,SiH4, 230, 1
27.3, 20.2, ,14,NKH4, 230, 1
27.3, 17.3, ,14,CHH4, 230, 1
27.3, 14.9, ,14,RNH4, 230, 0
28.6, 51.7, ,14,RNH4, 230, 1
28.6, 19.2, ,14,CRH4, 230, 0
17.5, 55.9, ,14,RNH4, 230, 0
29.7, 52.3, ,14,CHH4, 230, 0
30.2, 55.6, ,14,RNH4, 230, 0
29.0, 50.9, ,14,CHH4, 230, 0
30.5, 54.8, ,14,RNH4, 230, 0
30.5, 30.0, ,14,RNH4, 230, 0
28.0, 48.2, ,14,SiH4, 230, 1
28.0, 18.3, ,14,CHH4, 230, 0
9.9, 51.2, ,14,RNH4, 230, 1
9.9, 16.6, ,14,CHH4, 230, 0
7.4, 136.7, ,14,GLDRUB_TOM, 230, 2
7.4, 14.5, ,14,EURUSD000TOM, 230, 1
7.4, 78.9, ,14,USD000UTSTOM, 230, 3
7.4, 96.5, ,14,FIXP, 230, 5
7.4, 43.8, ,14,NKHP, 230, 6
7.4, 15.5, ,14,TATN, 230, 6
7.4, 34.1, ,14,USBN, 230, 6
7.4, 11.5, ,14,VKCO, 230, 5
7.4, 12.9, ,14,ROSN, 230, 4
7.4, 16.5, ,14,IRAO, 230, 3
7.4, 15.7, ,14,FLOT, 230, 2
7.4, 17.7, ,14,AGRO, 230, 1
7.4, 189.2, ,14,EUR_RUB__TOM, 230, 0
10.5, 110.7, ,14,RNH4, 230, 0
23.2, 116.3, ,14,CHH4, 230, 0
28.9, 224.2, ,14,CRH4, 230, 2
28.9, 13.6, ,14,NKH4, 230, 1
28.9, 13.9, ,14,RNH4, 230, 0
11.4, 139.3, ,14,RNH4, 230, 0
11.4, 45.6, ,14,CHH4, 230, 0
12.1, 79.9, ,14,GKH4, 230, 0
28.5, 68.5, ,14,SRH4, 230, 0
26.1, 87.0, ,14,RNH4, 230, 2
26.1, 18.4, ,14,CHH4, 230, 1
26.1, 14.3, ,14,RNH4, 230, 0
27.7, 64.0, ,14,RNH4, 230, 0
28.4, 59.3, ,14,RNH4, 230, 1
28.4, 19.4, ,14,RNH4, 230, 0
27.4, 71.5, ,14,CRH4, 230, 1
27.4, 21.7, ,14,EUR_RUB__TOD, 230, 1
27.4, 22.5, ,14,USD000UTSTOM, 230, 0
10.6, 49.2, ,14,RNH4, 230, 0
27.1, 47.3, ,14,CHH4, 230, 1
27.1, 66.2, ,14,CRH4, 230, 0
завершение Таймер 152505.619
27.2, 48.0, ,14,FSH4, 230, 0
24.9, 51.8, ,14,RNH4, 230, 1
24.9, 18.8, ,14,TTH4, 230, 1
24.9, 13.1, ,14,TTH4, 230, 0
25.8, 54.3, ,14,CRH4, 230, 0

Время обработки составило 5.6 секунд, вместо 48 секунд ранее.
Во время вычисления головного блока не происходи останов функции main, которая продолжает обработку колбеков.
В итоге, очередь до вычислений и после вычислений содержит не более 1 элемента, вместо 1854 ранее.
 
В этой теме
https://forum.quik.ru/forum17/topic8467/
я подробно рассказал как просто сделать  очередь событий в роботе и для чего это нужно.
При этом использование функции sleep  не приводит к потере событий на рынке.
-----------------------------
Однако, такое решение имеет недостаток в том, что ядро процессора простаивает, когда в очереди есть события.
-----------------------
Может показаться, что простаивание ядра на 10 ms это мелочь.
Но у нас ядро работает на частоте 3ГГц и более. За 10ms процессор может выполнить более 100 тысяч команд.
Стоит ли их терять?
---------------------  
Я использую другой способ остановки процессора на время отсутствия событий.
Рассказываю о нем лишь в самом упрощенном виде.
Кто пожелает его реализовать, рекомендую книгу Дж.Рихтера.
--------------------
Этот механизм можно реализовать на СИ.
Для этого создается специальный флаг, называемый event - событие.
Для обнаружения события используется функция ожидания события.
С учетом этого у меня колбеки записаны иначе, чем в указанной выше теме.
В них добавлена функция управления событием.
А в функцию main добавлена функция ожидания, которая дополнительно реализует функцию "сторожевого пса"
Вот фрагменты этих участков скрипта:
Код
function OnParam(c,s)   _N=_N+1; tpr[_N]={14,c,s};      nkevent.Set(event);end
Код
----
   local w=nkevent.wait(); --ждем события
   if w~=0 then  Log:write(w..",прошло 30 секунд\n"); Log:flush(); end
   while _N>0 do
----
Страницы: 1
Читают тему
Наверх