<?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>Tue, 21 Apr 2026 06:38:59 +0300</pubDate>
		<item>
			<title>Асинхронная подписка на свечи</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum17/message80310/topic9362/">Асинхронная подписка на свечи</a></b> в форуме <a href="http://forum.quik.ru/forum17/">Обмен опытом</a>. <br />
			В качестве финального варианта выкладываю скрипт подписки без колбеков.
====code====
<pre>--Пример асинхронного запроса свечей--результат в массиве ds для каждого инструмента
----------------------
name="nk_bot"
fnlog="D:/"..name..".log"; nkLog=io.open(fnlog,"w") 
Tclas={}
Tclas.QJSIM={SBER={int={1,2,5,10,20},ds={}}, GAZP={int={2,5},ds={}}, LKOH={int={5},ds={}}}
Tclas.SPBFUT={SiZ5={int={5},ds={}}, RIZ5={int={5,10},ds={}},SRZ5={int={30},ds={}}}
local tim=os.clock()
 ------------------------
 function main()
&nbsp;&nbsp;run=true;
&nbsp;&nbsp;local x=0; for c,tc in pairs(Tclas) do&nbsp;&nbsp;for s,ts in pairs(tc) do&nbsp;&nbsp;x=x+1 end&nbsp;&nbsp;end &nbsp;&nbsp;&nbsp;MaxDS=x;
&nbsp;&nbsp;while run do 
&nbsp;&nbsp;&nbsp;&nbsp; if MaxDS then 
&nbsp;&nbsp;&nbsp;for c,tc in pairs(Tclas) do 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for s,ts in pairs(tc) do&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local ts=tc&#91;s&#93;; local int=ts.int; local ds=ts.ds;local&nbsp;&nbsp;N=#int; local M=#ds;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if N~=M then local j=0; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while N&#62;j do j=j+1; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ds&#91;j&#93;==nil then local x=CreateDataSource(c,s, int&#91;j&#93;);&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if x and x:Size()&#62;0&nbsp;&nbsp;then &nbsp;&nbsp;&nbsp;local ti=math.tointeger(1000*(os.clock()-tim)//1);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ds&#91;j&#93;=x; nkLog:write("time(ms)="..tostring(ti)..","..c..","..s..",j="..j..",int="..int&#91;j&#93;..",size="..ds&#91;j&#93;:Size().."&#92;n"); nkLog:flush();
&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; end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; M=#ds; if N==M then MaxDS=MaxDS-1; nkLog:write(s..",подписка завершена&#92;n");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nkLog:flush(); end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end
&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;if MaxDS==0 then&nbsp;&nbsp;nkLog:write("блокируем блок подписки&#92;n"); &nbsp;&nbsp;&nbsp;nkLog:flush(); MaxDS=nil end
&nbsp;&nbsp;&nbsp;end
 --&nbsp;&nbsp;Выполнение заданий скрипта --
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep (10)
&nbsp;&nbsp; end 
end
function OnStop(signal)&nbsp;&nbsp;&nbsp;&nbsp;run = false&nbsp;&nbsp; return 1000 end
</pre>
=============
после завершения подписки &nbsp;в main будет исполнятся из кода подписки лишь один оператор if.<br />------------------------------ &nbsp;<br />Недостаток этого варианта по сравнению с первым тот, что в нем тратится время main на неисполненные подписки, если данный инструмент не торгуется. <br />Во втором варианте тратится время основного потока QUIK на подобные подписки.<br />--------------------------<br />Оптимальным вариантом будет решение, которое объединяет первый третий вариант.<br />--------------------------------<br />Именно такое решение я и использую в настоящее время. <br />
			<i>22.11.2025 06:59:01, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum17/message80310/topic9362/</link>
			<guid>http://forum.quik.ru/messages/forum17/message80310/topic9362/</guid>
			<pubDate>Sat, 22 Nov 2025 06:59:01 +0300</pubDate>
			<category>Обмен опытом</category>
		</item>
		<item>
			<title>Асинхронная подписка на свечи</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum17/message80309/topic9362/">Асинхронная подписка на свечи</a></b> в форуме <a href="http://forum.quik.ru/forum17/">Обмен опытом</a>. <br />
			поправил немного:<br />
====code====
<pre>function OnParam(c,s)
if MaxDS then 
for c,tc in pairs(Tclas) do 
&nbsp;&nbsp;&nbsp;for s,ts in pairs(tc) do&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;local ts=tc&#91;s&#93;; local int=ts.int; local ds=ts.ds;local&nbsp;&nbsp;N=#int; local M=#ds;
&nbsp;&nbsp;&nbsp;if N~=M then local j=0; 
&nbsp;&nbsp;&nbsp;while N&#62;j do j=j+1; 
&nbsp;&nbsp;&nbsp;if ds&#91;j&#93;==nil then&nbsp;&nbsp;local x=CreateDataSource(c,s, int&#91;j&#93;);&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;if x:Size()&#62;0&nbsp;&nbsp;then&nbsp;&nbsp;local ti=math.tointeger(1000*(os.clock()-tim)//1);
&nbsp;&nbsp;&nbsp;ds&#91;j&#93;=x; nkLog:write("time(ms)="..tostring(ti)..","..c..","..s..",j="..j..",int="..int&#91;j&#93;..",size="..ds&#91;j&#93;:Size().."&#92;n"); nkLog:flush();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end
&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;M=#ds; if N==M then MaxDS=MaxDS-1; nkLog:write(s..",подписка завершена&#92;n"); nkLog:flush(); end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp; end
&nbsp;&nbsp; end
&nbsp;&nbsp; if MaxDS==0 then&nbsp;&nbsp;nkLog:write("блокируем OnParam&#92;n"); nkLog:flush(); MaxDS=nil end
&nbsp;&nbsp;end
end</pre>
============= <br />
			<i>21.11.2025 21:50:39, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum17/message80309/topic9362/</link>
			<guid>http://forum.quik.ru/messages/forum17/message80309/topic9362/</guid>
			<pubDate>Fri, 21 Nov 2025 21:50:39 +0300</pubDate>
			<category>Обмен опытом</category>
		</item>
		<item>
			<title>Асинхронная подписка на свечи</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum17/message80308/topic9362/">Асинхронная подписка на свечи</a></b> в форуме <a href="http://forum.quik.ru/forum17/">Обмен опытом</a>. <br />
			Поступило два вопроса.<br />1) Если инструмент очень редко изменяется в ТТП, &nbsp;но кому-то надо срочно что-то считать ( не представляю что надо считать по этому инструменту) . Решаем эту проблему.<br />--------------------------<br />2) &nbsp;Этот код, хоть и на 4 мкс, но будет грузить основной поток после того, как подписка закончится. &nbsp;Решает и эту проблему,<br />-----------------------------------<br />Вот вариант скрипта, в котором этих проблем нет:<br />
====code====
<pre>--Пример асинхронного запроса свечей--
--результат в массиве ds для каждого инструмента
Tclas={}
Tclas.QJSIM={SBER={int={1,2,5,10,20},ds={}}, GAZP={int={2,5},ds={}}, LKOH={int={5},ds={}}}
Tclas.SPBFUT={SiZ5={int={5},ds={}}, RIZ5={int={5,10},ds={}},SRZ5={int={30},ds={}}}
local tim=os.clock()
 ------------------------
RUN = true
function main()
local fDS=true;
 while RUN do 
 --&nbsp;&nbsp;Выполнение заданий скрипта --
&nbsp;&nbsp;&nbsp;&nbsp;sleep (10)
&nbsp;&nbsp; end 
end
---------------------------------&#93;
function OnParam(c,s)
&nbsp;&nbsp;if MaxDS then 
&nbsp;&nbsp;&nbsp;&nbsp; for c,tc in pairs(Tclas) do 
&nbsp;&nbsp;&nbsp;for s,ts in pairs(tc) do&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local ts=tc&#91;s&#93;; local int=ts.int; local ds=ts.ds;local&nbsp;&nbsp;N=#int; local M=#ds;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if N~=M then &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local j=0; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while N&#62;j do j=j+1; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ds&#91;j&#93;==nil then&nbsp;&nbsp;&nbsp; local x=CreateDataSource(c,s, int&#91;j&#93;);&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if x:Size()&#62;0&nbsp;&nbsp;then &nbsp;&nbsp;&nbsp;local ti=math.tointeger(1000*(os.clock()-tim)//1);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ds&#91;j&#93;=x; nkLog:write("time(ms)="..tostring(ti)..","..c..","..s..",j="..j..",int="..int&#91;j&#93;..",size="..ds&#91;j&#93;:Size().."&#92;n");nkLog:flush();
&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;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;M=#ds; if N==M then MaxDS=MaxDS-1; nkLog:write(s..",подписка завершена&#92;n"); nkLog:flush(); end
&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp; end
&nbsp;&nbsp;end
 if MaxDS==0 then&nbsp;&nbsp;nkLog:write("блокируем OnParam&#92;n"); &nbsp;&nbsp;&nbsp;nkLog:flush(); MaxDS=nil end
end

function OnStop(signal)&nbsp;&nbsp;&nbsp;&nbsp;RUN = false&nbsp;&nbsp; return 5000 end

function OnInit(p) -- инициализация функции main
local p=string.reverse(p); local n,m=string.find(p,"&#92;&#92;"); 
local pS=string.reverse(string.sub(p,n)); name=string.reverse(string.sub(p,5,n-1)) ;
package.cpath =package.cpath..";"..pS.."?.dll;"
package.path =package.path..";"..pS.."?.lua;"..pS.."?.luac;"
fnlog=pS..name.."_nk.log";&nbsp;&nbsp;&nbsp;nkLog=io.open(fnlog,"w")
local x=0; for c,tc in pairs(Tclas) do&nbsp;&nbsp;for s,ts in pairs(tc) do&nbsp;&nbsp;x=x+1 end&nbsp;&nbsp;end MaxDS=x;
end</pre>
=============
---------------------------<br />а это результат его работы:
====code====
<pre>time(ms)=53,QJSIM,SBER,j=1,int=1,size=1041
time(ms)=54,QJSIM,SBER,j=2,int=2,size=523
time(ms)=54,QJSIM,SBER,j=3,int=5,size=209
time(ms)=54,QJSIM,SBER,j=4,int=10,size=105
time(ms)=54,QJSIM,SBER,j=5,int=20,size=53
SBER,подписка завершена
time(ms)=55,QJSIM,GAZP,j=1,int=2,size=523
time(ms)=55,QJSIM,GAZP,j=2,int=5,size=209
GAZP,подписка завершена
time(ms)=207,QJSIM,LKOH,j=1,int=5,size=209
LKOH,подписка завершена
time(ms)=207,SPBFUT,SiZ5,j=1,int=5,size=18572
SiZ5,подписка завершена
time(ms)=207,SPBFUT,SRZ5,j=1,int=30,size=2262
SRZ5,подписка завершена
time(ms)=207,SPBFUT,RIZ5,j=1,int=5,size=11347
time(ms)=207,SPBFUT,RIZ5,j=2,int=10,size=13811
RIZ5,подписка завершена
блокируем OnParam
</pre>
============= <br />
			<i>21.11.2025 21:42:20, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum17/message80308/topic9362/</link>
			<guid>http://forum.quik.ru/messages/forum17/message80308/topic9362/</guid>
			<pubDate>Fri, 21 Nov 2025 21:42:20 +0300</pubDate>
			<category>Обмен опытом</category>
		</item>
		<item>
			<title>Асинхронная подписка на свечи</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum17/message80289/topic9362/">Асинхронная подписка на свечи</a></b> в форуме <a href="http://forum.quik.ru/forum17/">Обмен опытом</a>. <br />
			Это можно сделать так: 
====code====
<pre>--Пример ассинхронного запроса свечей--
--результат в массиве ds для каждого инструмента

Tclas={}
Tclas.QJSIM={SBER={int={1,2,5,10,20},ds={}}, GAZP={int={2,5},ds={}}, LKOH={int={5},ds={}}}
Tclas.SPBFUT={SiZ5={int={5},ds={}}, RIZ5={int={5,10},ds={}},SRZ5={int={30},ds={}}}

local tim=os.clock()

function OnParam(c,s)
&nbsp;&nbsp; local tc=Tclas&#91;c&#93;
&nbsp;&nbsp; if tc then&nbsp;&nbsp;local ts=tc&#91;s&#93;;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp; if ts then local ts=tc&#91;s&#93;; local int=ts.int; local ds=ts.ds;local&nbsp;&nbsp;N=#int; local M=#ds;
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;if N~=M then local j=0; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while N&#62;j do j=j+1; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ds&#91;j&#93;==nil then local x=CreateDataSource(c,s, int&#91;j&#93;);&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if x:Size()&#62;0&nbsp;&nbsp;then &nbsp;&nbsp;&nbsp;local ti=math.tointeger(1000*(os.clock()-tim)//1);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ds&#91;j&#93;=x; nkLog:write("time(ms)="..tostring(ti)..","..c..","..s..",j="..j..",int="..int&#91;j&#93;..",size="..ds&#91;j&#93;:Size().."&#92;n"); nkLog:flush();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp; M=#ds; if N==M then nkLog:write(s..",подписка завершена&#92;n"); nkLog:flush(); end
&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp; end
end

RUN = truefunction main()
&nbsp;&nbsp;&nbsp;&nbsp;while RUN do 
 --&nbsp;&nbsp;Выполнение заданий скрипта --
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep (10)
&nbsp;&nbsp; end 
end

function OnStop(signal)&nbsp;&nbsp;&nbsp;&nbsp;RUN = false&nbsp;&nbsp; return 5000 end

function OnInit(p)
&nbsp;&nbsp;local p=string.reverse(p); local n,m=string.find(p,"&#92;&#92;"); 
&nbsp;&nbsp;local pS=string.reverse(string.sub(p,n)); name=string.reverse(string.sub(p,5,n-1)) ;
&nbsp;&nbsp;package.cpath =package.cpath..";"..pS.."?.dll;"
&nbsp;&nbsp;package.path =package.path..";"..pS.."?.lua;"..pS.."?.luac;"
&nbsp;&nbsp; fnlog=pS..name.."_nk.log";&nbsp;&nbsp;&nbsp;nkLog=io.open(fnlog,"w")
end
</pre>
=============
В скрипте есть вывод в лог файл, который создается в каталоге скрипта.<br />Результат работы скрипта на тестовом сервере QUIK
====code====
<pre>time(ms)=250,SPBFUT,SiZ5,j=1,int=5,size=18508
SiZ5,подписка завершена
time(ms)=704,SPBFUT,RIZ5,j=1,int=5,size=11284
time(ms)=706,SPBFUT,RIZ5,j=2,int=10,size=13779
RIZ5,подписка завершена
time(ms)=871,QJSIM,GAZP,j=1,int=2,size=350
time(ms)=871,QJSIM,GAZP,j=2,int=5,size=140
GAZP,подписка завершена
time(ms)=1547,SPBFUT,SRZ5,j=1,int=30,size=2251
SRZ5,подписка завершена
time(ms)=1880,QJSIM,LKOH,j=1,int=5,size=140
LKOH,подписка завершена
time(ms)=1882,QJSIM,SBER,j=1,int=1,size=696
time(ms)=1882,QJSIM,SBER,j=2,int=2,size=351
time(ms)=1882,QJSIM,SBER,j=3,int=5,size=140
time(ms)=1882,QJSIM,SBER,j=4,int=10,size=71
time(ms)=1884,QJSIM,SBER,j=5,int=20,size=36
SBER,подписка завершена
</pre>
============= <br />
			<i>21.11.2025 15:52:26, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum17/message80289/topic9362/</link>
			<guid>http://forum.quik.ru/messages/forum17/message80289/topic9362/</guid>
			<pubDate>Fri, 21 Nov 2025 15:52:26 +0300</pubDate>
			<category>Обмен опытом</category>
		</item>
	</channel>
</rss>
