Торговый робот с приоритетами обработки потоков (заготовка) — различия между версиями

Материал из ТХАБ.РФ
Перейти к: навигация, поиск
(Новая страница: « == См. также == * Облигационный торговый робот == Ссылки == * 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


См. также

Ссылки