Торговый робот с приоритетами обработки потоков (заготовка)
Материал из ТХАБ.РФ
Версия от 20:50, 31 марта 2020; СмартЛаб (обсуждение | вклад)
Содержание
Описание
В данном примере мы добавили новую Lua таблицу MAIN_QUEUE_TRADES, которая предназначена для создания очереди события добавления/изменения сделки, а в функции main() выделили приоритет для данной очереди, добавив условие обработки общей очереди MAIN_QUEUE только в том случае, если очередь сделок пуста. Также добавили для события OnQuote() фильтрацию по классу инструментов, и таким образом мы уменьшили очередь MAIN_QUEUE, не добавляя в неё ненужные нам события.
Код Торгового робота
--Обработка событий РМ QUIK в функции main() посредством очереди FIFO --с выделением приоритета OnTrade и фильтрации OnQuote function OnInit(script) is_run = true MAIN_QUEUE = {} MAIN_QUEUE_TRADES = {} end function OnOrder(order) table.sinsert(MAIN_QUEUE, {callback = "OnOrder", value = order}) end function OnTrade(trade) table.sinsert(MAIN_QUEUE_TRADES, trade) end
function OnAllTrade(all_trade) table.sinsert(MAIN_QUEUE, {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(MAIN_QUEUE, {callback = "OnQuote", value = quote}) end end function OnStop() is_run = false return 2000 end function main() while is_run do if #MAIN_QUEUE > 0 and #MAIN_QUEUE_TRADES == 0 then ProcessingCallbakc(MAIN_QUEUE[1]) table.sremove(MAIN_QUEUE, 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
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 Обсуждение этого торгового робота