<?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>Wed, 29 Apr 2026 09:32:17 +0300</pubDate>
		<item>
			<title>Получать обновления стакана без его открытия в КВИКе</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message38856/topic4610/">Получать обновления стакана без его открытия в КВИКе</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_YLXpA5qT" href="/user/13132/" bx-tooltip-user-id="13132">maxim</a> написал:<br />В чём может быть проблема?<br />=============<br /><br />Все колбеки LUA работают в главном потоке терминала.<br />Следовательно пока колбек не завершит работу, терминал будет висеть.<br />Чтобы убедиться в этом, можете для эксперимента, добавить в любой колбек бесконечный цикл и терминал повиснет намертво.<br />Вам нужно максимально минимизировать время обработки колбека OnQuote, как минимум убрать повторения одинаковых циклов и рассмотреть варианты минимизации записи в файл, например в цикле формировать переменную а записывать в файл уже после цикла.<br /><br />Ну или в функции main<br /><br />====quote====<br /><a class="blog-p-user-name" id="bp_eH1nezPp" href="/user/13132/" bx-tooltip-user-id="13132">maxim</a> написал:<br />2) в цикле гонять getQuoteLevel2<br />=============<br /> <br />
			<i>12.07.2019 07:19:51, Sergey Gorokhov.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message38856/topic4610/</link>
			<guid>http://forum.quik.ru/messages/forum10/message38856/topic4610/</guid>
			<pubDate>Fri, 12 Jul 2019 07:19:51 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Получать обновления стакана без его открытия в КВИКе</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message38855/topic4610/">Получать обновления стакана без его открытия в КВИКе</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Пока додумался только в рамках getQuoteLevel2 сначала всё писать в одну переменную, а затем её в файл. Посмотрим, будет ли от этого толк, так как вычитал инфу: &quot;поскольку строки в Lua неизменяемы, каждая конкатенация создает новый строковый объект и копирует данные из исходных строк в него. Это приводит к тому, что последовательные конкатенации в одну строку имеют очень низкую производительность.&quot; <br />Есть ещё пара идей на проверку: <br />1) если от конкатенации будет толк, то попробовать писать не каждый слепок, а раз в N промежуток времени/N слепков<br />2) писать сначала в массив (тем самым устранить потенциально низкую проблемы с производительностью при конкатенации), затем раз в N промежуток времени/N длину массива читать его и писать в файл<br />3) подцепить какую-либо БД и писать сразу в неё, но пока не нашёл чёткого HOW TO. Буду рад за ссылку, если таковой есть. <br />
			<i>11.07.2019 23:59:44, maxim.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message38855/topic4610/</link>
			<guid>http://forum.quik.ru/messages/forum10/message38855/topic4610/</guid>
			<pubDate>Thu, 11 Jul 2019 23:59:44 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Получать обновления стакана без его открытия в КВИКе</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message38849/topic4610/">Получать обновления стакана без его открытия в КВИКе</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Столкнулся с проблемой рассинхрона по времени между QUIK/сервера и реальным.<br />Порой он достигает нескольких минут. То есть при работающем скрипте внизу QUIK в строке &quot;время сервера&quot; показыает время на несколько минут меньше текущего (и, соотвественно, приходящие данные получаются не совсем актульаными по времени).<br />При этом по диспетчеру задач QUIK задействует в районе 50% процессора. Но сам QUIK практически намертво замирает, когда работает скрипт (реагируют на нажатия &nbsp;вечность)<br />Запускается и пишется всё на ssd.<br /><br />Что именно делаю: записываю в txt файл (для каждого инструмента - в свой) весь стакан по 50 наиболее ликвидным акциям и 10 фьючам. То есть открываю файл, пишу стакан, закрываю файл (закрывать надо, так как есть проблемы с постояннством работы компа). И так на каждое изменение стакана.<br /><br />В чём может быть проблема?<br />Как можно её решить?<br />Ну и может по коду что изменить/оптимизировать?<br />
====code====
<pre>local classCode = "TQBR"
local secCode = {}

local classCode2 = "SPBFUT"
local secCode2 = {}

stopped = true

function OnStop()
&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;for i,value in ipairs(secCode) do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Unsubscribe_Level_II_Quotes(classCode, value)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message("TQBR is UNsubscribed")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;end

&nbsp;&nbsp;&nbsp;for i,value in ipairs(secCode2) do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Unsubscribe_Level_II_Quotes(classCode2, value)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message("SPBFUT is UNsubscribed")
&nbsp;&nbsp;&nbsp;end

&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp; stopped = false
end

function&nbsp;&nbsp;main()
&nbsp;&nbsp; while stopped do end
end


for i,value in ipairs(secCode) do
&nbsp;&nbsp;&nbsp;Subscribe_Level_II_Quotes(classCode, value)
end

for i,value in ipairs(secCode2) do
&nbsp;&nbsp;&nbsp;Subscribe_Level_II_Quotes(classCode2, value)
end



function OnQuote(classCode, secCode)
&nbsp;&nbsp;&nbsp;if classCode == "TQBR" then
&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tb=getQuoteLevel2(classCode, secCode)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bid = tb.bid
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ask = tb.offer
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file = io.open("тут_путь"..secCode..".txt", "a+")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file:write(os.date("%c") .. ";")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for v = tonumber(tb.offer_count), 1, -1 do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file:write(ask&#91;v&#93;.quantity .. ";")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for v = tonumber(tb.bid_count), 1, -1 do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file:write(bid&#91;v&#93;.quantity .. ";")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for v = tonumber(tb.offer_count), 1, -1 do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file:write(ask&#91;v&#93;.price .. ";")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for v = tonumber(tb.bid_count), 1, -1 do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file:write(bid&#91;v&#93;.price .. ";")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file:write("&#92;n")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file:close()
&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;elseif classCode == "SPBFUT" then 
&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tb=getQuoteLevel2(classCode, secCode)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bid = tb.bid
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ask = tb.offer
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file = io.open("тут_путь"..secCode..".txt", "a+")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file:write(os.date("%c") .. ";")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for v = tonumber(tb.offer_count), 1, -1 do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file:write(ask&#91;v&#93;.quantity .. ";")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for v = tonumber(tb.bid_count), 1, -1 do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file:write(bid&#91;v&#93;.quantity .. ";")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for v = tonumber(tb.offer_count), 1, -1 do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file:write(ask&#91;v&#93;.price .. ";")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for v = tonumber(tb.bid_count), 1, -1 do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file:write(bid&#91;v&#93;.price .. ";")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file:write("&#92;n")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file:close()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;
end</pre>
============= <br />
			<i>11.07.2019 16:54:16, maxim.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message38849/topic4610/</link>
			<guid>http://forum.quik.ru/messages/forum10/message38849/topic4610/</guid>
			<pubDate>Thu, 11 Jul 2019 16:54:16 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Получать обновления стакана без его открытия в КВИКе</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message38674/topic4610/">Получать обновления стакана без его открытия в КВИКе</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Спасибо!<br />Проблема была в регистре, не заметил, что с маленькой буквы писал. <br />
			<i>02.07.2019 14:22:00, maxim.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message38674/topic4610/</link>
			<guid>http://forum.quik.ru/messages/forum10/message38674/topic4610/</guid>
			<pubDate>Tue, 02 Jul 2019 14:22:00 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Получать обновления стакана без его открытия в КВИКе</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message38660/topic4610/">Получать обновления стакана без его открытия в КВИКе</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Здравствуйте,<br />Если getQuoteLevel2 вызывать в колбеке OnQuote, то цикл гонять не потребуется <br />
			<i>02.07.2019 09:37:12, Sergey Gorokhov.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message38660/topic4610/</link>
			<guid>http://forum.quik.ru/messages/forum10/message38660/topic4610/</guid>
			<pubDate>Tue, 02 Jul 2019 09:37:12 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Получать обновления стакана без его открытия в КВИКе</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message38651/topic4610/">Получать обновления стакана без его открытия в КВИКе</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Правильно ли я понимаю, что единственный способ для этого:<br />1) подписаться через IsSubscribed_Level_II_Quotes<br />2) в цикле гонять getQuoteLevel2<br /><br />потому что без цикла у меня всего лишь 1 раз данные приходят <br />
			<i>01.07.2019 17:11:28, maxim.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message38651/topic4610/</link>
			<guid>http://forum.quik.ru/messages/forum10/message38651/topic4610/</guid>
			<pubDate>Mon, 01 Jul 2019 17:11:28 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
	</channel>
</rss>
