示例#1
0
        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();
        }
示例#2
0
        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);
            }
        }