Exemple #1
0
        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));
        }
Exemple #2
0
        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);
            }));
        }