Торговый робот с приоритетами обработки потоков (заготовка) — различия между версиями
Материал из ТХАБ.РФ
СмартЛаб (обсуждение | вклад) м |
СмартЛаб (обсуждение | вклад) м (→Код Торгового робота) |
||
Строка 5: | Строка 5: | ||
--Обработка событий РМ QUIK в функции main() посредством очереди FIFO | --Обработка событий РМ QUIK в функции main() посредством очереди FIFO | ||
--с выделением приоритета OnTrade и фильтрации OnQuote | --с выделением приоритета OnTrade и фильтрации OnQuote | ||
− | function OnInit(script) | + | -- Функции вызываемые в основном потоке (тормозят QUIK) |
+ | function OnInit(script) -- инициализация переменных скрипта | ||
is_run = true | is_run = true | ||
− | + | NORMAL_JOB = {} -- таблица очередь обработки событий обычного приоритета | |
− | MAIN_QUEUE_TRADES = {} | + | MAIN_QUEUE_TRADES = {} -- таблица очередь обработки событий высокого приоритета |
end | end | ||
− | function OnOrder(order) | + | -- Функции обработки событий - Основной поток |
− | table.sinsert( | + | function OnOrder(order) -- Событие заказ |
+ | table.sinsert(NORMAL_JOB, {callback = "OnOrder", value = order}) | ||
end | end | ||
− | function OnTrade(trade) | + | function OnTrade(trade) -- событие продажа |
table.sinsert(MAIN_QUEUE_TRADES, trade) | table.sinsert(MAIN_QUEUE_TRADES, trade) | ||
end | end | ||
− | function OnAllTrade(all_trade) | + | function OnAllTrade(all_trade) |
− | table.sinsert( | + | table.sinsert(NORMAL_JOB, {callback = "OnAllTrade", value = all_trade}) |
end | end | ||
function OnQuote(class_code, sec_code) | function OnQuote(class_code, sec_code) | ||
if class_code == "SPBFUT" then | if class_code == "SPBFUT" then | ||
local quote = getQuoteLevel2(class_code, sec_code) | local quote = getQuoteLevel2(class_code, sec_code) | ||
− | table.sinsert( | + | table.sinsert(NORMAL_JOB, {callback = "OnQuote", value = quote}) |
end | end | ||
end | end | ||
− | function OnStop() | + | function OnStop() -- Событие - нажата кнопка остановки скрипта |
is_run = false | is_run = false | ||
return 2000 | return 2000 | ||
end | end | ||
+ | -- Дополнительный поток | ||
function main() | function main() | ||
− | while is_run do | + | while is_run do -- основной цикл Дополнительного потока |
− | if # | + | if #NORMAL_JOB > 0 and #MAIN_QUEUE_TRADES == 0 then -- обработка событий обычного приоритета |
− | ProcessingCallbakc( | + | ProcessingCallbakc(NORMAL_JOB[1]) -- вызов функции обработки событий обычного приоритета |
− | table.sremove( | + | table.sremove(NORMAL_JOB, 1) -- удаление обработанного события из таблицы (удаляется строка) |
message("Размер общей очереди " .. tostring(#MAIN_QUEUE)) | message("Размер общей очереди " .. tostring(#MAIN_QUEUE)) | ||
− | elseif #MAIN_QUEUE_TRADES > 0 then | + | elseif #MAIN_QUEUE_TRADES > 0 then -- обработка событий Высокого приоритета |
− | + | ProcessingOnTrade(MAIN_QUEUE_TRADES[1]) -- вызов функции обработки событий высокого приоритета | |
− | table.sremove(MAIN_QUEUE_TRADES, 1) | + | table.sremove(MAIN_QUEUE_TRADES, 1) -- удаление обработанного события из таблицы (удаляется строка) |
message("Размер очереди сделок " .. tostring(#MAIN_QUEUE_TRADES)) | message("Размер очереди сделок " .. tostring(#MAIN_QUEUE_TRADES)) | ||
end | end | ||
end | end | ||
end | end | ||
− | + | -- Функции вызываемые в дополнительном потоке (не тормозят QUIK) | |
− | function ProcessingCallbakc(value) | + | function ProcessingCallbakc(value) -- функция обработки событий обычного приоритета |
message(string.format("Обработка события %s начата", value.callback)) | message(string.format("Обработка события %s начата", value.callback)) | ||
sleep(3000) --эмуляция продолжительного алгоритма обработки события | sleep(3000) --эмуляция продолжительного алгоритма обработки события | ||
Строка 50: | Строка 53: | ||
end | end | ||
− | function ProcessingOnTrade(trade) | + | function ProcessingOnTrade(trade) -- функция обработки событий высокого приоритета |
message(string.format("Обработка сделки №%s начата", trade.trade_num)) | message(string.format("Обработка сделки №%s начата", trade.trade_num)) | ||
sleep(3000) --эмуляция продолжительного алгоритма обработки сделки | sleep(3000) --эмуляция продолжительного алгоритма обработки сделки | ||
message(string.format("Обработка сделки №%s завершена", trade.trade_num)) | message(string.format("Обработка сделки №%s завершена", trade.trade_num)) | ||
end | end | ||
− | |||
− | |||
== См. также == | == См. также == |
Версия 21:00, 31 марта 2020
Содержание
Описание
В данном примере мы добавили новую Lua таблицу MAIN_QUEUE_TRADES, которая предназначена для создания очереди события добавления/изменения сделки, а в функции main() выделили приоритет для данной очереди, добавив условие обработки общей очереди MAIN_QUEUE только в том случае, если очередь сделок пуста. Также добавили для события OnQuote() фильтрацию по классу инструментов, и таким образом мы уменьшили очередь MAIN_QUEUE, не добавляя в неё ненужные нам события.
Код Торгового робота
--Обработка событий РМ QUIK в функции main() посредством очереди FIFO --с выделением приоритета OnTrade и фильтрации OnQuote -- Функции вызываемые в основном потоке (тормозят QUIK) function OnInit(script) -- инициализация переменных скрипта is_run = true NORMAL_JOB = {} -- таблица очередь обработки событий обычного приоритета MAIN_QUEUE_TRADES = {} -- таблица очередь обработки событий высокого приоритета end -- Функции обработки событий - Основной поток function OnOrder(order) -- Событие заказ table.sinsert(NORMAL_JOB, {callback = "OnOrder", value = order}) end function OnTrade(trade) -- событие продажа table.sinsert(MAIN_QUEUE_TRADES, trade) end
function OnAllTrade(all_trade) table.sinsert(NORMAL_JOB, {callback = "OnAllTrade", value = all_trade}) end function OnQuote(class_code, sec_code) if class_code == "SPBFUT" then local quote = getQuoteLevel2(class_code, sec_code) table.sinsert(NORMAL_JOB, {callback = "OnQuote", value = quote}) end end function OnStop() -- Событие - нажата кнопка остановки скрипта is_run = false return 2000 end -- Дополнительный поток function main() while is_run do -- основной цикл Дополнительного потока if #NORMAL_JOB > 0 and #MAIN_QUEUE_TRADES == 0 then -- обработка событий обычного приоритета ProcessingCallbakc(NORMAL_JOB[1]) -- вызов функции обработки событий обычного приоритета table.sremove(NORMAL_JOB, 1) -- удаление обработанного события из таблицы (удаляется строка) message("Размер общей очереди " .. tostring(#MAIN_QUEUE)) elseif #MAIN_QUEUE_TRADES > 0 then -- обработка событий Высокого приоритета ProcessingOnTrade(MAIN_QUEUE_TRADES[1]) -- вызов функции обработки событий высокого приоритета table.sremove(MAIN_QUEUE_TRADES, 1) -- удаление обработанного события из таблицы (удаляется строка) message("Размер очереди сделок " .. tostring(#MAIN_QUEUE_TRADES)) end end end -- Функции вызываемые в дополнительном потоке (не тормозят QUIK) function ProcessingCallbakc(value) -- функция обработки событий обычного приоритета message(string.format("Обработка события %s начата", value.callback)) sleep(3000) --эмуляция продолжительного алгоритма обработки события message(string.format("Обработка события %s завершена", value.callback)) end function ProcessingOnTrade(trade) -- функция обработки событий высокого приоритета message(string.format("Обработка сделки №%s начата", trade.trade_num)) sleep(3000) --эмуляция продолжительного алгоритма обработки сделки message(string.format("Обработка сделки №%s завершена", trade.trade_num)) end
См. также
Ссылки
- https://smart-lab.ru/algotrading/Есть%20ли%20в%20свободном%20доступе%20пример%20самого%20простого%20торгового%20робота%20на%20QLua Обсуждение этого торгового робота