Получать обновления стакана без его открытия в КВИКе

Страницы: 1
RSS
Получать обновления стакана без его открытия в КВИКе
 
Правильно ли я понимаю, что единственный способ для этого:
1) подписаться через IsSubscribed_Level_II_Quotes
2) в цикле гонять getQuoteLevel2

потому что без цикла у меня всего лишь 1 раз данные приходят
 
Здравствуйте,
Если getQuoteLevel2 вызывать в колбеке OnQuote, то цикл гонять не потребуется
 
Спасибо!
Проблема была в регистре, не заметил, что с маленькой буквы писал.
 
Столкнулся с проблемой рассинхрона по времени между QUIK/сервера и реальным.
Порой он достигает нескольких минут. То есть при работающем скрипте внизу QUIK в строке "время сервера" показыает время на несколько минут меньше текущего (и, соотвественно, приходящие данные получаются не совсем актульаными по времени).
При этом по диспетчеру задач QUIK задействует в районе 50% процессора. Но сам QUIK практически намертво замирает, когда работает скрипт (реагируют на нажатия  вечность)
Запускается и пишется всё на ssd.

Что именно делаю: записываю в txt файл (для каждого инструмента - в свой) весь стакан по 50 наиболее ликвидным акциям и 10 фьючам. То есть открываю файл, пишу стакан, закрываю файл (закрывать надо, так как есть проблемы с постояннством работы компа). И так на каждое изменение стакана.

В чём может быть проблема?
Как можно её решить?
Ну и может по коду что изменить/оптимизировать?
Код
local classCode = "TQBR"
local secCode = {}

local classCode2 = "SPBFUT"
local secCode2 = {}

stopped = true

function OnStop()
   
   for i,value in ipairs(secCode) do
      Unsubscribe_Level_II_Quotes(classCode, value)
      message("TQBR is UNsubscribed")
      
   end

   for i,value in ipairs(secCode2) do
      Unsubscribe_Level_II_Quotes(classCode2, value)
      message("SPBFUT is UNsubscribed")
   end

   end
   
   stopped = false
end

function  main()
   while stopped do end
end


for i,value in ipairs(secCode) do
   Subscribe_Level_II_Quotes(classCode, value)
end

for i,value in ipairs(secCode2) do
   Subscribe_Level_II_Quotes(classCode2, value)
end



function OnQuote(classCode, secCode)
   if classCode == "TQBR" then
   
      tb=getQuoteLevel2(classCode, secCode)

      bid = tb.bid
      ask = tb.offer
      file = io.open("тут_путь"..secCode..".txt", "a+")
      
      file:write(os.date("%c") .. ";")
      
      for v = tonumber(tb.offer_count), 1, -1 do
         file:write(ask[v].quantity .. ";")
      end
      
      for v = tonumber(tb.bid_count), 1, -1 do
         file:write(bid[v].quantity .. ";")
      end
      
      for v = tonumber(tb.offer_count), 1, -1 do
         file:write(ask[v].price .. ";")
      end
      
      for v = tonumber(tb.bid_count), 1, -1 do
         file:write(bid[v].price .. ";")
      end
      
      file:write("\n")
      
      file:close()
   
   elseif classCode == "SPBFUT" then 
   
      tb=getQuoteLevel2(classCode, secCode)

      bid = tb.bid
      ask = tb.offer
      file = io.open("тут_путь"..secCode..".txt", "a+")
      
      file:write(os.date("%c") .. ";")
      
      for v = tonumber(tb.offer_count), 1, -1 do
         file:write(ask[v].quantity .. ";")
      end
      
      for v = tonumber(tb.bid_count), 1, -1 do
         file:write(bid[v].quantity .. ";")
      end
      
      for v = tonumber(tb.offer_count), 1, -1 do
         file:write(ask[v].price .. ";")
      end
      
      for v = tonumber(tb.bid_count), 1, -1 do
         file:write(bid[v].price .. ";")
      end
      
      file:write("\n")
      
      file:close()
      
   end
   
end
 
Пока додумался только в рамках getQuoteLevel2 сначала всё писать в одну переменную, а затем её в файл. Посмотрим, будет ли от этого толк, так как вычитал инфу: "поскольку строки в Lua неизменяемы, каждая конкатенация создает новый строковый объект и копирует данные из исходных строк в него. Это приводит к тому, что последовательные конкатенации в одну строку имеют очень низкую производительность."
Есть ещё пара идей на проверку:
1) если от конкатенации будет толк, то попробовать писать не каждый слепок, а раз в N промежуток времени/N слепков
2) писать сначала в массив (тем самым устранить потенциально низкую проблемы с производительностью при конкатенации), затем раз в N промежуток времени/N длину массива читать его и писать в файл
3) подцепить какую-либо БД и писать сразу в неё, но пока не нашёл чёткого HOW TO. Буду рад за ссылку, если таковой есть.
 
Цитата
maxim написал:
В чём может быть проблема?

Все колбеки LUA работают в главном потоке терминала.
Следовательно пока колбек не завершит работу, терминал будет висеть.
Чтобы убедиться в этом, можете для эксперимента, добавить в любой колбек бесконечный цикл и терминал повиснет намертво.
Вам нужно максимально минимизировать время обработки колбека OnQuote, как минимум убрать повторения одинаковых циклов и рассмотреть варианты минимизации записи в файл, например в цикле формировать переменную а записывать в файл уже после цикла.

Ну или в функции main
Цитата
maxim написал:
2) в цикле гонять getQuoteLevel2
Страницы: 1
Читают тему
Наверх