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); }
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); }