﻿<?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-06-20T12:22:05Z</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">Alexander Mukhanchikov: Ответ был дан выше Остальные подробности - обращайтесь в ТП [confused]К сожа...</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;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(21035)" rel="nofollow" target="_blank"&gt;Alexander Mukhanchikov&lt;/a&gt;:&lt;/strong&gt;
&lt;a href="http://stocksharp.com/posts/m/20975/"&gt;Ответ был дан выше&lt;/a&gt;
Остальные подробности - обращайтесь в ТП&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;[confused]К сожалению я не получил ответа который бы помог разобраться в причине...
Поэтому привел более подробное описание.
Не видя как реализовано удаление правил, осталось только мое предположение - что проблема связана с введением токенов.&lt;/p&gt;
&lt;p&gt;вопросы из предыдущих постов:&lt;/p&gt;
&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;Можно ли как-то поменять токен у ранее созданного правила?&lt;/li&gt;
&lt;li&gt;Если сейчас никак нельзя, возможно ли добавить поддержку подобного механизма в будущих версиях S#?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;используется ли токен при удалении правила через Rules.Remove?
тоже остались не отвеченными&lt;/p&gt;
&lt;/blockquote&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">PavelAd: Mikhail Sukhov: У меня выше написанный код работает. Думаю, не все условия приведены в коде...</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;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(20978)" rel="nofollow" target="_blank"&gt;PavelAd&lt;/a&gt;:&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(20977)" rel="nofollow" target="_blank"&gt;Mikhail Sukhov&lt;/a&gt;:&lt;/strong&gt;
У меня выше написанный код работает. Думаю, не все условия приведены в коде. Плюс сам код не рабочий.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Привожу более точный код:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;IMarketRule ChangeStopOrderRule;
Order StopOrder;&lt;/p&gt;
&lt;p&gt;// Здесь первоначально создаем стоп заявку и правило
public void PrepareStopOrder(OrderDirections direction) {
...
StopOrder = this.CreateOrder(direction, stopPrice, Volume);
ChangeStopOrderRule = StopOrder.WhenIndicatorChanged(Indicator).Do(RePrepareStopOrder).Apply(this);
RegisterOrder(StopOrder);
}&lt;/p&gt;
&lt;p&gt;// Здесь перевыставляем стоп заявку, когда изменился индикатор
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;
}&lt;/p&gt;
&lt;p&gt;// Вызывается при полном исполнении профит заявки
private void ProfitOrderMatched(Order profitOrder) {
// Когда исполнен профит, отменяем стоп заявку и удаляем правило
Trader.CancelOrder(StopOrder);
Rules.Remove(ChangeStopOrderRule); // Здесь получаю исключение
}&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt; 
&amp;gt; Стоп-заявка перевыставляется каждый раз с новой ценой когда меняется индикатор. В методе переподготовки RePrepareStopOrder
&amp;gt; вызывается ChangeStopOrderRule.ChangeOrder(newStopOrder) для замены заявки в правиле (чтобы следующий раз когда сработает правило передавалась уже новая заявка)
&amp;gt; Если после одного перевыставления стоп заявки вдруг сработал профит, то в методе ProfitOrderMatched при удалении правила и получаю вышеуказанное исключение.
&amp;gt; Как я предполагаю из-за того что в правиле токен продолжает смотреть на первоначальную стоп заявку.
&amp;gt; 
&amp;gt; Михаил подскажите, при удалении через Rules.Remove все равно используется токен?


[Ответ был дан выше](http://stocksharp.com/posts/m/20975/)
Остальные подробности - обращайтесь в ТП
&lt;/code&gt;&lt;/pre&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">Mikhail Sukhov: У меня выше написанный код работает. Думаю, не все условия приведены в коде. Плюс са...</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;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(20977)" rel="nofollow" target="_blank"&gt;Mikhail Sukhov&lt;/a&gt;:&lt;/strong&gt;
У меня выше написанный код работает. Думаю, не все условия приведены в коде. Плюс сам код не рабочий.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Привожу более точный код:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-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;/code&gt;&lt;/pre&gt;
&lt;p&gt;Стоп-заявка перевыставляется каждый раз с новой ценой когда меняется индикатор. В методе переподготовки RePrepareStopOrder
вызывается ChangeStopOrderRule.ChangeOrder(newStopOrder) для замены заявки в правиле (чтобы следующий раз когда сработает правило передавалась уже новая заявка)
Если после одного перевыставления стоп заявки вдруг сработал профит, то в методе ProfitOrderMatched при удалении правила и получаю вышеуказанное исключение.
Как я предполагаю из-за того что в правиле токен продолжает смотреть на первоначальную стоп заявку.&lt;/p&gt;
&lt;p&gt;Михаил подскажите, при удалении через Rules.Remove все равно используется токен?&lt;/p&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/20977/</id>
    <title type="text">PavelAd: Это перестало работать после введения токенов для правила. Что обидно [crying] У меня выше ...</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;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="@message(20976)" rel="nofollow" target="_blank"&gt;PavelAd&lt;/a&gt;:&lt;/strong&gt;
Это перестало работать после введения токенов для правила. Что обидно [crying]&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;У меня выше написанный код работает. Думаю, не все условия приведены в коде. Плюс сам код не рабочий.&lt;/p&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">&lt;p&gt;Проблема возникает после вызова собственного метода ChangeOrder() для правила.
Этот метод у меня вызывается при перевыставлении заявки по условию, для того чтобы изменить ссылку на заявку в правиле без пересоздания самого правила в целях экономии ресурсов и времени.
Это перестало работать после введения токенов для правила. Что обидно [crying]&lt;/p&gt;
&lt;p&gt;Вопрос к разработчикам:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Можно ли как-то поменять токен у ранее созданного правила?&lt;/li&gt;
&lt;li&gt;Если сейчас никак нельзя, возможно ли добавить поддержку подобного механизма в будущих версиях S#?&lt;/li&gt;
&lt;/ol&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;p&gt;Эта тема, за последние несколько дней, поднималась пару раз минимум. Смотрим в поиске или &lt;a href="http://stocksharp.com/doc/html/12ef8365-1bd1-426d-afc5-5eee33d554a6.htm"&gt;документацию&lt;/a&gt;.&lt;/p&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;p&gt;При попытке удалить собственное правило получаю исключение:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;System.InvalidOperationException не обработано пользовательским кодом
Message=Правило  не зарегистрировано в контейнере TS_RIU2@RTS_SPBFUT010Lt.
Source=StockSharp.Algo
StackTrace:
в #=qB2ExCNEQw8oj77e3UN$lsGXd9IM$6dAY$FrsPtHePsc=.OnRemoving(IMarketRule #=ql0zRQV$KEbPTptc25u4ShA==)
в Ecng.Collections.BaseCollection&lt;code&gt;2.Remove(TItem item) в Ecng.Collections.SynchronizedCollection&lt;/code&gt;2.Remove(TItem item)
в TradeStrategy.TresureStrategy.RemoveOrderRules(Order order) в C:\Trade\TradeStrategy\TradeStrategy\TresureStrategy.cs:строка 1630
в TradeStrategy.TresureStrategy.StopOrderOnSignalBarFound(Order stopOrder, Candle signalCandle) в C:\Trade\TradeStrategy\TradeStrategy\TresureStrategy.cs:строка 1116
в TradeStrategy.TresureStrategy.&amp;lt;PrepareStopOrder&amp;gt;b__23(Order o) в C:\Trade\TradeStrategy\TradeStrategy\TresureStrategy.cs:строка 872
в StockSharp.Algo.MarketRule&lt;code&gt;2.#=qn2RvSblijBybYyyfWKcy1_hs9OJvieXgUlAwEKJ7QG4=() в StockSharp.Algo.MarketRuleHelper.#=qO_5nYqG02u$qDVGuIGBcPw==(IMarketRuleContainer #=q6WtW4HdAsVTLateaVJyxUg==, IMarketRule #=qXKycGTf2ej0HKdDUPJVrlQ==, Func&lt;/code&gt;1 #=qUHVCmgydNCLfZ5O8NP$PBg==)
в StockSharp.Algo.Strategies.Strategy.#=qCypqGMSO_x8SPWJDIPw__UD8vJqmRZyixTy_v9o8CHprIFRlcm3cJQXa6UL4cY1T9Cm2VTpAHQA6L2x1piL2jw==(IMarketRule #=q3eSZx6_yVLksnYZxrbPPbA==, Func`1 #=qDQNtK0bpCquD2$1aKN0h3w==)
InnerException:&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Код приводящий к ошибке:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;
IMarketRule ChangeStopOrderRule = stopOrder.WhenIndicatorChanged(Indicator).Do(RePrepareOrder).Apply(this);
...
Rules.Remove(ChangeStopOrderRule); // Здесь получаю исключение

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Код правила:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-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;/code&gt;&lt;/pre&gt;
&lt;p&gt;Это ошибка? или что-то я делаю не так&lt;/p&gt;
&lt;p&gt;в 4.1.2 все отрабатывало нормально&lt;/p&gt;
</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
</feed>