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

Материал из ТХАБ.РФ
Перейти к: навигация, поиск
м
м (Код Торгового робота)
Строка 5: Строка 5:
 
  --Обработка событий РМ QUIK в функции main() посредством очереди FIFO
 
  --Обработка событий РМ QUIK в функции main() посредством очереди FIFO
 
  --с выделением приоритета OnTrade и фильтрации OnQuote
 
  --с выделением приоритета OnTrade и фильтрации OnQuote
  function OnInit(script)
+
  -- Функции вызываемые в основном потоке (тормозят QUIK)
 +
  function OnInit(script) -- инициализация переменных скрипта
 
   is_run = true
 
   is_run = true
   MAIN_QUEUE = {}
+
   NORMAL_JOB = {} -- таблица очередь обработки событий обычного приоритета
   MAIN_QUEUE_TRADES = {}
+
   MAIN_QUEUE_TRADES = {} -- таблица очередь обработки событий высокого приоритета
 
  end
 
  end
  function OnOrder(order)
+
-- Функции обработки событий - Основной поток
   table.sinsert(MAIN_QUEUE, {callback = "OnOrder", value = order})
+
  function OnOrder(order) -- Событие  заказ
 +
   table.sinsert(NORMAL_JOB, {callback = "OnOrder", value = order})
 
  end
 
  end
  function OnTrade(trade)
+
  function OnTrade(trade) -- событие продажа
 
   table.sinsert(MAIN_QUEUE_TRADES, trade)
 
   table.sinsert(MAIN_QUEUE_TRADES, trade)
 
  end
 
  end
  
  function OnAllTrade(all_trade)
+
  function OnAllTrade(all_trade)  
   table.sinsert(MAIN_QUEUE, {callback = "OnAllTrade", value = all_trade})
+
   table.sinsert(NORMAL_JOB, {callback = "OnAllTrade", value = all_trade})
 
  end
 
  end
 
  function OnQuote(class_code, sec_code)
 
  function OnQuote(class_code, sec_code)
 
   if class_code == "SPBFUT" then
 
   if class_code == "SPBFUT" then
 
   local quote = getQuoteLevel2(class_code, sec_code)
 
   local quote = getQuoteLevel2(class_code, sec_code)
   table.sinsert(MAIN_QUEUE, {callback = "OnQuote", value = quote})
+
   table.sinsert(NORMAL_JOB, {callback = "OnQuote", value = quote})
 
   end
 
   end
 
  end
 
  end
  function OnStop()
+
  function OnStop() -- Событие - нажата кнопка остановки скрипта
 
   is_run = false
 
   is_run = false
 
   return 2000
 
   return 2000
 
  end
 
  end
 +
-- Дополнительный поток
 
  function main()
 
  function main()
   while is_run do
+
   while is_run do -- основной цикл Дополнительного потока
   if #MAIN_QUEUE > 0 and #MAIN_QUEUE_TRADES == 0 then
+
   if #NORMAL_JOB > 0 and #MAIN_QUEUE_TRADES == 0 then -- обработка событий обычного приоритета
     ProcessingCallbakc(MAIN_QUEUE[1])
+
     ProcessingCallbakc(NORMAL_JOB[1]) -- вызов функции обработки событий обычного приоритета
     table.sremove(MAIN_QUEUE, 1)
+
     table.sremove(NORMAL_JOB, 1) -- удаление обработанного события из таблицы (удаляется строка)
 
     message("Размер общей очереди " .. tostring(#MAIN_QUEUE))
 
     message("Размер общей очереди " .. tostring(#MAIN_QUEUE))
     elseif #MAIN_QUEUE_TRADES > 0 then
+
     elseif #MAIN_QUEUE_TRADES > 0 then -- обработка событий Высокого приоритета
    ProcessingOnTrade(MAIN_QUEUE_TRADES[1])
+
      ProcessingOnTrade(MAIN_QUEUE_TRADES[1]) -- вызов функции обработки событий высокого приоритета
     table.sremove(MAIN_QUEUE_TRADES, 1)
+
     table.sremove(MAIN_QUEUE_TRADES, 1) -- удаление обработанного события из таблицы (удаляется строка)
 
     message("Размер очереди сделок " .. tostring(#MAIN_QUEUE_TRADES))
 
     message("Размер очереди сделок " .. tostring(#MAIN_QUEUE_TRADES))
 
   end
 
   end
 
   end
 
   end
 
  end
 
  end
 
+
-- Функции вызываемые в дополнительном потоке (не тормозят QUIK)
  function ProcessingCallbakc(value)
+
  function ProcessingCallbakc(value) -- функция обработки событий обычного приоритета
 
   message(string.format("Обработка события %s начата", value.callback))
 
   message(string.format("Обработка события %s начата", value.callback))
 
   sleep(3000) --эмуляция продолжительного алгоритма обработки события
 
   sleep(3000) --эмуляция продолжительного алгоритма обработки события
Строка 50: Строка 53:
 
  end
 
  end
 
   
 
   
  function ProcessingOnTrade(trade)
+
  function ProcessingOnTrade(trade) -- функция обработки событий высокого приоритета
 
   message(string.format("Обработка сделки №%s начата", trade.trade_num))
 
   message(string.format("Обработка сделки №%s начата", trade.trade_num))
 
   sleep(3000) --эмуляция продолжительного алгоритма обработки сделки
 
   sleep(3000) --эмуляция продолжительного алгоритма обработки сделки
 
   message(string.format("Обработка сделки №%s завершена", trade.trade_num))
 
   message(string.format("Обработка сделки №%s завершена", trade.trade_num))
 
  end
 
  end
 
 
  
 
== См. также ==
 
== См. также ==

Версия 21:00, 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 = {} -- таблица очередь обработки событий обычного приоритета
  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

См. также

Ссылки