← Zurück

4.1.3 Не удаляется собственное правило правило

При попытке удалить собственное правило получаю исключение:

System.InvalidOperationException не обработано пользовательским кодом Message=Правило не зарегистрировано в контейнере TS_RIU2@RTS_SPBFUT010Lt. Source=StockSharp.Algo StackTrace: в #=qB2ExCNEQw8oj77e3UN$lsGXd9IM$6dAY$FrsPtHePsc=.OnRemoving(IMarketRule #=ql0zRQV$KEbPTptc25u4ShA==) в Ecng.Collections.BaseCollection2.Remove(TItem item) в Ecng.Collections.SynchronizedCollection2.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.<PrepareStopOrder>b__23(Order o) в C:\Trade\TradeStrategy\TradeStrategy\TresureStrategy.cs:строка 872 в StockSharp.Algo.MarketRule2.#=qn2RvSblijBybYyyfWKcy1_hs9OJvieXgUlAwEKJ7QG4=() в StockSharp.Algo.MarketRuleHelper.#=qO_5nYqG02u$qDVGuIGBcPw==(IMarketRuleContainer #=q6WtW4HdAsVTLateaVJyxUg==, IMarketRule #=qXKycGTf2ej0HKdDUPJVrlQ==, Func1 #=qUHVCmgydNCLfZ5O8NP$PBg==) в StockSharp.Algo.Strategies.Strategy.#=qCypqGMSO_x8SPWJDIPw__UD8vJqmRZyixTy_v9o8CHprIFRlcm3cJQXa6UL4cY1T9Cm2VTpAHQA6L2x1piL2jw==(IMarketRule #=q3eSZx6_yVLksnYZxrbPPbA==, Func`1 #=qDQNtK0bpCquD2$1aKN0h3w==) InnerException:

Код приводящий к ошибке:


IMarketRule ChangeStopOrderRule = stopOrder.WhenIndicatorChanged(Indicator).Do(RePrepareOrder).Apply(this);
...
Rules.Remove(ChangeStopOrderRule); // Здесь получаю исключение

Код правила:

  public sealed class OrderChangeRule : MarketRule<Order, Order> {
    private readonly Func<Order, bool> _changed;
    private Order _order;
    private readonly BaseIndicator<decimal> _indicator;

    public OrderChangeRule(BaseIndicator<decimal> indicator, Order order, Func<Order, bool> changed) : base(order) {
      if (indicator == null)
        throw new ArgumentNullException("indicator");
      if (order == null)
        throw new ArgumentNullException("order");
      if (changed == null)
        throw new ArgumentNullException("changed");

      _indicator = indicator;
      _order = order;
      _changed = changed;
      _indicator.Changed += OnIndicatorChanged;
    }

    private void OnIndicatorChanged(IIndicatorValue v1, IIndicatorValue v2) {
      if (_changed != null && _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<Order, Order> WhenIndicatorChanged(this Order order, BaseIndicator<decimal> indicator, Func<Order, bool> changed = null) {
      if (indicator == null)
        throw new ArgumentNullException("indicator");
      if (order == null)
        throw new ArgumentNullException("order");

      return new OrderChangeRule(indicator, order, changed);
    }
}

Это ошибка? или что-то я делаю не так

в 4.1.2 все отрабатывало нормально

War dieses Thema hilfreich?

Thema teilen

Kommentare (6)

Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen

esper
esper

Эта тема, за последние несколько дней, поднималась пару раз минимум. Смотрим в поиске или документацию.

PavelAd
PavelAd Autor

Проблема возникает после вызова собственного метода ChangeOrder() для правила. Этот метод у меня вызывается при перевыставлении заявки по условию, для того чтобы изменить ссылку на заявку в правиле без пересоздания самого правила в целях экономии ресурсов и времени. Это перестало работать после введения токенов для правила. Что обидно 😭

Вопрос к разработчикам:

  1. Можно ли как-то поменять токен у ранее созданного правила?
  2. Если сейчас никак нельзя, возможно ли добавить поддержку подобного механизма в будущих версиях S#?
Mikhail Sukhov
Mikhail Sukhov

PavelAd: Это перестало работать после введения токенов для правила. Что обидно 😭

У меня выше написанный код работает. Думаю, не все условия приведены в коде. Плюс сам код не рабочий.

PavelAd
PavelAd Autor

Mikhail Sukhov: У меня выше написанный код работает. Думаю, не все условия приведены в коде. Плюс сам код не рабочий.

Привожу более точный код:


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); // Здесь получаю исключение
}

Стоп-заявка перевыставляется каждый раз с новой ценой когда меняется индикатор. В методе переподготовки RePrepareStopOrder вызывается ChangeStopOrderRule.ChangeOrder(newStopOrder) для замены заявки в правиле (чтобы следующий раз когда сработает правило передавалась уже новая заявка) Если после одного перевыставления стоп заявки вдруг сработал профит, то в методе ProfitOrderMatched при удалении правила и получаю вышеуказанное исключение. Как я предполагаю из-за того что в правиле токен продолжает смотреть на первоначальную стоп заявку.

Михаил подскажите, при удалении через Rules.Remove все равно используется токен?

Alexander
Alexander

PavelAd:

Mikhail Sukhov: У меня выше написанный код работает. Думаю, не все условия приведены в коде. Плюс сам код не рабочий.

Привожу более точный код:

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); // Здесь получаю исключение }

> 
> Стоп-заявка перевыставляется каждый раз с новой ценой когда меняется индикатор. В методе переподготовки RePrepareStopOrder
> вызывается ChangeStopOrderRule.ChangeOrder(newStopOrder) для замены заявки в правиле (чтобы следующий раз когда сработает правило передавалась уже новая заявка)
> Если после одного перевыставления стоп заявки вдруг сработал профит, то в методе ProfitOrderMatched при удалении правила и получаю вышеуказанное исключение.
> Как я предполагаю из-за того что в правиле токен продолжает смотреть на первоначальную стоп заявку.
> 
> Михаил подскажите, при удалении через Rules.Remove все равно используется токен?


[Ответ был дан выше](http://stocksharp.com/posts/m/20975/)
Остальные подробности - обращайтесь в ТП
PavelAd
PavelAd Autor

Alexander Mukhanchikov: Ответ был дан выше Остальные подробности - обращайтесь в ТП

🤨К сожалению я не получил ответа который бы помог разобраться в причине... Поэтому привел более подробное описание. Не видя как реализовано удаление правил, осталось только мое предположение - что проблема связана с введением токенов.

вопросы из предыдущих постов:

  1. Можно ли как-то поменять токен у ранее созданного правила?
  2. Если сейчас никак нельзя, возможно ли добавить поддержку подобного механизма в будущих версиях S#?

используется ли токен при удалении правила через Rules.Remove? тоже остались не отвеченными