<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>Форум QUIK [тема: Распределенность обработки вызовов OnOrder]</title>
		<link>http://forum.quik.ru</link>
		<description>Новое в теме Распределенность обработки вызовов OnOrder форума  на сайте Форум QUIK [forum.quik.ru]</description>
		<language>ru</language>
		<docs>http://backend.userland.com/rss2</docs>
		<pubDate>Sun, 19 Apr 2026 11:43:12 +0300</pubDate>
		<item>
			<title>Распределенность обработки вызовов OnOrder</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message26416/topic3027/">Распределенность обработки вызовов OnOrder</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			поделюсь своим решением.<br />обрабатываю в колбеке.<br /> В таблице пассивные заявки удаляю. в колбеке обрабатываю все приходы и мне безразлично сколько их.<br />-----------------<br />обрабатывал и в майн.<br />=================== <br />Последний вариант - один колбек на все скрипты.<br /> т е роботов много, но колбеков по одному для каждого вида (заявки, сделки, стаканы и т д) <br />
			<i>27.08.2017 06:58:44, Николай  Камынин.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message26416/topic3027/</link>
			<guid>http://forum.quik.ru/messages/forum10/message26416/topic3027/</guid>
			<pubDate>Sun, 27 Aug 2017 06:58:44 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Распределенность обработки вызовов OnOrder</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message26414/topic3027/">Распределенность обработки вызовов OnOrder</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Чтобы уж точно не зависеть от того в одном потоке исполняются колбеки или в нескольких, я не обрабатываю в них информацию, а только фильтрую нужные и ставлю их в очередь. Обработкой же занимается исключительно поток main в той очередности, в какой были вызваны соответствующие колбеки (OnTransReply, OnOrder, OnTrade). При этом я не отбраковываю OnOrder с неизвестными trans_id и uid, т.к. к моменту их прихода зачастую уже известно соответствие order_num и trans_id из ранее пришедших OnTrade или OnTransReply.<br />Что касается редких парных (в единичных случаях тройных) вызовов OnOrder при снятии заявки, то по анализу моих логов выходит, что в первом (втором) из них всегда не достает какой-нибудь информации и лишь в последнем имеется все информация, а именно: uid, trans_id, flags - заявка неактивна-снята, &quot;правильный&quot; balance (соответствует ранее пришедшим OnTrade и OnTransReply на снятие заявки), withdraw_datetime, canceled_uid. Бывает, что приходит canceled_uid - заполнен, а withdraw_datetime - еще нет, хотя OnTransReply для транзакции на снятие заявки с успешным статусом уже пришел. Вот когда все эти поля заполнены - тогда мой алгоритм считает, что пришел последний OnOrder о снятии заявки.<br /> &nbsp; <br />
			<i>27.08.2017 02:41:37, Алексей.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message26414/topic3027/</link>
			<guid>http://forum.quik.ru/messages/forum10/message26414/topic3027/</guid>
			<pubDate>Sun, 27 Aug 2017 02:41:37 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Распределенность обработки вызовов OnOrder</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message26410/topic3027/">Распределенность обработки вызовов OnOrder</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<a class="blog-p-user-name" id="bp_4LFXT9Tq" href="/user/17/" bx-tooltip-user-id="17">Sergey Gorokhov</a>, <br /><br />Такой вариант я анализировал.<br />Даже если брать в расчет ситуацию прихода двух вызовов: первый - "сырой" (с отсутствующими uid и trans_id), второй - нормальный (с проставленными uid и trans_id), то в моем скрипте на обработку в теле OnOrder() будет допущен лишь второй вызов, так как первый, ввиду отсутствия uid и trans_id, будет отбракован. То есть, обработка в любом случае будет происходить один раз. До сегодняшнего дня все было нормально: трассировка показывала однократное исполнение OnOrder() в случае, когда flags в пришедшей записи указывает, что заявка снята. Это логично: если заявка снята, то биржа с ней ничего уже делать не будет, так как сама заявка уже отправлена в архив. Что может сделать сервер QUIK, стоящий у брокера, после получения от биржи записи о том, что заявка снята? Если я правильно понимаю, то только одну вещь: поместить заявку в архив как снятую и неактивную и выслать соответствующее уведомление на рабочее место QUIK. Пусть даже это уведомление и будет в виде двух вышеуказанных вызовов - "сырого" и нормального.<br />Но казус проявился в двукратном срабатывании кода OnOrder(), как если бы ее вызвали одновременно из двух разных потоков.. <br />
			<i>25.08.2017 19:55:27, Andrei2016.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message26410/topic3027/</link>
			<guid>http://forum.quik.ru/messages/forum10/message26410/topic3027/</guid>
			<pubDate>Fri, 25 Aug 2017 19:55:27 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Распределенность обработки вызовов OnOrder</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message26409/topic3027/">Распределенность обработки вызовов OnOrder</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<a class="blog-p-user-name" id="bp_NhaOEhqY" href="/user/62/" bx-tooltip-user-id="62">Николай  Камынин</a>, <br /><br />казус произошел именно при выполнении OnOrder(). Массив, в который вносятся и из которого исключаются заявки по order_num, объявлен локальным для всего скрипта, но затрагивается только в OnOrder(). Поток функции main() с этим массивом не работает.<br />Попробую тестировать еще, так как ранее подобных случаев не наблюдал. <br />
			<i>25.08.2017 19:45:13, Andrei2016.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message26409/topic3027/</link>
			<guid>http://forum.quik.ru/messages/forum10/message26409/topic3027/</guid>
			<pubDate>Fri, 25 Aug 2017 19:45:13 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Распределенность обработки вызовов OnOrder</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message26408/topic3027/">Распределенность обработки вызовов OnOrder</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			для колбеков поток один - это точно.<br />но возможно, что Вы работаете с таблицами в main. Тогда будет два потока.<br />-----------------------------------------<br />проблема может быть в Вашем алгоритме обработки.<br />Чтобы ответить точно, надо видеть как (вернее где) &nbsp;Вы обрабатываете сигналы заявки. <br />
			<i>25.08.2017 18:48:03, Николай  Камынин.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message26408/topic3027/</link>
			<guid>http://forum.quik.ru/messages/forum10/message26408/topic3027/</guid>
			<pubDate>Fri, 25 Aug 2017 18:48:03 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Распределенность обработки вызовов OnOrder</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message26405/topic3027/">Распределенность обработки вызовов OnOrder</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Причем тут потоки не понятно.<br />А Вы не думали что например сервер мог прислать два колбека? <br />
			<i>25.08.2017 15:15:24, Sergey Gorokhov.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message26405/topic3027/</link>
			<guid>http://forum.quik.ru/messages/forum10/message26405/topic3027/</guid>
			<pubDate>Fri, 25 Aug 2017 15:15:24 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Распределенность обработки вызовов OnOrder</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message26404/topic3027/">Распределенность обработки вызовов OnOrder</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Вопрос к разработчикам.<br /><br />Столкнулся с очень странным эффектом при работе callback-функции OnOrder().<br />Картина следующая. Работает скрипт, выставляется заявка, отрабатывает. Далее следуют два вызова OnOrder() в ситуации, когда оба раза флаги показывают, что заявка снята. Но двойной вызов OnOrder() на СНЯТОЙ заявке - это еще ладно, проблема в другом.<br /><br />Суть проблемы.<br />В скрипте создан массив, куда заносятся номера выставленных заявок. После того, как заявка снята, соответствующий элемент с order_num снятой заявки из массива исключается. СУЩЕСТВЕННО: обе операции - и включение в массив заявки , и исключение ее из этого массива происходят именно в OnOrder(), а не где-либо еще в скрипте.<br />Трассируя функцию OnOrder(), обнаружил, что почти мгновенно происходят ДВА ее вызова при снятии заявки ( lags показывает, что заявка снята), но при этом оба вызова, проходя через тело OnOrder(), отрабатывают, как если бы в первом вызове не было указано, что заявка на биржевом сервере уже снята, и она с ее order_num не была бы исключена из массива.<br /><br />Я могу понять такую ситуацию, если допустить что два эти вызова OnOrder() происходят из РАЗНЫХ потоков. Тогда - да, возможна ситуация, что VM LUA еще не успела полностью отработать код OnOrder(), вызванный первым потоком, тогда как сразу же запустилось исполнение экземпляра OnOrder(), созданного для второго потока.<br />Но разработчики QUIK все время говорят, что ВСЕ вызовы callback-функций со стороны терминала происходят исключительно в главном (т.е. одном и том же) потоке терминала. В этом случае описанного мною эффекта достичь не получится, так как обработка второго вызова OnOrder() для уже снятой заявки произойдет только после полного завершения отработки первого вызова OnOrder(), который априори исключит &nbsp;данную заявку по ее order_num из массива.<br /><br />На мой взгляд возможны два варианта:<br />а) вызовы callback-функций, в том числе и OnOrder(), ДЕЙСТВИТЕЛЬНО происходят из разных потоков терминала, а не только из одного единственного &nbsp;- главного; при этом очередность вызовов не предустановлена, и тогда руководство по QLUA и комментарии на форуме от разработчиков вводят нас в явное заблуждение.<br />б) разработчики не знают, какой конкретно поток внутри терминала может в конкретный момент времени - помимо ОСНОВНОГО потока рабочего места QUIK - вклиниться в цепочку вызовов callback-функций. И имеют в виду, что?, к примеру, вызов OnOrder() происходит не строго, а ПРЕИМУЩЕСТВЕННО в главном потоке терминала, что допускает такие вызовы и другими потоками терминала, в том числе и с неуловимой для VM QLUA задержкой по времени вызова.<br /><br />Прошу разработчиков прокомментировать изложенное, и - либо подтвердить один из вариантов, либо опровергнуть.<br />Вопрос очень существенный. <br />
			<i>25.08.2017 14:24:56, Andrei2016.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message26404/topic3027/</link>
			<guid>http://forum.quik.ru/messages/forum10/message26404/topic3027/</guid>
			<pubDate>Fri, 25 Aug 2017 14:24:56 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
	</channel>
</rss>
