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

Материал из ТХАБ.РФ
Перейти к: навигация, поиск
м (Код Торгового робота)
м (Код Торгового робота)
Строка 9: Строка 9:
 
   is_run = true
 
   is_run = true
 
   NORMAL_JOB = {} -- таблица очередь обработки событий обычного приоритета
 
   NORMAL_JOB = {} -- таблица очередь обработки событий обычного приоритета
   MAIN_QUEUE_TRADES = {} -- таблица очередь обработки событий высокого приоритета
+
   PRIORITET_JOB = {} -- таблица очередь обработки событий высокого приоритета
 
  end
 
  end
 
  -- Функции обработки событий - Основной поток
 
  -- Функции обработки событий - Основной поток
Строка 16: Строка 16:
 
  end
 
  end
 
  function OnTrade(trade) -- событие продажа
 
  function OnTrade(trade) -- событие продажа
   table.sinsert(MAIN_QUEUE_TRADES, trade)
+
   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 #MAIN_QUEUE_TRADES == 0 then -- обработка событий обычного приоритета
+
   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(#MAIN_QUEUE))
+
     message("Размер общей очереди " .. tostring(#NORMAL_JOB)) -- преобразует в строку размер таблицы NORMAL_JOB - список НЕ приоритетных событий
     elseif #MAIN_QUEUE_TRADES > 0 then -- обработка событий Высокого приоритета
+
     elseif #PRIORITET_JOB > 0 then -- обработка событий Высокого приоритета
       ProcessingOnTrade(MAIN_QUEUE_TRADES[1]) -- вызов функции обработки событий высокого приоритета
+
       ProcessingOnTrade(PRIORITET_JOB[1]) -- вызов функции обработки событий высокого приоритета
     table.sremove(MAIN_QUEUE_TRADES, 1) -- удаление обработанного события из таблицы (удаляется строка)
+
     table.sremove(PRIORITET_JOB, 1) -- удаление обработанного события из таблицы (удаляется строка)
     message("Размер очереди сделок " .. tostring(#MAIN_QUEUE_TRADES))
+
     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

См. также

Ссылки