﻿<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type='text/css' href='https://stocksharp.ru/css/style.css'?>
<?xml-stylesheet type='text/css' href='https://stocksharp.ru/css/bbeditor.css'?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title type="html">Матчинг ордеров и заявок</title>
  <id>~/topic/2775/matching-orderov-i-zayavok/</id>
  <rights type="text">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  <updated>2026-05-01T17:23:43Z</updated>
  <logo>https://stocksharp.ru/images/logo.png</logo>
  <link href="https://stocksharp.ru/handlers/atom.ashx?category=topic&amp;id=2775" rel="self" type="application/rss+xml" />
  <entry>
    <id>https://stocksharp.ru/posts/m/19623/</id>
    <title type="text">Вот как раз эта конструкция Do(bla-bla-bla).Apply(this) для меня сложновата, а примера не нашел. Зде...</title>
    <published>2012-06-09T00:01:11Z</published>
    <updated>2012-06-09T00:01:11Z</updated>
    <author>
      <name>igork</name>
      <uri>https://stocksharp.ru/users/6303/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">Вот как раз эта конструкция Do(bla-bla-bla).Apply(this) для меня сложновата, а примера не нашел. Здесь помимо простого Matched все равно нужно отслеживать еще и NotMatched и прочие состояния, поэтому все равно придется подписываться и анализировать все подряд. Например, если запустить на тестовом стенде ITInvest заявку на GAZR-9.12, к примеру, то в OrderCancelFired прилетает сообщение &amp;quot;Заявка не была принята системой&amp;quot;, никаких сообщений типа NewOrder со статусом Failed не приходит, и WhenMatched не будет никогда. &lt;br /&gt; &lt;br /&gt;Тем не менее спасибо за оперативный ответ. &lt;br /&gt;Вопрос снимается, разобрался, через TransactionID тоже можно матчить. &lt;br /&gt;&lt;br /&gt;&amp;gt;&amp;gt; P.S. Есть направление сделки, есть направление заявки. Это разные вещи&lt;br /&gt;Золотые слова &amp;quot;это разные вещи&amp;quot;, и я об этом же. Но если в Smartcom этого нет, то будем считать, что это одно и то же :-). Спасибо за помощь.</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/19593/</id>
    <title type="text">Самый элегантный метод матчинга - order.WhenMatched().Do(blablabla).Apply(this); P.S. Есть направлен...</title>
    <published>2012-06-08T05:49:43Z</published>
    <updated>2012-06-08T05:49:43Z</updated>
    <author>
      <name>Alexander</name>
      <uri>https://stocksharp.ru/users/2826/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">Самый элегантный метод матчинга - order.WhenMatched().Do(blablabla).Apply(this);&lt;br /&gt;&lt;br /&gt;P.S. Есть направление сделки, есть направление заявки. Это разные вещи. Шлюз смарткома не передаёт информацию по направлению сделки, поэтому они и null.</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.ru/posts/m/19592/</id>
    <title type="text">Хотелось бы понять, как матчить ордера и их исполнение (трэйды), чтобы отследить полное исполнение з...</title>
    <published>2012-06-08T00:24:06Z</published>
    <updated>2012-06-08T00:24:06Z</updated>
    <author>
      <name>igork</name>
      <uri>https://stocksharp.ru/users/6303/</uri>
      <email>info@stocksharp.ru</email>
    </author>
    <content type="html">Хотелось бы понять, как матчить ордера и их исполнение (трэйды), чтобы отследить полное исполнение заявки.&lt;br /&gt;&lt;br /&gt;Допустим, один из режимов работы будущего робота будет &amp;quot;синхронный&amp;quot;, то есть выбрасывается несколько ордеров по маркету (допустим), и затем ожидание их исполнения, и только после этого пойдет последующая расстановка ордеров и т.д. Проблема усложняется тем, что на том же счету будет работать несколько роботов (в будущем) с теми же инструментами, и следовательно MyTrades и Orders будут сыпаться во все роботы синхронно, и их нужно как-то разделять. Так как объект Strategy не удалось для этого прикрутить, после недолгого размышления пришла мысль использовать коментарии (Order.Comment). &lt;br /&gt;&lt;br /&gt;Все выглядит примерно так. &lt;br /&gt;&lt;br /&gt;1. В методе Connect &lt;br /&gt;&lt;br /&gt;   trader.NewOrders += orders =&amp;gt; { ProcessNewOrder(orders) };&lt;br /&gt;   trader.OrderChanged += orders =&amp;gt; {ProcessNewOrders(orders) };&lt;br /&gt;   trader.OrderRegisterFailed += ....&lt;br /&gt;   trader.OrderCancelFailed += ....&lt;br /&gt;   trader.NewMyTrades += trades =&amp;gt; { ProcessMyTrades(trades) };&lt;br /&gt;&lt;br /&gt;2. В методе запуска ордеров&lt;br /&gt;&lt;br /&gt;   а. Создаем потокобезопасную коллекцию, в которой храним Comment + нужные нам данные. &lt;br /&gt;   &lt;br /&gt;   _collection = new ThreadSafeObservableCollection&amp;lt;MyCollection&amp;gt;();&lt;br /&gt;&lt;br /&gt;   б. Создаем ордер. &lt;br /&gt;   o = new Order {&lt;br /&gt;	Market, Price, Volume, Direction, &lt;br /&gt;	Comment = StrategyID.ToString() + Type.ToString() + Portfolio.Name + Security.ID + Direction.ToString() + RND.Next().ToString()&lt;br /&gt;	};&lt;br /&gt;&lt;br /&gt;   в. Регистрируем его в коллекции. &lt;br /&gt;   MyCollection col = new MyCollection();&lt;br /&gt;   MyCollection.Comment = o.Comment;&lt;br /&gt;   _collection.Add(col);&lt;br /&gt;&lt;br /&gt;   г. запускаем Order.&lt;br /&gt;   trader.RegisterOrder(o);&lt;br /&gt;&lt;br /&gt;   и далее последовательно несколько ордеров в том же цикле. На этом выставление завершается, ждем подтверждений.&lt;br /&gt;&lt;br /&gt;Теперь в методе &lt;br /&gt;&lt;br /&gt;private void ProcessNewOrder(orders)&lt;br /&gt;{&lt;br /&gt;        foreach (Order o in orders)&lt;br /&gt;	{&lt;br /&gt;		String Comment = o.Comment;&lt;br /&gt;		var c = _collection.FirstOrDefault( cc =&amp;gt; cc.Comment == Comment);&lt;br /&gt;		if (var != null)&lt;br /&gt;                   нашли наш ордер, который мы запускали. &lt;br /&gt;	}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;и далее по шагам:&lt;br /&gt;- когда order.State != Done - в коллекции отмечаем, что он не выполнен, следовательно весь цикл не имеет смысла, отыгрываем позицию назад (логика исключительно для примера). &lt;br /&gt;- когда Order.State == Done - отмечаем это, и ждем прихода MyTrades по этому ордеру. &lt;br /&gt;- если в процессе ожидания исполнения лимитных заявок рынок ушел, то убить все неисполненные ордера, запустить ордера для возврата позиции в исходное состояние (где отрботал sell туда дать Buy), и войти заново по новым уровням....&lt;br /&gt;&lt;br /&gt;- в событии ProcessMyTrades(trades) через вложенный Order по комментарию находим элемент коллекции и ждем, когда в трэйдах придет все то количество, которое мы размещали в Order.Volume. &lt;br /&gt;&lt;br /&gt;- и так далее с очень разветвленным алгоритмом.&lt;br /&gt;&lt;br /&gt;Собственно вопрос: есть ли более элегантный метод матчинга, чем генерация комментариев через SID и rnd, чтобы не сравнивать строки? Я надеялся (казалось, логично) на TransactionID, но он всегда нулевой. &lt;br /&gt;&lt;br /&gt;P.S. Не знаю, баг это или специфическое поведение, но согласно документации Объект MyTrade фактически содержит в себе два объекта Trade и Order. В процессе матчинга я пытался проверять, одинаковые ли MyTrade.Trade.OrderDirection и MyTrade.Order.Direction (мало ли :-) ). Оказалось, что MyTrade.Trade.OrderDirection всегда есть null, и следовательно, когда получаешь новый MyTrade по событию trader.NewMyTrades +&amp;gt;, то направление трэйда можно получить только из вложенного ордера. Версия 4.0.20. &lt;br /&gt;&lt;br /&gt;</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
</feed>