Последовательность поступления индексов в callback для источника данных (выбор архитектуры скрипта)

Страницы: 1
RSS
Последовательность поступления индексов в callback для источника данных (выбор архитектуры скрипта), Поступают в строгом порядке или это не гарантируется?
 
Добрый день!

На текущий момент есть реализованный скрипт на Lua, но недавно задался вопросом правильности его архитектурной реализации.

Основной  принцип работы скрипта заключается в создании источника данных через  функцию CreateDataSource() и обработка поступающих индексов для расчета  индикаторов и принятия торгового решения.
При запуске скрипта  реализуется проход по истории всех индексов в источнике данных - это  реализовано самой платформой QUIK через последовательные вызовы callback() функции для всех индексов. Функция callback() - это просто  функция, которой передается индекс. При условии, что свеча пока не  закрылась может происходить множественный вызов функции callback() с  одним и тем же индексом.


Перед началом торговой сессии при  запуске скрипта необходимо произвести последовательный расчет всех  индексов, чтобы принять правильное решение. Сейчас я доверяю QUIK и его логике последовательного вызова callback() функции для всех индексов из источника данных. При НЕпоследовательном  поступлении индексов нельзя корректно рассчитать значения индикаторов.

В документации не нашел упоминания о последовательности поступления индексов в callback функцию.
То есть, индексы в callback() функцию поступают в строгом последовательном порядке или это не гарантируется?

Если  принять, что индексы потенциально могут поступать в callback() функцию в  произвольном порядке, то гарантируется только размер источника данных -  ds:Size(). То есть, нужно реагировать на изменение размера источника  данных, а не на вызов callback() функции, так как индекс может быть  старым.
Исходя из описанного выше встает вопрос выбора архитектуры скрипта (ниже приведу 2 варианта в псевдокоде для простоты):

Вариант 1 - Доверяем последовательности индексов

Код
is_run = false

function OnInit(script)
 is_run = true
end

function OnStop()
 is_run = false
end


function cb_for_ds(index)
-- получение нового индекса и его обработка, 
   if (last_processing_index>0 and ds:Size()>0 and last_processing_index< ds:Size()-1) then
      full_processing(index)
   end
end

function full_processing(index)
-- здесь выполняется тяжелая логика обработки нового индекса из источника данных с расчетом индикаторов и т.д. 
   
end


function main()
 
    ds = CreateDataSource("SPBFUT", "RIU3", INTERVAL_M1)
    ds: SetUpdateCallback (cb_for_ds)

    while is_run do
 
   sleep(100)
    end
end



Вариант 2 - Нельзя доверять порядку индексов,  поступающих в  функцию callback. Надо самим контролировать  последовательность обработки.
Код
last_processing_index=0
is_run = false

function OnInit(script)
 is_run = true
end

function OnStop()
 is_run = false
end


function cb_for_ds( index )
-- получение нового индекса и выставление флага
   if (last_processing_index>0 and ds:Size()>0 and last_processing_index< ds:Size()-1) then
      get_new_index = true
   end
end

function full_processing()
-- здесь выполняется тяжелая логика обработки индекса (last_processing_index+1) из источника данных с расчетом индикаторов и т.д. 
   
   if (last_processing_index == (ds:Size()-1)) then
      return
   end
   
   new_processing_index = last_processing_index+1
   . . .
   . . .
   last_processing_index= new_processing_index
end


function main()
 
    ds = CreateDataSource("SPBFUT", "RIU3", INTERVAL_M1)
    ds: SetUpdateCallback (cb_for_ds)

    while is_run do
 
   if (get_new_index == true) then
      full_processing()
   end

   sleep(100)
    end
end




Вопрос:

Гарантируется ли строгий  линейный порядок поступления индексов источника данных в callback()  функцию или вызов callback()-функции стоит рассматривать только как  событие выставления флага, после которого необходимо проверить реальное  поступление нового индекса (через увеличение размера) и потом его  обработать?


Любые комментарии и ссылки на документацию будут полезны.
Благодарю заранее за ответы!
 
У меня I в колбэках всегда формировали неубывающую последовательность, покуда не происходит новый коннект к серверу, тогда I становилась равна 1 на первой свече обновлённого из-за реконнекта датасорса и далее росла заново.

Время свечей при этом не всегда формирует неубывающую последовательность, т.к. в archive/*.dat файлах, которые формируют историческую часть датасорса, могут быть свечи с одинаковым временем. Но это зависит от брокера и того, как он формирует эти архивные файлы. Я такое только на индикативных данных видел, которые транслируются с иностранных бирж.
Страницы: 1
Читают тему
Наверх