При попытке удалить собственное правило получаю исключение:
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.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 все отрабатывало нормально
Kommentare (6)
Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen
Эта тема, за последние несколько дней, поднималась пару раз минимум. Смотрим в поиске или документацию.
Проблема возникает после вызова собственного метода ChangeOrder() для правила. Этот метод у меня вызывается при перевыставлении заявки по условию, для того чтобы изменить ссылку на заявку в правиле без пересоздания самого правила в целях экономии ресурсов и времени. Это перестало работать после введения токенов для правила. Что обидно 😭
Вопрос к разработчикам:
У меня выше написанный код работает. Думаю, не все условия приведены в коде. Плюс сам код не рабочий.
Привожу более точный код:
Стоп-заявка перевыставляется каждый раз с новой ценой когда меняется индикатор. В методе переподготовки RePrepareStopOrder вызывается ChangeStopOrderRule.ChangeOrder(newStopOrder) для замены заявки в правиле (чтобы следующий раз когда сработает правило передавалась уже новая заявка) Если после одного перевыставления стоп заявки вдруг сработал профит, то в методе ProfitOrderMatched при удалении правила и получаю вышеуказанное исключение. Как я предполагаю из-за того что в правиле токен продолжает смотреть на первоначальную стоп заявку.
Михаил подскажите, при удалении через Rules.Remove все равно используется токен?
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); // Здесь получаю исключение }
🤨К сожалению я не получил ответа который бы помог разобраться в причине... Поэтому привел более подробное описание. Не видя как реализовано удаление правил, осталось только мое предположение - что проблема связана с введением токенов.
вопросы из предыдущих постов: