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

Материал из ТХАБ.РФ
Перейти к: навигация, поиск

Описание

В данном примере мы добавили новую 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


См. также

Ссылки