Торговый робот с приоритетами обработки потоков (заготовка) — различия между версиями
Материал из ТХАБ.РФ
СмартЛаб (обсуждение | вклад) м (→Код Торгового робота) |
СмартЛаб (обсуждение | вклад) м (→Код Торгового робота) |
||
Строка 9: | Строка 9: | ||
is_run = true | is_run = true | ||
NORMAL_JOB = {} -- таблица очередь обработки событий обычного приоритета | NORMAL_JOB = {} -- таблица очередь обработки событий обычного приоритета | ||
− | + | PRIORITET_JOB = {} -- таблица очередь обработки событий высокого приоритета | |
end | end | ||
-- Функции обработки событий - Основной поток | -- Функции обработки событий - Основной поток | ||
Строка 16: | Строка 16: | ||
end | end | ||
function OnTrade(trade) -- событие продажа | function OnTrade(trade) -- событие продажа | ||
− | table.sinsert( | + | table.sinsert(PRIORITET_JOB, trade) |
end | end | ||
Строка 35: | Строка 35: | ||
function main() | function main() | ||
while is_run do -- основной цикл Дополнительного потока | while is_run do -- основной цикл Дополнительного потока | ||
− | if #NORMAL_JOB > 0 and # | + | if #NORMAL_JOB > 0 and #PRIORITET_JOB == 0 then -- обработка событий обычного приоритета |
ProcessingCallbakc(NORMAL_JOB[1]) -- вызов функции обработки событий обычного приоритета | ProcessingCallbakc(NORMAL_JOB[1]) -- вызов функции обработки событий обычного приоритета | ||
table.sremove(NORMAL_JOB, 1) -- удаление обработанного события из таблицы (удаляется строка) | table.sremove(NORMAL_JOB, 1) -- удаление обработанного события из таблицы (удаляется строка) | ||
− | message("Размер общей очереди " .. tostring(# | + | message("Размер общей очереди " .. tostring(#NORMAL_JOB)) -- преобразует в строку размер таблицы NORMAL_JOB - список НЕ приоритетных событий |
− | elseif # | + | elseif #PRIORITET_JOB > 0 then -- обработка событий Высокого приоритета |
− | ProcessingOnTrade( | + | ProcessingOnTrade(PRIORITET_JOB[1]) -- вызов функции обработки событий высокого приоритета |
− | table.sremove( | + | table.sremove(PRIORITET_JOB, 1) -- удаление обработанного события из таблицы (удаляется строка) |
− | message("Размер очереди сделок " .. tostring(# | + | message("Размер очереди сделок " .. tostring(#PRIORITET_JOB)) -- преобразует в строку размер таблицы NORMAL_JOB - список приоритетных событий |
end | end | ||
end | end |
Версия 21:03, 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 = {} -- таблица очередь обработки событий обычного приоритета PRIORITET_JOB = {} -- таблица очередь обработки событий высокого приоритета end -- Функции обработки событий - Основной поток function OnOrder(order) -- Событие заказ table.sinsert(NORMAL_JOB, {callback = "OnOrder", value = order}) end function OnTrade(trade) -- событие продажа table.sinsert(PRIORITET_JOB, 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 #PRIORITET_JOB == 0 then -- обработка событий обычного приоритета ProcessingCallbakc(NORMAL_JOB[1]) -- вызов функции обработки событий обычного приоритета table.sremove(NORMAL_JOB, 1) -- удаление обработанного события из таблицы (удаляется строка) message("Размер общей очереди " .. tostring(#NORMAL_JOB)) -- преобразует в строку размер таблицы NORMAL_JOB - список НЕ приоритетных событий elseif #PRIORITET_JOB > 0 then -- обработка событий Высокого приоритета ProcessingOnTrade(PRIORITET_JOB[1]) -- вызов функции обработки событий высокого приоритета table.sremove(PRIORITET_JOB, 1) -- удаление обработанного события из таблицы (удаляется строка) message("Размер очереди сделок " .. tostring(#PRIORITET_JOB)) -- преобразует в строку размер таблицы NORMAL_JOB - список приоритетных событий 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 Обсуждение этого торгового робота