Добрый день!
На текущий момент есть реализованный скрипт на 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()-функции стоит рассматривать только как событие выставления флага, после которого необходимо проверить реальное поступление нового индекса (через увеличение размера) и потом его обработать?
Любые комментарии и ссылки на документацию будут полезны.
Благодарю заранее за ответы!