Торговый робот с приоритетами обработки потоков (заготовка) — различия между версиями
Материал из ТХАБ.РФ
СмартЛаб (обсуждение | вклад) (Новая страница: « == См. также == * Облигационный торговый робот == Ссылки == * https://smart-lab.ru/algotrading/Есть%20ли%20в…») |
СмартЛаб (обсуждение | вклад) м |
||
Строка 1: | Строка 1: | ||
+ | == Описание == | ||
+ | В данном примере мы добавили новую 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 | ||
Версия 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 Обсуждение этого торгового робота