Торговый робот с приоритетами обработки потоков (заготовка)

Материал из ТХАБ.РФ
Версия от 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

См. также

Ссылки