Повторная подписка на свечи через CreateDataSource не работает на версии 9.2.3.15

Страницы: 1
RSS
Повторная подписка на свечи через CreateDataSource не работает на версии 9.2.3.15
 
Здравствуйте!
Заметил что на указанной версии не работает повторная подписка на обновления свечей через CreateDataSource + SetUpdateCallback
Брокер ВТБ
Ниже код для воспроизведения.
Выполняеем подписку на свечи SiH2, ожидаем получения 10 обновлений, затем отписываемся, и через небольшую паузу снова подписываемся.
В первый раз свечи приходят.
Во второй раз никаких вызовов коллбэка не происходит.


Я что-то не так делаю?
Это известный баг?
Есть способы обхода?
Уже исправлено в какой-то версии?

Код
run = true
ds = nil
datacounter = 0
recreatecounter = 0

--<BODY
message("started.")
--BODY>

function OnStop()
   run = false
end

function main()
   createds()
   
   while run do
      sleep(1000)
      message("running")
      
      if recreatecounter >= 1 then
         recreatecounter = recreatecounter + 1
         
         if recreatecounter >= 3 then
            recreatecounter = 0
            createds()
         end
      end
   end
end

function createds()
   message("creating ds")
   datacounter = 0
   ds, err = CreateDataSource("SPBFUT", "SiH2", INTERVAL_M5)
   
   if err ~= "" and err ~= nil then
      message("CreateDataSource error: "..err)
   end
   
   message("CreateDataSource OK")
   ds:SetUpdateCallback(mycb)
end

function mycb(index)
   message('got data: idx=' .. index .. ", close=" .. ds:C(index));

   datacounter = datacounter + 1
   if datacounter >= 10 then
      message('closing');
      ds:Close()
      ds = nil
      recreatecounter = 1
   end
end

 
Цитата
Сергей написал:
способы обхода
Когда временно не нужны данные, можно на датасорце вызвать SetEmptyCallback, когда снова понадобились - SetUpdateCallback. Датасорец оставлять до закрытия скрипта или до когда уже точно больше не понадобится. Оно даже на баг не похоже, а больше похоже на защиту от желающих задудосить сервер.
 
Вопрос целесообразности подписки на колбек.
Если - это необходимо для получения цены сделки внутри бара, то это не лучшая идея, т.к. этот колбек медленный и будут пропуски.А если это для того, чтобы узнать, что пришел новый бар, то не проще ли запомнить прошлый Size и сравнить с новым. Когда придет тогда и делать что-то. А так колбек будет дергаться много раз, ради одного события.
 
Цитата
Anton написал:
Оно даже на баг не похоже, а больше похоже на защиту от желающих задудосить сервер.
Да нет, сам датасорс обновляется,, но колбек действительно не вызывается.
Надо делать так, как надо. А как не надо - делать не надо.
 
Nikolay,
Цитата
Вопрос целесообразности подписки на колбек.
Ответ: целесообразно. :smile:

1. За получение цены сделки внутри бара полагается расстрел на месте.
2. Коллбеки при работе со свечами нужны ТОЛЬКО для того, чтобы даже не "узнавать, что пришёл новый бар", а получить его сразу по приходу (аналогичная задача у коллбека OnTrade).
3. За расчёт свечей на клиенте по ТОС см. пункт первый.
4. Заменить эту японскую гадость на нормальные свечи, которые имеют только ОДНО значение, рассчитываемое из тиков по формуле:
V=(N1*P1+N2*P2+...+Ni*Pi)/(N1+N2+...+Ni)
В этом случае сюда органично впишутся и объёмы, повышая достоверность информации, а не замыливая её.
5. Всё это я описал для случая нормальной организации, а то, что есть, лучше всего отправить оптом на помойку.
 
Разработчики терминала, вы планируете исправление бага?
 
Цитата
Сергей написал:
Здравствуйте!
Заметил что на указанной версии не работает повторная подписка на обновления свечей через CreateDataSource + SetUpdateCallback
Брокер ВТБ
Ниже код для воспроизведения.
Выполняеем подписку на свечи SiH2, ожидаем получения 10 обновлений, затем отписываемся, и через небольшую паузу снова подписываемся.
В первый раз свечи приходят.
Во второй раз никаких вызовов коллбэка не происходит.


Я что-то не так делаю?
Это известный баг?
Есть способы обхода?
Уже исправлено в какой-то версии?

Код
  run  =   true 
ds  =   nil 
datacounter  =   0 
recreatecounter  =   0 

 --<BODY 
 message ( "started." )
 --BODY> 

 function   OnStop ()
   run  =   false 
 end 

 function   main ()
   createds()
   
    while  run  do 
       sleep ( 1000 )
       message ( "running" )
      
       if  recreatecounter  >  =   1   then 
         recreatecounter  =  recreatecounter  +   1 
         
          if  recreatecounter  >  =   3   then 
            recreatecounter  =   0 
            createds()
          end 
       end 
    end 
 end 

 function   createds ()
    message ( "creating ds" )
   datacounter  =   0 
   ds, err  =   CreateDataSource ( "SPBFUT" ,  "SiH2" , INTERVAL_M5)
   
    if  err ~ =   ""   and  err ~ =   nil   then 
       message ( "CreateDataSource error: "  .. err)
    end 
   
    message ( "CreateDataSource OK" )
   ds: SetUpdateCallback (mycb)
 end 

 function   mycb (index)
    message ( 'got data: idx='   ..  index  ..   ", close="   ..  ds:C(index));

   datacounter  =  datacounter  +   1 
    if  datacounter  >  =   10   then 
       message ( 'closing' );
      ds: Close ()
      ds  =   nil 
      recreatecounter  =   1 
    end 
 end 

  

Здравствуйте!
Ваше письмо получено, проблема изучается. Постараемся в ближайшее время дать ответ.
 
Цитата
Сергей написал:
Разработчики терминала, вы планируете исправление бага?
Добрый день,

Описанная в данном обращении проблема будет устранена в одной из очередных версий ПО. Приносим извинения за причиненные неудобства.

 
Мда... большая текучка кадров в Арке...
Страницы: 1
Читают тему
Наверх