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

4.1.3 Не удаляется собственное правило правило
Atom
8/23/2012
PavelAd


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

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 все отрабатывало нормально


Tags:


Thanks:


esper

Avatar
Date: 8/23/2012
Reply


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

Thanks:

PavelAd

Avatar
Date: 8/23/2012
Reply


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

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

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

Mikhail Sukhov

Avatar
Date: 8/23/2012
Reply


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

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

Thanks:

PavelAd

Avatar
Date: 8/23/2012
Reply


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 все равно используется токен?

Thanks:

Alexander

Avatar
Date: 8/26/2012
Reply


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/)
Остальные подробности - обращайтесь в ТП
Thanks:

PavelAd

Avatar
Date: 8/27/2012
Reply


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

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

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

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

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

Thanks:


Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy