﻿<?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">4.1.3 Не удаляется собственное правило правило</title>
  <id>~/topic/2956/4_1_3-ne-udalyaetsya-sobstvennoe-pravilo-pravilo/</id>
  <rights type="text">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  <updated>2026-04-17T08:23:17Z</updated>
  <logo>https://stocksharp.com/images/logo.png</logo>
  <link href="https://stocksharp.com/handlers/atom.ashx?category=topic&amp;id=2956" rel="self" type="application/rss+xml" />
  <entry>
    <id>https://stocksharp.com/posts/m/21046/</id>
    <title type="text"> Ответ был дан выше Остальные подробности - обращайтесь в ТП К сожалению я не получил ответа который...</title>
    <published>2012-08-27T02:53:48Z</published>
    <updated>2016-08-16T00:08:44Z</updated>
    <author>
      <name>PavelAd</name>
      <uri>https://stocksharp.com/users/6072/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Alexander Mukhanchikov &lt;a href="https://stocksharp.com/posts/m/21035/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;&lt;br /&gt;&lt;a href="http://stocksharp.com/posts/m/20975/" title="http://stocksharp.com/posts/m/20975/"&gt;Ответ был дан выше&lt;/a&gt;&lt;br /&gt;Остальные подробности - обращайтесь в ТП&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;[confused]К сожалению я не получил ответа который бы помог разобраться в причине...&lt;br /&gt;Поэтому привел более подробное описание.&lt;br /&gt;Не видя как реализовано удаление правил, осталось только мое предположение - что проблема связана с введением токенов.&lt;br /&gt;&lt;br /&gt;вопросы из предыдущих постов: &lt;br /&gt;&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Quote:&lt;/span&gt;&lt;div class="innerquote"&gt;1. Можно ли как-то поменять токен у ранее созданного правила?&lt;br /&gt;2. Если сейчас никак нельзя, возможно ли добавить поддержку подобного механизма в будущих версиях S#?&lt;br /&gt;&lt;br /&gt;используется ли токен при удалении правила через Rules.Remove?&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;тоже остались не отвеченными</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/21035/</id>
    <title type="text"> У меня выше написанный код работает. Думаю, не все условия приведены в коде. Плюс сам код не рабочи...</title>
    <published>2012-08-26T14:06:47Z</published>
    <updated>2016-08-16T00:08:43Z</updated>
    <author>
      <name>Alexander</name>
      <uri>https://stocksharp.com/users/2826/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;PavelAd &lt;a href="https://stocksharp.com/posts/m/20978/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Mikhail Sukhov &lt;a href="https://stocksharp.com/posts/m/20977/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;&lt;br /&gt;У меня выше написанный код работает. Думаю, не все условия приведены в коде. Плюс сам код не рабочий.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Привожу более точный код:&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Code&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush:csharp"&gt;

IMarketRule ChangeStopOrderRule;
Order StopOrder;

// Здесь первоначально создаем стоп заявку и правило
public void PrepareStopOrder(OrderDirections direction) {
...
  StopOrder = this.CreateOrder(direction, stopPrice, Volume);
  ChangeStopOrderRule = StopOrder.WhenIndicatorChanged(Indicator).Do(RePrepareStopOrder).Apply(this);
  RegisterOrder(StopOrder);
}

// Здесь перевыставляем стоп заявку, когда изменился индикатор
private void RePrepareStopOrder(Order oldStopOrder) {
...
  var newStopOrder = oldStopOrder.Clone();
  newStopOrder.Price = newStopPrice;
  ((QuikStopCondition) newStopOrder.StopCondition).StopPrice = newActivatePrice;
...
  ChangeStopOrderRule.ChangeOrder(newStopOrder); // Заменяем заявку в правиле
  ReRegisterOrder(oldStopOrder, newStopOrder);
  StopOrder = newStopOrder;
}

// Вызывается при полном исполнении профит заявки
private void ProfitOrderMatched(Order profitOrder) {
  // Когда исполнен профит, отменяем стоп заявку и удаляем правило
  Trader.CancelOrder(StopOrder);
  Rules.Remove(ChangeStopOrderRule); // Здесь получаю исключение
}
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Стоп-заявка перевыставляется каждый раз с новой ценой когда меняется индикатор. В методе переподготовки RePrepareStopOrder&lt;br /&gt;вызывается ChangeStopOrderRule.ChangeOrder(newStopOrder) для замены заявки в правиле (чтобы следующий раз когда сработает правило передавалась уже новая заявка)&lt;br /&gt;Если после одного перевыставления стоп заявки вдруг сработал профит, то в методе ProfitOrderMatched при удалении правила и получаю вышеуказанное исключение.&lt;br /&gt;Как я предполагаю из-за того что в правиле токен продолжает смотреть на первоначальную стоп заявку.&lt;br /&gt;&lt;br /&gt;Михаил подскажите, при удалении через Rules.Remove все равно используется токен?&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://stocksharp.com/posts/m/20975/" title="http://stocksharp.com/posts/m/20975/"&gt;Ответ был дан выше&lt;/a&gt;&lt;br /&gt;Остальные подробности - обращайтесь в ТП</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/20978/</id>
    <title type="text"> У меня выше написанный код работает. Думаю, не все условия приведены в коде. Плюс сам код не рабочи...</title>
    <published>2012-08-23T10:16:50Z</published>
    <updated>2012-08-23T10:20:14Z</updated>
    <author>
      <name>PavelAd</name>
      <uri>https://stocksharp.com/users/6072/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Mikhail Sukhov &lt;a href="https://stocksharp.com/posts/m/20977/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;&lt;br /&gt;У меня выше написанный код работает. Думаю, не все условия приведены в коде. Плюс сам код не рабочий.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Привожу более точный код:&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Code&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush:csharp"&gt;

IMarketRule ChangeStopOrderRule;
Order StopOrder;

// Здесь первоначально создаем стоп заявку и правило
public void PrepareStopOrder(OrderDirections direction) {
...
  StopOrder = this.CreateOrder(direction, stopPrice, Volume);
  ChangeStopOrderRule = StopOrder.WhenIndicatorChanged(Indicator).Do(RePrepareStopOrder).Apply(this);
  RegisterOrder(StopOrder);
}

// Здесь перевыставляем стоп заявку, когда изменился индикатор
private void RePrepareStopOrder(Order oldStopOrder) {
...
  var newStopOrder = oldStopOrder.Clone();
  newStopOrder.Price = newStopPrice;
  ((QuikStopCondition) newStopOrder.StopCondition).StopPrice = newActivatePrice;
...
  ChangeStopOrderRule.ChangeOrder(newStopOrder); // Заменяем заявку в правиле
  ReRegisterOrder(oldStopOrder, newStopOrder);
  StopOrder = newStopOrder;
}

// Вызывается при полном исполнении профит заявки
private void ProfitOrderMatched(Order profitOrder) {
  // Когда исполнен профит, отменяем стоп заявку и удаляем правило
  Trader.CancelOrder(StopOrder);
  Rules.Remove(ChangeStopOrderRule); // Здесь получаю исключение
}
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Стоп-заявка перевыставляется каждый раз с новой ценой когда меняется индикатор. В методе переподготовки RePrepareStopOrder&lt;br /&gt;вызывается ChangeStopOrderRule.ChangeOrder(newStopOrder) для замены заявки в правиле (чтобы следующий раз когда сработает правило передавалась уже новая заявка)&lt;br /&gt;Если после одного перевыставления стоп заявки вдруг сработал профит, то в методе ProfitOrderMatched при удалении правила и получаю вышеуказанное исключение.&lt;br /&gt;Как я предполагаю из-за того что в правиле токен продолжает смотреть на первоначальную стоп заявку.&lt;br /&gt;&lt;br /&gt;Михаил подскажите, при удалении через Rules.Remove все равно используется токен?</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/20977/</id>
    <title type="text"> Это перестало работать после введения токенов для правила. Что обидно У меня выше написанный код ра...</title>
    <published>2012-08-23T09:29:21Z</published>
    <updated>2012-08-23T09:29:21Z</updated>
    <author>
      <name>Mikhail Sukhov</name>
      <uri>https://stocksharp.com/users/201/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;PavelAd &lt;a href="https://stocksharp.com/posts/m/20976/" class="quote_nav"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="innerquote"&gt;&lt;br /&gt;Это перестало работать после введения токенов для правила. Что обидно [crying] &lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;У меня выше написанный код работает. Думаю, не все условия приведены в коде. Плюс сам код не рабочий.</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/20976/</id>
    <title type="text">Проблема возникает после вызова собственного метода ChangeOrder() для правила. Этот метод у меня выз...</title>
    <published>2012-08-23T09:20:47Z</published>
    <updated>2012-08-23T09:20:47Z</updated>
    <author>
      <name>PavelAd</name>
      <uri>https://stocksharp.com/users/6072/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">Проблема возникает после вызова собственного метода ChangeOrder() для правила.&lt;br /&gt;Этот метод у меня вызывается при перевыставлении заявки по условию, для того чтобы изменить ссылку на заявку в правиле без пересоздания самого правила в целях экономии ресурсов и времени.&lt;br /&gt;Это перестало работать после введения токенов для правила. Что обидно [crying] &lt;br /&gt;&lt;br /&gt;Вопрос к разработчикам: &lt;br /&gt;1. Можно ли как-то поменять токен у ранее созданного правила?&lt;br /&gt;2. Если сейчас никак нельзя, возможно ли добавить поддержку подобного механизма в будущих версиях S#?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/20975/</id>
    <title type="text">Эта тема, за последние несколько дней, поднималась пару раз минимум. Смотрим в поиске или документац...</title>
    <published>2012-08-23T09:15:55Z</published>
    <updated>2012-08-23T09:15:55Z</updated>
    <author>
      <name>esper</name>
      <uri>https://stocksharp.com/users/5990/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">Эта тема, за последние несколько дней, поднималась пару раз минимум. Смотрим в поиске или &lt;a href="http://stocksharp.com/doc/html/12ef8365-1bd1-426d-afc5-5eee33d554a6.htm" title="http://stocksharp.com/doc/html/12ef8365-1bd1-426d-afc5-5eee33d554a6.htm"&gt;документацию&lt;/a&gt;.</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/20974/</id>
    <title type="text">При попытке удалить собственное правило получаю исключение: System.InvalidOperationException не обра...</title>
    <published>2012-08-23T08:57:58Z</published>
    <updated>2012-08-23T09:03:10Z</updated>
    <author>
      <name>PavelAd</name>
      <uri>https://stocksharp.com/users/6072/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">При попытке удалить собственное правило получаю исключение:&lt;br /&gt;&lt;br /&gt;&lt;div class="quote"&gt;&lt;span class="quotetitle"&gt;Quote:&lt;/span&gt;&lt;div class="innerquote"&gt;System.InvalidOperationException не обработано пользовательским кодом&lt;br /&gt;  Message=Правило  не зарегистрировано в контейнере TS_RIU2@RTS_SPBFUT010Lt.&lt;br /&gt;  Source=StockSharp.Algo&lt;br /&gt;  StackTrace:&lt;br /&gt;       в #=qB2ExCNEQw8oj77e3UN$lsGXd9IM$6dAY$FrsPtHePsc=.OnRemoving(IMarketRule #=ql0zRQV$KEbPTptc25u4ShA==)&lt;br /&gt;       в Ecng.Collections.BaseCollection`2.Remove(TItem item)&lt;br /&gt;       в Ecng.Collections.SynchronizedCollection`2.Remove(TItem item)&lt;br /&gt;       в TradeStrategy.TresureStrategy.RemoveOrderRules(Order order) в C:\Trade\TradeStrategy\TradeStrategy\TresureStrategy.cs:строка 1630&lt;br /&gt;       в TradeStrategy.TresureStrategy.StopOrderOnSignalBarFound(Order stopOrder, Candle signalCandle) в C:\Trade\TradeStrategy\TradeStrategy\TresureStrategy.cs:строка 1116&lt;br /&gt;       в TradeStrategy.TresureStrategy.&amp;lt;PrepareStopOrder&amp;gt;b__23(Order o) в C:\Trade\TradeStrategy\TradeStrategy\TresureStrategy.cs:строка 872&lt;br /&gt;       в StockSharp.Algo.MarketRule`2.#=qn2RvSblijBybYyyfWKcy1_hs9OJvieXgUlAwEKJ7QG4=()&lt;br /&gt;       в StockSharp.Algo.MarketRuleHelper.#=qO_5nYqG02u$qDVGuIGBcPw==(IMarketRuleContainer #=q6WtW4HdAsVTLateaVJyxUg==, IMarketRule #=qXKycGTf2ej0HKdDUPJVrlQ==, Func`1 #=qUHVCmgydNCLfZ5O8NP$PBg==)&lt;br /&gt;       в StockSharp.Algo.Strategies.Strategy.#=qCypqGMSO_x8SPWJDIPw__UD8vJqmRZyixTy_v9o8CHprIFRlcm3cJQXa6UL4cY1T9Cm2VTpAHQA6L2x1piL2jw==(IMarketRule #=q3eSZx6_yVLksnYZxrbPPbA==, Func`1 #=qDQNtK0bpCquD2$1aKN0h3w==)&lt;br /&gt;  InnerException: &lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Код приводящий к ошибке:&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Code&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush:csharp"&gt;

IMarketRule ChangeStopOrderRule = stopOrder.WhenIndicatorChanged(Indicator).Do(RePrepareOrder).Apply(this);
...
Rules.Remove(ChangeStopOrderRule); // Здесь получаю исключение
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Код правила:&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Code&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush:csharp"&gt;
  public sealed class OrderChangeRule : MarketRule&amp;lt;Order, Order&amp;gt; {
    private readonly Func&amp;lt;Order, bool&amp;gt; _changed;
    private Order _order;
    private readonly BaseIndicator&amp;lt;decimal&amp;gt; _indicator;

    public OrderChangeRule(BaseIndicator&amp;lt;decimal&amp;gt; indicator, Order order, Func&amp;lt;Order, bool&amp;gt; changed) : base(order) {
      if (indicator == null)
        throw new ArgumentNullException(&amp;quot;indicator&amp;quot;);
      if (order == null)
        throw new ArgumentNullException(&amp;quot;order&amp;quot;);
      if (changed == null)
        throw new ArgumentNullException(&amp;quot;changed&amp;quot;);

      _indicator = indicator;
      _order = order;
      _changed = changed;
      _indicator.Changed += OnIndicatorChanged;
    }

    private void OnIndicatorChanged(IIndicatorValue v1, IIndicatorValue v2) {
      if (_changed != null &amp;amp;&amp;amp; _changed(_order))
        Activate(_order);
    }

    // Замена заявки для которой первоначально создано правило. Необходимо для возможности замены заявки без пересоздания правила
    public void ChangeOrder(Order newOrder) {
      _order = newOrder;
    }

    protected override void DisposeManaged() {
      _indicator.Changed -= OnIndicatorChanged;
      base.DisposeManaged();
    }
  }

public static class OrderChangeRuleHelper {
    public static MarketRule&amp;lt;Order, Order&amp;gt; WhenIndicatorChanged(this Order order, BaseIndicator&amp;lt;decimal&amp;gt; indicator, Func&amp;lt;Order, bool&amp;gt; changed = null) {
      if (indicator == null)
        throw new ArgumentNullException(&amp;quot;indicator&amp;quot;);
      if (order == null)
        throw new ArgumentNullException(&amp;quot;order&amp;quot;);

      return new OrderChangeRule(indicator, order, changed);
    }
}
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Это ошибка? или что-то я делаю не так&lt;br /&gt;&lt;br /&gt;в 4.1.2 все отрабатывало нормально</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
</feed>