Здравствуйте.
Я использую MQS для открытия позиции, как дочернюю стратегию. В процессе работы котирования произошла ошибка, и котирование осталось висеть дочерней стратегией. Но при этом, перед ошибкой, позиция по инструменту была открыта. Мне надо сделать так, чтобы дочерняя MQS закончилась и самоудалилась из базовой стратегии, даже при ошибке. В данном же случае MQS переходит в ProcessState == Stopping и висит в родительской стратегии. Мне же нужно удалять дочерние стратегии после совершения сделок, или после ошибок. То есть - если стратегия отработала или ошиблась, то она должна удалиться.
Как это сделать самым лучшим способом? Под "лучшим способом" я понимаю в порядке убывания лучшести:
1. При создании стратегии выставить какое-нибудь свойство, которое указывает стратегии убиться в любом нештатном случае
2. Написать обработчик Error, в котором прибивать стратегию самостоятельно. (И что там примерно писать?).
3. Следить за дочерней стратегией из базовой, и выпиливать дочернюю, если что не так.
Лог утерян. В общем же, там было следующее:
1. Стратегия отправила ордер, тот зарегистрировался.
2. Изменился стакан или что-то еще произошло, и стратегия начала перерегистрацию ордера
3. В процессе перерегистрации заявка исполнилась.
4. Новый ордер ушел на биржу
5. ФОРТС ответил "нехватка по лимитам"
6. MQS вывалила в лог исключение (сообщение с ФОРТС) и осталась висеть в состоянии Stopping
Код:
Code
protected void EnterLong()
{
// дожидаемся завершения стратегий
if(base.ChildStrategies.Count != 0)
{
this.AddWarningLog("EnterLong - отказ, есть активные стратегии!");
return;
}
// Проверяем время
if(m_TTM.State(DateTime.Now) != TradeState.Opened)
{
this.AddWarningLog("EnterLong - отказ, неторговое время");
return;
}
decimal LongVolume = base.Volume - base.Position;
this.AddInfoLog("Входим в лонг, макс. объем {0}", LongVolume);
if(LongVolume < 1)
{
this.AddWarningLog("EnterLong - отказ, неправильный объем {0}. Вычислено {1} - {2}", LongVolume, base.Volume, base.Position);
return;
}
m_PositionEnter = base.Security.LastTrade.Price;
MarketQuotingStrategy buyer = new MarketQuotingStrategy(OrderDirections.Buy, Math.Min(LongVolume, m_Depth.BestAsk.Volume))
{
PriceType = MarketPriceTypes.Opposite/*,
MaxErrorCount = 3,
MaxReRegisterCount = 10,
MaxRegisterFailCount = 3*/
};
base.ChildStrategies.Add(buyer);
}