<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[QUIK -> DDE &mdash; Должна ли быть задержка после вызова функции Subscribe_Level_II_Quotes]]></title>
	<link rel="self" href="https://quik2dde.ru/extern.php?action=feed&amp;tid=313&amp;type=atom" />
	<updated>2020-03-07T19:55:19Z</updated>
	<generator>PunBB</generator>
	<id>https://quik2dde.ru/viewtopic.php?id=313</id>
		<entry>
			<title type="html"><![CDATA[Re: Должна ли быть задержка после вызова функции Subscribe_Level_II_Quotes]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=2635#p2635" />
			<content type="html"><![CDATA[<p>Ребята, огромное спасибо вам, очень выручаете, экономите массу времени на изучение ньюансов этого языка</p>]]></content>
			<author>
				<name><![CDATA[dkostiunin]]></name>
				<uri>https://quik2dde.ru/profile.php?id=3119</uri>
			</author>
			<updated>2020-03-07T19:55:19Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=2635#p2635</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Должна ли быть задержка после вызова функции Subscribe_Level_II_Quotes]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=2633#p2633" />
			<content type="html"><![CDATA[<p>ps: Если подходить к вопросу 500 стаканов &quot;просто&quot;, то можно вести список инструментов, на которые осуществляется подписка. Дальше, при приходе OnOrder()/OnTrade() проверяем, есть ли подписка, если она есть, то берем подготовленный стакан и ставим заявку. Если подписки на этот инструмент нет, то подписываемся (предварительно от чего-то отписавшись, если подписок уже больше критического количества) и заявку ставим из колбэка OnQuote() в момент прихода заказанного стакана. <br />Таким образом, некоторые заявки будут ставиться быстро, некоторые - с лагом на запрос стакана с сервера квика. Если есть &quot;часто торгуемые&quot; и &quot;редко торгуемые&quot; инструменты, то можно сделать что-то вроде кэша со счетчиком срабатываний, чтобы понизить вероятность заказа.<br />Еще кэшем можно управлять следя за ценами своих активных заявок и заказывая стаканы, когда биды и аски получаемые в колбэке OnParam приближаются к ценам своих заявок.</p>]]></content>
			<author>
				<name><![CDATA[toxa]]></name>
				<uri>https://quik2dde.ru/profile.php?id=3172</uri>
			</author>
			<updated>2020-03-07T18:33:41Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=2633#p2633</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Должна ли быть задержка после вызова функции Subscribe_Level_II_Quotes]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=2632#p2632" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>dkostiunin пишет:</cite><blockquote><p>Вот в таком варинате я пробовал.</p></blockquote></div><p>Конечно у вас не сработает, стакан должен быть открыт заранее или заказан функцией Subscribe_Level_II_Quotes (&quot;SPBFUT&quot;, &quot;RIH0&quot;)<br />В OnOrder, если по инструменту бот не видел событий, то и Subscribe_Level_II_Quotes вы не вызывали. На заказ стакана нужно время, а OnOrder уже закончил расчет.<br /> </p><div class="codebox"><pre><code>function main()
    --заказываю стаканы заранее
    slist = {&quot;RIH0&quot;, &quot;BRJ0&quot;, &quot;SiH0&quot;} 
    for i=1,slist do
      Subscribe_Level_II_Quotes (&quot;SPBFUT&quot;, slist[i])
    end
    while is_run do
        sleep(50)
    end;
end

function calc(market, ticker)
  local QL2 = getQuoteLevel2Ex(market, ticker)
--получить 5-ю строку бида
  local bid = ql2.GetAsk(QL2, 5).price
  if bid == 0 then return end
  -- если цена есть, значит считаем дальше
  message(market..&quot; &quot;..ticker..&quot; bid= &quot;..bid,2)
end

function OnOrder (trade_data)

    calc(trade_data.class_code, trade_data.sec_code)

end</code></pre></div>]]></content>
			<author>
				<name><![CDATA[kalikazandr]]></name>
				<uri>https://quik2dde.ru/profile.php?id=208</uri>
			</author>
			<updated>2020-03-07T18:20:46Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=2632#p2632</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Должна ли быть задержка после вызова функции Subscribe_Level_II_Quotes]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=2630#p2630" />
			<content type="html"><![CDATA[<p>В квике есть ограничение на количество заказанных стаканов. Вы не можете заказать и получать 500 стаканов. Если вы реально торгуете 500 инструментами, то это проблема, требующая специального подхода к своему решению.<br />500 стаканов в памяти - это не так уж и много. Вопрос лишь в скорости доступа. В lua быстрый доступ по ключу:<br />all_orderbooks={«tqbrsber”=&lt;table sber&gt;, “eqobru100500”=&lt;table ru100500&gt;}<br />И далее ordbook=all_orderbooks[class..code]</p>]]></content>
			<author>
				<name><![CDATA[toxa]]></name>
				<uri>https://quik2dde.ru/profile.php?id=3172</uri>
			</author>
			<updated>2020-03-07T10:22:53Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=2630#p2630</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Должна ли быть задержка после вызова функции Subscribe_Level_II_Quotes]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=2629#p2629" />
			<content type="html"><![CDATA[<p>Вот в таком варинате я пробовал.<br />Сразу не заработало, и с учетом обшибки,&nbsp; я попробовал сначала открыть стакан, а потом еще раз запустить, <br />и попробовал перед calc() добавить строку subsc=Subscribe_Level_II_Quotes (&quot;SPBFUT&quot;, &quot;RIH0&quot;)<br />в обоих случаях не сработало с той же ошибкой</p><p>is_run = true</p><p>function main()<br />&nbsp; &nbsp; while is_run do<br />&nbsp; &nbsp; &nbsp; &nbsp; sleep(50)<br />&nbsp; &nbsp; end;<br />end</p><p>function OnStop() <br />&nbsp; &nbsp; is_run = false<br />end</p><p>function GetAsk(ql2, ac)<br />&nbsp; &nbsp; if not ql2 then return {price = 0, quantity = 0} end<br />&nbsp; &nbsp; local ask_count = ql2.offer_count<br />&nbsp; &nbsp; if ac &gt; ask_count then ac = ask_count end<br />&nbsp; &nbsp; if ask_count == 0 then<br />&nbsp; &nbsp; &nbsp; &nbsp; return {price = 0, quantity = 0}<br />&nbsp; &nbsp; else<br />&nbsp; &nbsp; &nbsp; &nbsp; local ask = ql2.offer<br />&nbsp; &nbsp; &nbsp; &nbsp; if not ask then return {price = 0, quantity = 0} end<br />&nbsp; &nbsp; &nbsp; &nbsp; return ask[ac] or {price = 0, quantity = 0}<br />&nbsp; &nbsp; end<br />end</p><p>function calc()<br />&nbsp; local QL2 = getQuoteLevel2Ex(&quot;SPBFUT&quot;, &quot;RIH0&quot;)<br /> --получить 5-ю строку бида<br />&nbsp; local bid = ql2.GetAsk(QL2, 5).price<br />&nbsp; if bid == 0 then return end<br />&nbsp; -- если цена есть, значит считаем дальше<br />end</p><p>function OnOrder (trade_data)</p><p>&nbsp; &nbsp; calc()</p><p>end</p>]]></content>
			<author>
				<name><![CDATA[dkostiunin]]></name>
				<uri>https://quik2dde.ru/profile.php?id=3119</uri>
			</author>
			<updated>2020-03-07T09:19:36Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=2629#p2629</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Должна ли быть задержка после вызова функции Subscribe_Level_II_Quotes]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=2628#p2628" />
			<content type="html"><![CDATA[<p>Несколько ньансов мне не понятно.<br />Во первых по данным.<br />Однозначно стаканы не открыты.<br />В основную сессию у меня стоят заявки в основном на покупку как максимум по 400 инструментам.<br />Я эксперементировал с фукнцией OnOrder так как срабатывание&nbsp; OnTradе редко бывает.<br />То есть,&nbsp; просто ставил руками лимитные заявки по произвольным инструментам при запущенном скрипте.<br />единственное, все инстументы, по которым ставил заявки , добавлены в три разные таблицы текущих торгов (название таблицы у брокера ВТБ).<br />По поводу стаканов -я это заметил, когда стакан открыт, подписываться не надо, то есть с открытым стаканом прямо в OnOrder сразу приходят данные при вызове getQuoteLevel2, без&nbsp; предварительного Subscribe_Level_II_Quotes.<br />И наоброт, как я ранее и писал, если стакан не открыт, после первого срабатывания в OnOrders данные не идут , хоть&nbsp; &nbsp;подписывайся, хоть не подписывайся.<br />Ну это я к тому написал, что я понимаю, в чем разница, когда стакан откыт, а когда нет.<br />По поводу таблиц текущих торгов. У меня там облигации, и акции СПБ.<br />В настройках потока котировок (сейчас еще раз посмотрел), у меня заказаны все параметры и все бумаги по облигациям, но при этом ни по одной бумаге и ни одного соответственно параметра по акциям СПБ (галочка вообще не стоит на этом разделе). <br />При этом getQuoteLevel2 ведет себя одинаково и с облигациями и с акциями СПБ.<br />Еще один ньюанс по получению данных.<br />На примере акций СПБ довольно странный момент. Может это с брокерм ВТБ как то связано.<br />У меня на странице, где открыта таблица текущих торгов, еще открыто окно с графиком , и я связал таблицу и график цепочкой и якорем, чтобы визуально быстро видеть движение , кликая по инструментам.<br />Вот это работает без каких либо задержек (визуально). <br />Кликаешь на инструмент, и сразу отбражается в реальном времени меняющийся&nbsp; график, даже если совсем маленький таймферйм.<br />При этом, в брокере ВТБ&nbsp; я сижу где то полтора года, а до этого я торговал в Альфе, через терминал альфадирект 4.<br />У них там примерно такая же система, окно и график, и похожий принцип якоря и цепочки.<br />Вот только после выбора инструмента может пройти от 30 секунд до нескольких минут, пока график реальный появится. Подход к получению данных по разному видимо организован.<br />То есть, получается, что в ВТБ данные как бы уже есть, может быть у брокера на сервере, и приходят в терминал, как только кликаешь на инструмент,&nbsp; в скрипте аналогом клика является OnOrder<br />ну это просто мои предположения в порядке бреда.</p><p>По поводу Вашей схемы, ну получается , что Вы предлагаете заранее собирать даные в таблицы скрипта по куче инструментов. Если я правильно понимаю, это же в оперативной памяти будет храниться, а у меня с запущенным квиком и другими прогами и так обычно занято 85 процентов из имеющихся 2ГБ, сервер слабенький.<br />почему я и пытаюсь придумать таких схемы, чтобы минимизировать использование железа.<br />У меня и&nbsp; так квик иногда зависает (пару раз в месяц), когда одновременно запустишь несколько прог и плюс в браузере какую нибудь не правильную страницу запустишь.<br />и в Альфадиректе с ихним конструктором робота я эксперементировал, у них невозможно в одном скрипте отслеживать много инструментов, приходилось пок аждому отдельный скрипт запускать, и при запуске более 20 альфадирект начинал безбожно тормозить и отваливался от серверов брокера.<br />Просто не уверен, что это будет быстро работать, если заранее на все подписаться, и складывать изменения стаканов в талблицу</p><br /><br /><br /><div class="quotebox"><cite>toxa пишет:</cite><blockquote><p>ваш вариант - ужасен.</p></blockquote></div>]]></content>
			<author>
				<name><![CDATA[dkostiunin]]></name>
				<uri>https://quik2dde.ru/profile.php?id=3119</uri>
			</author>
			<updated>2020-03-07T09:07:09Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=2628#p2628</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Должна ли быть задержка после вызова функции Subscribe_Level_II_Quotes]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=2627#p2627" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>dkostiunin пишет:</cite><blockquote><p>Чего то не получается<br />вот в этой строке<br />local bid = ql2.GetBid(QL2, 5).price<br />ошибка attempt to index global &#039;ql2&#039; (a nil value)</p></blockquote></div><p>У вас не правильный подход. Выложите код, в котором вы используете предложенные функции. Тогда станет ясно, почему у вас не работает.</p><p>Удаляйте лишнее между тэгами, не нужно копировать все сообщение, еще и с кодом.</p>]]></content>
			<author>
				<name><![CDATA[kalikazandr]]></name>
				<uri>https://quik2dde.ru/profile.php?id=208</uri>
			</author>
			<updated>2020-03-06T22:44:45Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=2627#p2627</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Должна ли быть задержка после вызова функции Subscribe_Level_II_Quotes]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=2626#p2626" />
			<content type="html"><![CDATA[<p>нет смысла подписываться на стаканы в OnTrade, это очень долго. вы получаете данные мгновенно из-за того, что у вас этот стакан, судя по всему, открыт в терминале, на него вообще можно не подписываться. </p><p>1. я бы сделал так: в начале main() подписылся бы на все стаканы по которым осуществляется торговля, и дальше в main() крутится пустой цикл while not exitflag do sleep(1) end<br />2. в колбэке onquote я бы получал стакан getQuoteLevel2 () и данные из него клал бы свои таблички в подготовленном для анализа виде; таким образом, в любой момент времени были бы стаканы по всем нужным инструментам<br />3. в колбэке ontrade просто брал бы подготовленные данные по нужному стакану и ставил бы заявку</p><p>ваш вариант - ужасен.</p>]]></content>
			<author>
				<name><![CDATA[toxa]]></name>
				<uri>https://quik2dde.ru/profile.php?id=3172</uri>
			</author>
			<updated>2020-03-06T22:09:50Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=2626#p2626</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Должна ли быть задержка после вызова функции Subscribe_Level_II_Quotes]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=2625#p2625" />
			<content type="html"><![CDATA[<p>Спасибо за рекомендации.<br />Как раз под конец дня на акциях спб поэксперементировал.<br />Суть задачи такая. <br />У меня стоят заявки по облигациям лимитные. На покупку.<br />Когда они исполняются, мне надо выставить обратную заявку на исполненное количество.<br />При этом посмотреть стакан,выбрать нужное место , и встать перед ним.<br />Ну это я руками до сего момента делал.<br />То есть я следующий алгортим представляю.<br />получаю срабатывание функции OnTrade<br />в ней сразу подписываюсь на нужный мне стакан с помощью функции subsc=Subscribe_Level_II_Quotes (передавая ей параметры , полученные перед этим из OnTrade)<br />Затем Ontrade завершается и уже в Main у меня следущее</p><p>&nbsp; &nbsp; while is_run do<br />&nbsp; &nbsp; &nbsp; &nbsp; if subsc == true then <br />&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp;tab = getQuoteLevel2 (klass, instr)<br />&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp;off_count= tab.offer_count<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; subsc = false<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sleep(50)<br />&nbsp; &nbsp; end<br />&nbsp; &nbsp; &nbsp; &nbsp; </p><p>вроде работает без всяких sleep попробовал на разных стаканах, без задержек и ошибок.</p><p>Ну то есть, пока что&nbsp; мне постоянно стакан не надо, мне получить один раз из стакана данные, поставить заявку.<br />Теперь до вторника, чтоб проверить, а потом уже буду думать и над переставлением заявок в случае, если стакан будет меняться.</p><br /><br /><div class="quotebox"><cite>toxa пишет:</cite><blockquote><p>это работает не так. вы должны подписаться на обновление стакана один раз в начале main() при помощи функции Subscribe_Level_II_Quotes(). затем определить колбэк OnQuote() как написано в документации, он будет срабатывать каждый раз при обновлении стакана. внутри этого колбэка вызываем getQuoteLevel2Ex()&nbsp; - эта функция будет возвращать состояние обновленного стакана. никаких sleep(), естественно, не нужно.</p></blockquote></div>]]></content>
			<author>
				<name><![CDATA[dkostiunin]]></name>
				<uri>https://quik2dde.ru/profile.php?id=3119</uri>
			</author>
			<updated>2020-03-06T21:17:49Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=2625#p2625</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Должна ли быть задержка после вызова функции Subscribe_Level_II_Quotes]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=2624#p2624" />
			<content type="html"><![CDATA[<p>это работает не так. вы должны подписаться на обновление стакана один раз в начале main() при помощи функции Subscribe_Level_II_Quotes(). затем определить колбэк OnQuote() как написано в документации, он будет срабатывать каждый раз при обновлении стакана. внутри этого колбэка вызываем getQuoteLevel2Ex()&nbsp; - эта функция будет возвращать состояние обновленного стакана. никаких sleep(), естественно, не нужно.</p>]]></content>
			<author>
				<name><![CDATA[toxa]]></name>
				<uri>https://quik2dde.ru/profile.php?id=3172</uri>
			</author>
			<updated>2020-03-06T20:35:48Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=2624#p2624</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Должна ли быть задержка после вызова функции Subscribe_Level_II_Quotes]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=2623#p2623" />
			<content type="html"><![CDATA[<p>Чего то не получается<br />вот в этой строке</p><p>local bid = ql2.GetBid(QL2, 5).price</p><p>ошибка attempt to index global &#039;ql2&#039; (a nil value)</p><p>То есть, если я правильно понимаю getQuoteLevel2Ex(&quot;SPBFUT&quot;, &quot;RIH0&quot;)&nbsp; -&nbsp; не получает данные<br />я пробовал и со стаканом и без стакана<br />и пробовал вставлять строку subsc=Subscribe_Level_II_Quotes(&quot;SPBFUT&quot;, &quot;RIH0&quot;)</p><p>перед вызовом calc</p><p>еще такой момент, я попробовал по своему,&nbsp; с паузой, я вызываю это в функции OnOrder</p><p>function OnOrder (trade_data)</p><p>&nbsp; &nbsp; subsc=Subscribe_Level_II_Quotes(klass, instr)<br />&nbsp; &nbsp; message(&quot; is &quot;..tostring(subsc)) <br />&nbsp; &nbsp; ii = 1;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; repeat<br />&nbsp; &nbsp; &nbsp; &nbsp; tab = getQuoteLevel2 (klass, instr)<br />&nbsp; &nbsp; &nbsp; &nbsp; off_count= tab.offer_count<br />&nbsp; &nbsp; &nbsp; &nbsp; message(&quot;Значение i = &quot; .. ii..&#039;; off_count=&#039;..off_count)&nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; sleep(500)<br />&nbsp; &nbsp; &nbsp; &nbsp; ii = ii + 1<br />&nbsp; &nbsp; until off_count~=&#039;0.000000&#039; or ii &gt;10</p><p>первый цикл (когда даешь заявку) всегда завершается не удачно, при этом при втором цикле(когда по этому же инструменту снова даешь заявку) всегда срабатывает правильно без пауз - сразу выдает результат.</p><p>получается что в процессе одного вызова OnOrder запрошенные данные в любом случае не придут, пока функция OnOrder не завершится</p><p>то есть, логику получения данных из стакана надо вынести из функции onOrder</p><br /><br /><br /><br /><br /><br /><div class="quotebox"><cite>kalikazandr пишет:</cite><blockquote><div class="codebox"><pre><code>function GetBid(ql2, bc)
    if not ql2 then return {price = 0, quantity = 0} end
    local bid_count = ql2.bid_count
    if bc &gt; bid_count then bc = bid_count end
    if bc == 0 then
        return {price = 0, quantity = 0}
    else
        bc = bid_count-bc+1
        local bid = ql2.bid
        if not bid then return {price = 0, quantity = 0} end
        return bid[bc] or {price = 0, quantity = 0}
    end
end
function GetAsk(ql2, ac)
    if not ql2 then return {price = 0, quantity = 0} end
    local ask_count = ql2.offer_count
    if ac &gt; ask_count then ac = ask_count end
    if ask_count == 0 then
        return {price = 0, quantity = 0}
    else
        local ask = ql2.offer
        if not ask then return {price = 0, quantity = 0} end
        return ask[ac] or {price = 0, quantity = 0}
    end
end
function calc()
  local QL2 = getQuoteLevel2Ex(&quot;SPBFUT&quot;, &quot;RIH0&quot;)
 --получить 5-ю строку бида
  local bid = ql2.GetBid(QL2, 5).price
  if bid == 0 then return end
  -- если цена есть, значит считаем дальше
  
end

--где-то в коде
calc()</code></pre></div></blockquote></div>]]></content>
			<author>
				<name><![CDATA[dkostiunin]]></name>
				<uri>https://quik2dde.ru/profile.php?id=3119</uri>
			</author>
			<updated>2020-03-06T19:49:49Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=2623#p2623</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Должна ли быть задержка после вызова функции Subscribe_Level_II_Quotes]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=2622#p2622" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>dkostiunin пишет:</cite><blockquote><p>приходит ответ</p><p>attempt to index field &#039;offer&#039; (a nil value)</p><p>если после этого еще раз повторить все это(практически сразу), то уже ответ приходит нормальный,&nbsp; с данными</p></blockquote></div><p>Это нормально, getQuoteLevel2 ничего не знает, есть данные или только формируются таблицы , а данные ещё в них нет.</p><div class="codebox"><pre><code>function GetBid(ql2, bc)
    if not ql2 then return {price = 0, quantity = 0} end
    local bid_count = ql2.bid_count
    if bc &gt; bid_count then bc = bid_count end
    if bc == 0 then
        return {price = 0, quantity = 0}
    else
        bc = bid_count-bc+1
        local bid = ql2.bid
        if not bid then return {price = 0, quantity = 0} end
        return bid[bc] or {price = 0, quantity = 0}
    end
end
function GetAsk(ql2, ac)
    if not ql2 then return {price = 0, quantity = 0} end
    local ask_count = ql2.offer_count
    if ac &gt; ask_count then ac = ask_count end
    if ask_count == 0 then
        return {price = 0, quantity = 0}
    else
        local ask = ql2.offer
        if not ask then return {price = 0, quantity = 0} end
        return ask[ac] or {price = 0, quantity = 0}
    end
end
function calc()
  local QL2 = getQuoteLevel2Ex(&quot;SPBFUT&quot;, &quot;RIH0&quot;)
 --получить 5-ю строку бида
  local bid = ql2.GetBid(QL2, 5).price
  if bid == 0 then return end
  -- если цена есть, значит считаем дальше
  
end

--где-то в коде
calc()</code></pre></div>]]></content>
			<author>
				<name><![CDATA[kalikazandr]]></name>
				<uri>https://quik2dde.ru/profile.php?id=208</uri>
			</author>
			<updated>2020-03-06T13:00:38Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=2622#p2622</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Должна ли быть задержка после вызова функции Subscribe_Level_II_Quotes]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=2621#p2621" />
			<content type="html"><![CDATA[<p>Я подписываюсь на данные стакана </p><p>subsc=Subscribe_Level_II_Quotes(klass, instr)<br />message(&quot; is &quot;..tostring(subsc))</p><p>получаю ответ true</p><p>далее</p><p>tab = getQuoteLevel2 (klass, instr)<br />kol=tostring(tonumber(tab.offer[1].price))<br />message(&#039;; tab=&#039;..kol..&#039;; off_count=&#039;..off_count)</p><p>приходит ответ</p><p>attempt to index field &#039;offer&#039; (a nil value)</p><p>если после этого еще раз повторить все это(практически сразу), то уже ответ приходит нормальный,&nbsp; с данными</p><p>есть предположение, что запрос от меня на получение данных из стакана уходит раньше,<br />чем успевают подгрузиться данные стакана.<br />Это действительно так?</p><p>нормально будет решить вопрос написав sleep(100) после Subscribe_Level_II_Quotes(klass, instr)&nbsp; ?</p>]]></content>
			<author>
				<name><![CDATA[dkostiunin]]></name>
				<uri>https://quik2dde.ru/profile.php?id=3119</uri>
			</author>
			<updated>2020-03-06T11:23:56Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=2621#p2621</id>
		</entry>
</feed>
