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


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

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

Теги:


Спасибо:




6 Ответов
esper

Фотография
Программист
Дата: 23.08.2012
Ответить


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

PavelAd

Фотография
Дата: 23.08.2012
Ответить


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

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


Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 23.08.2012
Ответить


PavelAd Перейти

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


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

PavelAd

Фотография
Дата: 23.08.2012
Ответить


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

Фотография
Дата: 26.08.2012
Ответить


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



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

PavelAd

Фотография
Дата: 27.08.2012
Ответить


Alexander Mukhanchikov Перейти

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


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

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

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

тоже остались не отвеченными
Автор топика
Спасибо:


Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy