<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>Форум QUIK [тема: Два варианта использования графического пакета IUP (Lua 5.4) в QUIKе]</title>
		<link>http://forum.quik.ru</link>
		<description>Новое в теме Два варианта использования графического пакета IUP (Lua 5.4) в QUIKе форума  на сайте Форум QUIK [forum.quik.ru]</description>
		<language>ru</language>
		<docs>http://backend.userland.com/rss2</docs>
		<pubDate>Wed, 20 May 2026 08:14:30 +0300</pubDate>
		<item>
			<title>Два варианта использования графического пакета IUP (Lua 5.4) в QUIKе</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message79696/topic9270/">Два варианта использования графического пакета IUP (Lua 5.4) в QUIKе</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Корутина в луа - это функция, для которой создается отдельный state. &nbsp;<br />Поэтому при выходе из корутины стейт не занимается другими функциями, <br />а следовательно состояние корутины сохраняется и ее выполнение можно продолжить там, где вышли. <br />--------------------- &nbsp;<br />Но так как корутина выполняется в потоке VMLua, <br />то она выполняется последовательно как и обычные функции луа. <br />
			<i>06.10.2025 13:44:54, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message79696/topic9270/</link>
			<guid>http://forum.quik.ru/messages/forum10/message79696/topic9270/</guid>
			<pubDate>Mon, 06 Oct 2025 13:44:54 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Два варианта использования графического пакета IUP (Lua 5.4) в QUIKе</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message79694/topic9270/">Два варианта использования графического пакета IUP (Lua 5.4) в QUIKе</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_f607WwAp" href="/user/16131/" bx-tooltip-user-id="16131">VPM</a> написал:<br />Сопрограммы в Lua — это мост между двумя мирами:<br />1. Мир для программиста: Удобный, последовательный, понятный код.<br />2. Мир для машины: Гибкое, асинхронное, неблокирующее выполнение.<br />=============<br /> &nbsp; &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 />3. Есть задачи, которые могут быть реализованы с использованием сопрограмм проще, чем с использованием только функций. Например, подключение IUP в выложенном вами скрипте. <br /> &nbsp; &nbsp;Однако, следует учитывать, что сопрограммы (нити - псевдопотоки) отличаются от потоков, в основном, только следующим:<br />1) они не могут выполняться параллельно;<br />2) переключение между ними программное (yield), а не внешнее как в потоках (по прерываниям в любом их месте);<br />3) для их синхронизации не требуются тяжеловесные примитивы (критические секции и т.д.), достаточно использования переменных (так как нет параллелизма). <br /> &nbsp; При использовании сопрограмм всегда надо помнить: если в нескольких сопрограммах изменяются общие данные, то нужно заниматься их синхронизацией. <br /> &nbsp;Таким образом, используя сопрограммы вы попадаете в пусть специфическую, но многопоточную среду, почти со всеми проблемами программирования потоков.<br /> &nbsp;Использование сопрограмм это моделирование многопоточного поведения скрипта в однопоточной среде исполнения.<br />Программировать сопрограммы сложнее, чем функции. Чем сложнее программа, тем больше в ней ошибок. То что можно сделать просто в виде функций, вряд ли стоит делать на сопрограммах, если это не для развлечения. <br />
			<i>06.10.2025 12:43:26, TGB.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message79694/topic9270/</link>
			<guid>http://forum.quik.ru/messages/forum10/message79694/topic9270/</guid>
			<pubDate>Mon, 06 Oct 2025 12:43:26 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Два варианта использования графического пакета IUP (Lua 5.4) в QUIKе</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message79684/topic9270/">Два варианта использования графического пакета IUP (Lua 5.4) в QUIKе</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<B>Конкретные смыслы и практические преимущества, или как сопрограммы меняют парадигму!</B><br /><br /><I>Смысл 1:</I> Простота - <I>читаемость и ясность кода.</I><br />--------------------------------------------------------<br /><br /> * Теория: Мы пишем последовательный код.<br /> * Смысл: Мы можем описать сложную асинхронную логику так, как мы о ней думаем — шаг за шагом, без нагромождения хаоса колбэков.<br />&quot;Ад колбэков&quot; — код растет вглубь, асинхронная логика размазана по функциям. После (красота сопрограмм)!<br />
====code====
<pre>function сложнаяЗадача()
&nbsp;&nbsp;&nbsp;&nbsp;local data = загрузитьДанные("url") -- Здесь может быть yield
&nbsp;&nbsp;&nbsp;&nbsp;local result = обработатьДанные(data) -- И здесь
&nbsp;&nbsp;&nbsp;&nbsp;local success = сохранитьВБД(result) -- И здесь
&nbsp;&nbsp;&nbsp;&nbsp;если success then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;обновитьИнтерфейс()
&nbsp;&nbsp;&nbsp;&nbsp;end
end
-- Создаем сопрограмму и "опросом" управляем ее выполнением
local task = coroutine.create(сложная Задача)</pre>
=============
Смысл: Код выглядит как обычный, линейный и &quot;блокирующий&quot;, но на деле он асинхронный. Мозг читает его без напряжения.<br /><br /><br /> <I>Смысл 2: Архитектор - &quot;Кооперативная многозадачность&quot; и контроль.</I><br />------------------------------------------------------------<br /> * Теория: Мы сами решаем, когда отдать управление.<br /> * Смысл: Мы становимся архитекторами своего планировщика. Мы не зависим от прерываний по таймеру, а сами говорим: &quot;Стоп, я сейчас подожду, а ты пока выполни что-то еще&quot;.<br />
====code====
<pre>-- Пул из нескольких "независимых задач", как вы и сказали
local tasks = {
&nbsp;&nbsp;&nbsp;&nbsp;coroutine.create(function() ... end), -- Задача 1: загрузка контента
&nbsp;&nbsp;&nbsp;&nbsp;coroutine.create(function() ... end), -- Задача 2: анимация UI
&nbsp;&nbsp;&nbsp;&nbsp;coroutine.create(function() ... end), -- Задача 3: обработка ввода
}

-- Главный цикл "опросом" управляет всеми задачами
function главныйЦикл()
&nbsp;&nbsp;&nbsp;&nbsp;while true do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local всеЗавершены = true
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for i, co in ipairs(tasks) do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if coroutine.status(co) ~= "dead" then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;всеЗавершены = false
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;coroutine.resume(co) -- "Опрос" конкретной сопрограммы!
&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;если все Завершены then break end
&nbsp;&nbsp;&nbsp;&nbsp;end
end</pre>
=============
 * Смысл: Мы точно знаем, в какой момент какая задача будет выполняться. Нет гонки данных, нет сложных примитивов синхронизации, как в потоках. Мы создаем детерминированную систему. <br /><br /><br /><I> Смысл 3: Эффективность -</I><I> эффективное ожидание и реактивность.</I><br />------------------------------------------------------------------------------------------------------<br /> * Теория: Сопрограмма может быть приостановлена в любой точке.<br /> * Смысл: Мы можем элегантно реализовать ожидание без блокировки всего приложения.<br />
====code====
<pre>-- В движке: ждем 2 секунды перед загрузкой данных.
function ждать(секунды)
&nbsp;&nbsp;&nbsp;&nbsp;local времяСтарта = os.clock()
&nbsp;&nbsp;&nbsp;&nbsp;while os.clock() - времяСтарта &#60; секунды do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;coroutine.yield() -- "Спим", не блокируя основной поток, отдавая управление другим задачам
&nbsp;&nbsp;&nbsp;&nbsp;end
end</pre>
=============
 * Смысл:** Мы пишем логику, которая &quot;живет&quot; во времени, но не замораживает весь мир вокруг себя. Это основа для AI, анимаций, диалогов в играх.<br /><br /><br /> <I> Смысл 4: Эффективность - генераторы и бесконечные последовательности.</I><br />------------------------------------------------------------------------------------------------------------------<br /> * Теория: Сопрограмма может yield-ить промежуточные результаты.<br /> * Смысл: Мы создаем &quot;ленивые&quot; вычисления и потенциально бесконечные потоки данных.<br />
====code====
<pre>function бесконечнаяПоследовательность(старт, шаг)
&nbsp;&nbsp;&nbsp;&nbsp;local текущее = старт
&nbsp;&nbsp;&nbsp;&nbsp;while true do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;coroutine.yield(текущее)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;текущее = текущее + шаг
&nbsp;&nbsp;&nbsp;&nbsp;end
end

-- Создаем генератор чисел, начиная с 10, с шагом 5
local генератор = coroutine.wrap(бесконечнаяПоследовательность)
local gen = генератор(10, 5)

print(gen()) --&#62; 10
print(gen()) --&#62; 15
print(gen()) --&#62; 20
-- Можно получать значения по требованию, не вычисляя все сразу.</pre>
=============
 * Смысл: Экономия памяти и вычислений. Мы рассчитываем следующее значение только тогда, когда оно реально нужно.<br /><br /> <B><I>Итого.</I></B> Вся прелесть — в этом &quot;превращении&quot;. <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" /> &nbsp;Сопрограммы в Lua — это мост между двумя мирами:<br />1. Мир для программиста: Удобный, последовательный, понятный код.<br />2. Мир для машины: Гибкое, асинхронное, неблокирующее выполнение.<br /><br /><B>И ключ к управлению этим миром — наш &quot;опрос&quot; с помощью `coroutine.resume`.</B> Это диалог: &quot;<I>Ты готова поработать?&quot;, &quot;Сделай шаг&quot;, &quot;Отдохни, я спрошу тебя позже</I>&quot;.<br />Это и есть тот самый глубокий смысл, который делает сопрограммы в Lua таким элегантным и мощным инструментом. &nbsp; <br />
			<i>05.10.2025 10:47:45, VPM.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message79684/topic9270/</link>
			<guid>http://forum.quik.ru/messages/forum10/message79684/topic9270/</guid>
			<pubDate>Sun, 05 Oct 2025 10:47:45 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Два варианта использования графического пакета IUP (Lua 5.4) в QUIKе</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message79683/topic9270/">Два варианта использования графического пакета IUP (Lua 5.4) в QUIKе</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			От теории к смыслам! <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 />Вся прелесть и заключается использования сопрограмм <B>в превращении выполнения одной последовательной задачи луа в ряд независимых задач</B>! Как добиваемся независимости, опросом сопрограмм, там где нужно и тогда когда нужно! <br /><br />Вот мой рабочий пример (как есть прямо в таком виде сейчас крутится, это не образец для подражания, &nbsp;<img src="http://forum.quik.ru/upload/main/smiles/5/icon_confuse.png" border="0" data-code=":what:" data-definition="SD" alt=":what:" style="width:16px;height:16px;" title="Озадаченно" class="bx-smile" /> но), что я только с ним не делал? И сейчас на вечерней падает сопрограмма - обработка таблицы всех сделок, ну и ладно скрипт работает, а с вечеркой когда руки дойдут разберусь.
====code====
<pre>function OnMain()

&nbsp;&nbsp;&nbsp;&nbsp;Log:trace("OnMain started")
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;-- Создаем корутины Прверка пароля
&nbsp;&nbsp;&nbsp;&nbsp;local coPassword&nbsp;&nbsp; = coroutine.create(checkPassword)
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;-- Прверка пароля при первом входе!(корутина с безопасным вызовом)
&nbsp;&nbsp;&nbsp;&nbsp;safe_resume(coPassword, "coPassword")

&nbsp;&nbsp;&nbsp;&nbsp;--&#91;&#91;GUI.initialize()

&nbsp;&nbsp;&nbsp;&nbsp;-- Создание таблицы ордеров
&nbsp;&nbsp;&nbsp;&nbsp;GUI.createTable({
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name = "orders",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;title = "Active Orders",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;width = 1000,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;height = 400,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x = 10,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y = 50,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;columns = {
&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;iCode = 1,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;title = "Time",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;par_type = QTABLE_TIME_TYPE,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;width = 120
&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;iCode = 2,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;title = "Price",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;par_type = QTABLE_DOUBLE_TYPE,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;width = 100
&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;iCode = 3,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;title = "Volume",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;par_type = QTABLE_INT64_TYPE,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;width = 100
&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;GUI.createLabel({
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id = "statusLabel",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;text = "System Status: OK",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x = 10,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y = 10,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;width = 300,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;color = "#00FF00",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bgColor = "#333333"
&nbsp;&nbsp;&nbsp;&nbsp;})
&nbsp;&nbsp;&nbsp;&nbsp;--&#93;&#93;

&nbsp;&nbsp;&nbsp;&nbsp;GUI.initialize()
&nbsp;&nbsp;&nbsp;&nbsp;-- Создание таблицы ордеров
&nbsp;&nbsp;&nbsp;&nbsp;GUI.createTable({
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name = "orders",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;title = "Активные ордера",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;columns = {
&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;iCode = 1,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;title = "Время",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type = QTABLE_TIME_TYPE,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;width = 120
&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;iCode = 2,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;title = "Операция",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type = QTABLE_STRING_TYPE,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;width = 100
&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;iCode = 3,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;title = "Объем",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type = QTABLE_INT_TYPE, -- Теперь правильно QTABLE_INT_TYPE = 1
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;width = 80
&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;local hook = PerformanceHook()
&nbsp;&nbsp;&nbsp;&nbsp;--local performanceHook = PerformanceHook()

&nbsp;&nbsp;&nbsp;&nbsp;local fatal = nil

&nbsp;&nbsp;&nbsp;&nbsp;AutoUpdateVersion()
&nbsp;&nbsp;&nbsp;&nbsp;CreateWindowRobot()

&nbsp;&nbsp;&nbsp;&nbsp;if Start ~= nil then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Start()
&nbsp;&nbsp;&nbsp;&nbsp;end

&nbsp;&nbsp;&nbsp;&nbsp;AtExit(function()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for _, so in pairs(SmartOrder.pool) do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;so:enough()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;so:process()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;end)

&nbsp;&nbsp;&nbsp;&nbsp;if Robot ~= nil then -- Провека на наличие основтой функции

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;---- функция для получения информации о классе 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local ClassInfo = getClassInfo(class_names&#91;1&#93;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;firmid = ClassInfo and ClassInfo.firmid or ''; Log:trace('firmid = ' .. tostring(firmid ) );
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- Создаем корутину для функции Robot
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local routine = coroutine.create(Robot) 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log:trace("Robot started")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- Создаем корутины
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--local coPassword&nbsp;&nbsp; = coroutine.create(checkPassword)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local coConnection = coroutine.create(checkConnection)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local coTradeDate&nbsp;&nbsp;= coroutine.create(checkTradeDate)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local coServerTime = coroutine.create(checkServerTime)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local coWorkTime&nbsp;&nbsp; = coroutine.create(checkWorkTime) -- Сопрограмма для отслеживания рабочего времени 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--local coStopTimeTrading = coroutine.create(checkStopTimeTrading)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- Cоздание корутин для стратегий реального времени
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--if not rejime.test and event_co.connected == 1 and event_co.servertime&#91;2&#93; and flagTimeTrading then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- Cоздание корутины function 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local coCapitalManager = coroutine.create(CapitalManagerCo--function() CapitalManagerCo(CONFIG) end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local coMoneyManagement = coroutine.create(function()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--for _, class in ipairs(class_names) do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--for n, symbol in ipairs(symbol_names) do&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--if mm&#91;class&#93;&#91;symbol&#93; ~= nil 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;--MoneyManagementCo( mm&#91;class&#93;&#91;symbol&#93; )
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MoneyManagementCo( firmid, account, class_names, symbol_names )
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--Log:error("MoneyManagement instance 'mm&#91;n&#93;' is nil. Cannot start MoneyManagementCoroutine.")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;--if not rejime.test and event_co.connected == 1 and event_co.servertime&#91;2&#93; and flagTimeTrading then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local co_alltrade = coroutine.create(alltrade_processor)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local co_order_book = coroutine.create(order_book_processor)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--local co_tt_parametrs = coroutine.create(trade_data_processor)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local futuresCoroutine = coroutine.create(futures_position_processor)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local futuresLimitCoroutine = coroutine.create(futures_limit_processor)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--end
&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;while WORKING_FLAG do

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--------------------------
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local sek = os.clock();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--------------------------

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&#91;&#91;-- Обновление данных
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--GUI.update_connection_status(isConnected())
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--GUI.update_last_activity(os.time())
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--GUI.update_uptime(getUptime())

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- Добавление новых ордеров
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--while hasNewOrders() do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;&nbsp;&nbsp;&nbsp;GUI.add_order(getNextOrder())
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--end

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- Обновление торговой панели
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GUI.updateComponent("trading_panel", {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{"BUY", 100.50, 10},
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{"SELL", 101.00, 5}
&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;GUI.Chart.addLabel("MAIN_CHART", "Support Level", {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;YVALUE = 98.50,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;COLOR = RGB(46, 204, 113)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;})--&#93;&#93;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- Обновление данных
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GUI.updateTable("orders", {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{os.date("%H:%M:%S"), "BUY", 10},
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{os.date("%H:%M:%S"), "SELL", 5}
&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;if not rejime.test then

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;safe_resume(coConnection, "coConnection")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetCell(table_id, 1, 1, tostring(event_co.connected == 1 and 'Connect' or 'NoConnect'))

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if event_co.connected == 1 then

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;safe_resume(coTradeDate,&nbsp;&nbsp;"coTradeDate")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;safe_resume(coServerTime, "coServerTime")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;safe_resume(coWorkTime,&nbsp;&nbsp; "coWorkTime")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--safe_resume(coStopTimeTrading, "coStopTimeTrading")

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--if event_co.connected == 1 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- Запуск корутины MoneyManagement
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--safe_resume( MoneyManagementRoutine, "MoneyManagementRoutine")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;safe_resume( coCapitalManager, "coCapitalManager")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--end

&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;--Log:info('tradedate&#91;1&#93; =' ..tostring(event_co.tradedate&#91;1&#93;) ..'; worktime =' ..tostring(event_co.worktime&#91;2&#93;) ..'; servertime&#91;2&#93; =' ..tostring(event_co.servertime&#91;2&#93;) --..'; flagTimeTrading =' ..tostring(flagTimeTrading) )
&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;if event_co.tradedate&#91;1&#93; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;and event_co.worktime&#91;2&#93;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;and event_co.servertime&#91;2&#93; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;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;safe_resume(co_alltrade, 'co_alltrade')
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;safe_resume(co_order_book, 'co_order_book')
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--coroutine.resume(co_tt_parametrs)
&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;--start_futures_position_processing(futuresCoroutine)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--start_futures_limit_processing(futuresLimitCoroutine)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;safe_resume(futuresCoroutine, 'futuresCoroutine')
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--safe_resume(futuresLimitCoroutine, 'futuresLimitCoroutine')
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end

&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;--safe_resume( coCapitalManager, "coCapitalManager")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--safe_resume( coMoneyManagement, "coMoneyManagement")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- co Robot Затем используйте его методы
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local res, errmsg = coroutine.resume(routine)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if not res then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fatal = "Broken coroutine (Robot): " .. errmsg
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- Вариант 1: Использование глобального обработчика (рекомендуется)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_G.global_error_handler:handle_error(fatal, "Robot")
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- Вариант 2: Статический вызов
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- ErrorHandler.handle_error_static(fatal, "Robot")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if coroutine.status(routine) == "dead" then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log:trace("Robot routine finished")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ProcessRegistered()

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--local elapsed_ms = performanceHook(sek) -- sleep(1000)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hook(sek)&nbsp;&nbsp;-- Обновляем метрики

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(spinner.config.interval * 1000)&nbsp;&nbsp;-- Контроль частоты

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--if rejime.test then 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;&nbsp;&nbsp;&nbsp;sleep(100)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;&nbsp;&nbsp;&nbsp;Log:trace(math.floor(1000 - tonumber(elapsed_ms)))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--sleep(&nbsp;&nbsp;)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;&nbsp;&nbsp;&nbsp;sleep(1000)
&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;end

&nbsp;&nbsp;&nbsp;&nbsp;if Stop ~= nil then Stop() end
&nbsp;&nbsp;&nbsp;&nbsp;ProcessAtExit()&nbsp;&nbsp;-- Вызов ProcessAtExit
&nbsp;&nbsp;&nbsp;&nbsp;ErrorCollector.log_all_errors()&nbsp;&nbsp;-- Логирование всех ошибок при завершении
&nbsp;&nbsp;&nbsp;&nbsp;Log:trace("Robot stopped")
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;if fatal ~= nil then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;error(fatal)
&nbsp;&nbsp;&nbsp;&nbsp;end
end</pre>
============= <br />
			<i>05.10.2025 10:04:54, VPM.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message79683/topic9270/</link>
			<guid>http://forum.quik.ru/messages/forum10/message79683/topic9270/</guid>
			<pubDate>Sun, 05 Oct 2025 10:04:54 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Два варианта использования графического пакета IUP (Lua 5.4) в QUIKе</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message79681/topic9270/">Два варианта использования графического пакета IUP (Lua 5.4) в QUIKе</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Опять эти разговоры про параллельное исполнение. Lua - синхронное, однопоточное изделие. Корутины - это просто созданный стек и выполнение через переключение. Работать может либо тело скрипта, либо корутина, но не параллельное исполнение. Как только вы начинаете с помощью внешних средств пробовать сделать параллельное исполнение, то сразу же возникает вопрос о защите стека, т.к. всегда возникнет ситуация когда кто-то пишет в стек, а другой, параллельный, читает и очищает стек. Квик в этом плане падает сразу, если небрежно уронить стек скрипта. Что отдельная тема, прочему скрипт убивает весь терминал.<br /><br />Так что реализация работы с одним стеком через потоки - это не такая простая задача, и точно не про корутины, которые не стоит путать с таковыми в других языках, приписывая им те же свойства. Lua - это продукт из 90-х. <br />
			<i>05.10.2025 09:08:57, Nikolay.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message79681/topic9270/</link>
			<guid>http://forum.quik.ru/messages/forum10/message79681/topic9270/</guid>
			<pubDate>Sun, 05 Oct 2025 09:08:57 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Два варианта использования графического пакета IUP (Lua 5.4) в QUIKе</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message79680/topic9270/">Два варианта использования графического пакета IUP (Lua 5.4) в QUIKе</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_QkX1DxG0" href="/user/111/" bx-tooltip-user-id="111">Ростислав Дм. Кудряшов</a> написал:<br />Не поленись, а запусти на своём ПК пример переключения спорограмм-корутин между IUP и main(). И убедишься, что невытесняющая (кооперативная) многозадачность порой лучше вытесняющей.<br />=============<br /> &nbsp; &nbsp;С этого места, пожалуйста, поподробнее. Как вам удалось сумев запустить единственный готовый пример, определить что он порой лучше вытесняющей многозадачности? &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>05.10.2025 08:21:38, TGB.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message79680/topic9270/</link>
			<guid>http://forum.quik.ru/messages/forum10/message79680/topic9270/</guid>
			<pubDate>Sun, 05 Oct 2025 08:21:38 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Два варианта использования графического пакета IUP (Lua 5.4) в QUIKе</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message79673/topic9270/">Два варианта использования графического пакета IUP (Lua 5.4) в QUIKе</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Не поленись, а запусти на своём ПК пример переключения спорограмм-корутин между IUP и main(). И убедишься, что невытесняющая (кооперативная) многозадачность порой лучше вытесняющей. <br />
			<i>04.10.2025 23:49:25, Ростислав Дм. Кудряшов.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message79673/topic9270/</link>
			<guid>http://forum.quik.ru/messages/forum10/message79673/topic9270/</guid>
			<pubDate>Sat, 04 Oct 2025 23:49:25 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Два варианта использования графического пакета IUP (Lua 5.4) в QUIKе</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message79672/topic9270/">Два варианта использования графического пакета IUP (Lua 5.4) в QUIKе</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_6eVUDFOx" href="/user/111/" bx-tooltip-user-id="111">Ростислав Дм. Кудряшов</a> написал:<br /> <br />====quote====<br /><noindex><a href="/user/13952/" target="_blank" rel="nofollow">TGB</a></noindex> написал:<br />1. &nbsp; <br />====quote====<br /> <noindex><a href="/user/111/" target="_blank" rel="nofollow">Ростислав Дм. Кудряшов</a></noindex> &nbsp;написал:<br />Статья не разъясняет, &quot;для чего и как&quot;. Поэтому нет причины углубляться в скрипт.<br />=============<br /> &nbsp; &nbsp; Где вы в этой ветке прочитали мою статью?<br />2. &nbsp; <br />====quote====<br /> <noindex><a href="/user/111/" target="_blank" rel="nofollow">Ростислав Дм. Кудряшов</a></noindex> &nbsp;написал:<br />есть и третий способ использования IUP<br />=============<br /> &nbsp; &nbsp; Я это читал. <br />3. &nbsp; <br />====quote====<br /> <noindex><a href="/user/111/" target="_blank" rel="nofollow">Ростислав Дм. Кудряшов</a></noindex> &nbsp;написал:<br />параллельное исполнение скрипта main() и ручных манипуляций в IUP с непрерывной связью между этими нитями (threads) в обоих направлениях.<br />=============<br /> &nbsp; &nbsp; Где вы прочитали, что корутины в Lua выполняются параллельно? Интересно, как в одном потоке можно с помощью корутин реализовать параллелизм (одновременность) их выполнения? Но на всякий случай цитата Р. Иерузалимски: &quot;в любой момент времени программа с сопрограммами выполняет только одну из своих сопрограмм&quot;.<br />=============<br /> <br />=============<br /> <br />
			<i>04.10.2025 23:46:02, Ростислав Дм. Кудряшов.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message79672/topic9270/</link>
			<guid>http://forum.quik.ru/messages/forum10/message79672/topic9270/</guid>
			<pubDate>Sat, 04 Oct 2025 23:46:02 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Два варианта использования графического пакета IUP (Lua 5.4) в QUIKе</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message79671/topic9270/">Два варианта использования графического пакета IUP (Lua 5.4) в QUIKе</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_cDJS4Hpq" href="/user/13952/" bx-tooltip-user-id="13952">TGB</a> написал:<br />1. &nbsp;<br />====quote====<br /><noindex><a href="/user/111/" target="_blank" rel="nofollow">Ростислав Дм. Кудряшов</a></noindex> написал:<br />Статья не разъясняет, &quot;для чего и как&quot;. Поэтому нет причины углубляться в скрипт.<br />=============<br /> &nbsp; &nbsp;Где вы в этой ветке прочитали мою статью?<br />2. &nbsp;<br />====quote====<br /><noindex><a href="/user/111/" target="_blank" rel="nofollow">Ростислав Дм. Кудряшов</a></noindex> написал:<br />есть и третий способ использования IUP<br />=============<br /> &nbsp; &nbsp;Я это читал. <br />3. &nbsp;<br />====quote====<br /><noindex><a href="/user/111/" target="_blank" rel="nofollow">Ростислав Дм. Кудряшов</a></noindex> написал:<br />параллельное исполнение скрипта main() и ручных манипуляций в IUP с непрерывной связью между этими нитями (threads) в обоих направлениях.<br />=============<br /> &nbsp; &nbsp;Где вы прочитали, что корутины в Lua выполняются параллельно? Интересно, как в одном потоке можно с помощью корутин реализовать параллелизм (одновременность) их выполнения? Но на всякий случай цитата Р. Иерузалимски: &quot;в любой момент времени программа с сопрограммами выполняет только одну из своих сопрограмм&quot;.<br />=============<br /> <br />
			<i>04.10.2025 23:45:26, Ростислав Дм. Кудряшов.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message79671/topic9270/</link>
			<guid>http://forum.quik.ru/messages/forum10/message79671/topic9270/</guid>
			<pubDate>Sat, 04 Oct 2025 23:45:26 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Два варианта использования графического пакета IUP (Lua 5.4) в QUIKе</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message79670/topic9270/">Два варианта использования графического пакета IUP (Lua 5.4) в QUIKе</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			1. <br />====quote====<br /><a class="blog-p-user-name" id="bp_wckuqmsc" href="/user/111/" bx-tooltip-user-id="111">Ростислав Дм. Кудряшов</a> написал:<br />Статья не разъясняет, "для чего и как". Поэтому нет причины углубляться в скрипт.<br />=============<br /> &nbsp; Где вы в этой ветке прочитали мою статью?<br />2. <br />====quote====<br /><a class="blog-p-user-name" id="bp_cGX4p6Fo" href="/user/111/" bx-tooltip-user-id="111">Ростислав Дм. Кудряшов</a> написал:<br />есть и третий способ использования IUP<br />=============<br /> &nbsp; Я это читал. <br />3. <br />====quote====<br /><a class="blog-p-user-name" id="bp_jkMxgXrW" href="/user/111/" bx-tooltip-user-id="111">Ростислав Дм. Кудряшов</a> написал:<br />параллельное исполнение скрипта main() и ручных манипуляций в IUP с непрерывной связью между этими нитями (threads) в обоих направлениях.<br />=============<br /> &nbsp; Где вы прочитали, что корутины в Lua выполняются параллельно? Интересно, как в одном потоке можно с помощью корутин реализовать параллелизм (одновременность) их выполнения? Но на всякий случай цитата Р. Иерузалимски: "в любой момент времени программа с сопрограммами выполняет только одну из своих сопрограмм". <br />
			<i>04.10.2025 22:40:12, TGB.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message79670/topic9270/</link>
			<guid>http://forum.quik.ru/messages/forum10/message79670/topic9270/</guid>
			<pubDate>Sat, 04 Oct 2025 22:40:12 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Два варианта использования графического пакета IUP (Lua 5.4) в QUIKе</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message79666/topic9270/">Два варианта использования графического пакета IUP (Lua 5.4) в QUIKе</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Вообще-то есть и третий способ использования IUP в Quik&#39;е <noindex><a href="https://forum.quik.ru/forum10/topic9267/" target="_blank" rel="nofollow">ttps://forum.quik.ru/forum10/topic9267/</a></noindex>Со вполне чётко разъяснённой мотивацией и &nbsp;механикой - параллельное исполнение скрипта main() и ручных манипуляций в IUP с непрерывной связью между этими нитями (threads) в обоих направлениях. Переключение сопрограмм-корутин (coroutines) по таймеру между потоками управления в main() и IUP должно быть эффективнее любого другого способа.<br /><br />А вот ещё четвёртый способ - запустить IUP из отдельного скрипта со своим main(), а ещё лучше - отдельным от Quik&#39;а приложением; тогда не будет лишней нагрузки на Quik. И держать двустороннюю связь между торговым скриптом и IUP через DDE. Это создаст ещё меньшие накладные расходы (в основе DDE - оконные процедуры Windows), и отпадает необходимость переключения по таймеру - связь только когда возникает реальная потребность обмена. <br />
			<i>04.10.2025 21:28:04, Ростислав Дм. Кудряшов.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message79666/topic9270/</link>
			<guid>http://forum.quik.ru/messages/forum10/message79666/topic9270/</guid>
			<pubDate>Sat, 04 Oct 2025 21:28:04 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Два варианта использования графического пакета IUP (Lua 5.4) в QUIKе</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message79665/topic9270/">Два варианта использования графического пакета IUP (Lua 5.4) в QUIKе</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Статья не разъясняет, &quot;для чего и как&quot;. Поэтому нет причины углубляться в скрипт. <br />
			<i>04.10.2025 21:07:26, Ростислав Дм. Кудряшов.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message79665/topic9270/</link>
			<guid>http://forum.quik.ru/messages/forum10/message79665/topic9270/</guid>
			<pubDate>Sat, 04 Oct 2025 21:07:26 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Два варианта использования графического пакета IUP (Lua 5.4) в QUIKе</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message79662/topic9270/">Два варианта использования графического пакета IUP (Lua 5.4) в QUIKе</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_80dl0QIF" href="/user/3132/" bx-tooltip-user-id="3132">Nikolay</a> написал:<br />Нет, мне это не надо. <br />=============<br /> &nbsp; &nbsp;Согласен, в работающем роботе достаточно возможностей пользовательских таблиц QUIK. Идеальный, зарабатывающий робот должен это делать без вводных и без лишнего вывода, только отчеты о прибыли в журнале с аналитикой, полезной пользователю. Реально, желателен вывод роботом сообщений о наступлении событий, требующих вмешательство пользователя. Все это без проблем реализуемо на таблицах QUIK.<br /> &nbsp; Графический пакет я использовал для реализации средств создания скриптов, что сделать на таблицах QUIK сложновато. <br />
			<i>04.10.2025 15:17:21, TGB.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message79662/topic9270/</link>
			<guid>http://forum.quik.ru/messages/forum10/message79662/topic9270/</guid>
			<pubDate>Sat, 04 Oct 2025 15:17:21 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Два варианта использования графического пакета IUP (Lua 5.4) в QUIKе</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message79650/topic9270/">Два варианта использования графического пакета IUP (Lua 5.4) в QUIKе</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_WE6kCzpv" href="/user/3132/" bx-tooltip-user-id="3132">Nikolay</a> написал:<br />Просто замечание, что если предлагаете какое-то открытое решение, то зачем скрывать код, его подключающее.<br />=============<br /> &nbsp;С этим можно бы согласиться, но есть вариант 1, в котором нет скрытых кодов. <br />
			<i>04.10.2025 11:47:41, TGB.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message79650/topic9270/</link>
			<guid>http://forum.quik.ru/messages/forum10/message79650/topic9270/</guid>
			<pubDate>Sat, 04 Oct 2025 11:47:41 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Два варианта использования графического пакета IUP (Lua 5.4) в QUIKе</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message79649/topic9270/">Два варианта использования графического пакета IUP (Lua 5.4) в QUIKе</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Нет, мне это не надо. Просто замечание, что если предлагаете какое-то открытое решение, то зачем скрывать код, его подключающее. <br />
			<i>04.10.2025 10:47:25, Nikolay.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message79649/topic9270/</link>
			<guid>http://forum.quik.ru/messages/forum10/message79649/topic9270/</guid>
			<pubDate>Sat, 04 Oct 2025 10:47:25 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Два варианта использования графического пакета IUP (Lua 5.4) в QUIKе</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message79648/topic9270/">Два варианта использования графического пакета IUP (Lua 5.4) в QUIKе</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_0H2W9uTB" href="/user/3132/" bx-tooltip-user-id="3132">Nikolay</a> написал:<br />Я понял про что это библиотека. Я говорил, что нет исходников.<br />=============<br /><br />Мною рекомендуется использовать первый вариант и для него пакет QluaUser.dll не требуется. <br />
			<i>04.10.2025 10:41:20, TGB.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message79648/topic9270/</link>
			<guid>http://forum.quik.ru/messages/forum10/message79648/topic9270/</guid>
			<pubDate>Sat, 04 Oct 2025 10:41:20 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Два варианта использования графического пакета IUP (Lua 5.4) в QUIKе</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message79647/topic9270/">Два варианта использования графического пакета IUP (Lua 5.4) в QUIKе</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_htrRtgiK" href="/user/13952/" bx-tooltip-user-id="13952">TGB</a> написал:<br /> <br />====quote====<br /><noindex><a href="/user/3132/" target="_blank" rel="nofollow">Nikolay</a></noindex> написал:<br />Просто к слову, т.к. используется неизвестная библиотека QluaUser.dll то запускать это не видя исходники будут сложно. По крайней мере мне, не знаю как другим.<br />=============<br /> <br /> <br />====quote====<br /><noindex><a href="/user/13952/" target="_blank" rel="nofollow">TGB</a></noindex> написал:<br />-- Вариант 1: запуск IUP в потоке main (надо подключать только IUP, но цикл обработки скрипта программировать <br />-- в таймере IUP: помечено #### ).<br />-- Вариант 2: запуск IUP в отдельном потоке отличном от main(кроме IUP, обязательно подключать пакет QluaUser).<br />-- &nbsp; &nbsp;Вариант 1 более безопасный, чем 2. Так как однопоточный, и не требующий синхронизации диалога с <br />-- основной работой скрипта.<br />=============<br /> <br />=============<br />Я понял про что это библиотека. Я говорил, что нет исходников. <br />
			<i>04.10.2025 09:55:56, Nikolay.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message79647/topic9270/</link>
			<guid>http://forum.quik.ru/messages/forum10/message79647/topic9270/</guid>
			<pubDate>Sat, 04 Oct 2025 09:55:56 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Два варианта использования графического пакета IUP (Lua 5.4) в QUIKе</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message79645/topic9270/">Два варианта использования графического пакета IUP (Lua 5.4) в QUIKе</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_c64rJG1r" href="/user/3132/" bx-tooltip-user-id="3132">Nikolay</a> написал:<br />Просто к слову, т.к. используется неизвестная библиотека QluaUser.dll то запускать это не видя исходники будут сложно. По крайней мере мне, не знаю как другим.<br />=============<br /><br /><br />====quote====<br /><a class="blog-p-user-name" id="bp_6x7ZUE8T" href="/user/13952/" bx-tooltip-user-id="13952">TGB</a> написал:<br />-- Вариант 1: запуск IUP в потоке main (надо подключать только IUP, но цикл обработки скрипта программировать <br />-- в таймере IUP: помечено #### ).<br />-- Вариант 2: запуск IUP в отдельном потоке отличном от main(кроме IUP, обязательно подключать пакет QluaUser).<br />-- &nbsp; &nbsp;Вариант 1 более безопасный, чем 2. Так как однопоточный, и не требующий синхронизации диалога с <br />-- основной работой скрипта.<br />=============<br /> <br />
			<i>04.10.2025 09:09:10, TGB.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message79645/topic9270/</link>
			<guid>http://forum.quik.ru/messages/forum10/message79645/topic9270/</guid>
			<pubDate>Sat, 04 Oct 2025 09:09:10 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Два варианта использования графического пакета IUP (Lua 5.4) в QUIKе</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message79644/topic9270/">Два варианта использования графического пакета IUP (Lua 5.4) в QUIKе</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Просто к слову, т.к. используется неизвестная библиотека QluaUser.dll то запускать это не видя исходники будут сложно. По крайней мере мне, не знаю как другим. <br />
			<i>04.10.2025 09:01:45, Nikolay.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message79644/topic9270/</link>
			<guid>http://forum.quik.ru/messages/forum10/message79644/topic9270/</guid>
			<pubDate>Sat, 04 Oct 2025 09:01:45 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Два варианта использования графического пакета IUP (Lua 5.4) в QUIKе</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message79641/topic9270/">Два варианта использования графического пакета IUP (Lua 5.4) в QUIKе</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Инструкция в коде примера:<br />
====code====
<pre>

--- Использование графического пакета IUP (Lua 5.4...) в QUIKе (! ограничение IUP: 
-- только в одном из запущенном скрипте экземпляра QUIK).
-- Доступны все возможности пакета IUP (подключаемой версии).
-- Вариант 1: запуск IUP в потоке main (надо подключать только IUP, но цикл обработки скрипта программировать 
-- в таймере IUP: помечено #### ).
-- Вариант 2: запуск IUP в отдельном потоке отличном от main(кроме IUP, обязательно подключать пакет QluaUser).
--&nbsp;&nbsp;&nbsp;&nbsp;Вариант 1 более безопасный, чем 2. Так как однопоточный, и не требующий синхронизации диалога с 
-- основной работой скрипта.
-- Ссылка для скачивания пакетов iup.dll, iuplua54.dll, QluaUser.dll (мой):
--&nbsp;&nbsp;&nbsp;&nbsp;https://cloud.mail.ru/public/7xAm/jaCgULqGo&nbsp;&nbsp;&nbsp;&nbsp;Перед использованием пакетов, надо их разблокировать.
-- Пакеты переслать в папку экземпляра QUIK, хранящую файл info.exe.
_RUN_ = true

function main()
&nbsp;&nbsp; -- Пример формы IUP со двумя вкладками ---
&nbsp;&nbsp; local Pause = 1000
&nbsp;&nbsp; local thread = false&nbsp;&nbsp;-- false - выполнение диалога в потоке main; true - запуск IUP в отдельном потоке --
&nbsp;&nbsp; local cpath = (getWorkingFolder() .. '&#92;&#92;?54.dll;' .. getWorkingFolder() .. '&#92;&#92;?_5_4.dll;'.. getWorkingFolder() .. '&#92;&#92;?.dll;' .. package.cpath)
&nbsp;&nbsp;&nbsp;&nbsp;---
&nbsp;&nbsp; package.cpath = cpath
&nbsp;&nbsp; require("iuplua")
&nbsp;&nbsp; local QluaUser = require('QluaUser')&nbsp;&nbsp;-- Это для запуска диалога IUP в отдельном потоке ---
&nbsp;&nbsp; if thread then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QluaUser = require('QluaUser')
&nbsp;&nbsp; end
&nbsp;&nbsp; local function iup_form()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local timer = iup.timer { time = Pause }&nbsp;&nbsp; ---- Вместо sleep таймер формы&nbsp;&nbsp;( млсек.)&nbsp;&nbsp;---
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timer.run = "NO"
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function timer:action_cb()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if not _RUN_ then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timer.run = "NO"
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iup:ExitLoop()&nbsp;&nbsp; --&nbsp;&nbsp;Завершает текущий диалог&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if not thread then -- Основной цикл обработки скрипта в таймере IUP ---
&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;message('iup выполняется в потоке main. Тело основного цикла скрипта должно выполняеться здесь (в таймере iup)')
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-------------------
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- Creates boxes
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local vboxA = iup.vbox{iup.fill{}, iup.label{title="TABS AAA", expand="HORIZONTAL"}, iup.button{title="AAA"}}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local vboxB = iup.vbox{iup.label{title="TABS BBB"}, iup.button{title="BBB"}}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- Sets titles of the vboxes
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vboxA.tabtitle = "AAAAAA"
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vboxB.tabtitle = "BBBBBB"
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- Creates tabs 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local tabs = iup.tabs{vboxA, vboxB}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- Creates dialog
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local dlg = iup.dialog{iup.vbox{tabs; margin="10x10"}; title="Test IupTabs", size="150x80"}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- Shows dialog in the center of the screen
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dlg:showxy(iup.CENTER, iup.CENTER)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timer.run = "YES"
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (iup.MainLoopLevel()==0) then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iup.MainLoop()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timer.run = "NO"
&nbsp;&nbsp; end
&nbsp;&nbsp; if thread then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QluaUser.ThreadNew(iup_form)
&nbsp;&nbsp; else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iup_form()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iup.Close()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iup = nil
&nbsp;&nbsp; end
&nbsp;&nbsp; 
&nbsp;&nbsp; while _RUN_ do&nbsp;&nbsp;&nbsp;&nbsp;-- Основной цикл обработки скрипта в main ---
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-----------------------
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if thread then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; message('iup был запущен в отдельном потоке. Тело основного цикла скрипта выполняется в потоке main.')
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; message('После завершения потока iup, продолжается выполняется поток main.')
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(Pause)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-----------------------
&nbsp;&nbsp; end
end 
---
function OnStop(flag)
&nbsp;&nbsp; _RUN_ = false
&nbsp;&nbsp; sleep(2000)
&nbsp;&nbsp; if iup then iup.Close() end
&nbsp;&nbsp; return 3000 
end
</pre>
============= <br />
			<i>03.10.2025 20:50:09, TGB.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message79641/topic9270/</link>
			<guid>http://forum.quik.ru/messages/forum10/message79641/topic9270/</guid>
			<pubDate>Fri, 03 Oct 2025 20:50:09 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
	</channel>
</rss>
