Событие OrderChanged + MyTrades
Добрый день!
Версия 3.1.8
Trader.IsAsyncMode = false;
Обнаружил непонятную ситуацию в работе события OrderChanged для Strategy, суть следующая:
В моей зааче необходимо приявязать алгоритм стратегии к цене последней сделки по заявке. Например. объем заявки 100 контрактов, при срабатывании заявки в таблице Мои сделки появлется несколько сделок с объемом 25, 25 и 50, вот мне необходимо привязаться к цене последней сделки (50). Для решения задачи я добавил обработчик события OrderChanged в стратегию и в нем проверяю статус заявки...- Когда он равен OrderStates.Done, пытаюсь получить последнюю сделку по зявке, но ничего не получается т.к.:
1) Когда в OrderChanged заявка становится Done, в коллекции Strategy.MyTrades или Trader.MyTrades последней сделки по зявке может еще не быть, более того вообще сделок может не быть по этой заявке. Т.е. если в этот момент просуммировать объем контрактов по сделкам, то он не равен объему заявки.
2) Событие OrderChanged может возникать несколько раз, для заявки со статусом Done
Код для теcта следующий:
private void OptionCorrection_OrderChanged(Ecng.Trading.BusinessEntities.Order Order)
{
Boolean _orderIsDone = Order.State == Ecng.Trading.BusinessEntities.OrderStates.Done;
if (_orderIsDone)
{
var _my_trade = GetLastDoneTrade("Отрисовка", Order);
}
}
public Ecng.Trading.BusinessEntities.MyTrade GetLastDoneTrade(String Sender_method, Ecng.Trading.BusinessEntities.Order Order)
{
DateTime _start_time = DateTime.Now;
String _method_msg_view = "---[GetLastDoneTrade] вызов из <" + Sender_method + "> Заявка " + Order.ToView() + "-->";
IEnumerable<Ecng.Trading.BusinessEntities.MyTrade> _order_trades = null;
int _counter = 0;
while (_counter < 1000)
{
_counter++;
_order_trades = Trader.MyTrades.Where(t => t.Order.Id == Order.Id);
int _volume = _order_trades.Sum(o => o.Trade.Volume);
if (_volume == Order.Volume)
{
//Все ОК, Сумма МОИХ сделок равна объему заявки
break;
}
else
{
System.Threading.Thread.Sleep(100);
}
QuickExhanger.Сообщить(_method_msg_view + "попытка № <" + _counter.ToString()
+ "> --> Не было всех Моих сделок, когда заявка уже исполнилась",Globals.СтатусСообщения.Важное);
}
if (_order_trades != null && _order_trades.Count() > 0)
{
long _last_trade_ID = (long)_order_trades.Max(t => t.Trade.Id);
this.QuickExhanger.Сообщить(_method_msg_view + "время исполнения метода " + (DateTime.Now - _start_time).TotalMilliseconds.ToString() + " мс");
return _order_trades.Where(m => m.Trade.Id == _last_trade_ID).FirstOrDefault();
}
else
{
this.QuickExhanger.Сообщить(_method_msg_view + " не смогли определить последнюю сделку по заявке", Globals.СтатусСообщения.Важное);
this.QuickExhanger.Сообщить(_method_msg_view + "время исполнения метода " + (DateTime.Now - _start_time).TotalMilliseconds.ToString() + " мс");
return Trader.MyTrades.Where(t => t.Order.Id == Order.Id).LastOrDefault();
}
}
Вопросы следующие:
1) Является ли нормальной ситуацией. что OrderChanged может срабатывать еще несколько раз, после того как заявка становится Done, или это является ошибкой? Если ошибкой, то можно ли рассчитывать, что она будет устранена в будущих обновлениях S#
2) Является ли ошибкой, что при изменении статуса заявки на Done в событии OrderChanged, всех сделок по заявке в коллекции MyTrdes для Strategy или Trader может не быть? Если это ошибка, можно ли рассчитывать, что она будет устранена в будущих обновлениях S#
Заранее благодарю за ответ!