Добрый день!
На текущий момент есть реализованный скрипт на Lua, но недавно задался вопросом правильности его архитектурной реализации.
Основной принцип работы скрипта заключается в создании источника данных через функцию CreateDataSource() и обработка поступающих индексов для расчета индикаторов и принятия торгового решения.
При запуске скрипта реализуется проход по истории всех индексов в источнике данных - это реализовано самой платформой QUIK через последовательные вызовы callback() функции для всех индексов. Функция callback() - это просто функция, которой передается индекс. При условии, что свеча пока не закрылась может происходить множественный вызов функции callback() с одним и тем же индексом.
Перед началом торговой сессии при запуске скрипта необходимо произвести последовательный расчет всех индексов, чтобы принять правильное решение. Сейчас я доверяю QUIK и его логике последовательного вызова callback() функции для всех индексов из источника данных. При НЕпоследовательном поступлении индексов нельзя корректно рассчитать значения индикаторов.
В документации не нашел упоминания о последовательности поступления индексов в callback функцию.
То есть, индексы в callback() функцию поступают в строгом последовательном порядке или это не гарантируется?
Если принять, что индексы потенциально могут поступать в callback() функцию в произвольном порядке, то гарантируется только размер источника данных - ds:Size(). То есть, нужно реагировать на изменение размера источника данных, а не на вызов callback() функции, так как индекс может быть старым.
Исходя из описанного выше встает вопрос выбора архитектуры скрипта (ниже приведу 2 варианта в псевдокоде для простоты):
Вариант 1 - Доверяем последовательности индексов
Вариант 2 - Нельзя доверять порядку индексов, поступающих в функцию callback. Надо самим контролировать последовательность обработки.
Вопрос:
Гарантируется ли строгий линейный порядок поступления индексов источника данных в callback() функцию или вызов 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()-функции стоит рассматривать только как событие выставления флага, после которого необходимо проверить реальное поступление нового индекса (через увеличение размера) и потом его обработать?
Любые комментарии и ссылки на документацию будут полезны.
Благодарю заранее за ответы!