<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[QUIK -> DDE &mdash; OnOrder() срабатывает несколько раз на одну заявку!]]></title>
		<link>https://quik2dde.ru/viewtopic.php?id=310</link>
		<atom:link href="https://quik2dde.ru/extern.php?action=feed&amp;tid=310&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «OnOrder() срабатывает несколько раз на одну заявку!».]]></description>
		<lastBuildDate>Sat, 10 Jun 2023 12:06:01 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: OnOrder() срабатывает несколько раз на одну заявку!]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=4229#p4229</link>
			<description><![CDATA[<p><strong>alex.a</strong>,<br />так-то достаточно ожидаемая вещь, что любые добавленные строки к коду добавляют время его работы <img src="https://quik2dde.ru/img/smilies/smile.png" width="15" height="15" alt="smile" /></p><p>&quot;Подводные камни&quot; - так-то их нет. Ну разве что надо принимать во внимание, что все же повторные вызовы - они не просто так случаются, они случаются из-за того, что некоторые параметры дозаполняются, т.е. изменяются. Да, это вовсе не во все повторные вызовы происходит, более того, основные параметры гарантированно заполняется сразу при первом же вызове. Но что такое &quot;основные параметры&quot; - штука тёмная и неоднозначная. Соответственно если выяснится, что в первый раз у вас не всегда заполняются какие-то параметры, которые вы используете - значит просто так откидывать все последующие вызовы для вашего алгоритма не получится, придется дождаться тот вызов, где будет заполнен требуемый параметр. Но это всё из практики надо смотреть по конкретному алгоритму. Скорее всего&nbsp; все используемые вами параметры будут заполнены всегда при первом же вызове. Но на это надо обращать внимание при отладке.</p>]]></description>
			<author><![CDATA[null@example.com (swerg)]]></author>
			<pubDate>Sat, 10 Jun 2023 12:06:01 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=4229#p4229</guid>
		</item>
		<item>
			<title><![CDATA[Re: OnOrder() срабатывает несколько раз на одну заявку!]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=4228#p4228</link>
			<description><![CDATA[<div class="quotebox"><cite>swerg пишет:</cite><blockquote><div class="quotebox"><cite>dkostiunin пишет:</cite><blockquote><p>переделал</p><p>в сообщения приходит именно последняя заявка, но все равно два раза дублируется</p></blockquote></div><p>Да, потому что OnOrder() может срабатывать несколько раз на 1 заявку.<br />Если вам нужно, чтобы ваш код работал только 1 раз - то можно запоминать номера заявок, чтобы не было повторных вызовов.</p><p>В начало кода&nbsp; (где is_run) добавьте строку</p><div class="codebox"><pre><code>t_orders = {}</code></pre></div><p>и в начало OnOrder() добавьте код:</p><div class="codebox"><pre><code>function OnOrder(trade_data)
  if t_orders[trade_data.order_num] then
    return
  end

  t_orders[trade_data.order_num] = true

...далее ваш код...</code></pre></div></blockquote></div><br /><p>Уважаемый swerg,</p><p>Спасибо за предложенное решение. Была такая же проблема с повторяющимися сообщениями, только в функции OnTrade(trade). Протестировал на массиве из 2 тикеров. Работает нормально, без повторений сообщений.<br />Скажите, пожалуйста, может, есть какие-либо подводные камни из-за этих добавленных строк кода? Типа увеличения времени работы кода, еще чего-либо...</p>]]></description>
			<author><![CDATA[null@example.com (alex.a)]]></author>
			<pubDate>Fri, 09 Jun 2023 16:17:33 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=4228#p4228</guid>
		</item>
		<item>
			<title><![CDATA[Re: OnOrder() срабатывает несколько раз на одну заявку!]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=2568#p2568</link>
			<description><![CDATA[<div class="quotebox"><cite>toxa пишет:</cite><blockquote><p>больше всего, конечно, бесит колбэк datasource. на одну сделку он вызывается до 11 раз, а все изменения по ней происходят перед первым вызовом, то есть делается 10 бесполезных вызовов. ну, компьютер быстрый, чо, пусть трудится.</p></blockquote></div><p>ага) главное учитывать, что будет дополнительно 9+ одинаковых вызовов, а не реально новых сделок по одной цене))<br />Вот реально что бесит, это как datasource получает опционы, данных по ним тупо нет. 200-300 баров минуточных можно ждать от полу-часа до конца сессии либо открыть нужный график и сделать перезаказ данных с перегрузкой терминала, но это помогает только для этого графика. Открываешь другой график - та же песня. Ладно их вообще нет, неликвид же, ну и должна функция вернуть значение:<br />ds, err = CreateDateSourse()<br />ds = table<br />err = &quot;Не было сделок по инструменту, хочешь быть первым?)))&quot;<br />Ну реально же сделок может не быть, но когда они есть, а 200-300 свечек ждешь по пол часа - вот это треш.<br />А у арки все нормально, как всегда.</p>]]></description>
			<author><![CDATA[null@example.com (kalikazandr)]]></author>
			<pubDate>Sat, 29 Feb 2020 10:13:41 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=2568#p2568</guid>
		</item>
		<item>
			<title><![CDATA[Re: OnOrder() срабатывает несколько раз на одну заявку!]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=2567#p2567</link>
			<description><![CDATA[<div class="quotebox"><cite>swerg пишет:</cite><blockquote><p>В начало кода&nbsp; (где is_run) добавьте строку</p><div class="codebox"><pre><code>t_orders = {}</code></pre></div><p>и в начало OnOrder() добавьте код:</p><div class="codebox"><pre><code>function OnOrder(trade_data)
  if t_orders[trade_data.order_num] then
    return
  end

  t_orders[trade_data.order_num] = true

...далее ваш код...</code></pre></div></blockquote></div><p>Так не пойдет) Фишка в том, что на новую заявку будет вызван OnOrder 2 раза и на каждое следующее изменение заявки 1 раз.<br />Два раза по новой заявке вызывается в связи с двойной регистрацией на сервере квик и в ТС.<br />По этому, если мы видим первый раз заявку с номером №###, то не обрабатываем это событие никак, но регистрируем ее номер, а уже последующие события обрабатываем все, вплоть до ее снятия или исполнения.<br />потом ее нужно забыть так, что бы после дисконекта больше ее не обрабатывать, т.к. она уже забыта, а события по ней получим повторно.</p>]]></description>
			<author><![CDATA[null@example.com (kalikazandr)]]></author>
			<pubDate>Sat, 29 Feb 2020 01:21:39 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=2567#p2567</guid>
		</item>
		<item>
			<title><![CDATA[Re: OnOrder() срабатывает несколько раз на одну заявку!]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=2566#p2566</link>
			<description><![CDATA[<p>еще один вопрос, я этот код хотел использовать для передачи в телеграм бот инфы о заявки, это у меня работает, но <br />передавать то желательно не Код инструмента заявки , а в идеале сокращенное наименование инструмента.</p><p>В документации есть функция getItem , но в описании параметров таблицы заявок не вижу параметров с наименованиями, возможно все таки как то наименование получать? Ведь в самих таблицах такие поля есть</p>]]></description>
			<author><![CDATA[null@example.com (dkostiunin)]]></author>
			<pubDate>Fri, 28 Feb 2020 21:01:53 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=2566#p2566</guid>
		</item>
		<item>
			<title><![CDATA[Re: OnOrder() срабатывает несколько раз на одну заявку!]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=2565#p2565</link>
			<description><![CDATA[<p>Огромное спасибо!<br />Сэкономили кучу времени !<br />Сейчас приходит одно сообщение, когда появялется новая заявка, когда ее снимаешь, то сообщение не приходит.<br />Если не сложно, хотел уточнить, правильно ли я понял , как все работает. Потому что все равно один ньюанс не понимаю.</p><p>Вначале создали пустую таблицу.</p><p>ставим заявку,</p><p>начиает работу функция OnOrder</p><p>проверяется условие, если существует в таблице индекс в виде номера заявки, тогда функция завершается без исполнения всяких действий.</p><p>Так как таблица пустая, то при постановке новой заявки условие игнорируется, </p><p>выполняется запись в таблицу , где индекс это номер заявки, а значение это логическое True</p><p>затем выполняется код по формированию сообщения.</p><p>А далее , еще раз вызывается функция OnOrder, но при проверке условия находится запись в таблиуе с номером заявки. и фунция завершается без исполнения кода - от я это и не понимаю, зачем функция второй раз то вызывается?</p>]]></description>
			<author><![CDATA[null@example.com (dkostiunin)]]></author>
			<pubDate>Fri, 28 Feb 2020 20:35:00 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=2565#p2565</guid>
		</item>
		<item>
			<title><![CDATA[Re: OnOrder() срабатывает несколько раз на одну заявку!]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=2564#p2564</link>
			<description><![CDATA[<div class="quotebox"><cite>dkostiunin пишет:</cite><blockquote><p>переделал</p><p>в сообщения приходит именно последняя заявка, но все равно два раза дублируется</p></blockquote></div><p>Да, потому что OnOrder() может срабатывать несколько раз на 1 заявку.<br />Если вам нужно, чтобы ваш код работал только 1 раз - то можно запоминать номера заявок, чтобы не было повторных вызовов.</p><p>В начало кода&nbsp; (где is_run) добавьте строку</p><div class="codebox"><pre><code>t_orders = {}</code></pre></div><p>и в начало OnOrder() добавьте код:</p><div class="codebox"><pre><code>function OnOrder(trade_data)
  if t_orders[trade_data.order_num] then
    return
  end

  t_orders[trade_data.order_num] = true

...далее ваш код...</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (swerg)]]></author>
			<pubDate>Fri, 28 Feb 2020 16:58:29 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=2564#p2564</guid>
		</item>
		<item>
			<title><![CDATA[Re: OnOrder() срабатывает несколько раз на одну заявку!]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=2563#p2563</link>
			<description><![CDATA[<div class="quotebox"><cite>dkostiunin пишет:</cite><blockquote><p>в сообщения приходит именно последняя заявка, но все равно два раза дублируется</p></blockquote></div><p>напечатайте номер заявки, balance и ext_order_status, затем ставьте-снимайте в произвольном порядке свои заявки и вам все станет понятно.</p>]]></description>
			<author><![CDATA[null@example.com (toxa)]]></author>
			<pubDate>Fri, 28 Feb 2020 11:57:38 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=2563#p2563</guid>
		</item>
		<item>
			<title><![CDATA[Re: OnOrder() срабатывает несколько раз на одну заявку!]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=2562#p2562</link>
			<description><![CDATA[<div class="quotebox"><cite>dkostiunin пишет:</cite><blockquote><p>вот это я не понял ((которая может быть и не последней по индексу)&nbsp; -&nbsp; теми двумя строками я не гарантированно получу последнюю заявку?</p></blockquote></div><p>вы получите последнюю заявку по номеру, но не последнюю по обновлению.</p><p>дело в том, что заявки - таблица, в которой строки могут обновляться в любом порядке. если вы поставили заявку 1, затем поставили заявку 2, а потом сняли заявку 1, то OnOrder() будет вызвана три раза: после добавления заявки 1, после добавления заявки 2 и после снятия заявки 1.</p><p>ваш же код при добавлении заявки 1 вернет заявку 1, при добавлении заявки 2 вернет заявку 2, а при снятии заявки 1 вернет тоже заявку 2, а по смыслу должен 1.</p><p>используйте параметры, передаваемые в OnOrder() - это позволит вам достать из таблицы заявок именно ту заявку, с которой произошло какое-то действие. собственно, и доставать ничего не нужно, так как в параметры эта заявка и передается.</p>]]></description>
			<author><![CDATA[null@example.com (toxa)]]></author>
			<pubDate>Fri, 28 Feb 2020 11:51:02 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=2562#p2562</guid>
		</item>
		<item>
			<title><![CDATA[Re: OnOrder() срабатывает несколько раз на одну заявку!]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=2561#p2561</link>
			<description><![CDATA[<p>переделал</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 OnOrder(trade_data)<br />&nbsp; &nbsp; summ=trade_data.value<br />&nbsp; &nbsp; instr=trade_data.sec_code<br />&nbsp; &nbsp; kl_to_serv= summ..&#039;&nbsp; &#039;..instr<br />&nbsp; &nbsp; message (&quot;instrument &quot; .. tostring(kl_to_serv))<br />&nbsp; &nbsp;<br />end</p><p>в сообщения приходит именно последняя заявка, но все равно два раза дублируется</p>]]></description>
			<author><![CDATA[null@example.com (dkostiunin)]]></author>
			<pubDate>Fri, 28 Feb 2020 09:09:26 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=2561#p2561</guid>
		</item>
		<item>
			<title><![CDATA[Re: OnOrder() срабатывает несколько раз на одну заявку!]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=2560#p2560</link>
			<description><![CDATA[<div class="quotebox"><cite>swerg пишет:</cite><blockquote><p>Кроме того не стоит забывать, что иногда на самом деле никаких параметров у заявки может и не измениться, но OnOrder() вызывается, есть такая особенность.</p></blockquote></div><p>больше всего, конечно, бесит колбэк datasource. на одну сделку он вызывается до 11 раз, а все изменения по ней происходят перед первым вызовом, то есть делается 10 бесполезных вызовов. ну, компьютер быстрый, чо, пусть трудится.</p>]]></description>
			<author><![CDATA[null@example.com (toxa)]]></author>
			<pubDate>Fri, 28 Feb 2020 07:11:07 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=2560#p2560</guid>
		</item>
		<item>
			<title><![CDATA[Re: OnOrder() срабатывает несколько раз на одну заявку!]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=2559#p2559</link>
			<description><![CDATA[<div class="quotebox"><cite>dkostiunin пишет:</cite><blockquote><p>function OnOrder(trade_data)<br /><strong>&nbsp; &nbsp; n = getNumberOf(&quot;orders&quot;)<br />&nbsp; &nbsp; t = getItem(&quot;orders&quot;, n-1)<br /></strong>&nbsp; &nbsp; summ=t.value<br />&nbsp; &nbsp; instr=t.sec_code<br />&nbsp; &nbsp; kl_to_serv= summ..&#039;&nbsp; &#039;..instr<br />&nbsp; &nbsp; message (&quot;instrument &quot; .. tostring(kl_to_serv))<br />end</p></blockquote></div><p>Выделенное - лишнее. В качестве параметра в OnOrder(order) уже передаётся готовая таблица с параметрами этой самой заявки (которая может быть и не последней по индексу)</p>]]></description>
			<author><![CDATA[null@example.com (swerg)]]></author>
			<pubDate>Fri, 28 Feb 2020 06:18:21 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=2559#p2559</guid>
		</item>
		<item>
			<title><![CDATA[Re: OnOrder() срабатывает несколько раз на одну заявку!]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=2558#p2558</link>
			<description><![CDATA[<p>Потому что OnOrder() вызывается как на <strong>появление</strong> заявки, так и на <strong>изменение</strong> её параметров. Снятие заявки, формирование по ней сделки - это изменение параметров заявки.</p><p>Кроме того не стоит забывать, что иногда на самом деле никаких параметров у заявки может и не измениться, но OnOrder() вызывается, есть такая особенность.</p>]]></description>
			<author><![CDATA[null@example.com (swerg)]]></author>
			<pubDate>Fri, 28 Feb 2020 06:12:17 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=2558#p2558</guid>
		</item>
		<item>
			<title><![CDATA[OnOrder() срабатывает несколько раз на одну заявку!]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=2557#p2557</link>
			<description><![CDATA[<p>начинаю осваивать ЛУа, поробовал код, который для примера был приведен , у меня почему то сообщения два раза подряд отображаются.<br />То есть, я даю в терминал одну заявку, скрипт отправляет два сообщения, получается что функция на одну заявку два раза срабатывает.<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 OnOrder(trade_data)<br />&nbsp; &nbsp; n = getNumberOf(&quot;orders&quot;)<br />&nbsp; &nbsp; t = getItem(&quot;orders&quot;, n-1)<br />&nbsp; &nbsp; summ=t.value<br />&nbsp; &nbsp; instr=t.sec_code<br />&nbsp; &nbsp; kl_to_serv= summ..&#039;&nbsp; &#039;..instr<br />&nbsp; &nbsp; message (&quot;instrument &quot; .. tostring(kl_to_serv))<br />&nbsp; &nbsp;<br />end</p>]]></description>
			<author><![CDATA[null@example.com (dkostiunin)]]></author>
			<pubDate>Thu, 27 Feb 2020 21:35:26 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=2557#p2557</guid>
		</item>
	</channel>
</rss>
