<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>Форум QUIK [тема: Работа колбеков]</title>
		<link>http://forum.quik.ru</link>
		<description>Новое в теме Работа колбеков форума  на сайте Форум QUIK [forum.quik.ru]</description>
		<language>ru</language>
		<docs>http://backend.userland.com/rss2</docs>
		<pubDate>Sat, 15 Aug 2026 09:59:05 +0300</pubDate>
		<item>
			<title>Работа колбеков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message83056/topic9604/">Работа колбеков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_UsY5Uk07" href="/user/62/" bx-tooltip-user-id="62">nikolz</a> написал:<br />Но колбек вызывается перед записью в таблицу обезличенных сделок.<br />Если читать из таблицы то будет вызов колбека, запись в таблицу, и потом чтение из нее.<br />=============<br />Здесь есть сомнения, т.к. колбек на таблицу - это событие на изменение данных, которые приходят в пакетах. Что произойдет первым - это вопрос, т.к. я не раз ловил в логах ситуацию когда запись в таблице появлялась ранее чем колбек. Но даже если это такт, то не очень понятно, что это изменяет. Я бы сказал, наоборот, наличие такого частого колбека приведет к падению производительности. Организовать процедуру чтения порций с опросом числа записей в таблице - довольно банальная задача. Сотни тысяч записей записываются в файл за пару секунд. А далее, по мере поступления уже новых, просто их обрабатываем. Зачем для этого колбек в потоке терминала - не ясно. Сама идея событийной модели - это абстракция, за которой все равно будет код, проверяющий что событие наступило. Поэтому я предпочитаю сам это делать, с необходимой мне частотой. <br />
			<i>03.08.2026 10:16:05, Nikolay.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message83056/topic9604/</link>
			<guid>http://forum.quik.ru/messages/forum10/message83056/topic9604/</guid>
			<pubDate>Mon, 03 Aug 2026 10:16:05 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Работа колбеков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message83054/topic9604/">Работа колбеков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_JkIZ89BR" href="/user/3132/" bx-tooltip-user-id="3132">Nikolay</a> написал:<br /> Альтернатива - чтение таблицы обезличенных сделок (тики) и это будет самое точное (читать не через колбеки точно), но проблема что её не все брокеры выдают, поэтому это решение нельзя использовать как базовое.<br />=============<br />Но колбек вызывается перед записью в таблицу обезличенных сделок.<br />Если читать из таблицы то будет вызов колбека, запись в таблицу, и потом чтение из нее. <br />
			<i>03.08.2026 08:30:21, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message83054/topic9604/</link>
			<guid>http://forum.quik.ru/messages/forum10/message83054/topic9604/</guid>
			<pubDate>Mon, 03 Aug 2026 08:30:21 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Работа колбеков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message83047/topic9604/">Работа колбеков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<a class="blog-p-user-name" id="bp_5mzVGVxS" href="/user/3132/" bx-tooltip-user-id="3132">Nikolay</a>, &nbsp;Так ведь и я про это. Есть круг задач решение которых, ну если не оптимальны то хотя бы &nbsp;лучший способ использовать OnParam. Просто потому что лучше ни чего нет.<br />Вы подняли на само деле очень важную проблему. Возраст которой можно уже исчислять десятками лет. Я с Вами целиком согласен. Полное безобразие!<br /><br />Но торгуем сегодня, и решения нужны сегодня они есть? Пусть не оптимальное. &nbsp;Обсуждение очень важное, у себя даже усложняю структуру у меня вообще срез по рынку (фаза), задумался дописал модули, посчитал лаги на стратегию на принятие решения на исполнение суммарный. Усложнил изохронность, разделил на 3 контура. &nbsp;Встал вопрос а какой ценой лимитный ордер заполнять? Ну точно не из ТТТ. <br />
			<i>31.07.2026 21:58:48, VPM.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message83047/topic9604/</link>
			<guid>http://forum.quik.ru/messages/forum10/message83047/topic9604/</guid>
			<pubDate>Fri, 31 Jul 2026 21:58:48 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Работа колбеков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message83045/topic9604/">Работа колбеков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Есть нюанс. Т.к. скорость движения цены заведомо выше скорости получения данных терминалом, то OnParam использовался для компромиссного быстрого получения последней цены, времени цены, времени пакета и проверки, что это не опоздавший пакет. И аггрегации этих данных между опросами в основном цикле. Можно и просто получать опросами, но только если не проблема пропустить выбросы цены.<br /> <br />Остальное параметры ТТТ не требует такой скорости и можно получать по месту требования. Тем более, что много параметров ТТТ вообще не изменяются в течении сессии и требуют однократного запроса.<br /><br />Но теперь OnParam - это слишком накладно для терминала. Альтернатива - чтение таблицы обезличенных сделок (тики) и это будет самое точное (читать не через колбеки точно), но проблема что её не все брокеры выдают, поэтому это решение нельзя использовать как базовое. <br />
			<i>31.07.2026 20:17:21, Nikolay.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message83045/topic9604/</link>
			<guid>http://forum.quik.ru/messages/forum10/message83045/topic9604/</guid>
			<pubDate>Fri, 31 Jul 2026 20:17:21 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Работа колбеков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message83043/topic9604/">Работа колбеков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Ну прямо какие то "Страсти Мордастей" написали. Обматываю не большую таблицу, первоначально задав ее: &nbsp; -- Реестр параметров<br />MEO_Config.REQ_PARAMS_REGISTRY = {<br /> &nbsp; <br /> "STATUS", "TRADINGSTATUS", "TRADINGPHASE", <br /><br />"BUYDEPO", "SELLDEPO",<br /><br /> &nbsp; &nbsp;"BIDDEPTH", "OFFERDEPTH", "NUMBIDS", "NUMOFFERS", "NUMCONTRACTS",<br /><br /> &nbsp; &nbsp;"WAPRICE", "PRICEMAX", "PRICEMIN", "VOLTODAY", "VALTODAY", "QTY",<br /> &nbsp; &nbsp;"LAST", "BID", "OFFER"<br /><br />, "STEPPRICE"<br />}<br /><br />Ничего страшного, все на хорошей скорости проходит если понимать с каким лагом обновляется сама таблица. <br />Ведь дело не в оптимальности самой функции и использовании калбэка, &nbsp;А в архитектуре вашей программы и круге решаемых задач.<br /><br />А зачем он нужен, я специально разделил таблицу на группы параметров. Просто посмотрите. Ну ведь понятно что для высоколиквидных инструментов метрики сделок из ТТТ не годятся, для этого есть &nbsp;тиковые колбэки. А как отследить если изменились параметры "PRICEMAX", "PRICEMIN" в течении сессии? &nbsp;А где взять &nbsp;"BIDDEPTH", "OFFERDEPTH", "NUMBIDS", "NUMOFFERS"? Опять опрос? &nbsp; &nbsp; А посчитайте лаги? <br />
			<i>31.07.2026 18:28:53, VPM.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message83043/topic9604/</link>
			<guid>http://forum.quik.ru/messages/forum10/message83043/topic9604/</guid>
			<pubDate>Fri, 31 Jul 2026 18:28:53 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Работа колбеков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message83042/topic9604/">Работа колбеков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_tu3P3F1B" href="/user/3132/" bx-tooltip-user-id="3132">Nikolay</a> написал:<br />в тех скриптах, где требовался колбек OnParam пришлось полностью его отключить<br />=============<br /> &nbsp; В тех случаях, когда мне надо получать значения текущих торгов, я это делаю методом опроса, в цикле с фильтрацией повторений по параметру 'VOLTODAY'. Существует также параметр 'TIME' - время последней сделки, которое можно для чего то пригодится. <br />
			<i>31.07.2026 17:57:34, TGB.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message83042/topic9604/</link>
			<guid>http://forum.quik.ru/messages/forum10/message83042/topic9604/</guid>
			<pubDate>Fri, 31 Jul 2026 17:57:34 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Работа колбеков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message83040/topic9604/">Работа колбеков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Ок. Пока разработчики молчат, то в тех скриптах, где требовался колбек OnParam пришлось полностью его отключить, т.к. обрабатывать этот &quot;мусор&quot;, подаваемый ему на вход, совсем странное занятие. Это был второй колбек, который я использовал, теперь остался только один - OnTransReply. <br />
			<i>31.07.2026 16:09:10, Nikolay.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message83040/topic9604/</link>
			<guid>http://forum.quik.ru/messages/forum10/message83040/topic9604/</guid>
			<pubDate>Fri, 31 Jul 2026 16:09:10 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Работа колбеков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message83037/topic9604/">Работа колбеков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_n28IIZIp" href="/user/3132/" bx-tooltip-user-id="3132">Nikolay</a> написал:<br />А есть подтверждение, что в qlua эти макросы задействованы, а не оставлены пустыми как в чистом lua.<br />=============<br /> &nbsp; &nbsp; &nbsp;Для экспериментального подтверждения запустите код:<br />
====code====
<pre>
for i = 1, 5000000000 do&nbsp;&nbsp; end
</pre>
=============
<br /> в main и пока он будет выполняться ни один коллбек не будет выполнен, а интерфейс QUIK зависнет. <br />
			<i>31.07.2026 14:37:04, TGB.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message83037/topic9604/</link>
			<guid>http://forum.quik.ru/messages/forum10/message83037/topic9604/</guid>
			<pubDate>Fri, 31 Jul 2026 14:37:04 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Работа колбеков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message83036/topic9604/">Работа колбеков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_hhkSP0rn" href="/user/3132/" bx-tooltip-user-id="3132">Nikolay</a> написал:<br />А есть подтверждение, что в qlua эти макросы задействованы, а не оставлены пустыми как в чистом lua.<br />=============<br /><br /><br />====quote====<br /><a class="blog-p-user-name" id="bp_qk282SCG" href="/user/13952/" bx-tooltip-user-id="13952">TGB</a> написал:<br />Коды скрипта разделяются между потоками, использующими его. В выбранном варианте трансляции исходников Lua активирована синхронизация, обеспечивающая использование кода LUa только одним потоком, но на разных стеках. <br />=============<br /> <br />
			<i>31.07.2026 14:17:55, TGB.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message83036/topic9604/</link>
			<guid>http://forum.quik.ru/messages/forum10/message83036/topic9604/</guid>
			<pubDate>Fri, 31 Jul 2026 14:17:55 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Работа колбеков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message83035/topic9604/">Работа колбеков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_L6YgQgTv" href="/user/13952/" bx-tooltip-user-id="13952">TGB</a> написал:<br />Как фрагмент между &nbsp;lua_lock(L); &nbsp; &nbsp; lua_unlock(L); &nbsp; может исполняться в двух потоках<br />=============<br />А есть подтверждение, что в qlua эти макросы задействованы, а не оставлены пустыми как в чистом lua. <br />
			<i>31.07.2026 13:36:43, Nikolay.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message83035/topic9604/</link>
			<guid>http://forum.quik.ru/messages/forum10/message83035/topic9604/</guid>
			<pubDate>Fri, 31 Jul 2026 13:36:43 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Работа колбеков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message83034/topic9604/">Работа колбеков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_epC4GG3u" href="/user/62/" bx-tooltip-user-id="62">nikolz</a> написал:<br />Тут у Вас ошибка в понимании. Коды не надо разделять или синхронизировать &nbsp;Они могут исполнятся потоками одновременно .<br />=============<br /> &nbsp; &nbsp;Это, например, из исходников Lua 5.4.1: <br />
====code====
<pre>
LUA_API void lua_pushboolean (lua_State *L, int b) {
&nbsp;&nbsp;lua_lock(L);
&nbsp;&nbsp;if (b)
&nbsp;&nbsp;&nbsp;&nbsp;setbtvalue(s2v(L-&#62;top));
&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;setbfvalue(s2v(L-&#62;top));
&nbsp;&nbsp;api_incr_top(L);
&nbsp;&nbsp;lua_unlock(L);
}
</pre>
=============
<br /> &nbsp; &nbsp; &nbsp;Протрите глаза. Как фрагмент между &nbsp;lua_lock(L); &nbsp; &nbsp; lua_unlock(L); &nbsp; может исполняться в двух потоках? <br />
			<i>31.07.2026 13:33:04, TGB.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message83034/topic9604/</link>
			<guid>http://forum.quik.ru/messages/forum10/message83034/topic9604/</guid>
			<pubDate>Fri, 31 Jul 2026 13:33:04 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Работа колбеков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message83030/topic9604/">Работа колбеков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_yLa9KaSY" href="/user/13952/" bx-tooltip-user-id="13952">TGB</a> написал:<br /> 4. Коды скрипта разделяются между потоками, использующими его. В выбранном варианте трансляции исходников Lua активирована синхронизация, обеспечивающая использование кода LUa только одним потоком, но на разных стеках. Сишные функции (не использующие управление память Lua) при их вызовах выполняются в потоке их вызова, и при этом разрешается выполнение потока на другом стеке. После звершения сишной функции, его поток блокируется до тех пор пока в потоке, исполняемом код Lua не будет вызвана сишная функция.<br />=============<br />Тут у Вас ошибка в понимании. Коды не надо разделять или синхронизировать &nbsp;Они могут исполнятся потоками одновременно . <br />Разделяется обращение к памяти данных &nbsp; &nbsp;Это еще называется синхронизация потоков. Т е синхронизация потоков это не про коды а про данные. <br />
			<i>31.07.2026 11:49:51, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message83030/topic9604/</link>
			<guid>http://forum.quik.ru/messages/forum10/message83030/topic9604/</guid>
			<pubDate>Fri, 31 Jul 2026 11:49:51 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Работа колбеков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message83028/topic9604/">Работа колбеков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_CelSxJvJ" href="/user/3132/" bx-tooltip-user-id="3132">Nikolay</a> написал:<br />Т.е. наличие OnParam вызывает постоянный вызов GC, судя по всему при вызове OnParam. Это, конечно, наверно хорошо не расходовать память, но и агрессивный GC - это влияние на производительность.<br />=============<br /> &nbsp;Насколько я понимаю, в текущем QUIK реализована следующая схема реализации QLua.<br /> &nbsp;1. В исходники Lua добавлены функции QLua и выбран вариант использования кода Lua в нескольких потоках, запускаемых на отдельных стеках (основном и стеках сопрограмм).<br /> &nbsp;2. Основной стек используется служебным основным потоком QUIK, обрабатывающим много чего (смотрите мой комментарий в этой ветке и в других тоже).<br /> &nbsp;3. Поток main запускается на стеке сопрограммы.<br /> &nbsp;4. Коды скрипта разделяются между потоками, использующими его. В выбранном варианте трансляции исходников Lua активирована синхронизация, обеспечивающая использование кода LUa только одним потоком, но на разных стеках. Сишные функции (не использующие управление память Lua) при их вызовах выполняются в потоке их вызова, и при этом разрешается выполнение потока на другом стеке. После звершения сишной функции, его поток блокируется до тех пор пока в потоке, исполняемом код Lua не будет вызвана сишная функция.<br /> &nbsp;5. При обработке коллбеков в QUIK:<br /> &nbsp; &nbsp; 1) перед его вызовом:<br /> &nbsp; &nbsp; &nbsp; &nbsp;сохраняется состояние работы GC;<br /> &nbsp; &nbsp; 2) выполняется: collectgarbage("stop") с тем, чтобы запретить работу Gc, который обрабатывает все стеки Lua (зашита от возможных ошибок многопоточности);<br /> &nbsp; &nbsp; 3) запускается функция коллбека;<br /> &nbsp; &nbsp; 4) после завершения коллбека восстанавливается состояние работы GC.<br /> &nbsp; &nbsp; &nbsp; &nbsp;Если восстановление collectgarbage("restart"), то это короткая операция (10000 вызовов ~ 1,5 млс.), но если разработчик сделаи collectgarbage("collect"), то это тяжелая операция принудительной сборки мусора.<br />----<br /> &nbsp; Я много писал, о том, что разработчиком QUIK устроен этот гемморой, в котором они захлебыватся сами и окунают в это пользователей, хотя есть давно известные решения, избавляющие от этого всех.<br /> &nbsp; Обработка в одном потоке почти всего это тоже ноу-хау разработчика QUIK &nbsp;<img src="http://forum.quik.ru/upload/main/smiles/5/icon_smile.png" border="0" data-code=":smile:" data-definition="SD" alt=":smile:" style="width:16px;height:16px;" title="С улыбкой" class="bx-smile" /> . <br />
			<i>31.07.2026 10:09:51, TGB.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message83028/topic9604/</link>
			<guid>http://forum.quik.ru/messages/forum10/message83028/topic9604/</guid>
			<pubDate>Fri, 31 Jul 2026 10:09:51 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Работа колбеков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message83019/topic9604/">Работа колбеков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Также вопрос по памяти:<br /><br />Если в скрипте зарегистрировать OnParam, даже пустой:<br /><br /> function OnParam()<br />end<br /><br />то память, отображаемая в окне Доступные скрипты, почти не изменяется. А если же OnParam нет вовсе, то она бегает от начального значения до удвоения, и потом уже срабатывает GC, сбрасывая её. Особенно это заметно на &quot;объёмных&quot; скриптах с большим числом локальных переменных.<br /><br />Т.е. наличие OnParam вызывает постоянный вызов GC, судя по всему при вызове OnParam. Это, конечно, наверно хорошо не расходовать память, но и агрессивный GC - это влияние на производительность. <br />
			<i>30.07.2026 14:30:06, Nikolay.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message83019/topic9604/</link>
			<guid>http://forum.quik.ru/messages/forum10/message83019/topic9604/</guid>
			<pubDate>Thu, 30 Jul 2026 14:30:06 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Работа колбеков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message83015/topic9604/">Работа колбеков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Ок, вопрос разработчикам:<br /><br />Почему callback OnParam игнорирует настройки терминала в разделе &quot;Получение данных&quot;?<br /><br />Берем чистый терминал, открываем только одну таблицу текущих торгов, в ней выбраны конкретные инструменты. Выбрана настройка &quot;умным заказом данных&quot;.<br />Никаких открытых графиков или других таблиц, только одна ТТТ. Нет запущенных скриптов, кроме тестового.<br /><br />В тестовом скрипте есть только OnParam и вывод данных через PrintDbgStr, нет заказов каких-то данных.<br /><br />Запускаем тест и видим вызов OnParam для инструментов, которых нет в открытой ТТТ, нет открытых позиций, заявок по этим инструментам.<br />С точки зрения скрипта, где этот OnParam зарегистрирован (а нигде более этот метод и не используется) - это мусор, влияющий на работу всего терминала.<br /><br />Также вопрос о самой настройке &quot;умным заказом данных&quot;: если она допускает такой поток данных (а он явно есть, раз есть вызов OnParam), то о каком снижении потока передаваемых данных может быть речь?<br /><br />Для примера:<br />...............<br />00002129 &nbsp; &nbsp;11:44:06.628 &nbsp; &nbsp;&#91;1332&#93; OnParam 2128 SPBFUT RAU6 last_price 1246.0 &nbsp; &nbsp;<br />00002130 &nbsp; &nbsp;11:44:06.629 &nbsp; &nbsp;&#91;1332&#93; OnParam 2129 SPBFUT FLU6 last_price 7975.0 &nbsp; &nbsp;<br />00002131 &nbsp; &nbsp;11:44:06.629 &nbsp; &nbsp;&#91;1332&#93; OnParam 2130 SPBFUT VBU6 last_price 5871.0 &nbsp; &nbsp;<br />00002132 &nbsp; &nbsp;11:44:06.629 &nbsp; &nbsp;&#91;1332&#93; OnParam 2131 SPBFUT CRZ6 last_price 12.167 &nbsp; &nbsp;<br />00002133 &nbsp; &nbsp;11:44:06.629 &nbsp; &nbsp;&#91;1332&#93; OnParam 2132 SPBFUT SiU6 last_price 80734.0 &nbsp; &nbsp;<br />00002134 &nbsp; &nbsp;11:44:06.629 &nbsp; &nbsp;&#91;1332&#93; OnParam 2133 SPBFUT ALU6 last_price 2220.0 &nbsp; &nbsp;<br />00002135 &nbsp; &nbsp;11:44:06.629 &nbsp; &nbsp;&#91;1332&#93; OnParam 2134 SPBFUT VKU6 last_price 1544.0 &nbsp; &nbsp;<br />00002136 &nbsp; &nbsp;11:44:06.629 &nbsp; &nbsp;&#91;1332&#93; OnParam 2135 SPBFUT EDU6 last_price 1.1432 &nbsp; &nbsp;<br />00002137 &nbsp; &nbsp;11:44:06.630 &nbsp; &nbsp;&#91;1332&#93; OnParam 2136 CROSSRATE CNY last_price 0.0 &nbsp; &nbsp;<br />00002138 &nbsp; &nbsp;11:44:06.690 &nbsp; &nbsp;&#91;1332&#93; OnParam 2137 CROSSRATE GLD last_price 0.0 &nbsp; &nbsp;<br />00002139 &nbsp; &nbsp;11:44:06.690 &nbsp; &nbsp;&#91;1332&#93; OnParam 2138 CROSSRATE CNY last_price 0.0 &nbsp; &nbsp;<br />00002140 &nbsp; &nbsp;11:44:06.750 &nbsp; &nbsp;&#91;1332&#93; OnParam 2139 CROSSRATE CNY last_price 0.0 &nbsp; &nbsp;<br />00002141 &nbsp; &nbsp;11:44:06.813 &nbsp; &nbsp;&#91;1332&#93; OnParam 2140 CROSSRATE CNY last_price 0.0 &nbsp; &nbsp;<br />00002142 &nbsp; &nbsp;11:44:06.935 &nbsp; &nbsp;&#91;1332&#93; OnParam 2141 SPBFUT SZU6 last_price 573.0 &nbsp; &nbsp;<br />00002143 &nbsp; &nbsp;11:44:06.935 &nbsp; &nbsp;&#91;1332&#93; OnParam 2142 SPBFUT RAU6 last_price 1246.0 &nbsp; &nbsp;<br />00002144 &nbsp; &nbsp;11:44:06.936 &nbsp; &nbsp;&#91;1332&#93; OnParam 2143 SPBFUT PHU6 last_price 5835.0 &nbsp; &nbsp;<br />00002145 &nbsp; &nbsp;11:44:06.936 &nbsp; &nbsp;&#91;1332&#93; OnParam 2144 SPBFUT VKU6 last_price 1544.0 &nbsp; &nbsp;<br />00002146 &nbsp; &nbsp;11:44:06.936 &nbsp; &nbsp;&#91;1332&#93; OnParam 2145 SPBFUT MMU6 last_price 2306.3 &nbsp; &nbsp;<br />00002147 &nbsp; &nbsp;11:44:06.936 &nbsp; &nbsp;&#91;1332&#93; OnParam 2146 SPBFUT GZU6 last_price 9578.0 &nbsp; &nbsp;<br />00002148 &nbsp; &nbsp;11:44:06.937 &nbsp; &nbsp;&#91;1332&#93; OnParam 2147 SPBFUT MXU6 last_price 230650.0 &nbsp; &nbsp;<br />00002149 &nbsp; &nbsp;11:44:06.937 &nbsp; &nbsp;&#91;1332&#93; OnParam 2148 SPBFUT RIU6 last_price 90110.0 &nbsp; &nbsp;<br />00002150 &nbsp; &nbsp;11:44:06.937 &nbsp; &nbsp;&#91;1332&#93; OnParam 2149 SPBFUT BRU6 last_price 88.65 &nbsp; &nbsp;<br />00002151 &nbsp; &nbsp;11:44:06.937 &nbsp; &nbsp;&#91;1332&#93; OnParam 2150 SPBFUT CKU6 last_price 6502.0 &nbsp; &nbsp;<br />00002152 &nbsp; &nbsp;11:44:06.937 &nbsp; &nbsp;&#91;1332&#93; OnParam 2151 SPBFUT LKU6 last_price 48859.0 &nbsp; &nbsp;<br />00002153 &nbsp; &nbsp;11:44:06.937 &nbsp; &nbsp;&#91;1332&#93; OnParam 2152 CROSSRATE GLD last_price 0.0 &nbsp; &nbsp;<br />00002154 &nbsp; &nbsp;11:44:06.937 &nbsp; &nbsp;&#91;1332&#93; OnParam 2153 CROSSRATE CNY last_price 0.0 &nbsp; &nbsp;<br />00002155 &nbsp; &nbsp;11:44:06.950 &nbsp; &nbsp;&#91;1332&#93; OnParam 2154 SPBFUT SNU6 last_price 15515.0 &nbsp; &nbsp;<br />00002156 &nbsp; &nbsp;11:44:06.950 &nbsp; &nbsp;&#91;1332&#93; OnParam 2155 SPBFUT MGU6 last_price 21122.0 &nbsp; &nbsp;<br />00002157 &nbsp; &nbsp;11:44:06.950 &nbsp; &nbsp;&#91;1332&#93; OnParam 2156 SPBFUT NMU6 last_price 7371.0 &nbsp; &nbsp;<br />00002158 &nbsp; &nbsp;11:44:06.950 &nbsp; &nbsp;&#91;1332&#93; OnParam 2157 SPBFUT GKU6 last_price 1191.0 &nbsp; &nbsp;<br />00002159 &nbsp; &nbsp;11:44:06.950 &nbsp; &nbsp;&#91;1332&#93; OnParam 2158 SPBFUT ALU6 last_price 2221.0 &nbsp; &nbsp;<br />00002160 &nbsp; &nbsp;11:44:06.950 &nbsp; &nbsp;&#91;1332&#93; OnParam 2159 SPBFUT IMOEXF last_price 2269.0 &nbsp; &nbsp;<br />00002161 &nbsp; &nbsp;11:44:06.950 &nbsp; &nbsp;&#91;1332&#93; OnParam 2160 SPBFUT X5U6 last_price 2115.0 &nbsp; &nbsp;<br />00002162 &nbsp; &nbsp;11:44:06.951 &nbsp; &nbsp;&#91;1332&#93; OnParam 2161 SPBFUT VBU6 last_price 5871.0 &nbsp; &nbsp;<br />00002163 &nbsp; &nbsp;11:44:06.951 &nbsp; &nbsp;&#91;1332&#93; OnParam 2162 SPBFUT SPU6 last_price 28329.0 &nbsp; &nbsp;<br />00002164 &nbsp; &nbsp;11:44:06.951 &nbsp; &nbsp;&#91;1332&#93; OnParam 2163 SPBFUT YDU6 last_price 4053.0 &nbsp; &nbsp;<br />00002165 &nbsp; &nbsp;11:44:06.951 &nbsp; &nbsp;&#91;1332&#93; OnParam 2164 SPBFUT NVU6 last_price 10553.0 &nbsp; &nbsp;<br />00002166 &nbsp; &nbsp;11:44:06.951 &nbsp; &nbsp;&#91;1332&#93; OnParam 2165 SPBFUT ONU6 last_price 3219.0 &nbsp; &nbsp;<br />00002167 &nbsp; &nbsp;11:44:06.951 &nbsp; &nbsp;&#91;1332&#93; OnParam 2166 SPBFUT GAZPF last_price 94.09 &nbsp; &nbsp;<br />00002168 &nbsp; &nbsp;11:44:06.951 &nbsp; &nbsp;&#91;1332&#93; OnParam 2167 CROSSRATE CNY last_price 0.0 &nbsp; &nbsp;<br />00002169 &nbsp; &nbsp;11:44:06.951 &nbsp; &nbsp;&#91;1332&#93; OnParam 2168 CROSSRATE CNY last_price 0.0 &nbsp; &nbsp;<br />00002170 &nbsp; &nbsp;11:44:06.996 &nbsp; &nbsp;&#91;1332&#93; OnParam 2169 CROSSRATE CNY last_price 0.0 &nbsp; &nbsp;<br />00002171 &nbsp; &nbsp;11:44:06.997 &nbsp; &nbsp;&#91;1332&#93; OnParam 2170 TQOY RU000A10DQB6 last_price 99.567 &nbsp; &nbsp;<br />00002172 &nbsp; &nbsp;11:44:06.997 &nbsp; &nbsp;&#91;1332&#93; OnParam 2171 TQOB SU26245RMFS9 last_price 85.493 &nbsp; &nbsp;<br />00002173 &nbsp; &nbsp;11:44:06.998 &nbsp; &nbsp;&#91;1332&#93; OnParam 2172 CROSSRATE CNY last_price 0.0 &nbsp; &nbsp;<br />00002174 &nbsp; &nbsp;11:44:07.132 &nbsp; &nbsp;&#91;1332&#93; OnParam 2173 TQOB SU26221RMFS0 last_price 70.893 &nbsp; &nbsp;<br />00002175 &nbsp; &nbsp;11:44:07.144 &nbsp; &nbsp;&#91;1332&#93; OnParam 2174 CROSSRATE CNY last_price 0.0 &nbsp; &nbsp;<br />00002176 &nbsp; &nbsp;11:44:07.147 &nbsp; &nbsp;&#91;1332&#93; OnParam 2175 CROSSRATE CNY last_price 0.0 &nbsp; &nbsp;<br />00002177 &nbsp; &nbsp;11:44:07.150 &nbsp; &nbsp;&#91;1332&#93; OnParam 2176 CROSSRATE CNY last_price 0.0 &nbsp; &nbsp;<br />00002178 &nbsp; &nbsp;11:44:07.153 &nbsp; &nbsp;&#91;1332&#93; OnParam 2177 CROSSRATE CNY last_price 0.0 &nbsp; &nbsp;<br />00002179 &nbsp; &nbsp;11:44:07.156 &nbsp; &nbsp;&#91;1332&#93; OnParam 2178 CROSSRATE CNY last_price 0.0 &nbsp; &nbsp;<br />00002180 &nbsp; &nbsp;11:44:07.159 &nbsp; &nbsp;&#91;1332&#93; OnParam 2179 CROSSRATE GLD last_price 0.0 &nbsp; &nbsp;<br />00002181 &nbsp; &nbsp;11:44:07.162 &nbsp; &nbsp;&#91;1332&#93; OnParam 2180 CROSSRATE CNY last_price 0.0 &nbsp; &nbsp;<br />00002182 &nbsp; &nbsp;11:44:07.165 &nbsp; &nbsp;&#91;1332&#93; OnParam 2181 CROSSRATE CNY last_price 0.0 &nbsp; &nbsp;<br />00002183 &nbsp; &nbsp;11:44:07.167 &nbsp; &nbsp;&#91;1332&#93; OnParam 2182 CROSSRATE CNY last_price 0.0 &nbsp; &nbsp;<br />00002184 &nbsp; &nbsp;11:44:07.170 &nbsp; &nbsp;&#91;1332&#93; OnParam 2183 CROSSRATE CNY last_price 0.0 &nbsp; &nbsp;<br />00002185 &nbsp; &nbsp;11:44:07.173 &nbsp; &nbsp;&#91;1332&#93; OnParam 2184 CROSSRATE CNY last_price 0.0 &nbsp; &nbsp;<br />00002186 &nbsp; &nbsp;11:44:07.211 &nbsp; &nbsp;&#91;1332&#93; OnParam 2185 CROSSRATE CNY last_price 0.0 &nbsp; &nbsp;<br />00002187 &nbsp; &nbsp;11:44:07.211 &nbsp; &nbsp;&#91;1332&#93; OnParam 2186 CROSSRATE CNY last_price 0.0 &nbsp; &nbsp;<br />00002188 &nbsp; &nbsp;11:44:07.211 &nbsp; &nbsp;&#91;1332&#93; OnParam 2187 CROSSRATE GLD last_price 0.0 &nbsp; &nbsp;<br />00002189 &nbsp; &nbsp;11:44:07.243 &nbsp; &nbsp;&#91;1332&#93; OnParam 2188 CROSSRATE CNY last_price 0.0 &nbsp; &nbsp;<br />00002190 &nbsp; &nbsp;11:44:07.244 &nbsp; &nbsp;&#91;1332&#93; OnParam 2189 CROSSRATE CNY last_price 0.0 &nbsp; &nbsp;<br />00002191 &nbsp; &nbsp;11:44:07.244 &nbsp; &nbsp;&#91;1332&#93; OnParam 2190 SPBFUT GZU6 last_price 9578.0 &nbsp; &nbsp;<br />00002192 &nbsp; &nbsp;11:44:07.244 &nbsp; &nbsp;&#91;1332&#93; OnParam 2191 SPBFUT X5Z6 last_price 2185.0 &nbsp; &nbsp;<br />................... <br />
			<i>30.07.2026 12:04:55, Nikolay.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message83015/topic9604/</link>
			<guid>http://forum.quik.ru/messages/forum10/message83015/topic9604/</guid>
			<pubDate>Thu, 30 Jul 2026 12:04:55 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Работа колбеков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message83013/topic9604/">Работа колбеков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Кто хочет поразвлекаться, вот тестовый скрипт. Запускам. Разрываем связь, ждем, запускаем. Когда в информационном окне закончится очередь отставших сообщений остановить. была возможность считать этот параметр оставили бы сами. Для наглядности можно включить PrintDbgStr в OnParam и посмотреть что приходит и с какой скоростью, после восстановления связи или в моменты когда терминал подгружает отставшие пакеты.<br /><br />И почему все эти вызовы OnParam будут мусором, потому что если получить и вывести цену в колбеке, то она будет одинаковая, т.к. последняя. Т.е. можно предположить, что изменяется что-то служебное.<br /><br />Также, включая PrintDbgStr в OnParam, увидел, что приходят данные даже не включенные в настройках. На том же ВТБ - включены только облигации, т.к. открыта ТТТ по ним. Но после разрыва связи получаю такое<br /><br />====quote====<br />00009130 &nbsp; &nbsp;17:07:08.617 &nbsp; &nbsp;&#91;15592&#93; OnParam 9130 SPBOPT MX270000BU6 last_price 0.0 &nbsp; &nbsp;<br />00009131 &nbsp; &nbsp;17:07:08.618 &nbsp; &nbsp;&#91;15592&#93; OnParam 9131 SPBOPT MX275000BU6 last_price 0.0 &nbsp; &nbsp;<br />00009132 &nbsp; &nbsp;17:07:08.618 &nbsp; &nbsp;&#91;15592&#93; OnParam 9132 SPBOPT MX280000BU6 last_price 0.0 &nbsp; &nbsp;<br />00009133 &nbsp; &nbsp;17:07:08.618 &nbsp; &nbsp;&#91;15592&#93; OnParam 9133 SPBOPT MX285000BU6 last_price 0.0 &nbsp; &nbsp;<br />00009134 &nbsp; &nbsp;17:07:08.618 &nbsp; &nbsp;&#91;15592&#93; OnParam 9134 SPBOPT MX290000BU6 last_price 0.0 &nbsp; &nbsp;<br />00009135 &nbsp; &nbsp;17:07:08.618 &nbsp; &nbsp;&#91;15592&#93; OnParam 9135 SPBOPT MX295000BU6 last_price 0.0 &nbsp; &nbsp;<br />00009136 &nbsp; &nbsp;17:07:08.618 &nbsp; &nbsp;&#91;15592&#93; OnParam 9136 SPBOPT MX300000BU6 last_price 0.0 &nbsp; &nbsp;<br />00009137 &nbsp; &nbsp;17:07:08.618 &nbsp; &nbsp;&#91;15592&#93; OnParam 9137 SPBOPT MX305000BU6 last_price 0.0 &nbsp; &nbsp;<br />00009138 &nbsp; &nbsp;17:07:08.618 &nbsp; &nbsp;&#91;15592&#93; OnParam 9138 SPBOPT MX310000BU6 last_price 0.0 &nbsp; &nbsp;<br />00009139 &nbsp; &nbsp;17:07:08.618 &nbsp; &nbsp;&#91;15592&#93; OnParam 9139 SPBOPT MX315000BU6 last_price 0.0 &nbsp; &nbsp;<br />00009140 &nbsp; &nbsp;17:07:08.619 &nbsp; &nbsp;&#91;15592&#93; OnParam 9140 SPBOPT MX320000BU6 last_price 0.0 &nbsp; &nbsp;<br />00009141 &nbsp; &nbsp;17:07:08.619 &nbsp; &nbsp;&#91;15592&#93; OnParam 9141 SPBOPT MX325000BU6 last_price 0.0 &nbsp; &nbsp;<br />00009142 &nbsp; &nbsp;17:07:08.619 &nbsp; &nbsp;&#91;15592&#93; OnParam 9142 SPBOPT MX340000BU6 last_price 0.0 &nbsp; &nbsp;<br />00009143 &nbsp; &nbsp;17:07:08.619 &nbsp; &nbsp;&#91;15592&#93; OnParam 9143 SPBOPT SF595BI6 last_price 0.0 &nbsp; &nbsp;<br />00009144 &nbsp; &nbsp;17:07:08.619 &nbsp; &nbsp;&#91;15592&#93; OnParam 9144 SPBOPT SF600BI6 last_price 0.0 &nbsp; &nbsp;<br />00009145 &nbsp; &nbsp;17:07:08.619 &nbsp; &nbsp;&#91;15592&#93; OnParam 9145 SPBOPT SF605BI6 last_price 0.0 &nbsp; &nbsp;<br />00009146 &nbsp; &nbsp;17:07:08.619 &nbsp; &nbsp;&#91;15592&#93; OnParam 9146 SPBOPT SF610BI6 last_price 0.0 &nbsp; &nbsp;<br />00009147 &nbsp; &nbsp;17:07:08.619 &nbsp; &nbsp;&#91;15592&#93; OnParam 9147 SPBOPT SF615BI6 last_price 0.0 &nbsp; &nbsp;<br />00009148 &nbsp; &nbsp;17:07:08.619 &nbsp; &nbsp;&#91;15592&#93; OnParam 9148 SPBOPT SF620BI6 last_price 0.0 &nbsp; &nbsp;<br />00009149 &nbsp; &nbsp;17:07:08.620 &nbsp; &nbsp;&#91;15592&#93; OnParam 9149 SPBOPT SF625BI6 last_price 0.0 &nbsp; &nbsp;<br />00009150 &nbsp; &nbsp;17:07:08.620 &nbsp; &nbsp;&#91;15592&#93; OnParam 9150 SPBOPT SF630BI6 last_price 0.0 &nbsp; &nbsp;<br />00009151 &nbsp; &nbsp;17:07:08.620 &nbsp; &nbsp;&#91;15592&#93; OnParam 9151 SPBOPT SF635BI6 last_price 0.0 &nbsp; &nbsp;<br />00009152 &nbsp; &nbsp;17:07:08.620 &nbsp; &nbsp;&#91;15592&#93; OnParam 9152 SPBOPT SF640BI6 last_price 0.0 &nbsp; &nbsp;<br />00009153 &nbsp; &nbsp;17:07:08.620 &nbsp; &nbsp;&#91;15592&#93; OnParam 9153 SPBOPT SF645BI6 last_price 0.0 &nbsp; &nbsp;<br />00009154 &nbsp; &nbsp;17:07:08.620 &nbsp; &nbsp;&#91;15592&#93; OnParam 9154 SPBOPT SF650BI6 last_price 0.0 &nbsp; &nbsp;<br />00009155 &nbsp; &nbsp;17:07:08.620 &nbsp; &nbsp;&#91;15592&#93; OnParam 9155 SPBOPT SF655BI6 last_price 0.0 &nbsp; &nbsp;<br />00009156 &nbsp; &nbsp;17:07:08.620 &nbsp; &nbsp;&#91;15592&#93; OnParam 9156 SPBOPT SF660BI6 last_price 0.0 &nbsp; &nbsp;<br />00009157 &nbsp; &nbsp;17:07:08.621 &nbsp; &nbsp;&#91;15592&#93; OnParam 9157 SPBOPT SF665BI6 last_price 0.0 &nbsp; &nbsp;<br />00009158 &nbsp; &nbsp;17:07:08.622 &nbsp; &nbsp;&#91;15592&#93; OnParam 9158 SPBOPT SF670BI6 last_price 0.0 &nbsp; &nbsp;<br />00009159 &nbsp; &nbsp;17:07:08.622 &nbsp; &nbsp;&#91;15592&#93; OnParam 9159 SPBOPT SF675BI6 last_price 0.0 &nbsp; &nbsp;<br />00009160 &nbsp; &nbsp;17:07:08.622 &nbsp; &nbsp;&#91;15592&#93; OnParam 9160 SPBOPT SF680BI6 last_price 0.0 &nbsp; &nbsp;<br />00009161 &nbsp; &nbsp;17:07:08.622 &nbsp; &nbsp;&#91;15592&#93; OnParam 9161 SPBOPT SF685BI6 last_price 0.0 &nbsp; &nbsp;<br />00009162 &nbsp; &nbsp;17:07:08.622 &nbsp; &nbsp;&#91;15592&#93; OnParam 9162 SPBOPT SF690BI6 last_price 0.0 &nbsp; &nbsp;<br />00009163 &nbsp; &nbsp;17:07:08.623 &nbsp; &nbsp;&#91;15592&#93; OnParam 9163 SPBOPT SF695BI6 last_price 0.0<br />=============<br /><br />И много другого мусора по всем классам и инструментам даже не включенных в поток данных. Т.е. это банальная DDOS атака колбеков в скриптах, т.к. приходят десятки тысяч вызовов, по всем классам инструментов.<br /> Зачем тогда эта настройка &quot;умным заказом данных&quot;, если получаем всё...<br />
====code====
<pre>local path = _G.getScriptPath()
package.path = path.."/?.lua;"

local id = 'script1'
local logFile

function _G.OnInit(script_path)
&nbsp;&nbsp;&nbsp;id = ((script_path:match("&#91;^/&#92;&#92;&#93;+$")):gsub('.lua', ''))
end

local function log_tostring(...)
&nbsp;&nbsp;local args = table.pack(...)
&nbsp;&nbsp;if args.n == 1 then
&nbsp;&nbsp;&nbsp;&nbsp;return tostring(args&#91;1&#93;)
&nbsp;&nbsp;end
&nbsp;&nbsp;for i = 1, args.n do
&nbsp;&nbsp;&nbsp;&nbsp;args&#91;i&#93; = tostring(args&#91;i&#93;)
&nbsp;&nbsp;end
&nbsp;&nbsp;return table.concat(args, " ", 1, args.n)
end

local function log(...)
&nbsp;&nbsp;&nbsp;&nbsp;if logFile==nil then return end
&nbsp;&nbsp;&nbsp;&nbsp;logFile:write(log_tostring(...).."&#92;n");
&nbsp;&nbsp;&nbsp;&nbsp;logFile:flush();
end

local sleep&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = _G.sleep
local message&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = _G.message
local isRun&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = true

local last_rec, last_time, time_diff
local start_rec = tonumber(getInfoParam('LASTRECORD') or '') or 0

local q = 0
local t = os.time()
local start

function _G.OnParam(class_code,&nbsp;&nbsp;sec_code)
&nbsp;&nbsp;&nbsp;if q == 0 then t = os.time() end
&nbsp;&nbsp;&nbsp;q = q + 1
&nbsp;&nbsp;&nbsp;local last_price = tonumber((getParamEx(class_code,&nbsp;&nbsp;sec_code, 'LAST') or {}).param_value)
&nbsp;&nbsp;&nbsp;-- PrintDbgStr(log_tostring('OnParam', q, class_code,&nbsp;&nbsp;sec_code, 'last_price', last_price))
end

local function log_stat()

&nbsp;&nbsp;&nbsp;local end_rec&nbsp;&nbsp; = tonumber(getInfoParam('LASTRECORD') or '') or 0
&nbsp;&nbsp;&nbsp;local loaded&nbsp;&nbsp;&nbsp;= end_rec - start_rec
&nbsp;&nbsp;&nbsp;t = os.time() - t
&nbsp;&nbsp;&nbsp;local str = log_tostring(id, ': done', ', processed callbacks: ', q, ', in: ', t, 'sec', ', avg: ', q == 0 and '---' or t/q)
&nbsp;&nbsp;&nbsp;message(str)
&nbsp;&nbsp;&nbsp;local str1 = log_tostring(id, ': start_rec: ', start_rec, ', end_rec: ', end_rec, ', loaded records: ', loaded, ', avg: ', loaded == 0 and '---' or t/loaded)
&nbsp;&nbsp;&nbsp;message(str1)
&nbsp;&nbsp;&nbsp;if io.type(logFile) == 'file' then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log(str)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log(str1)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logFile:close()
&nbsp;&nbsp;&nbsp;end
end


function _G.main()

&nbsp;&nbsp;&nbsp;&nbsp;logFile = io.open(path.."&#92;&#92;"..id..".txt", "w")

&nbsp;&nbsp;&nbsp;&nbsp;while isRun do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(10)
&nbsp;&nbsp;&nbsp;&nbsp;end
end

function _G.OnDisconnected()
&nbsp;&nbsp;&nbsp;message('OnDisconnected, current_rec: '..tostring(tonumber(getInfoParam('LASTRECORD') or '') or 0))
&nbsp;&nbsp;&nbsp;q = 0
&nbsp;&nbsp;&nbsp;t = os.time()
end

function _G.OnConnected(flag)
&nbsp;&nbsp;&nbsp;if flag then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;start_rec&nbsp;&nbsp; = tonumber(getInfoParam('LASTRECORD') or '') or 0
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message('OnConnected, start_rec: '..tostring(start_rec))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;q = 0
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t = os.time()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;start = true
&nbsp;&nbsp;&nbsp;end
end

function _G.OnStop()
&nbsp;&nbsp;&nbsp;&nbsp;isRun = false
&nbsp;&nbsp;&nbsp;log_stat()
end</pre>
============= <br />
			<i>29.07.2026 17:20:03, Nikolay.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message83013/topic9604/</link>
			<guid>http://forum.quik.ru/messages/forum10/message83013/topic9604/</guid>
			<pubDate>Wed, 29 Jul 2026 17:20:03 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Работа колбеков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message83012/topic9604/">Работа колбеков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Вы абсолютно правы в своих рассуждениях, и Ваш анализ обнажает главные &quot;болевые точки&quot; архитектуры QUIK и его связки с Lua. Разработчики терминала создали механизм, который при определённых условиях начинает работать против стабильности всей системы. Ваше наблюдение за поведением после OnCleanUp (или при обрыве связи у ВТБ) абсолютно точно описывает проблему архитектуры QUIK. Вы в этом лучше меня разбираетесь. Я лишь хочу сказать о срытой проблеме выделение памяти (Garbage Collection). Каждый вызов getParamEx возвращает Lua-таблицу с полями param_value, param_image, param_type и result.На миллионах вызовов в секунду (при подгрузке истории) создаются миллионы временных таблиц и строк. Встроенный в QUIK сборщик мусора Lua не успевает их утилизировать. Происходит микро - зависание потока, обрабатывающего скрипт. Я не давно вывел т. обезличенных сделок, волосы дыбом, что сделали из ленты! Выведите посмотрите ради интереса. Думаю тут таже история. Можно бесконечно возмущаться, а воз и ныне там. Я о другом как быть в этой ситуации?<br />Разберу мой код выше. Посмотрите в примере именно на этот момент:<br /><br />
====code====
<pre>while c.is_run do
&nbsp;&nbsp;&nbsp;&nbsp;local cur_size = _G.Robot.ds:Size()
&nbsp;&nbsp;&nbsp;&nbsp;if cur_size &#62; last_known_size then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;last_known_size = cur_size
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c.BAR_CACHE_IDX = cur_size
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_G.Robot:ExecuteQuantumClosure(
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_G.Robot.ds,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cur_size
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)
&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;if _G.Robot.ProcessLearningQueue then 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_G.Robot:ProcessLearningQueue()
&nbsp;&nbsp;&nbsp;&nbsp;end

&nbsp;&nbsp;&nbsp;&nbsp;if _G.Robot.TriggerUIRender then 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_G.Robot:TriggerUIRender()
&nbsp;&nbsp;&nbsp;&nbsp;end

&nbsp;&nbsp;&nbsp;&nbsp;local current_work_time = GetMilliseconds() - TT
&nbsp;&nbsp;&nbsp;&nbsp;c.LAST_EXECUTION_LAG = current_work_time
&nbsp;&nbsp;&nbsp;&nbsp;local calculated_sleep = 200 - current_work_time

&nbsp;&nbsp;&nbsp;&nbsp;if calculated_sleep &#60;= 0 then 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;calculated_sleep = 1 
&nbsp;&nbsp;&nbsp;&nbsp;end

&nbsp;&nbsp;&nbsp;&nbsp;sleep(calculated_sleep)
&nbsp;&nbsp;&nbsp;&nbsp;TT = GetMilliseconds()
end
</pre>
=============
<br /><br />Это не просто цикл. Это планировщик (scheduler).Что здесь уже правильно:<br /> 1. Баровый контур отделён от событий QUIK. Это главное. сейчас:<br />QUIK callbacks<br /> &nbsp; &nbsp; &nbsp; &nbsp;|<br /> &nbsp; &nbsp; &nbsp; &nbsp;v<br /> &nbsp;накопление состояния<br /> &nbsp; &nbsp; &nbsp; &nbsp;|<br /> &nbsp; &nbsp; &nbsp; &nbsp;v<br /> &nbsp; &nbsp; &nbsp;main()<br /> &nbsp; &nbsp; &nbsp; &nbsp;|<br /> &nbsp; &nbsp; &nbsp; &nbsp;v<br />ExecuteQuantumClosure()<br /><br />То есть:<br />* OnQuote() &nbsp; &nbsp;не запускает принятие решений;<br />* OnAllTrade() не запускает MDP;<br />* OnParam() &nbsp; &nbsp;не вызывает расчёты S/D. <br />* DS &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;не вызывает расчёт индикаторов. И это уже правильно, у всех разные периоды тик, сеунда, минута.<br /><br /> 2. Изохронность. задан период: sleep(200) То есть: 5 Hz scheduler А внутри: баровая фиксация; очередь обучения; рендеринг пользовательского интерфейса; пульс.<br />Это паттерн. Не, тик -&gt; торговое решение -&gt; ордер <br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; а, накопление событий + обработка, управляемая тактовым сигналом.<br /><br /> 3. Выполнение квантового замыкания. Вот это фактически граница транзакции в MEO. Сейчас:<br />new bar<br />v<br />ExecuteQuantumClosure()<br />v<br />DSP<br />v<br />State Encoder<br />v<br />MDP<br />v<br />Decision<br />v<br />Execution<br /> Именно здесь должен жить: НАЧАТЬ ТРАНЗАКЦИЮ; вычислить; подтвердить; совершить; хэш, а не в QUIK CALLBACK. <br />Ну по крайней мере сейчас так представляется. <br />
			<i>29.07.2026 16:44:54, VPM.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message83012/topic9604/</link>
			<guid>http://forum.quik.ru/messages/forum10/message83012/topic9604/</guid>
			<pubDate>Wed, 29 Jul 2026 16:44:54 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Работа колбеков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message83011/topic9604/">Работа колбеков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			И ещё из странного. Добавляем в скрипт такое:<br /><br /><B>local function ds_callback(ds, index)</B><br /><B> &nbsp; &nbsp;PrintDbgStr(log_tostring(&#39;ds_callback&#39;, index, &#39;last_price&#39;, ds:C(index)))</B><br /><B>end</B><br /><br /><br />function _G.main()<br /><br /> &nbsp; &nbsp;logFile = io.open(path..&quot;\\&quot;..id..&quot;.txt&quot;, &quot;w&quot;)<br /><br /><B> &nbsp; &nbsp;local ds = _G.CreateDataSource(&#39;TQBR&#39;, &#39;SBER&#39;, 1)</B><br /><B> &nbsp; &nbsp;if not ds then</B><br /><B> &nbsp; &nbsp; &nbsp; &nbsp;isRun = false</B><br /><B> &nbsp; &nbsp;end</B><br /><B> &nbsp; &nbsp;ds:SetUpdateCallback(function(...) return ds_callback(ds, ...) end)</B><br /><br /> &nbsp; &nbsp;while isRun do<br /> &nbsp; &nbsp; &nbsp; &nbsp;sleep(10)<br /> &nbsp; &nbsp;end<br />end<br /><br />Что пробуем понять - что будет если остановить скрипт, брокер выдаст OnCleanUp и начнет передавать все пакеты заново. Предположение, что функция в <B>SetUpdateCallback </B>выдаст все, начиная с первого индекса.<br /><br />И действительно, прерываем связь, ждем, получаем OnCleanUp, и получаем вызовы от первого индекса.<br /><br />Т.о. массовая передача отставших пакетов или даже всех от старта сессии, приведет к вызову всех колбеков заново. И скрипт будет это разбирать, вместо работы. И нагрузка на терминал, соответственно, т.к. на каждый пакет будут вызваны все назначенные пакеты. Вот тебе и событийная модель. Казалось бы, событие давно прошло - но нет, получи заново. <br />
			<i>29.07.2026 16:16:02, Nikolay.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message83011/topic9604/</link>
			<guid>http://forum.quik.ru/messages/forum10/message83011/topic9604/</guid>
			<pubDate>Wed, 29 Jul 2026 16:16:02 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Работа колбеков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message83010/topic9604/">Работа колбеков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_oubizjQa" href="/user/16131/" bx-tooltip-user-id="16131">VPM</a> написал:<br />У Вас же идет вызов тяжеловеса, еще нужно понять где фильтруется<br />=============<br />Это нагрузочный тест, фильтр закомментирован. В этом и смысл. Также, если getParamEx - это тяжелая функция, то тогда можно смело даже не думать о написании чего-то существенного на QLUA.<br />Эта функция, по идее, максимально быстро выдает данные из кеша терминала. Никуда не ходит, просто берет из хранилища.<br /><br />Почему-то кажется, что получение типа, да ещё сравнение с строкой (её бы в константу загнать, чтобы Lua каждый раз не бегал в пул строк), а потом ещё и вызов функции, потяжелее будет.<br />
====code====
<pre>&nbsp;&nbsp;&nbsp;&nbsp;if not Robot or not c.is_run or not c.IS_WARMED_UP or Robot.Is_Inside_HotPath then return end
&nbsp;&nbsp;&nbsp;&nbsp;if Robot.ProcessParamEvent and type(Robot.ProcessParamEvent) == "function" then 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Robot:ProcessParamEvent(class_code, sec_code) 
&nbsp;&nbsp;&nbsp;&nbsp;end</pre>
=============
<br />Также, если внутри колбека OnParam ничего не делать, то он становится бесполезным, т.к. он не говорит что изменилось, а просто сигнализирует - что-то там изменилось.<br />Да, можно как и с OnQuote, как в тестах выше, фиксировать просто флаг изменения, и уже в main получать данные через getParamEx. Но это приведёт к существенной потере точности считывания данных, т.к. пока дойдём до этого участка кода, OnParam вызовется ещё тридцать раз, где были промежуточные изменения.<br /><br />Т.о., если даже такое - это тяжело для Квика, то, как сказал выше, можно расслабиться.<br /><br />Но почему-то кажется, что проблема все-же в архитектуре. OnParam - по идее, должен быть событием реального времени. Если он будет вызываться на все приходящие записи после OnCleanUp, да ещё вечером, когда этих записей много, то терминал, вместо работы, будет занимается разбором пакетов. Я такое второй день наблюдаю на ВТБ, и даже без скриптов в эти моменты терминалу плохо. При этом теперь OnCleanUp - это рядовое событие, стоит разорвать связь на не такое и длительное время и всё - получите всё с начала торгов. Данные баров, сделки, ордера - да. А OnParam зачем? <br />
			<i>29.07.2026 15:11:39, Nikolay.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message83010/topic9604/</link>
			<guid>http://forum.quik.ru/messages/forum10/message83010/topic9604/</guid>
			<pubDate>Wed, 29 Jul 2026 15:11:39 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Работа колбеков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message83009/topic9604/">Работа колбеков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			В моем примере выше, архитектура устроена так что, все колбэки ни чего не делают, они &quot;ТУПЫЕ&quot;, их задача сводится просигнализировать &quot;Терминал сообщает, что параметры инструмента изменились&quot;. Это другой уровень абстракции. <br />В этой архитектуре главное: <B>QUIK callbacks нельзя превращать в бизнес-события напрямую</B><br /><br />
====code====
<pre>function OnParam(class_code, sec_code)
&nbsp;&nbsp;&nbsp;&nbsp;if not Robot or not c.is_run or not c.IS_WARMED_UP or Robot.Is_Inside_HotPath then return end
&nbsp;&nbsp;&nbsp;&nbsp;if Robot.ProcessParamEvent and type(Robot.ProcessParamEvent) == "function" then 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Robot:ProcessParamEvent(class_code, sec_code) 
&nbsp;&nbsp;&nbsp;&nbsp;end
end</pre>
=============
<br /><br />У Вас же идет вызов тяжеловеса, еще нужно понять где фильтруется:<br />
====code====
<pre>function _G.OnParam(class_code,&nbsp;&nbsp;sec_code)
&nbsp;&nbsp;&nbsp;&nbsp;local last_price = tonumber((getParamEx(class_code,&nbsp;&nbsp;sec_code, 'LAST') or {}).param_value) or nil

&nbsp;&nbsp; -- if rev_lis&#91;sec_code&#93; then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- GetPrice(class_code,&nbsp;&nbsp;sec_code)
&nbsp;&nbsp; -- end
end</pre>
============= <br />
			<i>29.07.2026 13:50:03, VPM.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message83009/topic9604/</link>
			<guid>http://forum.quik.ru/messages/forum10/message83009/topic9604/</guid>
			<pubDate>Wed, 29 Jul 2026 13:50:03 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Работа колбеков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message83003/topic9604/">Работа колбеков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Ок. Чтобы наглядно показать как влияют колбеки на работу терминала запустил такой тест.<br /><br />Запускаем скрипты, в которых есть только колбек OnParam с одной строкой внутри getParamEx(class_code, &nbsp;sec_code, &#39;LAST&#39;)<br /><br />И смотрим как это повлияет на работу в период загрузки данных. Отключаем соединение с сервером, ждем некоторое время, чтобы накопились пакеты, восстанавливаем соединение. <br />И смотрим в информационное окно терминала. Также визуально видна реакция на выключение и включение скрипта, особенно на вывод данных в таблицу.<br /><br /><noindex><a href="https://disk.360.yandex.ru/i/TOFhfjD7EHQtfA" target="_blank" rel="nofollow">https://disk.360.yandex.ru/i/TOFhfjD7EHQtfA</a></noindex><br /><br />Скрипт банальный. Раз в секунду запрашиваем getParamEx. Также для проверки влияния getInfoParam были добавлены запросы в main, но как показало - не влияет. Лог тоже закомментирован.<br />Если есть колбек OnParam - влияние видно глазами, через скорость изменения данных в информационном окне. Если его нет, то наличие работающего скрипта визуально не заметно.<br /><br />Судя по всему, вызывается OnParam на каждую пропущенную запись для какого-то служебного поля, что и приводит к такому. Но это просто догадка. Если так, то это совсем не корректно.<br /><br />Отдельно также можно сказать, что если не было соединения достаточно долго, то брокер кидает OnCleanUp (это видно по логу и по параметру &quot;число записей&quot; в информационном окне, он скидывается в 0), судя по всему, срабатывает условие &quot;смена сессии&quot;. И в итоге загрузка данных происходит долго, очень долго. По крайней мере у ВТБ. Другие бырокеры побыстрее.<br /><br />Наблюдая за инфомационнгым окном у ВТБ - достатоно часто видно как бежит число &quot;отставшая запись&quot; и в это время терминал занят этим и будет такое же влияние.
====code====
<pre>local path = _G.getScriptPath()
package.path = path.."/?.lua;"

local bl1 = require('big_lib')
local bl2 = require('big_lib2')
local bl3 = require('big_lib3')
local bl4 = require('big_lib4')

local id = 'script3'
local logFile

local function log_tostring(...)
&nbsp;&nbsp;local args = table.pack(...)
&nbsp;&nbsp;if args.n == 1 then
&nbsp;&nbsp;&nbsp;&nbsp;return tostring(args&#91;1&#93;)
&nbsp;&nbsp;end
&nbsp;&nbsp;for i = 1, args.n do
&nbsp;&nbsp;&nbsp;&nbsp;args&#91;i&#93; = tostring(args&#91;i&#93;)
&nbsp;&nbsp;end
&nbsp;&nbsp;return table.concat(args, " ", 1, args.n)
end

local function log(...)
&nbsp;&nbsp;&nbsp;&nbsp;if logFile==nil then return end
&nbsp;&nbsp;&nbsp;&nbsp;logFile:write(log_tostring(...).."&#92;n");
&nbsp;&nbsp;&nbsp;&nbsp;logFile:flush();
end


local sec_list&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= {
&nbsp;&nbsp;&nbsp;&nbsp;{'SPBFUT', 'MMU6'},
&nbsp;&nbsp;&nbsp;&nbsp;{'SPBFUT', 'SiU6'},
&nbsp;&nbsp;&nbsp;&nbsp;{'SPBFUT', 'RIU6'},
&nbsp;&nbsp;&nbsp;&nbsp;{'SPBFUT', 'USDRUBF'},
&nbsp;&nbsp;&nbsp;&nbsp;{'SPBFUT', 'CNYRUBF'},
&nbsp;&nbsp;&nbsp;&nbsp;{'TQBR', 'SBER'},
&nbsp;&nbsp;&nbsp;&nbsp;{'TQBR', 'GAZP'}
}

local last_data = {}


local rev_lis = {}
for i = 1, #sec_list do
&nbsp;&nbsp;&nbsp;&nbsp;rev_lis&#91;sec_list&#91;i&#93;&#91;2&#93;&#93; = i
&nbsp;&nbsp;&nbsp;&nbsp;last_data&#91;sec_list&#91;i&#93;&#91;2&#93;&#93; = {}
end

local sleep&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = _G.sleep
local isRun&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = true

local t_id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= nil

-- local SeaGreen&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= 12713921&nbsp;&nbsp;--&nbsp;&nbsp;RGB(193, 255, 193) нежно-зеленый
-- local RosyBrown&nbsp;&nbsp;&nbsp;&nbsp; = 12698111&nbsp;&nbsp;--&nbsp;&nbsp;RGB(255, 193, 193) нежно-розовый
-- local GetCell&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = _G.GetCell
-- local Highlight&nbsp;&nbsp;&nbsp;&nbsp; = _G.Highlight
local SetCell&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = _G.SetCell
local getParamEx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= _G.getParamEx
local getInfoParam&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= _G.getInfoParam
local IsWindowClosed&nbsp;&nbsp;&nbsp;&nbsp;= _G.IsWindowClosed

local Queue = {}
Queue.__index = Queue

function Queue.new()
&nbsp;&nbsp; return setmetatable({first = 1, last = 0 }, Queue)
end
---&nbsp;&nbsp;Записать в очередь --
function Queue:push(v)
&nbsp;&nbsp; if v == nil then error('!!! Ошибка. Параметр v функции QueuePush nil') end
&nbsp;&nbsp; local last = self.last + 1
&nbsp;&nbsp; self&#91;last&#93; = v
&nbsp;&nbsp; self.last = last
&nbsp;&nbsp; return last - self.first + 1&nbsp;&nbsp;&nbsp;&nbsp;-- количество элементов в очереди ---
end
---&nbsp;&nbsp;Читать очередь&nbsp;&nbsp;--
function Queue:pop()
&nbsp;&nbsp; local&nbsp;&nbsp;first =&nbsp;&nbsp;self.first
&nbsp;&nbsp; if&nbsp;&nbsp;first &#62; self.last then return nil&nbsp;&nbsp; end
&nbsp;&nbsp; local v, v1&nbsp;&nbsp;=&nbsp;&nbsp;self&#91;first&#93;, self&#91;first + 1&#93;
&nbsp;&nbsp; self.first = first + 1
&nbsp;&nbsp; self&#91;first&#93; =&nbsp;&nbsp;nil
&nbsp;&nbsp; v1 = type (v1) == 'string' and #v1 or 0
&nbsp;&nbsp; return&nbsp;&nbsp;v, v1&nbsp;&nbsp; -- v1 -длина следующего элемента (если строка) ---
end

-- Текущий размер очереди ---
function Queue:size()
&nbsp;&nbsp; return self.last - self.first + 1
end

local queue = Queue.new()

local function process_queue()
&nbsp;&nbsp;&nbsp;&nbsp;local n = 0
&nbsp;&nbsp;&nbsp;&nbsp;local res = queue:pop()
&nbsp;&nbsp;&nbsp;&nbsp;while res do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n = n + 1
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local last_price = res&#91;3&#93;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- local lp = GetCell(t_id, 1, 0).value or last_price
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- if lp &#60; last_price then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;&nbsp;&nbsp;&nbsp; Highlight(t_id, 1, 0, SeaGreen, 0, 500)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- elseif lp &#62; last_price then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;&nbsp;&nbsp;&nbsp; Highlight(t_id, 1, 0, RosyBrown, 0, 500)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetCell(t_id, rev_lis&#91;res&#91;2&#93;&#93;, 1, tostring(last_price), last_price)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- log(id, ' --- set pop value',&nbsp;&nbsp;n, rev_lis&#91;res&#91;2&#93;&#93;, last_price)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res = queue:pop()
&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;return n
end

local function GetPrice(class_code,&nbsp;&nbsp;sec_code)
&nbsp;&nbsp;&nbsp;&nbsp;local last_price = tonumber((getParamEx(class_code,&nbsp;&nbsp;sec_code, 'LAST') or {}).param_value) or nil
&nbsp;&nbsp;&nbsp;&nbsp;if last_data&#91;sec_code&#93;&#91;1&#93; == last_price then return end
&nbsp;&nbsp;&nbsp;&nbsp;local res = {}
&nbsp;&nbsp;&nbsp;&nbsp;res.last_time&nbsp;&nbsp;= tonumber((getParamEx(class_code,&nbsp;&nbsp;sec_code, 'TIME') or {}).param_value) or 0
&nbsp;&nbsp;&nbsp;&nbsp;if res.last_time == 0 then return end
&nbsp;&nbsp;&nbsp;&nbsp;res.last_price = last_price
&nbsp;&nbsp;&nbsp;&nbsp;if not res.last_price then return end
&nbsp;&nbsp;&nbsp;&nbsp;local bid_depth&nbsp;&nbsp;= tonumber((getParamEx(class_code,&nbsp;&nbsp;sec_code, 'BIDDEPTHT') or {}).param_value) or 0
&nbsp;&nbsp;&nbsp;&nbsp;res.best_bid&nbsp;&nbsp; = bid_depth &#62; 0 and tonumber((getParamEx(class_code,&nbsp;&nbsp;sec_code, 'BID') or {}).param_value) or nil
&nbsp;&nbsp;&nbsp;&nbsp;local ask_depth&nbsp;&nbsp;= tonumber((getParamEx(class_code,&nbsp;&nbsp;sec_code, 'OFFERDEPTHT') or {}).param_value) or 0
&nbsp;&nbsp;&nbsp;&nbsp;res.best_ask&nbsp;&nbsp; = ask_depth &#62; 0 and tonumber((getParamEx(class_code,&nbsp;&nbsp;sec_code, 'OFFER') or {}).param_value) or nil
&nbsp;&nbsp;&nbsp;&nbsp;-- res.last_rec&nbsp;&nbsp; = tonumber((tostring(getInfoParam('LASTRECORDTIME') or ''):gsub(':', ''))) or 0
&nbsp;&nbsp;&nbsp;&nbsp;-- res.local_time = (tonumber((tostring(getInfoParam('LOCALTIME') or ''):gsub(':', ''))) or 0)
&nbsp;&nbsp;&nbsp;&nbsp;-- res.time_diff&nbsp;&nbsp;= math.abs(res.local_time - res.last_rec) + 10
&nbsp;&nbsp;&nbsp;&nbsp;last_data&#91;sec_code&#93;&#91;1&#93; = last_price
&nbsp;&nbsp;&nbsp;&nbsp;queue:push{class_code,&nbsp;&nbsp;sec_code, last_price}
end

local function event_callback(_, msg, par1, par2)
&nbsp;&nbsp;&nbsp;&nbsp;if (msg == _G.QTABLE_CLOSE) then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isRun = false
&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;if msg == _G.QTABLE_CHAR then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetCell(t_id, par1, 2, tostring(par2), par2)
&nbsp;&nbsp;&nbsp;&nbsp;end
end

local function CreateTable()

&nbsp;&nbsp;&nbsp;&nbsp;t_id = _G.AllocTable()

&nbsp;&nbsp;&nbsp;&nbsp;_G.AddColumn(t_id, 0, "sec", true, _G.QTABLE_STRING_TYPE, 15)
&nbsp;&nbsp;&nbsp;&nbsp;_G.AddColumn(t_id, 1, "price", true, _G.QTABLE_DOUBLE_TYPE, 15)
&nbsp;&nbsp;&nbsp;&nbsp;_G.AddColumn(t_id, 2, "edit", true, _G.QTABLE_DOUBLE_TYPE, 15)
&nbsp;&nbsp;&nbsp;&nbsp;_G.CreateWindow(t_id)
&nbsp;&nbsp;&nbsp;&nbsp;_G.SetWindowPos(t_id, 90, 120, 470, 300)
&nbsp;&nbsp;&nbsp;&nbsp;for i = 1, #sec_list do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_G.InsertRow(t_id, i)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetCell(t_id, i, 0, sec_list&#91;i&#93;&#91;2&#93;)
&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;_G.SetTableNotificationCallback(t_id, event_callback)
end

function _G.OnParam(class_code,&nbsp;&nbsp;sec_code)
&nbsp;&nbsp;&nbsp;&nbsp;local last_price = tonumber((getParamEx(class_code,&nbsp;&nbsp;sec_code, 'LAST') or {}).param_value) or nil

&nbsp;&nbsp;&nbsp;-- if rev_lis&#91;sec_code&#93; then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- GetPrice(class_code,&nbsp;&nbsp;sec_code)
&nbsp;&nbsp;&nbsp;-- end
end

local last_rec, last_time, time_diff


function _G.main()

&nbsp;&nbsp;&nbsp;&nbsp;CreateTable()

&nbsp;&nbsp;&nbsp;&nbsp;logFile = io.open(path.."&#92;&#92;load_"..id..".txt", "w")

&nbsp;&nbsp;&nbsp;&nbsp;local lt = 0
&nbsp;&nbsp;&nbsp;&nbsp;local req_int = 1

&nbsp;&nbsp;&nbsp;&nbsp;while isRun do

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local cwt = os.time()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if cwt - lt &#62; req_int then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lt = cwt
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for i = 1, #sec_list do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetPrice(sec_list&#91;i&#93;&#91;1&#93;, sec_list&#91;i&#93;&#91;2&#93;)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end

&nbsp;&nbsp;&nbsp;last_rec&nbsp;&nbsp; = tonumber((tostring(getInfoParam('LASTRECORDTIME') or ''):gsub(':', ''))) or 0
&nbsp;&nbsp;&nbsp;local_time = (tonumber((tostring(getInfoParam('LOCALTIME') or ''):gsub(':', ''))) or 0)
&nbsp;&nbsp;&nbsp;time_diff&nbsp;&nbsp;= math.abs(local_time - last_rec) + 10

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- log(id, 'Enter main loop')
&nbsp;&nbsp;&nbsp;IsWindowClosed(t_id)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local n = process_queue()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bl1.func1()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bl2.func100()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bl3.func200()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bl4.func300()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- log(id, 'Exit main loop', 'in queue', n)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- log('---------------------------------------------------------------------------')
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(60)
&nbsp;&nbsp;&nbsp;&nbsp;end
end

function _G.OnStop()
&nbsp;&nbsp;&nbsp;&nbsp;isRun = false
&nbsp;&nbsp;&nbsp;&nbsp;if t_id and not IsWindowClosed(t_id) then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_G.DestroyTable(t_id)
&nbsp;&nbsp;&nbsp;&nbsp;end
end</pre>
============= <br />
			<i>28.07.2026 18:45:03, Nikolay.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message83003/topic9604/</link>
			<guid>http://forum.quik.ru/messages/forum10/message83003/topic9604/</guid>
			<pubDate>Tue, 28 Jul 2026 18:45:03 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Работа колбеков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message82991/topic9604/">Работа колбеков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_5BXKw8iy" href="/user/62/" bx-tooltip-user-id="62">nikolz</a> написал:<br />Вывод -тормозят Ваши скрипты. <br />Измерьте время их исполнения.<br />------------------<br />Но так как эта задержка существует и при спокойном рынке, то скорее всего это 1 вариант<br /> &nbsp;<br />=============<br />Тексты скриптов выложены выше. Что там конкретно приводит к &quot;тормозам&quot;? Просто интересно, раз такое категоричное утверждение.<br /><br /><br />====quote====<br /><a class="blog-p-user-name" id="bp_IBNAqJSm" href="/user/62/" bx-tooltip-user-id="62">nikolz</a> написал:<br />Тест проверяет быстродействие выполнения колбеков, включая обработку очереди .<br />=============<br />У меня и не было задачи проверять работу колбеков, а влияние их наличия на скорость работы интерфейса терминала. Буду рад если предложите другой инструментальный тест. &nbsp; <br />
			<i>28.07.2026 08:01:41, Nikolay.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message82991/topic9604/</link>
			<guid>http://forum.quik.ru/messages/forum10/message82991/topic9604/</guid>
			<pubDate>Tue, 28 Jul 2026 08:01:41 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Работа колбеков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message82990/topic9604/">Работа колбеков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_SvnXtVKF" href="/user/3132/" bx-tooltip-user-id="3132">Nikolay</a> написал:<br />Тест был направлен не на измерение скорости работы скрипта, а на влияние работы скрипта на работу терминала, его интерфейса в первую очередь. Какой смысл показать, да ещё на демо, что main работает быстро.<br />У меня на демо тоже всё прекрасно. Переключаешься на реальный и во время &nbsp;открытия рынка - терминал вкладки переключает по 30 секунд. &nbsp;Была бы возможность инструментально измерить работу самого терминала - так и вопросов не было бы.<br /><br />=============<br />Вы не поняли мой тест. <br />Тест проверяет быстродействие выполнения колбеков, включая обработку очереди . <br />
			<i>28.07.2026 05:48:47, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message82990/topic9604/</link>
			<guid>http://forum.quik.ru/messages/forum10/message82990/topic9604/</guid>
			<pubDate>Tue, 28 Jul 2026 05:48:47 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Работа колбеков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message82988/topic9604/">Работа колбеков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_tlWcDnpO" href="/user/3132/" bx-tooltip-user-id="3132">Nikolay</a> написал:<br />Оставил скрипты тестовые с колбеками запущенными. В итоге:<br /><br />задержка данных при обмене с сервером = 11.109<br />средняя задержка данных = 26.384.<br />Максимальная задержка данных = 175.063<br /><br />Как только остановил скрипты - побежал счётчик полученных пакетов, отставших записей в информационном окне. И пока данные бегут, то терминал и без скриптов не особо спешит.<br />=============<br />Вывод -тормозят Ваши скрипты. <br />Измерьте время их исполнения.<br />------------------<br />Кроме того, тормозит сервер брокера . И это не зависит от скриптов.<br />Последнее время &nbsp;у Сбера видны задержки в выставлении заявок <br />Т е уходит заявка из терминала а в стакане она появляется с заметной задержкой визуально. &nbsp;<br />Так как задержка реакция нашего глаза &nbsp;не менее 0.2 сек то можно говорить что заявка выставляется с задержкой сотни миллисекунд.<br />------------------------ &nbsp;<br />Объяснить это можно лишь задержкой на стороне сервера. <br />Два варианта<br />1) Умышленная задержка на стороне сервера.<br />2) Большие очереди заявок.<br />------------------------------------- &nbsp;<br />Но так как эта задержка существует и при спокойном рынке, то скорее всего это 1 вариант<br /> &nbsp; <br />
			<i>28.07.2026 05:11:28, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message82988/topic9604/</link>
			<guid>http://forum.quik.ru/messages/forum10/message82988/topic9604/</guid>
			<pubDate>Tue, 28 Jul 2026 05:11:28 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Работа колбеков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message82982/topic9604/">Работа колбеков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Оставил скрипты тестовые с колбеками запущенными. В итоге:<br /><br />задержка данных при обмене с сервером = 11.109<br />средняя задержка данных = 26.384.<br />Максимальная задержка данных = 175.063<br /><br />Как только остановил скрипты - побежал счётчик полученных пакетов, отставших записей в информационном окне. И пока данные бегут, то терминал и без скриптов не особо спешит. <br />
			<i>27.07.2026 15:01:42, Nikolay.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message82982/topic9604/</link>
			<guid>http://forum.quik.ru/messages/forum10/message82982/topic9604/</guid>
			<pubDate>Mon, 27 Jul 2026 15:01:42 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Работа колбеков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message82981/topic9604/">Работа колбеков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_R8Thw6Q7" href="/user/16131/" bx-tooltip-user-id="16131">VPM</a> написал:<br />Просто мысли вслух. Таблицы обезличенных сделок и левел2 это тиковые данные, в то время как &nbsp;OnParam приходит пакетами примерно раз в секунду. Я кто тому что и очереди и буфер &nbsp;и тайм фреймы у них ме могут быть одинаковы. OnParam требует индивидуального подхода и подписок на параметры. Может собака в сомой обработке зарыта?<br />=============<br />Я довольно редко использую обезличенные сделки и getQuoteLevel2. В данном тесте getQuoteLevel2 просто для создания какой-то нагрузки на qlua API. Простые адекватные расчёты в main не особо влияют.<br />Тот же ВТБ и без скриптов стартует, да и работает, очень медленно. Я думал Кит - медленный (а там большие потоки данных). Но нет ВТБ выдает результаты в информационном окне типа такого:<br /><br />средняя задержка данных = 1.877.<br />Максимальная задержка данных = 29.656. <br />
			<i>27.07.2026 14:16:40, Nikolay.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message82981/topic9604/</link>
			<guid>http://forum.quik.ru/messages/forum10/message82981/topic9604/</guid>
			<pubDate>Mon, 27 Jul 2026 14:16:40 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Работа колбеков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message82980/topic9604/">Работа колбеков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			OnParam и OnQuote самые быстрые. Остальные не так часто.<br /><br />Поэтому добавим пустой OnParam. Почти нет влияния. Хотя есть уже ощущение, что не так, как без скриптов. Опять же - только визуальный контроль.<br /><br />Добавим внутрь колбека одну строку<br /><br />tonumber((getParamEx(class_code, &nbsp;sec_code, &#39;LAST&#39;) or {}).param_value)<br /><br />И уже явно что-то есть.<br /><br />Также, чисто субъективно, кажется, что если дать ностояться, т.е. поработать скриптам, то уже как-то сильнее влияние.<br /><br />Еще из странного - зависит от сервера брокера. Я тестирую на ВТБ, как одном из &quot;тормозных&quot;, переключаешь на другой сервер - и уже не так заметно влияние. <br />
			<i>27.07.2026 14:09:50, Nikolay.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message82980/topic9604/</link>
			<guid>http://forum.quik.ru/messages/forum10/message82980/topic9604/</guid>
			<pubDate>Mon, 27 Jul 2026 14:09:50 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Работа колбеков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message82979/topic9604/">Работа колбеков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Просто мысли вслух. Таблицы обезличенных сделок и левел2 это тиковые данные, в то время как &nbsp;OnParam приходит пакетами примерно раз в секунду. Я кто тому что и очереди и буфер &nbsp;и тайм фреймы у них ме могут быть одинаковы. OnParam требует индивидуального подхода и подписок на параметры. Может собака в сомой обработке зарыта? <br />
			<i>27.07.2026 13:19:16, VPM.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message82979/topic9604/</link>
			<guid>http://forum.quik.ru/messages/forum10/message82979/topic9604/</guid>
			<pubDate>Mon, 27 Jul 2026 13:19:16 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Работа колбеков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message82978/topic9604/">Работа колбеков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_T7sfh7lx" href="/user/3132/" bx-tooltip-user-id="3132">Nikolay</a> написал:<br />Но как только подключаем OnParam и пишем в очередь<br />=============<br />А если какой-нибудь другой колбэк заюзать? Любой достаточно частый. <br />
			<i>27.07.2026 12:37:16, funduk.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message82978/topic9604/</link>
			<guid>http://forum.quik.ru/messages/forum10/message82978/topic9604/</guid>
			<pubDate>Mon, 27 Jul 2026 12:37:16 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Работа колбеков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message82976/topic9604/">Работа колбеков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Сами скачки волне ожидаемы в клиент-серверном взаимодействии. Ну не пришли ещё пакеты, бывает, если оставить в сторону реализацию обмена.<br />Но вот почему в эти периоды терминал становится &quot;тупым&quot; - уже не столь очевидно и вызывает вопросы. Как будто сделали блокирующий цикл, ожидающий пакеты, а интерфейс - да кому он нужен. <br />
			<i>27.07.2026 11:50:13, Nikolay.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message82976/topic9604/</link>
			<guid>http://forum.quik.ru/messages/forum10/message82976/topic9604/</guid>
			<pubDate>Mon, 27 Jul 2026 11:50:13 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
	</channel>
</rss>
