Торговый робот с приоритетами обработки потоков (заготовка)
Материал из ТХАБ.РФ
Содержание
Описание
В данном примере мы добавили новую 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 Обсуждение этого торгового робота