Есть следующий код:
order .WhenCanceled() .Do(o => ) .Once() .Apply(this);
order .WhenRegisterFailed() .Do(fail => ) .Once() .Apply(this);
order .WhenMatched() .Do(o => { Rules.Remove(order.WhenRegisterFailed()); Тут выдается исключение Rules.Remove(order.WhenCanceled()); }) .Once() .Apply(this);
Выдается исключение при попытке удалить правило (на самом деле любых правил) Rules.Remove(order.WhenRegisterFailed()):
System.InvalidOperationException: Операция является недопустимой из-за текущего состояния объекта.
в #=qa_4zGoLcsro_feFbb0XM96ZE7LOy5hveNYH9wnxFE2w=.OnRemoving(IMarketRule #=qju3lJ7K286dxREWSpw8cmg==)
в Ecng.Collections.BaseCollection2.Remove(TItem item) в Ecng.Collections.SynchronizedCollection2.Remove(TItem item)
в StockSharp.Algo.Strategies.DeltaHedgeStrategy.<>c__DisplayClassc.<ReHedge>b__8(Order o) в D:\work\PROG\Projects\StockSharp 4.1.3\Strategies\VolatilityTradingStrategy\DeltaHedgeStrategy.cs:строка 202
в StockSharp.Algo.MarketRule2.#=q6_Dj$NpGFM71HHUqmQhQ0G5RZlYBsJ6Wee9kQg_qgVo=() в StockSharp.Algo.MarketRuleHelper.#=qw7TgNQ_P_7uPcYTNTLttHg==(IMarketRuleContainer #=qTNAYzkNQSqZjn9BvAkH9cA==, IMarketRule #=quLfxru5uzbPCCVRiCLmC0g==, Func1 #=q8YGWbkMa6AIbIV3KFFO5Xw==)
в StockSharp.Algo.Strategies.Strategy.#=q47pcTs$vhqCk7bcqb_pv_886glmmzTC1_raPs3xepsw5km_KDfufw3zJMTnb0$eVObikcyITlFlAUYx_AKAK_A==(IMarketRule #=qTJ4HwZuqQOv0fT2qFqxPLg==, Func`1 #=q8pW741NtpT_BaJV1HedsHw==)
Комментарии (9)
Вход или Создать аккаунт, Войдите или зарегистрируйтесь, чтобы оставить комментарий
s# v.4.1.3
Скорее всего при событии WhenMatched эти правила (2 первых) удаляются автоматически.
У вас в коде бред написан. В Do вы пытаетесь удалить из Rules. Этого делать нельзя, что и приводит к исключению.
Раньше так работало однозначно я даже тесты делал подобного рода специально :).
Да, но раньше работало. А как тогда удалять правила, которые уже не нужны. Я по приходу события о полном исполнении ордеров удаляю ненужные правила - соответственно canceled и failed. Иначе они ведь будут болтаться. Дай
Дайте тогда может пример какой поглядеть. И какая разница откуда их удалять? И собственно откуда их удалять можно?
В версии 4.1.2 оно еще работало.
Скопировано из справки.
Использование правил
У IMarketRuleесть Token - токен правила, с которым он ассоциирован. Например, для правила WhenCanceledтокеном будет являться заявка. Когда сработало правило успешной отмены заявки, то лучше удалить все остальные правила, связанные с этой заявкой:
Взаимоисключающие правила
Взаимоисключающие правила, это правила которые удаляются по активации одного из этих правил. Для этого вызвается метод MarketRuleHelper.Exclusive в который передается правило, которое будет удалено при активации данного правила. Например регистрируется два правила, на успешную и неуспешную регистрацию заявки, одно из них нужно удалить в случае активации другого:
Также взаимоисключающие правила можно создать через добавление в ExclusiveRules
Ну вот, другое дело. :) Спасибо большое за конструктивный ответ!