﻿<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type='text/css' href='https://stocksharp.com/css/style.css'?>
<?xml-stylesheet type='text/css' href='https://stocksharp.com/css/bbeditor.css'?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title type="html">Частичное исполнение лимитной заявки</title>
  <id>~/topic/8327/chastichnoe-ispolnenie-limitnoi-zayavki/</id>
  <rights type="text">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  <updated>2026-04-30T07:13:17Z</updated>
  <logo>https://stocksharp.com/images/logo.png</logo>
  <link href="https://stocksharp.com/handlers/atom.ashx?category=topic&amp;id=8327" rel="self" type="application/rss+xml" />
  <entry>
    <id>https://stocksharp.com/posts/m/40184/</id>
    <title type="text">1. Есть событие WhenRegistered,,, В этот момент заявка имеет статус Act ive. 2, Могу рекомендовать с...</title>
    <published>2017-06-20T14:18:17Z</published>
    <updated>2017-06-20T14:18:17Z</updated>
    <author>
      <name>Support</name>
      <uri>https://stocksharp.com/users/97869/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">1. Есть событие  WhenRegistered,,, В этот момент заявка имеет статус Act ive. 2, Могу рекомендовать следующий подход.. Для каждого &amp;quot;логического&amp;quot; типа заявок (вход, тейк, стоп и т.п.) создается метод, в котором собраны все события для данной заявки... В событиях заявки реализуется необходимая логика.. Можно иметь шаблон такого метода и использовать его в разных стратегиях. Ниже показан пример..   &lt;br /&gt;&lt;br /&gt;&lt;div class='spoilertitle'&gt;&lt;input type='button' value='Show spoiler' class='btn btn-primary' onclick="toggleSpoiler(this, 'spolier_56bdcc860c2e4056b5646c802e950f72');" title='Show spoiler' /&gt;&lt;/div&gt;&lt;div class='spoilerbox' id='spolier_56bdcc860c2e4056b5646c802e950f72' style='display:none'&gt;       private void TakeOrderProcessing(Order order)&lt;br /&gt;        {&lt;br /&gt;&lt;br /&gt;            if (_isStopping)&lt;br /&gt;                return;&lt;br /&gt;&lt;br /&gt;            order.Comment = &amp;quot;Take&amp;quot;;&lt;br /&gt;&lt;br /&gt;            try&lt;br /&gt;            {&lt;br /&gt;&lt;br /&gt;                if (this.Root.SessionState != eSessionState.ActiveSession)&lt;br /&gt;                    throw new Exception(&amp;quot;Не могу выставить заявку - сессия неактивна!&amp;quot;);&lt;br /&gt;&lt;br /&gt;                order.WhenChanged(this.Connector).Do(o =&amp;gt;&lt;br /&gt;                {&lt;br /&gt;                    this.AddDebugLog(&amp;quot;{0} заявка изменена. {1}&amp;quot;, o.Comment, o);&lt;br /&gt;&lt;br /&gt;                    var bl = ETSBlocks.FirstOrDefault(b =&amp;gt; b.Take.Orders.Any(ord =&amp;gt; ord.TransactionId == o.TransactionId));&lt;br /&gt;                    if (bl != null)&lt;br /&gt;                        Take.CanChange = bl.Take.Orders.Any(ord =&amp;gt; ord.State == OrderStates.Active);&lt;br /&gt;&lt;br /&gt;                }).Apply(this);&lt;br /&gt;&lt;br /&gt;                order.WhenRegistered(this.Connector).Do(o =&amp;gt;&lt;br /&gt;                {&lt;br /&gt;&lt;br /&gt;                    var bl = ETSBlocks.FirstOrDefault(b =&amp;gt; b.Take.Orders.Any(ord =&amp;gt; ord.TransactionId == o.TransactionId));&lt;br /&gt;&lt;br /&gt;                    if (bl != null)&lt;br /&gt;                        Take.CanChange = bl.Take.Orders.Any(ord =&amp;gt; ord.State == OrderStates.Active);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;                    this.AddDebugLog(&amp;quot;{0} заявка зарегистрирована. {1}&amp;quot;, o.Comment, o);&lt;br /&gt;                }).Apply(this).Once();&lt;br /&gt;&lt;br /&gt;                var orderWhenRegisterFailed = order.WhenRegisterFailed(this.Connector);&lt;br /&gt;&lt;br /&gt;                orderWhenRegisterFailed.Do(of =&amp;gt;&lt;br /&gt;                {&lt;br /&gt;                    this.AddWarningLog(&amp;quot;Ошибка регистрации {0} заявки. {1}. {2}&amp;quot;, of.Order.Comment, of.Order, of.Error.Message);&lt;br /&gt;                    this.Rules.RemoveRulesByToken(orderWhenRegisterFailed.Token, orderWhenRegisterFailed);&lt;br /&gt;                }).Apply(this);&lt;br /&gt;&lt;br /&gt;                var orderWhenCanceled = order.WhenCanceled(this.Connector);&lt;br /&gt;&lt;br /&gt;                orderWhenCanceled.Do(o =&amp;gt;&lt;br /&gt;                {&lt;br /&gt;                    this.AddInfoLog(&amp;quot;Отменена {0} заявка. {1}&amp;quot;, o.Comment, o);&lt;br /&gt;&lt;br /&gt;                    var bl = ETSBlocks.FirstOrDefault(b =&amp;gt; b.Take.Orders.Any(ord =&amp;gt; ord.TransactionId == o.TransactionId));&lt;br /&gt;&lt;br /&gt;                    if (bl != null)&lt;br /&gt;                    {&lt;br /&gt;&lt;br /&gt;                        Take.CanChange = bl.Take.Orders.Any(ord =&amp;gt; ord.State == OrderStates.Active);&lt;br /&gt;&lt;br /&gt;                        if (AlgorithmStatus == AlgorithmStatuses.SendCancelTake)&lt;br /&gt;                        {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;                            if (bl.Take.Orders.All(t =&amp;gt; t.State != OrderStates.Active))&lt;br /&gt;                            {&lt;br /&gt;                                var vol = Volume - bl.Take.Orders.Sum(t =&amp;gt; t.Volume - t.Balance);&lt;br /&gt;&lt;br /&gt;                                var newTake = this.CreateOrder(Direction.Invert(), _newTakePrice, vol);&lt;br /&gt;&lt;br /&gt;                                bl.Take.ActivateLevel = _newTakePrice;&lt;br /&gt;                                bl.Take.Orders.Add(newTake);&lt;br /&gt;&lt;br /&gt;                                this.AddInfoLog(&amp;quot;Изменение тейк-заявки. Послылаем команда на выставление новой тейк-заявки. Новая цена {0}&amp;quot;, _newTakePrice);&lt;br /&gt;&lt;br /&gt;                                TakeOrderProcessing(newTake);&lt;br /&gt;                            }&lt;br /&gt;&lt;br /&gt;                        }&lt;br /&gt;                    }&lt;br /&gt;                    else&lt;br /&gt;                        this.AddWarningLog(&amp;quot;Не найден TakeStopBlock&amp;quot;);&lt;br /&gt;&lt;br /&gt;                    UpdateInfo();&lt;br /&gt;&lt;br /&gt;                    this.Rules.RemoveRulesByToken(orderWhenCanceled.Token, orderWhenCanceled);&lt;br /&gt;                }).Apply(this);&lt;br /&gt;&lt;br /&gt;                var orderWhenMatched = order.WhenMatched(this.Connector);&lt;br /&gt;                orderWhenMatched.Do(o =&amp;gt;&lt;br /&gt;                {&lt;br /&gt;                    this.AddInfoLog(&amp;quot;Полное исполнение {0} заявки. {1}&amp;quot;, o.Comment, o);&lt;br /&gt;&lt;br /&gt;                    var bl = ETSBlocks.FirstOrDefault(b =&amp;gt; b.Take.Orders.Any(ord =&amp;gt; ord.TransactionId == o.TransactionId));&lt;br /&gt;&lt;br /&gt;                    if (bl != null)&lt;br /&gt;                    {&lt;br /&gt;                        Take.CanChange = bl.Take.Orders.Any(ord =&amp;gt; ord.State == OrderStates.Active);&lt;br /&gt;                        var enterVolume = bl.Enter.Orders.Where(ord =&amp;gt; ord.State == OrderStates.Done).Sum(ord =&amp;gt; ord.Volume - ord.Balance);&lt;br /&gt;                        var takeVolume = bl.Take.Orders.Where(ord =&amp;gt; ord.State == OrderStates.Done).Sum(ord =&amp;gt; ord.Volume - ord.Balance);&lt;br /&gt;&lt;br /&gt;                        if (enterVolume == takeVolume)&lt;br /&gt;                            AlgorithmStatus = AlgorithmStatuses.Take;&lt;br /&gt;&lt;br /&gt;                    }&lt;br /&gt;                    else&lt;br /&gt;                        this.AddWarningLog(&amp;quot;Не найден TakeStopBlock&amp;quot;);&lt;br /&gt;&lt;br /&gt;                    UpdateInfo();&lt;br /&gt;&lt;br /&gt;                    this.Rules.RemoveRulesByToken(orderWhenMatched.Token, orderWhenMatched);&lt;br /&gt;                }).Apply(this);&lt;br /&gt;&lt;br /&gt;                order.WhenPartiallyMatched(this.Connector).Do(o =&amp;gt;&lt;br /&gt;                {&lt;br /&gt;                    if (o.IsMatchedPartially())&lt;br /&gt;                    {&lt;br /&gt;                        this.AddInfoLog(&amp;quot;Частичное исполнение {0} заявки. {1}&amp;quot;, o.Comment, o);&lt;br /&gt;                    }&lt;br /&gt;                }).Apply(this);&lt;br /&gt;&lt;br /&gt;                order.WhenNewTrade(this.Connector).Do(trade =&amp;gt;&lt;br /&gt;                {&lt;br /&gt;                    var bl = ETSBlocks.FirstOrDefault(b =&amp;gt; b.Take.Orders.Any(o =&amp;gt; o.TransactionId == trade.Order.TransactionId));&lt;br /&gt;                    if (bl != null)&lt;br /&gt;                    {&lt;br /&gt;                        if (bl.Take.Trades.All(t =&amp;gt; t.Trade.Id != trade.Trade.Id))&lt;br /&gt;                            bl.Take.Trades.Add(trade);&lt;br /&gt;                    }&lt;br /&gt;&lt;br /&gt;                    UpdateInfo();&lt;br /&gt;&lt;br /&gt;                }).Apply(this);&lt;br /&gt;&lt;br /&gt;                AlgorithmStatus = AlgorithmStatuses.SendTake;&lt;br /&gt;&lt;br /&gt;                this.RegisterOrder(order);&lt;br /&gt;&lt;br /&gt;                this.AddInfoLog(&amp;quot;Послана {0} заявка. Price: {0}&amp;quot;, order.Comment, order.Price);&lt;br /&gt;            }&lt;br /&gt;            catch (Exception ex)&lt;br /&gt;            {&lt;br /&gt;                this.AddErrorLog(string.Format(&amp;quot;{0} / {1}&amp;quot;, ex.Message, ex.StackTrace));&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;        } &lt;/div&gt;</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/40179/</id>
    <title type="text">А как это реализуется на практике через собственные флаги? Я имею ввиду как дождаться, того, что выс...</title>
    <published>2017-06-19T17:49:47Z</published>
    <updated>2017-06-19T17:49:47Z</updated>
    <author>
      <name>Knup</name>
      <uri>https://stocksharp.com/users/50721/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">А как это реализуется на практике через собственные флаги? Я имею ввиду как дождаться, того, что выставленная заявка станет активной, чтобы к ней можно было применить CancelOrder ? Просто не совсем очевидно. </content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/40177/</id>
    <title type="text">1. Лучше использовать два события WhenPartyallyMatched и WhenNewTrade, потому что WhenPartyallyMatch...</title>
    <published>2017-06-19T15:50:37Z</published>
    <updated>2017-06-19T15:50:37Z</updated>
    <author>
      <name>Support</name>
      <uri>https://stocksharp.com/users/97869/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">1.   Лучше использовать два события WhenPartyallyMatched и WhenNewTrade, потому что WhenPartyallyMatched обычно приходит раньше WhenNewTrade... В WhenNewTrade мы только проверяем была ли выполнена обработка в WhenPartyallyMatched.. 2. Вам не нужно полностью полагаться на статусы и события зяявки, а использовать собственные флаги для контроля за состоянием...которые проверить</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/40174/</id>
    <title type="text">Добрый день, Подскажите, пожалуйста, как на S# корректно реализовать следующий алгоритм: 1) Выставля...</title>
    <published>2017-06-19T13:08:18Z</published>
    <updated>2017-06-19T13:08:18Z</updated>
    <author>
      <name>Knup</name>
      <uri>https://stocksharp.com/users/50721/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">Добрый день,&lt;br /&gt;&lt;br /&gt;Подскажите, пожалуйста, как на S# корректно реализовать следующий алгоритм: &lt;br /&gt;1) Выставляем лимитную заявку на покупку&lt;br /&gt;2) При каждом частичном исполнении заявки выставляется тейк-профит в виде противоположной лимитной заявки. Тейк-профит должен быть всегда один, т.е. при каждом новом частичном исполнении заявки старый тейк-профит отменяется, новый же с сальдированным большим объёмом - выставляется. И так, пока заявка на покупку полностью не исполнится. Т.е. в итоге после исполнения лимитной заявки на покупку из n лотов должна быть одна противоположная заявка на продажу (тейк-профит) тоже из n лотов.  &lt;br /&gt;&lt;br /&gt;Делаю примерно так через WhenNewTrade: &lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Code&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;br /&gt;...&lt;br /&gt;_orderOpen.WhenNewTrade(Connector)&lt;br /&gt;                .Do(o =&amp;gt;&lt;br /&gt;                {&lt;br /&gt;                    // фиксируем набранную позицию&lt;br /&gt;                    _summVolumeOpen += o.Trade.Volume;&lt;br /&gt;                    _summPriceVolumeOpen += _orderdata.OpenPrice * o.Trade.Volume;&lt;br /&gt;&lt;br /&gt;                    // Создать заявку тейк-профит по набранной позиции&lt;br /&gt;                    CreateTakeProfitOrderSell(_summVolumeOpen);&lt;br /&gt;                })&lt;br /&gt;                .Apply(this);&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;        private void CreateTakeProfitOrderSell(decimal curvol)&lt;br /&gt;        {&lt;br /&gt;            lock (_syncObjSafe)&lt;br /&gt;            {&lt;br /&gt;                if (_orderClose != null &amp;amp;&amp;amp; _orderClose.State == OrderStates.Active)&lt;br /&gt;                    CancelOrder(_orderClose);&lt;br /&gt;                &lt;br /&gt;                _orderClose = this.SellAtLimit(_orderdata.ClosePrice, curvol);&lt;br /&gt;                &lt;br /&gt;                ...&lt;br /&gt;&lt;br /&gt;                RegisterOrder(_orderClose);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Проблема в том, что при исполнении лимитной заявки по частям WhenNewTrade вызывается быстро несколько раз так, что заявка тейк-профит _orderClose не успевает принять состояние Active и поэтому не отменяется. WhenPartiallyMatched, как я понял, тоже не решает проблему - это правило вызывается столько же раз, сколько и WhenNewTrade. В общем, в результате вместо одного тейк-профита у меня выставляется сразу несколько, что неправильно (все заявки кроме последней должны быть отменёнными).  &lt;br /&gt;</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
</feed>