<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>Форум QUIK [тема: Для чего нужна функция SetUpdateCallback?]</title>
		<link>http://forum.quik.ru</link>
		<description>Новое в теме Для чего нужна функция SetUpdateCallback? форума  на сайте Форум QUIK [forum.quik.ru]</description>
		<language>ru</language>
		<docs>http://backend.userland.com/rss2</docs>
		<pubDate>Sat, 02 May 2026 22:32:15 +0300</pubDate>
		<item>
			<title>Для чего нужна функция SetUpdateCallback?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message31798/topic3568/">Для чего нужна функция SetUpdateCallback?</a></b> <i>Работа с данными.</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_FfN2TxDh" href="/user/6622/" bx-tooltip-user-id="6622">Ирина</a> написал:<br />И абсолютно не нужна мне схема &quot;опроса&quot;. Просто подозреваю, что если засунуть весь код в &quot;колбэк&quot;, терминал атрофируется из-за 100% занятого основного потока, да и &quot;колбэки&quot; не будут успевать обрабатываться.<br />=============<br />В этом сложность разработки алгоритма. Вы должны рассчитать, насколько ваш код тяжёлый и можно ли его поделить на ту часть, которая быстрая и которую можно поместить в «колбэк», и на ту часть, которая медленная и которую нужно поместить в main, а ещё дополнительно выделить ту часть, которая совсем тяжёлая и вынести её вообще в отдельную DLL, либо вообще в отдельный процесс... это всё отдельная задача проектирования, которую нужно решать и понимать конечную цель всех решений архитектурных.<br /><br />В документации по Lua дают наиболее общую схему с очередью событий из «колбеков» и обработкой её в main, которая медленная, но не вешает Quik, и поэтому подойдёт большинству начинающих роботописателей. Поэтому она и даётся как пример.<br /><br /><br />====quote====<br /><a class="blog-p-user-name" id="bp_CQRCHcYI" href="/user/6622/" bx-tooltip-user-id="6622">Ирина</a> написал:<br />Все &quot;глобальные&quot; функции, кот. вызывает &quot;колбэк&quot;, тоже выполняются в основном потоке терминала?<br />=============<br />Да. <br />
			<i>15.06.2018 14:31:31, Suntor.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message31798/topic3568/</link>
			<guid>http://forum.quik.ru/messages/forum10/message31798/topic3568/</guid>
			<pubDate>Fri, 15 Jun 2018 14:31:31 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Для чего нужна функция SetUpdateCallback?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message31785/topic3568/">Для чего нужна функция SetUpdateCallback?</a></b> <i>Работа с данными.</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Все &quot;глобальные&quot; функции, кот. вызывает &quot;колбэк&quot;, тоже выполняются в основном потоке терминала?
====code====
<pre>function OnAllTrade(price)
&nbsp;&nbsp;&nbsp;if price &#62;= min_price+X then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OpenOrders()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...
&nbsp;&nbsp;&nbsp;end
end

function OpenOrders()
&nbsp;&nbsp;&nbsp;...
end
</pre>
============= <br />
			<i>15.06.2018 04:12:35, Ирина.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message31785/topic3568/</link>
			<guid>http://forum.quik.ru/messages/forum10/message31785/topic3568/</guid>
			<pubDate>Fri, 15 Jun 2018 04:12:35 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Для чего нужна функция SetUpdateCallback?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message31784/topic3568/">Для чего нужна функция SetUpdateCallback?</a></b> <i>Работа с данными.</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_nQz73EO1" href="/user/901/" bx-tooltip-user-id="901">Suntor</a> написал:<br />вы через «колбэки» пытаетесь сделать код по схеме «опроса», где эти «колбэки» то и не нужны. Они нужны совсем для другого, кода вы строите код по схеме обратного вызова.<br />=============<br />Я о том и говорю. И абсолютно не нужна мне схема &quot;опроса&quot;. Просто подозреваю, что если засунуть весь код в &quot;колбэк&quot;, терминал атрофируется из-за 100% занятого основного потока, да и &quot;колбэки&quot; не будут успевать обрабатываться. Что похлеще отстающей схемы &quot;опроса&quot; будет. <br />Немного понятнее стало.<br />Попробую ловить сигнал дважды: в &quot;колбэк&quot; с выполнением минимума (хотя самое тормозное - транзакции - всё равно из него придется отправлять) + дублирующим &quot;опросом&quot; в мейне с выполнением несрочных операций... <br />
			<i>15.06.2018 03:49:35, Ирина.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message31784/topic3568/</link>
			<guid>http://forum.quik.ru/messages/forum10/message31784/topic3568/</guid>
			<pubDate>Fri, 15 Jun 2018 03:49:35 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Для чего нужна функция SetUpdateCallback?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message31782/topic3568/">Для чего нужна функция SetUpdateCallback?</a></b> <i>Работа с данными.</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_qHfGLM13" href="/user/6622/" bx-tooltip-user-id="6622">Ирина</a> написал:<br /><br />====quote====<br /> Suntor &nbsp; написал:<br />Этот sleep ... там должен быть обязательно.<br /><br />=============<br />Ну и какой тогда толк от &quot;колбэка&quot;?<br />=============<br />sleep в main и «колбэки» никак напрямую не связаны... разные вещи. sleep в main нужен для того, чтобы этот самый main не повесил весь Quik с концами...<br /><br />====quote====<br /><a class="blog-p-user-name" id="bp_yO2qKhZQ" href="/user/6622/" bx-tooltip-user-id="6622">Ирина</a> написал:<br />Что без него main спал и пропускал сигнал, что с ним спит, только ещё и основной поток грузится...<br />=============<br />main ничего не пропускает, а лишь реагирует с задержкой. И так он и должен работать, потому что ваш код изначально строится по схеме «опроса». И «колбэки» вы в эту схему засунули, чтобы лишний раз не дёргать getNumberOf, а я лишь довёл вашу эту схему до совершенства, грубо говоря, и вообще избавился от getNumberOf... Важно то, что вы строите ваш код по принципу опроса системной таблицы all_trades. Можно опрашивать её в main дёргая getNumberOf, сохраняя и сравнивая размер каждый раз, можно через булев флаг выставленный из «колбека» о том что таблица изменилась, а можно подсчётом событий «колбэков» насколько она изменилась, как в моём примере. В любом случае, этот код по схеме «опроса» будет работать с задержкой sleep в потоке main, и в любом случае эта задержка там необходима, иначе всё повиснет.<br /><br />====quote====<br /><a class="blog-p-user-name" id="bp_qo1jMxRU" href="/user/6622/" bx-tooltip-user-id="6622">Ирина</a> написал:<br />Кстати, в примере из &quot;Использование Lua в Рабочем месте QUIK&quot; в main нет sleep. Ошибка?<br />=============<br />Он там есть, только спрятан в нижестоящую ф-цию ProcessingCallback... и это пример кода. Если в этом месте менять на свои реальные вычисления, то этот sleep нужно будет передвинуть выше в main. Можете все остальные примеры с первой и до последней страницы пересмотреть в этом документе, там везде в каждом main стоит sleep.<br /><br />====quote====<br /><a class="blog-p-user-name" id="bp_Yrvb33CF" href="/user/6622/" bx-tooltip-user-id="6622">Ирина</a> написал:<br />Сдается мне, что не main-ом надо &quot;колбэки&quot; обрабатывать, а &quot;колбэками&quot; main, - только так их скорость будет использована.<br />=============<br />Ваше заблуждение лишь оттого, что вы через «колбэки» пытаетесь сделать код по схеме «опроса», где эти «колбэки» то и не нужны. Они нужны совсем для другого, кода вы строите код по схеме обратного вызова. То-есть, вместо цикла со sleep внутри main, где вы периодично опрашиваете таблицу, нужно поместить код в «колбэки», и он сам будет вызываться и именно в тот момент, когда наступит событие. А не тогда, когда цикл main после sleep наконец проснётся и обнаружит, что пока он спал, таблица all_trades приросла новыми данными. «Колбэки» срабатывают в тот момент, когда по сети информация приходит в Quik. Счёт идёт на миллисекунды... «Колбэки» это более мощное средство, и с его помощью можно имитировать схему «опроса», а вот наоборот уже не получится. <br />
			<i>15.06.2018 02:20:07, Suntor.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message31782/topic3568/</link>
			<guid>http://forum.quik.ru/messages/forum10/message31782/topic3568/</guid>
			<pubDate>Fri, 15 Jun 2018 02:20:07 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Для чего нужна функция SetUpdateCallback?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message31781/topic3568/">Для чего нужна функция SetUpdateCallback?</a></b> <i>Работа с данными.</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_0faI0kc4" href="/user/901/" bx-tooltip-user-id="901">Suntor</a> написал:<br />Этот sleep ... там должен быть обязательно.<br /><br />=============<br />Ну и какой тогда толк от &quot;колбэка&quot;? Что без него main спал и пропускал сигнал, что с ним спит, только ещё и основной поток грузится... Кстати, в примере из &quot;Использование Lua в Рабочем месте QUIK&quot; в main нет sleep. Ошибка? (Я поэтому и хотела &quot;колбэк&quot; применить).<br /><br />Сдается мне, что не main-ом надо &quot;колбэки&quot; обрабатывать, а &quot;колбэками&quot; main, - только так их скорость будет использована. <br />
			<i>14.06.2018 23:41:29, Ирина.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message31781/topic3568/</link>
			<guid>http://forum.quik.ru/messages/forum10/message31781/topic3568/</guid>
			<pubDate>Thu, 14 Jun 2018 23:41:29 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Для чего нужна функция SetUpdateCallback?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message31731/topic3568/">Для чего нужна функция SetUpdateCallback?</a></b> <i>Работа с данными.</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_m17cLLsQ" href="/user/6622/" bx-tooltip-user-id="6622">Ирина</a> написал:<br />Смущает sleep(1000). Раз после цикла стоит, он будет прерываться при поступлении нового колбэка?<br />=============<br />Этот sleep относится к циклу fRun и нужен для того, чтобы скрипт не завис на бесконечном цикле. В этом случае его невозможно будет остановить кнопкой «Остановить» из окна скриптов. Да и весь Quik при этом также зависнит. Его можно ставить меньше по длительности или больше в зависимости от того, что вы в main делаете. Но он там должен быть обязательно.<br /><br />На «колбэки» содержание кода в main никак не влияет, так как они исполняются в другом потоке.<br /><br /><br />====quote====<br /><a class="blog-p-user-name" id="bp_tU2KCeAh" href="/user/6622/" bx-tooltip-user-id="6622">Ирина</a> написал:<br />Не обращала внимания, что происходит с таблицами в вечерний клиринг...<br />а вечерняя сессия ещё и вялая обычно - не страшно.<br />=============<br />На акциях, где нет «вечерки», тоже самое... это не про то речь. Quik если запустить через несколько дней, то он со старыми данными загрузится, они все в таблицах видны. А когда залогинетесь на сервер, то увидите, что все таблицы сбрасываются, а потом загружаются новыми последними данными. Вот в этом месте будет рассинхрон в работе скриптов. Нужно либо это в коде учитывать, либо ручками следить. Вообще, после некоторой практики приспособитесь к этому. В Quik'е вообще много похожих вещей, за которыми нужно либо самому следить, либо писать нетривиальный код их автоматизации.<br /><br />====quote====<br /><a class="blog-p-user-name" id="bp_4BOWaHMu" href="/user/6622/" bx-tooltip-user-id="6622">Ирина</a> написал:<br />Вообще, уважаемый &nbsp;Suntor &nbsp;, благодарю за помощь в написании моего маленького скрипта! Вашими усилиями он почти готов. :)))<br />=============<br />Да не за что... ))) <br />
			<i>13.06.2018 13:20:04, Suntor.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message31731/topic3568/</link>
			<guid>http://forum.quik.ru/messages/forum10/message31731/topic3568/</guid>
			<pubDate>Wed, 13 Jun 2018 13:20:04 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Для чего нужна функция SetUpdateCallback?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message31712/topic3568/">Для чего нужна функция SetUpdateCallback?</a></b> <i>Работа с данными.</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_PMMv3KTf" href="/user/901/" bx-tooltip-user-id="901">Suntor</a> написал:<br />это всё несущественно, просто глаз режет...<br /><br />=============<br />На вылавливание таких косячков больше всего времени уходит, так что большое спасибо!<br /><br />Код у Вас очень гармоничный получился.<br />Смущает sleep(1000). Раз после цикла стоит, он будет прерываться при поступлении нового колбэка?<br /><br /><br />====quote====<br /><a class="blog-p-user-name" id="bp_U69iw50F" href="/user/901/" bx-tooltip-user-id="901">Suntor</a> написал:<br />рассинхронизация состояния таблицы all_trades<br />=============<br />Не обращала внимания, что происходит с таблицами в вечерний клиринг... спасибо за акцент. Ну буду руками подстраховывать, если что (всё равно скрипт только пол алгоритма выполняет), а вечерняя сессия ещё и вялая обычно - не страшно.<br /><br />Вообще, уважаемый <a class="blog-p-user-name" id="bp_BQamSDmF" href="/user/901/" bx-tooltip-user-id="901">Suntor</a>, благодарю за помощь в написании моего маленького скрипта! Вашими усилиями он почти готов. :))) <br />
			<i>13.06.2018 02:37:39, Ирина.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message31712/topic3568/</link>
			<guid>http://forum.quik.ru/messages/forum10/message31712/topic3568/</guid>
			<pubDate>Wed, 13 Jun 2018 02:37:39 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Для чего нужна функция SetUpdateCallback?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message31705/topic3568/">Для чего нужна функция SetUpdateCallback?</a></b> <i>Работа с данными.</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_J4dsyUhX" href="/user/6622/" bx-tooltip-user-id="6622">Ирина</a> написал:<br />В примере с колбэками из &quot;Использование Lua в Рабочем месте QUIK&quot; в main непрерывно проверяется размер таблицы Lua. А без колбэка мог бы также проверяться размер таблицы обезличенных сделок или иной. Чем хуже?<br />=============<br />Тут вопрос не в том, хуже или нет. А в том, что код по другому структурирован. Можно в свою таблицу складывать события, а можно из системной их потом вылавливать. Тут есть свои плюсы и минусы. В том числе и с рассинхроном. См. мой пример в пред. сообщении. <br />
			<i>12.06.2018 14:53:07, Suntor.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message31705/topic3568/</link>
			<guid>http://forum.quik.ru/messages/forum10/message31705/topic3568/</guid>
			<pubDate>Tue, 12 Jun 2018 14:53:07 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Для чего нужна функция SetUpdateCallback?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message31704/topic3568/">Для чего нужна функция SetUpdateCallback?</a></b> <i>Работа с данными.</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_7DkthQR4" href="/user/6622/" bx-tooltip-user-id="6622">Ирина</a> написал:<br /><br />====quote====<br /> Ирина &nbsp; написал:<br />собьется поток main при поступлении нового колбэка?<br />=============<br />Например, при таком использовании:
====code====
<pre>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp;&nbsp;start&nbsp;&nbsp;=&nbsp;&nbsp; true&nbsp;&nbsp; then 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;start&nbsp;&nbsp;=&nbsp;&nbsp; false&nbsp;&nbsp;</pre>
=============
<br />=============<br />Сразу прокомментирую две ошибки новичка классических. В условии стоит оператор присвоения «=», а не оператор сравнения «==». В Lua такой код отсекается при компиляторе, но в том же Си/Си++ нужно быть внимательным. И сброс переменной условия происходит вне инструкции проверки, а не внутри неё. То-есть, присвоение start = false должно стоять внутри блока условия. Даже, если это не повлияет численно на алгоритм, это стилистическая и логическая ошибка компоновки... это всё несущественно, просто глаз режет...<br /><br />По самому коду. В принципе, будет работать и так. Если сильно не придираться. Но если уж писать в рамках этой идеи, то надо бы булеву переменную start заменить на счётчик новых сделок. Который инкрементировать в OnAllTrade, и декрементировать в main. В этом случае, это уже будет выглядеть законченным кодом. И в этом случае, можно даже избавиться от вызова getNumberOf.<br /><br />Я бы вообще написал вот так, с использованием двух переменных начала и конца. Код компилируется и запускается, но проверить на идущей торговой сессии не могу, так как сегодня праздничный неторговый день.
====code====
<pre>local fRun = true

local first = getNumberOf("all_trades")-1
local last = first

function OnAllTrade(alltrade)
&nbsp;&nbsp;&nbsp;&nbsp;last = last+1
end

function main()
&nbsp;&nbsp;&nbsp;&nbsp;while fRun do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while first ~= last do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;first = first+1
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local alltrade = getItem("all_trades", first)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if alltrade then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message("Новая сделка № "..tostring(alltrade.trade_num))
&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(1000)
&nbsp;&nbsp;&nbsp;&nbsp;end
end

function OnStop(s)
&nbsp;&nbsp;&nbsp;&nbsp;fRun = false
end</pre>
=============
В любом случае, у такого кода, одновременно работающего с OnAllTrade и с таблицей all_trades одна проблема. Это рассинхронизация состояния таблицы all_trades. То-есть, если запустить Quik и скрипт в середине торгового дня, то таблица all_trades будет содержать старые сделки за предыдущую торговую сессию. И параметр first будет инициализирован по размеру этих данных. Потом Quik сбросит всю таблицу all_trades в ноль, и начнёт закачку данных за текущую торговую сессию, что займёт несколько минут. Всё это время будут сыпаться OnAllTrade по получаемым сделкам, а в main цикл выборки из таблицы all_trades будет пытаться получить данные по уже несуществующим индексам. Поэтому, такой код можно запускать только дождавшись полной загрузки всей all_trades таблицы за текущую торговую сессию. Можно смотреть в таблицу всех сделок, и когда она полностью загрузится, уже тогда запускать скрипт. То-есть, это отдельная проблема. Она частично решается если работать со своей очередью куда складывать OnAllTrade, но даже в этом случае, тоже нужно отсекать загрузку старых данных за текущую торговую сессию при первом запуске Quik. <br />
			<i>12.06.2018 14:50:13, Suntor.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message31704/topic3568/</link>
			<guid>http://forum.quik.ru/messages/forum10/message31704/topic3568/</guid>
			<pubDate>Tue, 12 Jun 2018 14:50:13 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Для чего нужна функция SetUpdateCallback?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message31702/topic3568/">Для чего нужна функция SetUpdateCallback?</a></b> <i>Работа с данными.</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_OHeQECxq" href="/user/901/" bx-tooltip-user-id="901">Suntor</a> написал:<br />«Колбэки» нужны, когда вам нужна максимальная скорость реакции на события.<br />=============<br />В примере с колбэками из &quot;Использование Lua в Рабочем месте QUIK&quot; в main непрерывно проверяется размер таблицы Lua. А без колбэка мог бы также проверяться размер таблицы обезличенных сделок или иной. Чем хуже? <br />
			<i>12.06.2018 14:11:30, Ирина.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message31702/topic3568/</link>
			<guid>http://forum.quik.ru/messages/forum10/message31702/topic3568/</guid>
			<pubDate>Tue, 12 Jun 2018 14:11:30 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Для чего нужна функция SetUpdateCallback?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message31693/topic3568/">Для чего нужна функция SetUpdateCallback?</a></b> <i>Работа с данными.</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_HZDTPi7B" href="/user/6622/" bx-tooltip-user-id="6622">Ирина</a> написал:<br />собьется поток main при поступлении нового колбэка?<br />=============<br />Например, при таком использовании:
====code====
<pre>is_run = true
first=getNumberOf("all_trades")

function OnAllTrade(all_trade)
&nbsp;&nbsp;&nbsp;start = true
end

function main()
&nbsp;&nbsp;&nbsp;while is_run = true do

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if start = true then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for k=first,getNumberOf("all_trades")-1 do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;first = k+1
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;start = false

&nbsp;&nbsp;&nbsp;end
end

function OnStop()
&nbsp;&nbsp;&nbsp;is_run = false
end
</pre>
============= <br />
			<i>12.06.2018 04:51:59, Ирина.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message31693/topic3568/</link>
			<guid>http://forum.quik.ru/messages/forum10/message31693/topic3568/</guid>
			<pubDate>Tue, 12 Jun 2018 04:51:59 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Для чего нужна функция SetUpdateCallback?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message31691/topic3568/">Для чего нужна функция SetUpdateCallback?</a></b> <i>Работа с данными.</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_zaY4nZpH" href="/user/7724/" bx-tooltip-user-id="7724">rinat</a> написал:<br />так стоит ли переживать за такие мелочи?<br />=============<br />А зачем себя в хвост загонять, если разница в буквах кода? (Конкуренты в лице таких же юзеров QUIKа не в счет что ли и ликвидности не добавляют?) <br />
			<i>12.06.2018 03:04:07, Ирина.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message31691/topic3568/</link>
			<guid>http://forum.quik.ru/messages/forum10/message31691/topic3568/</guid>
			<pubDate>Tue, 12 Jun 2018 03:04:07 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Для чего нужна функция SetUpdateCallback?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message31690/topic3568/">Для чего нужна функция SetUpdateCallback?</a></b> <i>Работа с данными.</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_p48uU7Qe" href="/user/901/" bx-tooltip-user-id="901">Suntor</a> написал:<br />2. Взаимодействие потоков Lua скрипта<br />=============<br />Спасибо, такой разбор и искала. Стало понятно, что без очереди ничего не понятно...<br />Однако тут пишут, что функции insert/remove сами по себе тормозные... И, в моем случае, очередь ещё и неудобна - дублируются переборы вторичных таблиц, где скорость вообще не нужна. А вот ввернуть сам факт появления новой сделки вместо &nbsp;
====code====
<pre>if first == getNumberOf("all_trades") then
&nbsp;&nbsp; sleep(1000)</pre>
=============
было бы полезно. Но так и не поняла, собьется поток main при поступлении нового колбэка, без его постановки в очередь, или проигнорирует его (что нестрашно)... <br />
			<i>12.06.2018 02:35:50, Ирина.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message31690/topic3568/</link>
			<guid>http://forum.quik.ru/messages/forum10/message31690/topic3568/</guid>
			<pubDate>Tue, 12 Jun 2018 02:35:50 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Для чего нужна функция SetUpdateCallback?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message31570/topic3568/">Для чего нужна функция SetUpdateCallback?</a></b> <i>Работа с данными.</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_oFpCOwot" href="/user/6622/" bx-tooltip-user-id="6622">Ирина</a> написал:<br />Ну и какой смысл в этом колбэке, если нет реакции на каждый тик?<br />=============<br />тогда подумайте о том, что тики, пришедшие с биржи, попали к Вам не мгновенно в момент совершения сделки, а через время совершения события в ядре биржи, обработки в очередь на выдачу в буфере выходного потока ядра биржи, затем в буфер входного потока сервера АРКА, затем некая обработка на сервере АРКА, затем в буфер выходного потока с сервера, затем в буфер терминала для обработки в клиенте КВИК и вот уже это вы обрабатываете своим скриптом. <br />количество и скорость событий не являются ни линейными, ни предопределенными на всех этапах. так стоит ли переживать за такие мелочи? понимайте свой временной горизонт и перебирайте сделки по мере обработки и попадания в Ваши алчные алгоритмы :) <br />
			<i>08.06.2018 07:54:04, rinat.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message31570/topic3568/</link>
			<guid>http://forum.quik.ru/messages/forum10/message31570/topic3568/</guid>
			<pubDate>Fri, 08 Jun 2018 07:54:04 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Для чего нужна функция SetUpdateCallback?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message31569/topic3568/">Для чего нужна функция SetUpdateCallback?</a></b> <i>Работа с данными.</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_hixLfXne" href="/user/6622/" bx-tooltip-user-id="6622">Ирина</a> написал:<br />Прошу развеять сомнения и поправить, если неправильно понимаю принцип работы.<br />=============<br />Для начала, посмотрите пример из документации по QLua (<noindex><a href="https://arqatech.com/upload/iblock/194/quik_lua.zip" target="_blank" rel="nofollow">https://arqatech.com/upload/iblock/194/quik_lua.zip</a></noindex>)<br />В файле <B>Использование Lua в Рабочем месте QUIK.pdf</B> в главе <B>2. Взаимодействие потоков Lua скрипта</B> пример с разбором, как сделать очередь событий от ф-ций обратного вызова и обработать её в main().<br /><br />====quote====<br /><a class="blog-p-user-name" id="bp_BSVdaVsU" href="/user/6622/" bx-tooltip-user-id="6622">Ирина</a> написал:<br />Схема кода такая:<br />=============<br />Если долго разглядывать ваш код, то можно познать дзен... шутка... )))<br />В принципе, если скрипт неторопливый и перерасчитывается раз в секунду, то наверно можно и так сделать как вы. Только обработчик OnStop добавьте и переменную для прерывания цикла в main().<br /><br />====quote====<br /><a class="blog-p-user-name" id="bp_AeVAxOdx" href="/user/6622/" bx-tooltip-user-id="6622">Ирина</a> написал:<br />Ну и какой смысл в этом колбэке, если нет реакции на каждый тик? А main итак проверяет все новые тики.<br />=============<br />«Колбэки» нужны, когда вам нужна максимальная скорость реакции на события. Если такой задачи не стоит, то можно и без них обойтись в целом. <br />
			<i>08.06.2018 05:30:28, Suntor.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message31569/topic3568/</link>
			<guid>http://forum.quik.ru/messages/forum10/message31569/topic3568/</guid>
			<pubDate>Fri, 08 Jun 2018 05:30:28 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Для чего нужна функция SetUpdateCallback?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message31567/topic3568/">Для чего нужна функция SetUpdateCallback?</a></b> <i>Работа с данными.</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_nzlF5p3y" href="/user/901/" bx-tooltip-user-id="901">Suntor</a> написал:<br />Лучше напишите первую версию<br />=============<br />Почти написала и вернулась к обсуждавшемуся вопросу. Сейчас всё в main. Думаю задействовать OnAllTrade, но не вижу в нём смысла. Прошу развеять сомнения и поправить, если неправильно понимаю принцип работы. <br /><br />Схема кода такая:
====code====
<pre>first=getNumberOf("all_trades")

function main()
while true do

if first == getNumberOf("all_trades") then
&nbsp;&nbsp; sleep(1000)
else

for k=first,getNumberOf("all_trades")-1 do
&nbsp;&nbsp;&nbsp;local trade = getItem("all_trades", k)
&nbsp;&nbsp;&nbsp;if trade then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;получение сигнала - выставление и снятие заявок;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;присвоение новых значений переменным
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;first = k+1
end

for i=0,getNumberOf("orders")-1 do

&nbsp;&nbsp;&nbsp;снятие лишних заявок "на ходу" 

end

end
end
end
</pre>
=============
Торгую si, т.е. сотни сделок в секунду случаются.<br /><br />Допустим, задействовала я OnAllTrade. Посылает он сигнал main-у, а тот в это время находится где-нить в середине цикла. <B>Что с ним будет?</B><br />Допустим, ничего.<B> Тогда что будет с пропущенным сигналом OnAllTrade</B>, потеряется?<br />Допустим, нет. Тогда за время проведения main-ом своих расчетов накопится много сигналов OnAllTrade. <B>Что будет с ними?</B> Будут обрабатываться в порядке очереди?<br />Ну и какой смысл в этом колбэке, если нет реакции на каждый тик? А main итак проверяет все новые тики. <br />
			<i>08.06.2018 03:15:03, Ирина.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message31567/topic3568/</link>
			<guid>http://forum.quik.ru/messages/forum10/message31567/topic3568/</guid>
			<pubDate>Fri, 08 Jun 2018 03:15:03 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Для чего нужна функция SetUpdateCallback?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message31376/topic3568/">Для чего нужна функция SetUpdateCallback?</a></b> <i>Работа с данными.</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_PTTtc3JU" href="/user/6622/" bx-tooltip-user-id="6622">Ирина</a> написал:<br />Пришла к следующему алгоритму:<br />=============<br />Лучше напишите первую версию, если сразу не получится, сюда код киньте, мы посмотрим... так по словесному описанию сложно оценить алгоритм, тем более что при реализации он скорее всего изменится.<br /><br />====quote====<br /><a class="blog-p-user-name" id="bp_mEv5GDx1" href="/user/6622/" bx-tooltip-user-id="6622">Ирина</a> написал:<br />С учетом упорядоченности цен в таблице и растущей индексации от старого к новому тику, <br />получается, что при получении каждого изменения, перебирать вообще не нужно.<br />=============<br />Если у вас начало вашего диапазона не меняется, то тогда полный перебор не нужен. А если начало сдвигается, то нужен. <br />
			<i>30.05.2018 13:58:52, Suntor.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message31376/topic3568/</link>
			<guid>http://forum.quik.ru/messages/forum10/message31376/topic3568/</guid>
			<pubDate>Wed, 30 May 2018 13:58:52 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Для чего нужна функция SetUpdateCallback?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message31373/topic3568/">Для чего нужна функция SetUpdateCallback?</a></b> <i>Работа с данными.</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			В общем, если бреда много, прошу простить, с Луа на этапе знакомства. <br />
			<i>30.05.2018 11:46:12, Ирина.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message31373/topic3568/</link>
			<guid>http://forum.quik.ru/messages/forum10/message31373/topic3568/</guid>
			<pubDate>Wed, 30 May 2018 11:46:12 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Для чего нужна функция SetUpdateCallback?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message31372/topic3568/">Для чего нужна функция SetUpdateCallback?</a></b> <i>Работа с данными.</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Случайно отправила недоделанное сообщение. Как тут редактировать? <br />
			<i>30.05.2018 11:41:01, Ирина.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message31372/topic3568/</link>
			<guid>http://forum.quik.ru/messages/forum10/message31372/topic3568/</guid>
			<pubDate>Wed, 30 May 2018 11:41:01 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Для чего нужна функция SetUpdateCallback?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message31371/topic3568/">Для чего нужна функция SetUpdateCallback?</a></b> <i>Работа с данными.</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<a class="blog-p-user-name" id="bp_2dGhpFvc" href="/user/901/" bx-tooltip-user-id="901">Suntor</a>, спасибо за объяснения, помогаете сориентироваться.<br /><br />Код только начинаю писать, поэтому показать нечего. Пришла к следующему алгоритму:<br />При первом запуске скрипта,он перебирает последние тики/цены сделок до нахождения значений &quot;текущая цена&quot;+ х пунктов и &quot;текущая цена&quot;- х пунктов. Проверяет какое из значений было последним и присваивает соответственно 0 и 1 переменным &quot;тренд вверх&quot; и &quot;тренд вниз&quot;, перебирает тики после значения &quot;текущая цена&quot; +/- х пунктов, находит и присваивает переменным &quot;минимум&quot;, &quot;максимум&quot; значение или nil. Это только при запуске. Дальнейшее определение &quot;тренда&quot; и экстремума получается сравнением цены с его предыдущим значением. <br />С учетом упорядоченности цен в таблице и растущей индексации от старого к новому тику, <br />получается, что при получении каждого изменения, перебирать вообще не нужно. Или рациональнее для загрузки получать новые данные порциями и перебирать, зато реже обращаться к терминалу?<br />При наступлении события &quot;текущая цена&quot; -/+ х пунктов &gt;/&lt; мин./макс. меняется тренд и скрипт перетряхивает заявки, стоп-заявки. Они находятся на удалении от текущей цены, сильные движения редки (и вообще скрипт пишу в помощь рукам), поэтому опоздать с сигналом нестрашно. Но опять же вопрос, а нужна ли эта жертва или <br />получение каждого тика/сделки не больше грузит терминал, процесс?<br />Ещё скрипт снимает лимитки по ходу движения, ориентируясь на цену. В остальном, т.е. при работе с заявками оперирует таблицами заявок и стоп-заявок. Вот. И с <br />====quote====<br /><a class="blog-p-user-name" id="bp_zqPQvpem" href="/user/901/" bx-tooltip-user-id="901">Suntor</a> написал:<br />с чем изначально вы работаете.<br />=============<br />?<br />С чем ему работать? Откуда тут лучше брать цену, со свечь, тиков, тлиц обезличеннх селок? &nbsp; <br />
			<i>30.05.2018 11:37:12, Ирина.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message31371/topic3568/</link>
			<guid>http://forum.quik.ru/messages/forum10/message31371/topic3568/</guid>
			<pubDate>Wed, 30 May 2018 11:37:12 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Для чего нужна функция SetUpdateCallback?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message31359/topic3568/">Для чего нужна функция SetUpdateCallback?</a></b> <i>Работа с данными.</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_S006DyeY" href="/user/6622/" bx-tooltip-user-id="6622">Ирина</a> написал:<br />причем период переборки неопределенный (типа трала)<br />=============<br />Если это что-то типа скользящего окна... то-есть, экстремум за последние 100 минут скажем... то тут проще всего эти самые 100 минутных свечек и перебирать, причём полностью их перебирать только когда меняется номер последней свечи... когда же сама последняя свеча меняется, то сравнивать только с её минимумами и максимумами... в таком варианте полный перебор будет только раз в минуту... <br />
			<i>30.05.2018 02:03:20, Suntor.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message31359/topic3568/</link>
			<guid>http://forum.quik.ru/messages/forum10/message31359/topic3568/</guid>
			<pubDate>Wed, 30 May 2018 02:03:20 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Для чего нужна функция SetUpdateCallback?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message31358/topic3568/">Для чего нужна функция SetUpdateCallback?</a></b> <i>Работа с данными.</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_SYopNwdJ" href="/user/6622/" bx-tooltip-user-id="6622">Ирина</a> написал:<br />Теперь думаю что &quot;легче&quot; по загрузке, таблица обезличенных сделок что ли? Или всё-таки прибегнуть к колбэкам для меньшего кол-ва итераций. Боюсь я их - повесят квик.<br />=============<br />Наверно зависит от того, с чем изначально вы работаете. Если вы работаете на свечках, то свечки и перебирать. А если на тиках, то таблицу обезличенных сделок. Оно просто по коду скрипта так будет получаться удобнее...<br /><br />«Колбэки» нормально будут работать. Нахождение минимума и максимума простые мат. операции, просто два сравнения и присвоения, их прямо вовнутрь тела ф-ции OnAllTrade поместить и всё нормально будет. <br />
			<i>30.05.2018 01:10:32, Suntor.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message31358/topic3568/</link>
			<guid>http://forum.quik.ru/messages/forum10/message31358/topic3568/</guid>
			<pubDate>Wed, 30 May 2018 01:10:32 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Для чего нужна функция SetUpdateCallback?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message31357/topic3568/">Для чего нужна функция SetUpdateCallback?</a></b> <i>Работа с данными.</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<a class="blog-p-user-name" id="bp_D4OsgB1k" href="/user/901/" bx-tooltip-user-id="901">Suntor</a>, спасибо большое за хитрое решение - наверняка пригодится.<br />Но мне да, нужны последние экстремумы, причем период переборки неопределенный (типа трала). Думала, просто запоминать последний максимум/минимум и сравнивать с текущей ценой. А тут вон засада с пропущенными значениями. Придется перебирать. Теперь думаю что &quot;легче&quot; по загрузке, таблица обезличенных сделок что ли? Или всё-таки прибегнуть к колбэкам для меньшего кол-ва итераций. Боюсь я их - повесят квик. <br />
			<i>30.05.2018 00:49:23, Ирина.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message31357/topic3568/</link>
			<guid>http://forum.quik.ru/messages/forum10/message31357/topic3568/</guid>
			<pubDate>Wed, 30 May 2018 00:49:23 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Для чего нужна функция SetUpdateCallback?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message31356/topic3568/">Для чего нужна функция SetUpdateCallback?</a></b> <i>Работа с данными.</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_XKGJ2g9t" href="/user/6622/" bx-tooltip-user-id="6622">Ирина</a> написал:<br />Что посоветуете для отслеживания экстремума с минимальной загрузкой скрипта и терминала (скорость не нужна - заявки выставляются ранее, а вот само значение минимума/максимума принципиально для расчетов)? Думала пользоваться именно таблицей текущих торгов, и тут ваше сообщение... Все тики перелопачивать не хотелось бы, а большая свеча может захватить оба экстремума... Эх. Мозг заболел.<br />=============<br />Если нужны минимумы и максимумы за текущую торговую сессию, то их можно получить прямо из таблицы текущих торгов через параметры &quot;LOW&quot; и &quot;HIGH&quot;. Примерно таким скриптом:
====code====
<pre>local fRun = true

function OnParam(class_code, sec_code)
&nbsp;&nbsp;&nbsp;&nbsp;if class_code =="SPBFUT" and sec_code == "SiM8" then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local low&nbsp;&nbsp;= getParamEx(class_code, sec_code, "LOW")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local high = getParamEx(class_code, sec_code, "HIGH")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if low.result == "1" and high.result == "1" then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message("low.param_value&#92;t= "..low.param_value.."&#92;nhigh.param_value&#92;t= "..high.param_value)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;end
end

function main()
&nbsp;&nbsp;&nbsp;&nbsp;while fRun do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(1000)
&nbsp;&nbsp;&nbsp;&nbsp;end
end

function OnStop(s)
&nbsp;&nbsp;&nbsp;&nbsp;fRun = false
end</pre>
=============
А вот если нужны минимумы и максимумы за другие периоды внутри торговой сессии или между ними, то тут придётся уже мутить более сложный код с перебором всех значений по таблице всех сделок или по свечкам и пр. <br />
			<i>29.05.2018 23:52:34, Suntor.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message31356/topic3568/</link>
			<guid>http://forum.quik.ru/messages/forum10/message31356/topic3568/</guid>
			<pubDate>Tue, 29 May 2018 23:52:34 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Для чего нужна функция SetUpdateCallback?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message31355/topic3568/">Для чего нужна функция SetUpdateCallback?</a></b> <i>Работа с данными.</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<a class="blog-p-user-name" id="bp_rsi0rh8n" href="/user/1801/" bx-tooltip-user-id="1801">Борис Гудылин</a>, добрый день.<br /><br />====quote====<br /><a class="blog-p-user-name" id="bp_lOM69SRa" href="/user/1801/" bx-tooltip-user-id="1801">Борис Гудылин</a> написал:<br />Много вариантов есть: можно &quot;монтекарлить&quot; по срезам таблицы текущих торгов (OnParam - last) <B>с риском пропустить экстремум</B>, можно привязаться к графику по идентификатору, можно пропускать через себя все сделки (OnAllTrade), про варианты с CreateDataSource Вы уже знаете. У них у всех есть свои достоинства и недостатки, иногда даже опасности, свои временные характеристики.<br />=============<br />Что посоветуете для отслеживания экстремума с минимальной загрузкой скрипта и терминала (скорость не нужна - заявки выставляются ранее, а вот само значение минимума/максимума принципиально для расчетов)? Думала пользоваться именно таблицей текущих торгов, и тут ваше сообщение... Все тики перелопачивать не хотелось бы, а большая свеча может захватить оба экстремума... Эх. Мозг заболел. <br />
			<i>29.05.2018 23:00:37, Ирина.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message31355/topic3568/</link>
			<guid>http://forum.quik.ru/messages/forum10/message31355/topic3568/</guid>
			<pubDate>Tue, 29 May 2018 23:00:37 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Для чего нужна функция SetUpdateCallback?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message30580/topic3568/">Для чего нужна функция SetUpdateCallback?</a></b> <i>Работа с данными.</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<noindex><a href="http://www.qcustomplot.com/index.php/demos/financialchartsdemo" target="_blank" rel="nofollow">http://www.qcustomplot.com/index.php/demos/financialchartsdemo</a></noindex> <br />
			<i>16.04.2018 21:32:17, rinat.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message30580/topic3568/</link>
			<guid>http://forum.quik.ru/messages/forum10/message30580/topic3568/</guid>
			<pubDate>Mon, 16 Apr 2018 21:32:17 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Для чего нужна функция SetUpdateCallback?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message30579/topic3568/">Для чего нужна функция SetUpdateCallback?</a></b> <i>Работа с данными.</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Спасибо большое, интересная программа. &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>16.04.2018 21:16:07, Андрей.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message30579/topic3568/</link>
			<guid>http://forum.quik.ru/messages/forum10/message30579/topic3568/</guid>
			<pubDate>Mon, 16 Apr 2018 21:16:07 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Для чего нужна функция SetUpdateCallback?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message30574/topic3568/">Для чего нужна функция SetUpdateCallback?</a></b> <i>Работа с данными.</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_92xudhJ2" href="/user/9636/" bx-tooltip-user-id="9636">Андрей</a> написал:<br />А сам график строить какой нибудь другой программой, более менее знакомой, пока больше склоняюсь к двум вариантам или php или LabView.<br />=============<br /><noindex><a href="https://www.youtube.com/watch?v=5-QcZbKl7JE&amp;t=9s" target="_blank" rel="nofollow">https://www.youtube.com/watch?v=5-QcZbKl7JE&amp;t=9s</a></noindex> <br />
			<i>16.04.2018 17:43:49, rinat.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message30574/topic3568/</link>
			<guid>http://forum.quik.ru/messages/forum10/message30574/topic3568/</guid>
			<pubDate>Mon, 16 Apr 2018 17:43:49 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Для чего нужна функция SetUpdateCallback?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message30527/topic3568/">Для чего нужна функция SetUpdateCallback?</a></b> <i>Работа с данными.</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_4NSGeaX8" href="/user/1801/" bx-tooltip-user-id="1801">Борис Гудылин</a> написал:<br />Зачем роботу графики - я не понимаю, Вы же сами все расчеты должны делать и чувствовать, где находятся Ваши кривые на текущий момент (втемную). <br />=============<br />Да, Вы правильно поняли идею, расчет ведется в темную, но проверить визуально свою теорию на чем то нужно, причем удобнее это сделать оперативно, в реальном режиме времени, а не по историческим данным.Графики мне нужны не для миниробота, а для себя, просто что бы меньше тратить времени на проверки. Пока склоняюсь к записи данных в текстовый файл, с флагом в конце файла, что можно строить график. А сам график строить какой нибудь другой программой, более менее знакомой, пока больше склоняюсь к двум вариантам или php или LabView. Php имеет смысл использовать что бы убить двух зайцев и отправку смс по завершившейся сделке и график. LabView очень удобна для построения графиков, там есть встроенное масштабирование. <br /><br /><br />====quote====<br />Для визуализации или отладки можно использовать штатные графики QUIK и штатные МАшки<br />=============<br />Штатные конечно надо будет использовать, но для других целей, для сверки своих расчетов в темную, с реальными ( это можно делать наверно позднее по историческим данным).<br /><br />====quote====<br />Термин &quot;поток&quot; я использую для обозначения архитектурной единицы ОС Windows, которая претендует на время процессора и другие ресурсы и может выполняться параллельно с аналогичными единицами.<br />=============<br />В потоках я не силен, но на своем практическом опыте ( когда тестировал, по работе, передачу управляющих сигналов через сом порт, задержка была примерно около 20 мс в среднем), а у меня для ожидания новой свечи остается 57 сек , поэтому думаю задержка потоков в системе виндовс помехой для мини робота не будет. А за синхронизацией своих потоков Windows следит сама.<br /> Вывод: &nbsp;теоретически мини робот работать может. Хотя минус его конечно очевиден , он не сможет работать со сложными заявками (связанные заявки, стоп-лосс, тейк профит и тд) и конечно будет таким роботам уступать в производительности, поэтому я не претендую на нем на большую прибыль, но пусть для начала она будет хоть в плюсе, а не в минусе и то уже приятно. Если успею, то запущу в свободное плаванье на демо счете в понедельник.<br /><br /><br /><br /><span class="bx-font" style="color:inherit"><span class="bx-font" style="font-family:X-LocaleSpecific, sans-serif, Tahoma, Helvetica"><span class="bx-font" style="font-size:;">#s3gt_translate_tooltip_mini { display: none !important; }</span></span></span> <br />
			<img src="https://forum.quik.ru/bitrix/components/bitrix/forum.interface/show_file.php?fid=4868&" width="965" height="305" /><br /><i>14.04.2018 23:34:21, Андрей.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message30527/topic3568/</link>
			<guid>http://forum.quik.ru/messages/forum10/message30527/topic3568/</guid>
			<pubDate>Sat, 14 Apr 2018 23:34:21 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Для чего нужна функция SetUpdateCallback?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message30520/topic3568/">Для чего нужна функция SetUpdateCallback?</a></b> <i>Работа с данными.</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Вполне возможно, что Вам не хватит возможностей скрипта main и придется задействовать callback'и. <br /><br />Термин &quot;поток&quot; я использую для обозначения архитектурной единицы ОС Windows, которая претендует на время процессора и другие ресурсы и может выполняться параллельно с аналогичными единицами. При определенных условиях они могут &quot;подраться&quot; за некоторые Ваши таблицы, которые Вы захотите ввести и обрабатывать (модифицировать) сразу в двух потоках. Для предотвращения таких коллизий (организация последовательного доступа) и были введены функции sinsert и sremove &nbsp;(там еще несколько подобных по назначению есть, посмотрите). &nbsp; &nbsp;<br />Не повезло QUIKу, многие термины перегружены разными смысловыми нагрузками, а некоторые объекты обзываются по-разному, это мешает.<br /><br />В Вашем примере вы неявно находитесь в рамках потока main скрипта и имеете непосредственный доступ к данным источника, без задействования функций обратного вызова (те, что выполняются в основном ;) потоке). &nbsp; <br /><br />Зачем роботу графики - я не понимаю, Вы же сами все расчеты должны делать и чувствовать, где находятся Ваши кривые на текущий момент (втемную). Для визуализации или отладки можно использовать штатные графики QUIK и штатные МАшки, если Ваши с ними совпадают по алгоритмам. Если не совпадают - напишите для них свои индикаторы, это просто, и поместите их на нужные графики. <br /><br />Для отслеживания и визуализации состояния робота постройте таблицу и отображайте ее средствами QUIK. &nbsp; &nbsp; <br />
			<i>14.04.2018 08:18:26, Борис Гудылин.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message30520/topic3568/</link>
			<guid>http://forum.quik.ru/messages/forum10/message30520/topic3568/</guid>
			<pubDate>Sat, 14 Apr 2018 08:18:26 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
	</channel>
</rss>
