Все относится к релизу 4.0.22, вполне вероятно что и дальше тоже.
Путем изысканий пришел к выводу такому:
У меня есть стратегия, которая перед тем как совсем остановиться, пытается отменить все свои ордера активные. Проверка происходит в методе
Code
public override void Stop()
{
if (this.HaveActiveStopOrders())
{
this.AddInfoLog("Стратегия имеет активные ордера, пробуем отменить их.");
this.GuarantyCancelOrders(new [] {_stopOrder});
this
.When(_stopOrder.Canceled())
.Do(o =>
{
this.AddInfoLog("Активные ордера отменены, останавливаем стратегию.");
Stop();
});
return;
}
base.Stop();
}
GuarantyCancelOrders использует стратегию для отмены ордеров. По факту при выполнении сего метода в нашу стратегию подключается дочерняя стартегия, которая отменяет ордера достаточно надежно. Что именно происходит НЕ так? Вот пример другого кода, только уже в методе OnStopping
Code
public override void OnStopping()
{
if (this.HaveActiveStopOrders())
{
this.AddInfoLog("Стратегия имеет активные ордера, пробуем отменить их.");
this.GuarantyCancelOrders(new [] {_stopOrder});
this
.When(_stopOrder.Canceled())
.Do(o =>
{
this.AddInfoLog("Активные ордера отменены, останавливаем стратегию.");
Stop();
});
return;
}
base.OnStopping();
}
Этот код приведет к тому что для дочерних стратегий из метода GuarantyCancelOrders будет вызван только метод OnStopping без вызова метода OnStarting. Ну а если вы при запуске делаете инициализацию чего либо, то легко можете получить исключение если работаете с этими объектами в завершающих методах. Это связано я полагаю с тем что в дочернюю стратегию передается статус родительской. А в родительской будет Stopping. Отсюда стартовый метод не выполняется, НО вот завершающий метод почему-то выполняется. Что мне кажется не совсем правильно. Если стратегия собственно еще и не была запущена, то с какого лешего выполнять метод OnStopping??? Ну вот как-то так :). По идее если стратегия добавляемая как дочерняя в статусе Stopped, то статус может измениться только на Starting или в этом духе. Есь даж паттерн такой :).
Надеюсь понятно изложил. А то кажется слегка запутанно.