Удаление правил, исключение

Удаление правил, исключение
Atom
7/26/2012
Дюшес


Есть следующий код:

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.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==)


Tags:


Thanks:


Дюшес

Avatar
Date: 7/26/2012
Reply


s# v.4.1.3

Thanks:

Pantov

Avatar
Date: 7/26/2012
Reply


Скорее всего при событии WhenMatched эти правила (2 первых) удаляются автоматически.

Thanks:

Alexander

Avatar
Date: 7/26/2012
Reply


У вас в коде бред написан. В Do вы пытаетесь удалить из Rules. Этого делать нельзя, что и приводит к исключению.

Thanks:

Дюшес

Avatar
Date: 7/26/2012
Reply


Да, но раньше работало. А как тогда удалять правила, которые уже не нужны. Я по приходу события о полном исполнении ордеров удаляю ненужные правила - соответственно canceled и failed. Иначе они ведь будут болтаться. Дай

Thanks:

Дюшес

Avatar
Date: 7/26/2012
Reply


Дайте тогда может пример какой поглядеть. И какая разница откуда их удалять? И собственно откуда их удалять можно?

Thanks:

Дюшес

Avatar
Date: 7/26/2012
Reply


В версии 4.1.2 оно еще работало.

Thanks:

Moadip

Avatar
Date: 7/26/2012
Reply


Дайте тогда может пример какой поглядеть.

Скопировано из справки.

Использование правил

У IMarketRuleесть Token - токен правила, с которым он ассоциирован. Например, для правила WhenCanceledтокеном будет являться заявка. Когда сработало правило успешной отмены заявки, то лучше удалить все остальные правила, связанные с этой заявкой:


var order = this.CreateOrder(direction, (decimal) Security.GetCurrentPrice(direction), Volume);

var ruleCanceled = order.WhenCanceled();

ruleCanceled
    .Do(() => 
            {
                this.AddInfoLog("Заявка успешно отменена");

                // удаление всех правил связанных с order
                Rules.RemoveRulesByToken(ruleCanceled, ruleCanceled.Token);
            })
    .Once()
    .Apply(this);

order
    .WhenRegistered()
    .Do(() => this.AddInfoLog("Заявка успешно зарегестрирована"))
    .Once()
    .Apply(this)

order
    .WhenRegisterFailed()
    .Do(() => this.AddInfoLog("Заявка не принята биржей"))
    .Once()
    .Apply(this)

order
    .WhenMatched()
    .Do(() => this.AddInfoLog("Заявка полностью исполнена"))
    .Once()
    .Apply(this);    

// регистрирация заявки
RegisterOrder(order);

Взаимоисключающие правила

Взаимоисключающие правила, это правила которые удаляются по активации одного из этих правил. Для этого вызвается метод MarketRuleHelper.Exclusive в который передается правило, которое будет удалено при активации данного правила. Например регистрируется два правила, на успешную и неуспешную регистрацию заявки, одно из них нужно удалить в случае активации другого:


var order = this.CreateOrder(direction, (decimal) Security.GetCurrentPrice(direction), Volume);

var ruleReg = order.WhenRegistered();
var ruleRegFailed = order.WhenRegisterFailed();

ruleReg
    .Do(() => this.AddInfoLog("Заявка успешно зарегестрирована"))
    .Once()
    .Apply(this)
    .Exclusive(ruleRegFailed);

ruleRegFailed
    .Do(() => this.AddInfoLog("Заявка не принята биржей"))
    .Once()
    .Apply(this)
    .Exclusive(ruleReg);

// регистрирация заявки
RegisterOrder(order);

Также взаимоисключающие правила можно создать через добавление в ExclusiveRules


var order = this.CreateOrder(direction, (decimal) Security.GetCurrentPrice(direction), Volume);

var ruleReg = order.WhenRegistered();
var ruleRegFailed = order.WhenRegisterFailed();

ruleReg.ExclusiveRules.Add(ruleRegFailed);
ruleRegFailed.ExclusiveRules.Add(ruleReg);

ruleReg
    .Do(() => this.AddInfoLog("Заявка успешно зарегестрирована"))
    .Once()
    .Apply(this);

ruleRegFailed
    .Do(() => this.AddInfoLog("Заявка не принята биржей"))
    .Once()
    .Apply(this);

// регистрирация заявки
RegisterOrder(order);

Thanks: Кот Матроскин Axell

Дюшес

Avatar
Date: 7/30/2012
Reply


Ну вот, другое дело. :) Спасибо большое за конструктивный ответ!

Thanks:

ra81

Avatar
Date: 8/1/2012
Reply


Alexander Mukhanchikov: У вас в коде бред написан. В Do вы пытаетесь удалить из Rules. Этого делать нельзя, что и приводит к исключению.

Раньше так работало однозначно я даже тесты делал подобного рода специально :).

Thanks:


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

loading
clippy