public Tuple <OrderFail, bool> ProcessOrderFailMessage(Security security, ExecutionMessage message) { if (security == null) { throw new ArgumentNullException("security"); } if (message == null) { throw new ArgumentNullException("message"); } var data = _cache.GetData(security); Order order = null; if (!message.OrderStringId.IsEmpty()) { order = data.OrdersByStringId.TryGetValue(message.OrderStringId); } bool isCancelled; if (order == null) { if (message.OriginalTransactionId == 0) { throw new ArgumentOutOfRangeException("message", message.OriginalTransactionId, LocalizedStrings.Str715); } var orders = data.Orders; order = (Order)orders.TryGetValue(CreateOrderKey(message.OrderType, message.OriginalTransactionId, true)); if (order != null && order.Id == message.OrderId) { isCancelled = true; } else { order = (Order)orders.TryGetValue(CreateOrderKey(message.OrderType, message.OriginalTransactionId, false)); isCancelled = false; } if (order == null) { return(null); } } else { var pair = data.Orders.LastOrDefault(p => p.Value.Order == order); isCancelled = pair.Key.Item3; } // ServerTime для заявки - это время регистрации order.LastChangeTime = message.LocalTime; order.LocalTime = message.LocalTime; if (message.OrderStatus != null) { order.Status = message.OrderStatus; } //для ошибок снятия не надо менять состояние заявки if (!isCancelled) { order.State = OrderStates.Failed; } if (message.Commission != null) { order.Commission = message.Commission; } message.CopyExtensionInfo(order); var error = message.Error ?? new InvalidOperationException( isCancelled ? LocalizedStrings.Str716 : LocalizedStrings.Str717); var fail = EntityFactory.CreateOrderFail(order, error); fail.ServerTime = message.ServerTime; fail.LocalTime = message.LocalTime; return(Tuple.Create(fail, isCancelled)); }
public IEnumerable <Tuple <OrderFail, bool> > ProcessOrderFailMessage(Order order, Security security, ExecutionMessage message) { if (security == null) { throw new ArgumentNullException(nameof(security)); } if (message == null) { throw new ArgumentNullException(nameof(message)); } var data = GetData(security); var orders = new List <Tuple <Order, bool> >(); if (message.OriginalTransactionId == 0) { throw new ArgumentOutOfRangeException(nameof(message), message.OriginalTransactionId, LocalizedStrings.Str715); } var orderType = message.OrderType; if (order == null) { var cancelledOrder = data.Orders.TryGetValue(CreateOrderKey(orderType, message.OriginalTransactionId, true))?.Order; if (cancelledOrder == null && orderType == null) { cancelledOrder = data.Orders.TryGetValue(CreateOrderKey(OrderTypes.Conditional, message.OriginalTransactionId, true))?.Order; if (cancelledOrder != null) { orderType = OrderTypes.Conditional; } } if (cancelledOrder != null /*&& order.Id == message.OrderId*/) { orders.Add(Tuple.Create(cancelledOrder, true)); } var registeredOrder = data.Orders.TryGetValue(CreateOrderKey(orderType, message.OriginalTransactionId, false))?.Order; if (registeredOrder == null && orderType == null) { registeredOrder = data.Orders.TryGetValue(CreateOrderKey(OrderTypes.Conditional, message.OriginalTransactionId, false))?.Order; } if (registeredOrder != null) { orders.Add(Tuple.Create(registeredOrder, false)); } if (cancelledOrder == null && registeredOrder == null) { if (!message.OrderStringId.IsEmpty()) { order = data.OrdersByStringId.TryGetValue(message.OrderStringId); if (order != null) { var pair = data.Orders.LastOrDefault(p => p.Value.Order == order); if (pair.Key != null) { orders.Add(Tuple.Create(pair.Value.Order, pair.Key.Item3)); } } } } } else { if (data.Orders.ContainsKey(CreateOrderKey(order.Type, message.OriginalTransactionId, true))) { orders.Add(Tuple.Create(order, true)); } var registeredOrder = data.Orders.TryGetValue(CreateOrderKey(order.Type, message.OriginalTransactionId, false))?.Order; if (registeredOrder != null) { orders.Add(Tuple.Create(registeredOrder, false)); } } if (orders.Count == 0) { return(Enumerable.Empty <Tuple <OrderFail, bool> >()); } return(orders.Select(t => { var o = t.Item1; var isCancelTransaction = t.Item2; o.LastChangeTime = message.ServerTime; o.LocalTime = message.LocalTime; if (message.OrderStatus != null) { o.Status = message.OrderStatus; } //для ошибок снятия не надо менять состояние заявки if (!isCancelTransaction) { o.State = o.State.CheckModification(OrderStates.Failed); } if (message.Commission != null) { o.Commission = message.Commission; } message.CopyExtensionInfo(o); var error = message.Error ?? new InvalidOperationException(isCancelTransaction ? LocalizedStrings.Str716 : LocalizedStrings.Str717); var fail = EntityFactory.CreateOrderFail(o, error); fail.ServerTime = message.ServerTime; fail.LocalTime = message.LocalTime; return Tuple.Create(fail, isCancelTransaction); })); }