Beispiel #1
0
            public OrderChangeInfo ApplyChanges(ExecutionMessage message, bool isCancel)
            {
                var order = Order;

                OrderChangeInfo retVal;

                if (order.State == OrderStates.Done)
                {
                    // данные о заявке могут приходить из маркет-дата и транзакционного адаптеров
                    retVal         = OrderChangeInfo.Create(order, _raiseNewOrder, false);
                    _raiseNewOrder = false;
                    return(retVal);
                    //throw new InvalidOperationException("Изменение заявки в состоянии Done невозможно.");
                }
                else if (order.State == OrderStates.Failed)
                {
                    // some adapters can resend order's info

                    //throw new InvalidOperationException();
                    return(null);
                }

                var isPending = order.State == OrderStates.Pending;

                if (message.OrderId != null)
                {
                    order.Id = message.OrderId.Value;
                }

                if (!message.OrderStringId.IsEmpty())
                {
                    order.StringId = message.OrderStringId;
                }

                if (!message.OrderBoardId.IsEmpty())
                {
                    order.BoardId = message.OrderBoardId;
                }

                //// некоторые коннекторы не транслируют при отмене отмененный объем
                //// esper. при перерегистрации заявок необходимо обновлять баланс
                //if (message.Balance > 0 || !isCancelled || isReRegisterCancelled)
                //{
                //	// BTCE коннектор не транслирует баланс заявки
                //	if (!(message.OrderState == OrderStates.Active && message.Balance == 0))
                //		order.Balance = message.Balance;
                //}

                if (message.Balance != null)
                {
                    order.Balance = message.Balance.Value;
                }

                // IB коннектор не транслирует состояние заявки в одном из своих сообщений
                if (message.OrderState != null)
                {
                    order.State = order.State.CheckModification(message.OrderState.Value);
                }

                if (order.Time == DateTimeOffset.MinValue)
                {
                    order.Time = message.ServerTime;
                }

                // для новых заявок используем серверное время,
                // т.к. заявка получена первый раз и не менялась
                // ServerTime для заявки - это время регистрации
                order.LastChangeTime = _raiseNewOrder ? message.ServerTime : message.LocalTime;
                order.LocalTime      = message.LocalTime;

                //нулевой объем может быть при перерегистрации
                if (order.Volume == 0 && message.OrderVolume != null)
                {
                    order.Volume = message.OrderVolume.Value;
                }

                if (message.Commission != null)
                {
                    order.Commission = message.Commission;
                }

                if (!message.CommissionCurrency.IsEmpty())
                {
                    order.CommissionCurrency = message.CommissionCurrency;
                }

                if (message.TimeInForce != null)
                {
                    order.TimeInForce = message.TimeInForce.Value;
                }

                if (message.Latency != null)
                {
                    if (isCancel)
                    {
                        order.LatencyCancellation = message.Latency.Value;
                    }
                    else if (isPending)
                    {
                        if (order.State != OrderStates.Pending)
                        {
                            order.LatencyRegistration = message.Latency.Value;
                        }
                    }
                }

                if (message.AveragePrice != null)
                {
                    order.AveragePrice = message.AveragePrice;
                }

                if (message.Yield != null)
                {
                    order.Yield = message.Yield;
                }

                message.CopyExtensionInfo(order);

                retVal         = OrderChangeInfo.Create(order, _raiseNewOrder, true);
                _raiseNewOrder = false;
                return(retVal);
            }
Beispiel #2
0
            public OrderChangeInfo ApplyChanges(ExecutionMessage message, bool isCancel)
            {
                var order = Order;

                OrderChangeInfo retVal;

                if (order.State == OrderStates.Done)
                {
                    // данные о заявке могут приходить из маркет-дата и транзакционного адаптеров
                    retVal         = OrderChangeInfo.Create(order, _raiseNewOrder, false);
                    _raiseNewOrder = false;
                    return(retVal);
                    //throw new InvalidOperationException("Изменение заявки в состоянии Done невозможно.");
                }
                else if (order.State == OrderStates.Failed)
                {
                    // some adapters can resend order's info

                    //throw new InvalidOperationException();
                    return(null);
                }

                var isPending = order.State == OrderStates.Pending;

                if (message.OrderId != null)
                {
                    order.Id = message.OrderId.Value;
                }

                if (!message.OrderStringId.IsEmpty())
                {
                    order.StringId = message.OrderStringId;
                }

                if (!message.OrderBoardId.IsEmpty())
                {
                    order.BoardId = message.OrderBoardId;
                }

                if (message.Balance != null)
                {
                    if (order.Balance < message.Balance.Value)
                    {
                        _parent._logReceiver.AddErrorLog($"Order {order.TransactionId}: bal_old {order.Balance} -> bal_new {message.Balance.Value}");
                    }

                    order.Balance = message.Balance.Value;
                }

                if (message.OrderState != null)
                {
                    order.State = order.State.CheckModification(message.OrderState.Value);
                }

                if (order.Time == DateTimeOffset.MinValue)
                {
                    order.Time = message.ServerTime;
                }

                // для новых заявок используем серверное время,
                // т.к. заявка получена первый раз и не менялась
                // ServerTime для заявки - это время регистрации
                order.LastChangeTime = _raiseNewOrder ? message.ServerTime : message.LocalTime;
                order.LocalTime      = message.LocalTime;

                //нулевой объем может быть при перерегистрации
                if (order.Volume == 0 && message.OrderVolume != null)
                {
                    order.Volume = message.OrderVolume.Value;
                }

                if (message.Commission != null)
                {
                    order.Commission = message.Commission;
                }

                if (!message.CommissionCurrency.IsEmpty())
                {
                    order.CommissionCurrency = message.CommissionCurrency;
                }

                if (message.TimeInForce != null)
                {
                    order.TimeInForce = message.TimeInForce.Value;
                }

                if (message.Latency != null)
                {
                    if (isCancel)
                    {
                        order.LatencyCancellation = message.Latency.Value;
                    }
                    else if (isPending)
                    {
                        if (order.State != OrderStates.Pending)
                        {
                            order.LatencyRegistration = message.Latency.Value;
                        }
                    }
                }

                if (message.AveragePrice != null)
                {
                    order.AveragePrice = message.AveragePrice;
                }

                if (message.Yield != null)
                {
                    order.Yield = message.Yield;
                }

                message.CopyExtensionInfo(order);

                retVal         = OrderChangeInfo.Create(order, _raiseNewOrder, true);
                _raiseNewOrder = false;
                return(retVal);
            }