<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>Форум QUIK [тема: Очередь -элементарно и полезно]</title>
		<link>http://forum.quik.ru</link>
		<description>Новое в теме Очередь -элементарно и полезно форума  на сайте Форум QUIK [forum.quik.ru]</description>
		<language>ru</language>
		<docs>http://backend.userland.com/rss2</docs>
		<pubDate>Mon, 20 Apr 2026 01:03:05 +0300</pubDate>
		<item>
			<title>Очередь -элементарно и полезно</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum17/message73870/topic8467/">Очередь -элементарно и полезно</a></b> <i>Как сделать очередь в роботе и зачем.  </i> в форуме <a href="http://forum.quik.ru/forum17/">Обмен опытом</a>. <br />
			Примечательно то, что наличие очереди дает нам возможность получить и обработать все события, которые принимают колбеки вне зависимости от величины времени &nbsp;бездействия &nbsp;функции sleep.<br />----------------<br />Если бы я не использовал очередь, то в случае sleep(1000) - 1 секунда, в каждом цикле терялись несколько десятков событий.<br />Если посмотрите тему &quot;мой робот&quot;, то там видно что за 5 секунд приходит до 3000 событий, которые без организации очереди просто потеряются.<br />=====================<br />А теперь я объясню как в моем скрипте организована очередь и почему она такая простая.<br />---------------<br />Очередь реализована так.<br />строка:
====code====
<pre>_N=0; _tN={};</pre>
=============
в ней задается счетчик элементов очереди _N<br />и таблица для этих элементов<br />-------------------<br />запись элемента в очередь производится в колбеках всегда одинаково просто:
====code====
<pre>&nbsp;&nbsp;_N=_N+1; _tN&#91;_N&#93;={1,t}; </pre>
=============
а для колбека onParam так:
====code====
<pre> _N=_N+1; _tN&#91;_N&#93;={99,c,s,tim};

</pre>
=============
т е увеличиваем счетчик элементов<br />и записываем в таблицу по значению счетчика &nbsp; ключ и передаваемые параметры.<br />-----------------------<br />При записи не требуется никакой синхронизации, так как запись лишь в колбеках, а они в одном потоке.<br />----------------------<br />Чтение и удаление элемента из очереди реализована в функции main &nbsp;так:
====code====
<pre>&nbsp;&nbsp; t=_tN&#91;_N&#93;; _N=_N-1 

</pre>
=============
Элемент не удаляется, а уменьшается лишь счетчик.<br />Удаление элемента произойдет лишь, если на его место будет записан новый элемент в колбеке.<br />=====================<br />Вот и вся очередь.<br />-----------------------<br />Все просто , но весьма эффективно.<br />---------------------<br />Далее я расскажу как сделать обработку еще быстрее, но не сложнее.<br />-----------------<br />Продолжение возможно следует.. &nbsp; <br />
			<i>19.01.2024 14:15:15, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum17/message73870/topic8467/</link>
			<guid>http://forum.quik.ru/messages/forum17/message73870/topic8467/</guid>
			<pubDate>Fri, 19 Jan 2024 14:15:15 +0300</pubDate>
			<category>Обмен опытом</category>
		</item>
		<item>
			<title>Очередь -элементарно и полезно</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum17/message73864/topic8467/">Очередь -элементарно и полезно</a></b> <i>Как сделать очередь в роботе и зачем.  </i> в форуме <a href="http://forum.quik.ru/forum17/">Обмен опытом</a>. <br />
			В данном варианте скрипта у нас нет информации о времени исполнения каких-либо фрагментов.<br />изменим скрипт и добавим измерения времени исполнения.<br />кроме того, начнем процесс изучения с классической рекомендации разработчиков - поставить sleep на 1 секунду<br />вот такой скрипт:
====code====
<pre>name="bot";&nbsp;&nbsp;-- имя робота
path = "D:/QUIK_SCRIPT/nk_bot/"&nbsp;&nbsp; --папка где разместим лог файл
Log=io.open(path..name..".log","w")&nbsp;&nbsp; -- создаем лог файл для записи
------------
_N=0; _tN={};
----------------------
function main()
-----------------------
&nbsp;&nbsp;&nbsp;while fconnect do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if getInfoParam("SERVERTIME") then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DT=getInfoParam("TRADEDATE"); DT=tonumber(string.sub (DT,7,10)..string.sub (DT,4,5)..string.sub (DT,1,2));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fconnect=2;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log:write("DT="..tostring(DT)..",fconnect="..fconnect.."&#92;n");Log:flush();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
------------------------------

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local clas,sec,ncb,t,_time,tim1,tim2,T;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local tim0,tim1,tim2,T;
-----------------------------
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while fconnect==2 do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while _N&#62;0 do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t=_tN&#91;_N&#93;; _N=_N-1&nbsp;&nbsp;ncb=t&#91;1&#93;;
&nbsp;&nbsp;&nbsp;----------------------
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ncb==99 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clas,sec=t&#91;2&#93;,t&#91;3&#93;; tim1=t&#91;4&#93;;

&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;t=t&#91;2&#93;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ncb==1 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clas=t.class_code; sec=t.sec_code; --может не быть
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elseif ncb==2 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clas=t.class_code; sec=t.sec_code;
&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;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T=os.sysdate(); tim=60.*(60.*T.hour+T.min)+T.sec+0.001*(T.ms+0.001*T.mcs);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tim=(1000000.*(tim-tim1))//1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log:write(ncb..",tim="..tim..",clas="..tostring(clas)..",sec="..tostring(sec)..",_N=".._N.."&#92;n");Log:flush();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(1000);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;end
end
----------------------------
function OnInit(pfile) &nbsp;&nbsp;&nbsp;fconnect=isConnected(); end
----------------
function OnParam(c,s)
local T=os.sysdate(); local tim=60.*(60.*T.hour+T.min)+T.sec+0.001*(T.ms+0.001*T.mcs)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_N=_N+1; _tN&#91;_N&#93;={99,c,s,tim};
end
function OnTransReply(t)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_N=_N+1; _tN&#91;_N&#93;={1,t}; end
function OnOrder(t)&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_N=_N+1; _tN&#91;_N&#93;={2,t}; end
</pre>
=============
это результат в лог файле:
====code====
<pre>DT=20240119,fconnect=2
99,tim=218014.0,clas=SPBFUT,sec=EuH4,_N=25
99,tim=304359.0,clas=SPBFUT,sec=SVH4,_N=24
99,tim=541966.0,clas=SPBFUT,sec=NKH4,_N=23
99,tim=595608.0,clas=CETS,sec=EUR_RUB__TOD,_N=22
99,tim=1213820.0,clas=SPBFUT,sec=EuH4,_N=21
99,tim=1344144.0,clas=SPBFUT,sec=GZH4,_N=20
99,tim=1404051.0,clas=SPBFUT,sec=EuH4,_N=19
99,tim=587619.0,clas=CETS,sec=EUR_RUB__TOD,_N=18
99,tim=587619.0,clas=SPBFUT,sec=EDH4,_N=17
99,tim=772196.0,clas=QJSIM,sec=YNDX,_N=16
99,tim=772196.0,clas=QJSIM,sec=WUSH,_N=15
99,tim=772196.0,clas=QJSIM,sec=TGKA,_N=14
99,tim=772196.0,clas=QJSIM,sec=TATNP,_N=13
99,tim=772196.0,clas=QJSIM,sec=SNGS,_N=12
99,tim=772196.0,clas=QJSIM,sec=SFIN,_N=11
99,tim=772196.0,clas=QJSIM,sec=SBER,_N=10
99,tim=772196.0,clas=QJSIM,sec=RTKMP,_N=9
99,tim=772196.0,clas=QJSIM,sec=RTKM,_N=8
99,tim=772196.0,clas=QJSIM,sec=OZON,_N=7
99,tim=772196.0,clas=QJSIM,sec=MTLR,_N=6
99,tim=772196.0,clas=QJSIM,sec=KGKCP,_N=5
99,tim=772196.0,clas=QJSIM,sec=IRAO,_N=4
99,tim=772196.0,clas=QJSIM,sec=GLTR,_N=3
99,tim=772196.0,clas=QJSIM,sec=GAZP,_N=2
99,tim=772196.0,clas=QJSIM,sec=ALRS,_N=1
99,tim=772196.0,clas=QJSIM,sec=ABIO,_N=0
99,tim=61608.0,clas=SPBFUT,sec=EuH4,_N=26
99,tim=127575.0,clas=SPBFUT,sec=BRH4,_N=25
99,tim=559817.0,clas=CETS,sec=EURUSD000TOD,_N=24
99,tim=653453.0,clas=SPBFUT,sec=EuH4,_N=23
99,tim=899874.0,clas=SPBFUT,sec=CRH4,_N=22
99,tim=995760.0,clas=SPBFUT,sec=GZH4,_N=21
99,tim=1022059.0,clas=QJSIM,sec=WUSH,_N=20
99,tim=1022059.0,clas=QJSIM,sec=TTLK,_N=19
99,tim=1022059.0,clas=QJSIM,sec=TGKA,_N=18
99,tim=1022059.0,clas=QJSIM,sec=TCSG,_N=17
99,tim=1022059.0,clas=QJSIM,sec=SOFL,_N=16
99,tim=1022059.0,clas=QJSIM,sec=SFIN,_N=15
99,tim=1022059.0,clas=QJSIM,sec=SBERP,_N=14
99,tim=1022059.0,clas=QJSIM,sec=SBER,_N=13
99,tim=1022059.0,clas=QJSIM,sec=RTKM,_N=12
99,tim=1022059.0,clas=QJSIM,sec=MTSS,_N=11
99,tim=1022059.0,clas=QJSIM,sec=MTLR,_N=10
99,tim=1022059.0,clas=QJSIM,sec=KZOSP,_N=9
99,tim=1022059.0,clas=QJSIM,sec=KGKCP,_N=8
99,tim=1022059.0,clas=QJSIM,sec=IRAO,_N=7
99,tim=1022059.0,clas=QJSIM,sec=GAZP,_N=6
99,tim=1022059.0,clas=QJSIM,sec=ALRS,_N=5
99,tim=1430033.0,clas=SPBFUT,sec=SiH4,_N=4
99,tim=619443.0,clas=CETS,sec=SLVRUB_TOM,_N=3
99,tim=619443.0,clas=SPBFUT,sec=EuH4,_N=2
99,tim=681738.0,clas=SPBFUT,sec=EuH4,_N=1
99,tim=805853.0,clas=SPBFUT,sec=SGH4,_N=0
99,tim=311503.0,clas=QJSIM,sec=WUSH,_N=23
99,tim=311503.0,clas=QJSIM,sec=SNGS,_N=22
99,tim=311503.0,clas=QJSIM,sec=SFIN,_N=21
99,tim=311503.0,clas=QJSIM,sec=SBERP,_N=20
</pre>
=============
В лог файле есть два значения времени tim, - задержка исполнения колбека onParam в main <br />Как видно из лог файла , Как видим из лог файла очередь на обработку никогда не бывает пустой.<br />Задержка составляет от 0.3 до 0.8 сек. В лог файле она в мкс.<br />--------------------------<br />функция sleep установлена чтобы уменьшить загрузку ядра процессора холостыми циклами.<br />Поэтому посмотрим в диспетчере задач эту загрузку.<br />Она составляет:<br />[FILE ID=11709]<br /><br />Примерно 8.5%<br />теперь давайте уменьшим эту величину до 1 ms<br />в результате получим: 
====code====
<pre>DT=20240119,fconnect=2
99,tim=32006.0,clas=SPBFUT,sec=SiH4,_N=1
99,tim=32006.0,clas=SPBFUT,sec=SiH4,_N=0
99,tim=31589.0,clas=SPBFUT,sec=RNH4,_N=1
99,tim=31589.0,clas=SPBFUT,sec=RNH4,_N=0
99,tim=24404.0,clas=SPBFUT,sec=SiH4,_N=2
99,tim=24404.0,clas=SPBFUT,sec=SPH4,_N=1
99,tim=24404.0,clas=SPBFUT,sec=EuH4,_N=0
99,tim=32006.0,clas=SPBFUT,sec=RNH4,_N=0
99,tim=30568.0,clas=SPBFUT,sec=SPH4,_N=0
99,tim=30675.0,clas=SPBFUT,sec=RNH4,_N=2
99,tim=30675.0,clas=SPBFUT,sec=SPH4,_N=1
99,tim=30675.0,clas=SPBFUT,sec=RNH4,_N=0
99,tim=30164.0,clas=SPBFUT,sec=RNH4,_N=0
99,tim=20010.0,clas=SPBFUT,sec=SPH4,_N=0
99,tim=30185.0,clas=SPBFUT,sec=SPH4,_N=0
99,tim=28578.0,clas=SPBFUT,sec=RIH4,_N=1
99,tim=28578.0,clas=SPBFUT,sec=SiH4,_N=0
99,tim=4000.0,clas=SPBFUT,sec=EuH4,_N=0
99,tim=26515.0,clas=SPBFUT,sec=RNH4,_N=0
99,tim=2383.0,clas=SPBFUT,sec=RNH4,_N=0
99,tim=30316.0,clas=SPBFUT,sec=SiH4,_N=1
99,tim=30316.0,clas=SPBFUT,sec=SiH4,_N=0
99,tim=31911.0,clas=SPBFUT,sec=SPH4,_N=0
99,tim=11245.0,clas=SPBFUT,sec=VBH4,_N=2
99,tim=11245.0,clas=SPBFUT,sec=VBH4,_N=1
99,tim=11508.0,clas=SPBFUT,sec=RNH4,_N=0
99,tim=11998.0,clas=SPBFUT,sec=SPH4,_N=0
99,tim=28664.0,clas=SPBFUT,sec=SiH4,_N=0
99,tim=27900.0,clas=SPBFUT,sec=RNH4,_N=0
99,tim=831.0,clas=SPBFUT,sec=BRG4,_N=0
99,tim=11832.0,clas=SPBFUT,sec=GZH4,_N=1
99,tim=11832.0,clas=SPBFUT,sec=EuH4,_N=0
99,tim=11998.0,clas=CETS,sec=TRYRUB_TOM,_N=1
99,tim=11998.0,clas=CETS,sec=CNYRUB_TOM,_N=0
99,tim=31687.0,clas=SPBFUT,sec=GZH4,_N=0
99,tim=23877.0,clas=SPBFUT,sec=RNH4,_N=0
99,tim=11997.0,clas=SPBFUT,sec=SPH4,_N=0
99,tim=31793.0,clas=SPBFUT,sec=RNH4,_N=0
99,tim=30233.0,clas=SPBFUT,sec=SPH4,_N=0
99,tim=29818.0,clas=SPBFUT,sec=MMH4,_N=0
99,tim=30141.0,clas=SPBFUT,sec=RNH4,_N=0
99,tim=1998.0,clas=QJSIM,sec=YNDX,_N=19
99,tim=1998.0,clas=QJSIM,sec=WUSH,_N=18
99,tim=1998.0,clas=QJSIM,sec=VTBR,_N=17
99,tim=1998.0,clas=QJSIM,sec=VKCO,_N=16
99,tim=1998.0,clas=QJSIM,sec=TCSG,_N=15
99,tim=1998.0,clas=QJSIM,sec=SFIN,_N=14
99,tim=1998.0,clas=QJSIM,sec=SELG,_N=13
99,tim=1998.0,clas=QJSIM,sec=SBER,_N=12
99,tim=1998.0,clas=QJSIM,sec=ROSN,_N=11
99,tim=1998.0,clas=QJSIM,sec=OZON,_N=10
99,tim=1998.0,clas=QJSIM,sec=MOEX,_N=9
99,tim=1998.0,clas=QJSIM,sec=LKOH,_N=8
99,tim=1998.0,clas=QJSIM,sec=KAZTP,_N=7
99,tim=1998.0,clas=QJSIM,sec=IRAO,_N=6
99,tim=4000.0,clas=QJSIM,sec=GLTR,_N=5

</pre>
=============
Задержка составляет 1998 мкс примерно 2 ms. &nbsp;Очередь бывает пустой.<br />Смотрим загрузку ядра:<br />[FILE ID=11710]<br />Примерно 10%. Что вполне допустимо<br />------------------<br />Продолжение следует... <br />
			<img src="https://forum.quik.ru/bitrix/components/bitrix/forum.interface/show_file.php?fid=11709&" width="852" height="30" /><br /><img src="https://forum.quik.ru/bitrix/components/bitrix/forum.interface/show_file.php?fid=11710&" width="866" height="34" /><br /><i>19.01.2024 13:47:51, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum17/message73864/topic8467/</link>
			<guid>http://forum.quik.ru/messages/forum17/message73864/topic8467/</guid>
			<pubDate>Fri, 19 Jan 2024 13:47:51 +0300</pubDate>
			<category>Обмен опытом</category>
		</item>
		<item>
			<title>Очередь -элементарно и полезно</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum17/message73859/topic8467/">Очередь -элементарно и полезно</a></b> <i>Как сделать очередь в роботе и зачем.  </i> в форуме <a href="http://forum.quik.ru/forum17/">Обмен опытом</a>. <br />
			Тем, кто хотел бы практически разобраться в данном вопросе, рекомендую установить демо КВИК<br />и запускать скрипты, которые я буду выкладывать и пояснять.<br />Итак начнем.<br />Вот исходный скрипт, в нем закомментированы некоторые операторы, которые демонстрируют однотипность записи колбеков<br />и их обработку в функции main.<br />В первых трех строчках скрипта создаемся лог файл, куда скрипт выводит информацию о своей работе.<br />Вам надо исправить 2-ю строку, записав в ней путь, где Вы хотите создать этот файл <br />
====code====
<pre>name="bot";&nbsp;&nbsp;-- имя робота
path = "D:/QUIK_SCRIPT/nk_bot/"&nbsp;&nbsp; --папка где разместим лог файл
Log=io.open(path..name..".log","w")&nbsp;&nbsp; -- создаем лог файл для записи
------------
_N=0; _tN={};
----------------------
function main()
-----------------------
&nbsp;&nbsp;&nbsp;while fconnect do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if getInfoParam("SERVERTIME") then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DT=getInfoParam("TRADEDATE"); DT=tonumber(string.sub (DT,7,10)..string.sub (DT,4,5)..string.sub (DT,1,2));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fconnect=2;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log:write("DT="..tostring(DT)..",fconnect="..fconnect.."&#92;n");Log:flush();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
------------------------------

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local clas,sec,ncb,t,_time;
-----------------------------
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while fconnect==2 do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while _N&#62;0 do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t=_tN&#91;_N&#93;; _N=_N-1&nbsp;&nbsp;ncb=t&#91;1&#93;;
&nbsp;&nbsp;&nbsp;----------------------
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ncb==99 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clas,sec=t&#91;2&#93;,t&#91;3&#93;;
&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;t=t&#91;2&#93;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ncb==1 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clas=t.class_code; sec=t.sec_code; --может не быть
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elseif ncb==2 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clas=t.class_code; sec=t.sec_code;
--&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elseif ncb==3 then
--&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elseif ncb==4 then
--&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elseif ncb==5 then
--&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elseif ncb==6 then
--&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elseif ncb==7 then
--&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elseif ncb==8 then
--&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elseif ncb==9 then
--&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elseif ncb==10 then
--&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elseif ncb==11 then
--&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elseif ncb==12 then
&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;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log:write(ncb..",clas="..tostring(clas)..",sec="..tostring(sec)..",_N=".._N.."&#92;n");Log:flush();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_time=0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(1);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;end
end
----------------------------
function OnInit(pfile) &nbsp;&nbsp;&nbsp;fconnect=isConnected(); end
----------------
function OnParam(c,s)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_N=_N+1; _tN&#91;_N&#93;={99,c,s,tim};end
---------------------
function OnTransReply(t)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_N=_N+1; _tN&#91;_N&#93;={1,t}; end
function OnOrder(t)&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_N=_N+1; _tN&#91;_N&#93;={2,t}; end
--function OnStopOrder(t) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_N=_N+1; _tN&#91;_N&#93;={3,t}; end
--function OnTrade(t)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;_N=_N+1; _tN&#91;_N&#93;={4,t}; end
--function OnQuote(c,s)&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_N=_N+1; _tN&#91;_N&#93;={5,t}; end
--function OnAllTrade(t) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_N=_N+1; _tN&#91;_N&#93;={6,t}; end
--function OnDepoLimit(t)&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_N=_N+1; _tN&#91;_N&#93;={7,t}; end
--function OnAccountBalance(t) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _N=_N+1; _tN&#91;_N&#93;={8,t}; end-- изменение позиции по счету
--function OnAccountPosition(t) &nbsp;&nbsp;&nbsp;_N=_N+1; _tN&#91;_N&#93;={9,t}; end-- изменение позиции по счету
--function OnDepoLimit(t) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_N=_N+1; _tN&#91;_N&#93;={10,t}; end -- изменение позиции по инструментам
--function OnFuturesClientHolding(t) _N=_N+1; _tN&#91;_N&#93;={11,t}; end&nbsp;&nbsp;-- изменение позиции по срочному рынку
--function OnMoneyLimit(t) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_N=_N+1; _tN&#91;_N&#93;={12,t}; end -- изменение денежной позиции

--function OnClose() fconnect=nil end
--function OnConnected(flag) fconnect=1; end
--function OnDisconnected() fconnect=1 end
--function OnStop(flag) fconnect=nil; return 2000 end
--function OnCleanUp()&nbsp;&nbsp;end -- смена торговой сессии
--function OnDepoLimitDelete(t) end -- удаление позиции по инструментам
--function OnFirm(t) end -- получение описания новой фирмы
--function OnFuturesLimitChange(t) end -- изменение ограничений по срочному рынку
--function OnFuturesLimitDelete(t) end -- удаление лимита по срочному рынку
--function OnMoneyLimitDelete(t) end -- удаление денежной позиции
--function OnNegDeal end-- новая заявка на внебиржевую сделку или изменение параметров существующей заявки на внебиржевую сделку
--function OnNegTrade end-- новая сделка для исполнения или изменение существующей сделки для исполнения
</pre>
=============
для наглядности уберем эти комментарии:
====code====
<pre>name="bot";&nbsp;&nbsp;-- имя робота
path = "D:/QUIK_SCRIPT/nk_bot/"&nbsp;&nbsp; --папка где разместим лог файл
Log=io.open(path..name..".log","w")&nbsp;&nbsp; -- создаем лог файл для записи
------------
_N=0; _tN={};
----------------------
function main()
-----------------------
&nbsp;&nbsp;&nbsp;while fconnect do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if getInfoParam("SERVERTIME") then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DT=getInfoParam("TRADEDATE"); DT=tonumber(string.sub (DT,7,10)..string.sub (DT,4,5)..string.sub (DT,1,2));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fconnect=2;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log:write("DT="..tostring(DT)..",fconnect="..fconnect.."&#92;n");Log:flush();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
------------------------------

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local clas,sec,ncb,t,_time;
-----------------------------
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while fconnect==2 do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while _N&#62;0 do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t=_tN&#91;_N&#93;; _N=_N-1&nbsp;&nbsp;ncb=t&#91;1&#93;;
&nbsp;&nbsp;&nbsp;----------------------
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ncb==99 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clas,sec=t&#91;2&#93;,t&#91;3&#93;;
&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;t=t&#91;2&#93;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ncb==1 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clas=t.class_code; sec=t.sec_code; --может не быть
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elseif ncb==2 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clas=t.class_code; sec=t.sec_code;
&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;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log:write(ncb..",clas="..tostring(clas)..",sec="..tostring(sec)..",_N=".._N.."&#92;n");Log:flush();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_time=0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(1);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;end
end
----------------------------
function OnInit(pfile) &nbsp;&nbsp;&nbsp;fconnect=isConnected(); end
----------------
function OnParam(c,s)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_N=_N+1; _tN&#91;_N&#93;={99,c,s,tim};end
---------------------
function OnTransReply(t)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_N=_N+1; _tN&#91;_N&#93;={1,t}; end
function OnOrder(t)&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_N=_N+1; _tN&#91;_N&#93;={2,t}; end
</pre>
=============
Запустим этот скрипт на исполнение<br />и получим следующий результат в лог файле
====code====
<pre>DT=20240119,fconnect=2
99,clas=SPBFUT,sec=SiH4,_N=0
99,clas=SPBFUT,sec=MMH4,_N=0
99,clas=SPBFUT,sec=EuH4,_N=0
99,clas=SPBFUT,sec=EuH4,_N=0
99,clas=SPBFUT,sec=EuH4,_N=0
99,clas=SPBFUT,sec=SFH4,_N=0
99,clas=SPBFUT,sec=EuH4,_N=0
99,clas=SPBFUT,sec=EuH4,_N=1
99,clas=SPBFUT,sec=USDRUBF,_N=0
99,clas=SPBFUT,sec=EuH4,_N=0
99,clas=SPBFUT,sec=USDRUBF,_N=0
99,clas=CETS,sec=USDCNY_TOM,_N=4
99,clas=CETS,sec=EURUSD000TOD,_N=3
99,clas=CETS,sec=CNYRUB_TOM,_N=2
99,clas=CETS,sec=EUR_RUB__TOM,_N=1
99,clas=SPBFUT,sec=EuH4,_N=0
99,clas=SPBFUT,sec=TNH4,_N=1
99,clas=SPBFUT,sec=EuH4,_N=0
99,clas=SPBFUT,sec=SGH4,_N=0
99,clas=SPBFUT,sec=CHH4,_N=0
99,clas=SPBFUT,sec=SGH4,_N=1
99,clas=SPBFUT,sec=CHH4,_N=0
99,clas=SPBFUT,sec=LKH4,_N=1
99,clas=SPBFUT,sec=SGH4,_N=0
99,clas=SPBFUT,sec=TNH4,_N=3
99,clas=SPBFUT,sec=TNH4,_N=2
99,clas=SPBFUT,sec=EDH4,_N=1
99,clas=SPBFUT,sec=EDH4,_N=0
99,clas=QJSIM,sec=WUSH,_N=12
99,clas=QJSIM,sec=UPRO,_N=11
99,clas=QJSIM,sec=UGLD,_N=10
99,clas=QJSIM,sec=SIBN,_N=9
99,clas=QJSIM,sec=NMTP,_N=8
99,clas=QJSIM,sec=MTLR,_N=7
99,clas=QJSIM,sec=MDMG,_N=6
99,clas=QJSIM,sec=GLTR,_N=5
99,clas=QJSIM,sec=CHMF,_N=4
99,clas=QJSIM,sec=ALRS,_N=3
99,clas=QJSIM,sec=ABIO,_N=2
99,clas=SPBFUT,sec=CRH4,_N=1
99,clas=SPBFUT,sec=TNH4,_N=0

</pre>
=============
Последним значением в строке переменная _N - длина очереди.<br />--------------<br />Пояснение следует... <br />
			<i>19.01.2024 12:45:19, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum17/message73859/topic8467/</link>
			<guid>http://forum.quik.ru/messages/forum17/message73859/topic8467/</guid>
			<pubDate>Fri, 19 Jan 2024 12:45:19 +0300</pubDate>
			<category>Обмен опытом</category>
		</item>
		<item>
			<title>Очередь -элементарно и полезно</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum17/message73847/topic8467/">Очередь -элементарно и полезно</a></b> <i>Как сделать очередь в роботе и зачем.  </i> в форуме <a href="http://forum.quik.ru/forum17/">Обмен опытом</a>. <br />
			Добрый день,<br />Хочу поделиться некоторыми приемами, которые я использую при построении своих роботов.<br />См. тему -мой робот.<br />-----------------<br />В структуре спинного мозга робота , реализуемого в QUIK, условно можно выделить колбеки, <br />в которые приходят сообщения о событиях и функцию main, <br />работающую в отдельном потоке, которая обрабатывает эти события.<br />------------------- <br />Как правило, в &nbsp;main делается бесконечный цикл, в котором и осуществляется обработка.<br />------------------------<br />Если обрабатывать нечего, то рекомендуют ставить sleep(time) , где time - число миллисекундах,<br /> на которое Вы заморозите работу main.<br />=============== <br />Но проблема в том, что пока Main не работает, в колбеки поступают события , <br />которые надо обрабатывать либо как-то сохранить иначе они потеряются.<br />------------------------------<br />Если обрабатывать события &nbsp;в колбеках, то на время обработки будет остановлен терминал QUIK, так как колбеки работают в основном потоке термина. <br />------------------<br />Проблема решается путем сохранения сообщений из колбеков в массиве, <br />из которого потом main сможет обработать все сохраненные сообщения.<br />Такой список (массив,таблица и т д) сообщений называется очередью.<br />===================<br />Вопрос лишь в том, как организовать эту очередь , чтобы было просто и быстро.<br />---------------<br />Есть несколько вариантов,<br />------------<br />Вариант 1: классический - это сделать универсальные списки, очереди. Алгоритмов и их реализаций много можно найти в интернете.<br />Сложно, малопонятно не спецам . Большая нагрузка на сборщик мусора, что замедляет исполнение скрипта.<br />--------------------<br />Вариант 2: -рекомендуемый &nbsp;в документации QLUA - использовать потоко безопасные функции записи и удаления из массива.<br />Просто, но относительно медленно. <br />-------------------<br />Вариант 3: &nbsp; это мой, тот который я расскажу далее. просто и быстро.<br />Объяснять буду на рабочем примере.<br />-------------------<br />Продолжение следует...<br /><br /> &nbsp; <br />
			<i>19.01.2024 09:22:18, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum17/message73847/topic8467/</link>
			<guid>http://forum.quik.ru/messages/forum17/message73847/topic8467/</guid>
			<pubDate>Fri, 19 Jan 2024 09:22:18 +0300</pubDate>
			<category>Обмен опытом</category>
		</item>
	</channel>
</rss>
