public OrderInfo(IBOrder order, Instrument instrument = null, string orderState = null) { // При создании OrderInfo из IBApi.Order у нас нет информации // * о неисполненном объеме заявки. Есть надежда, что этот объем придет через orderState() // * о времени постановки заявки. Тут ничего не поделаешь, проставляем текущую дату/время Account = order.Account; OrderId = order.OrderId; Operation = IBUtils.ParseOrderOperation(order.Action); Price = (decimal)order.LmtPrice; OrderRef = order.OrderRef; Type = IBUtils.ParseOrderType(order.OrderType) ?? OrderType.Limit; PermId = order.PermId; Quantity = order.TotalQuantity; ActiveQuantity = order.TotalQuantity; DateTime = DateTime.Now; Instrument = instrument; State = IBUtils.ParseOrderState(orderState) ?? OrderState.Active; NewOrderTransactionId = Guid.NewGuid(); }
public override void orderStatus( int orderId, string status, int filled, int remaining, double avgFillPrice, int permId, int parentId, double lastFillPrice, int clientId, string whyHeld) { using (orderInfoContainerLock.Lock()) { OrderInfo orderInfo; if (!orderInfoContainer.TryGetByTickerId(orderId, out orderInfo) && !orderInfoContainer.TryGetByPermId(permId, out orderInfo)) { // Неизвестная заявка, ничего не поделаешь return; } var orderState = IBUtils.ParseOrderState(status) ?? orderInfo.State; // Если заявка снялась по запросу из OW, надо выплюнуть TransactionReply if (orderState == OrderState.Cancelled && orderInfo.KillOrderTransactionId != null && !orderInfo.KillOrderTransactionReplySent) { connector.IBOrderRouter.Transmit(new TransactionReply { TransactionId = orderInfo.KillOrderTransactionId.Value, Success = true }); orderInfo.KillOrderTransactionReplySent = true; } // Вычисляем OSCM var message = new OrderStateChangeMessage { ActiveQuantity = (uint)remaining, ChangeTime = DateTime.Now, FilledQuantity = (uint)filled, OrderExchangeId = permId.ToString(CultureInfo.InvariantCulture), Quantity = (uint?)(filled + remaining), TransactionId = orderInfo.NewOrderTransactionId, State = orderState }; if (!double.IsNaN(lastFillPrice) && Math.Abs(lastFillPrice) > double.Epsilon) { message.Price = (decimal?)lastFillPrice; } if (message.State != null) { orderInfo.State = message.State.Value; } if (message.ActiveQuantity != null) { orderInfo.ActiveQuantity = (int)message.ActiveQuantity.Value; } // Выплевываем OSCM connector.IBOrderRouter.Transmit(message); // Пробуем отправить ожидающие филы orderInfoContainer.ProcessPendingFills(orderInfo); } }