<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>Форум QUIK [тема: Последовательность поступления индексов в callback для источника данных  (выбор архитектуры скрипта)]</title>
		<link>http://forum.quik.ru</link>
		<description>Новое в теме Последовательность поступления индексов в callback для источника данных  (выбор архитектуры скрипта) форума  на сайте Форум QUIK [forum.quik.ru]</description>
		<language>ru</language>
		<docs>http://backend.userland.com/rss2</docs>
		<pubDate>Mon, 27 Apr 2026 07:27:01 +0300</pubDate>
		<item>
			<title>Последовательность поступления индексов в callback для источника данных  (выбор архитектуры скрипта)</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message72186/topic8276/">Последовательность поступления индексов в callback для источника данных  (выбор архитектуры скрипта)</a></b> <i>Поступают в строгом порядке или это не гарантируется?</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			У меня I в колбэках всегда формировали неубывающую последовательность, покуда не происходит новый коннект к серверу, тогда I становилась равна 1 на первой свече обновлённого из-за реконнекта датасорса и далее росла заново.<br /><br />Время свечей при этом не всегда формирует неубывающую последовательность, т.к. в archive/*.dat файлах, которые формируют историческую часть датасорса, могут быть свечи с одинаковым временем. Но это зависит от брокера и того, как он формирует эти архивные файлы. Я такое только на индикативных данных видел, которые транслируются с иностранных бирж. <br />
			<i>05.10.2023 14:16:16, funduk.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message72186/topic8276/</link>
			<guid>http://forum.quik.ru/messages/forum10/message72186/topic8276/</guid>
			<pubDate>Thu, 05 Oct 2023 14:16:16 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Последовательность поступления индексов в callback для источника данных  (выбор архитектуры скрипта)</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message72185/topic8276/">Последовательность поступления индексов в callback для источника данных  (выбор архитектуры скрипта)</a></b> <i>Поступают в строгом порядке или это не гарантируется?</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Добрый день!<br /><br />На текущий момент есть реализованный скрипт на Lua, но недавно задался вопросом правильности его архитектурной реализации. <br /><br />Основной &nbsp;принцип работы скрипта заключается в создании источника данных через &nbsp;функцию CreateDataSource() и обработка поступающих индексов для расчета &nbsp;индикаторов и принятия торгового решения.<br />При запуске скрипта &nbsp;реализуется проход по истории всех индексов в источнике данных - это &nbsp;реализовано самой платформой QUIK через последовательные вызовы callback() функции для всех индексов. Функция callback() - это просто &nbsp;функция, которой передается индекс. При условии, что свеча пока не &nbsp;закрылась может происходить множественный вызов функции callback() с &nbsp;одним и тем же индексом. <br /><br /><br />Перед началом торговой сессии при &nbsp;запуске скрипта необходимо произвести последовательный расчет всех &nbsp;индексов, чтобы принять правильное решение. Сейчас я доверяю QUIK и его логике последовательного вызова callback() функции для всех индексов из источника данных. При НЕпоследовательном &nbsp;поступлении индексов нельзя корректно рассчитать значения индикаторов. <br /> <br />В документации не нашел упоминания о последовательности поступления индексов в callback функцию. <br />То есть, индексы в callback() функцию поступают в строгом последовательном порядке или это не гарантируется?<br /><br />Если &nbsp;принять, что индексы потенциально могут поступать в callback() функцию в &nbsp;произвольном порядке, то гарантируется только размер источника данных - &nbsp;ds:Size(). То есть, нужно реагировать на изменение размера источника &nbsp;данных, а не на вызов callback() функции, так как индекс может быть &nbsp;старым.<br />Исходя из описанного выше встает вопрос выбора архитектуры скрипта (ниже приведу 2 варианта в псевдокоде для простоты):<br /><br /><B>Вариант 1 - Доверяем последовательности индексов</B><br /><br />
====code====
<pre>is_run = false

function OnInit(script)
 is_run = true
end

function OnStop()
 is_run = false
end


function cb_for_ds(index)
-- получение нового индекса и его обработка, 
&nbsp;&nbsp;&nbsp;if (last_processing_index&#62;0 and ds:Size()&#62;0 and last_processing_index&#60; ds:Size()-1) then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;full_processing(index)
&nbsp;&nbsp;&nbsp;end
end

function full_processing(index)
-- здесь выполняется тяжелая логика обработки нового индекса из источника данных с расчетом индикаторов и т.д. 
&nbsp;&nbsp;&nbsp;
end


function main()
 
&nbsp;&nbsp;&nbsp;&nbsp;ds = CreateDataSource("SPBFUT", "RIU3", INTERVAL_M1)
&nbsp;&nbsp;&nbsp;&nbsp;ds: SetUpdateCallback (cb_for_ds)

&nbsp;&nbsp;&nbsp;&nbsp;while is_run do
 
&nbsp;&nbsp;&nbsp;sleep(100)
&nbsp;&nbsp;&nbsp;&nbsp;end
end

</pre>
=============
<br /><br /><B>Вариант 2 - Нельзя доверять порядку индексов, &nbsp;поступающих в &nbsp;функцию callback. Надо самим контролировать &nbsp;последовательность обработки.</B>
====code====
<pre>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 )
-- получение нового индекса и выставление флага
&nbsp;&nbsp;&nbsp;if (last_processing_index&#62;0 and ds:Size()&#62;0 and last_processing_index&#60; ds:Size()-1) then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;get_new_index = true
&nbsp;&nbsp;&nbsp;end
end

function full_processing()
-- здесь выполняется тяжелая логика обработки индекса (last_processing_index+1) из источника данных с расчетом индикаторов и т.д. 
&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;if (last_processing_index == (ds:Size()-1)) then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return
&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;new_processing_index = last_processing_index+1
&nbsp;&nbsp;&nbsp;. . .
&nbsp;&nbsp;&nbsp;. . .
&nbsp;&nbsp;&nbsp;last_processing_index= new_processing_index
end


function main()
 
&nbsp;&nbsp;&nbsp;&nbsp;ds = CreateDataSource("SPBFUT", "RIU3", INTERVAL_M1)
&nbsp;&nbsp;&nbsp;&nbsp;ds: SetUpdateCallback (cb_for_ds)

&nbsp;&nbsp;&nbsp;&nbsp;while is_run do
 
&nbsp;&nbsp;&nbsp;if (get_new_index == true) then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;full_processing()
&nbsp;&nbsp;&nbsp;end

&nbsp;&nbsp;&nbsp;sleep(100)
&nbsp;&nbsp;&nbsp;&nbsp;end
end

</pre>
=============
<br /><br /><br /><B>Вопрос:</B> <br /><br />Гарантируется ли строгий &nbsp;линейный порядок поступления индексов источника данных в callback() &nbsp;функцию или вызов callback()-функции стоит рассматривать только как &nbsp;событие выставления флага, после которого необходимо проверить реальное &nbsp;поступление нового индекса (через увеличение размера) и потом его &nbsp;обработать? <br /><br /><br />Любые комментарии и ссылки на документацию будут полезны.<br />Благодарю заранее за ответы! <br />
			<i>05.10.2023 14:05:59, Blackninja.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message72185/topic8276/</link>
			<guid>http://forum.quik.ru/messages/forum10/message72185/topic8276/</guid>
			<pubDate>Thu, 05 Oct 2023 14:05:59 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
	</channel>
</rss>
