Ejemplo n.º 1
0
        //撤销订单
        private void cancelOrder(SubOrder subOrder)
        {
            //
            if (subOrder.OrderID.Equals(string.Empty))
            {
                LogUtils.EnginLog($"撤单错误|未找到订单编号:{subOrder.InstrumentID}|{subOrder.Direction}|{subOrder.Offset}|{subOrder.LimitPrice}|{subOrder.Volume}|{subOrder.CustomID}");
                return;
            }
            //
            if (subOrder.Status == OrderStatus.Canceled ||
                subOrder.Status == OrderStatus.Error ||
                subOrder.Status == OrderStatus.Filled)
            {
                return;
            }
            //
            int rtn;

            rtn = mTrader.ReqOrderAction(subOrder.OrderID);

            //这种情况多是盘后未撤订单,按撤单处理
            if (rtn == -1)
            {
                subOrder.Status     = OrderStatus.Canceled;
                subOrder.VolumeLeft = 0;
                activeOrders.Remove(subOrder);
                subOrder.Refresh();
            }

            LogUtils.EnginLog($"撤单:{rtn}|{subOrder.InstrumentID}|{subOrder.Direction}|{subOrder.Offset}|{subOrder.LimitPrice}|{subOrder.Volume}|{subOrder.CustomID}|{subOrder.OrderID}");
        }
Ejemplo n.º 2
0
        //同步订单
        private void syncOrder(OrderField o, SubOrder s)
        {
            //更新编号
            s.OrderID = o.OrderID;
            //只有正常和部成,才响应订单事件
            if (s.Status == OrderStatus.Normal || s.Status == OrderStatus.Partial)
            {
                switch (o.Status)
                {
                case HaiFeng.OrderStatus.Canceled:
                    s.VolumeLeft = 0;
                    s.Status     = OrderStatus.Canceled;
                    activeOrders.Remove(s);
                    break;

                case HaiFeng.OrderStatus.Filled:
                    s.VolumeLeft   = 0;
                    s.Status       = OrderStatus.Filled;
                    s.VolumeTraded = s.Volume;
                    activeOrders.Remove(s);
                    break;

                case HaiFeng.OrderStatus.Error:
                    s.VolumeLeft = 0;
                    s.Status     = OrderStatus.Error;
                    activeOrders.Remove(s);
                    break;

                case HaiFeng.OrderStatus.Partial:
                    s.VolumeLeft   = o.VolumeLeft;
                    s.VolumeTraded = s.Volume - s.VolumeLeft;
                    s.Status       = OrderStatus.Partial;
                    break;
                }
            }
            s.Refresh();
        }
Ejemplo n.º 3
0
        //发送订单
        private void SendOrder(SubOrder subOrder)
        {
            //自增编码
            subOrder.CustomID = customID++;
            orderMap.Add(subOrder.CustomID, subOrder);
            activeOrders.Add(subOrder);

            //转换
            HaiFeng.DirectionType direction = subOrder.Direction == DirectionType.Buy ? HaiFeng.DirectionType.Buy : HaiFeng.DirectionType.Sell;
            HaiFeng.OffsetType    offset    = HaiFeng.OffsetType.Open;
            switch (subOrder.Offset)
            {
            case OffsetType.Open:
                offset = HaiFeng.OffsetType.Open;
                break;

            case OffsetType.Close:
                offset = HaiFeng.OffsetType.Close;
                break;

            case OffsetType.CloseToday:
                offset = HaiFeng.OffsetType.CloseToday;
                break;
            }

            //报单
            int rtn = mTrader.ReqOrderInsert(pInstrument: subOrder.InstrumentID,
                                             pDirection: direction,
                                             pOffset: offset,
                                             pPrice: subOrder.LimitPrice,
                                             pVolume: subOrder.Volume,
                                             pCustom: subOrder.CustomID,
                                             pType: OrderType.Limit,
                                             pHedge: HedgeType.Speculation);

            LogUtils.EnginLog($"发单:{rtn}\t{subOrder.CustomID}\t{subOrder.InstrumentID}\t{subOrder.Direction}\t{subOrder.Offset}\t{subOrder.LimitPrice}\t{subOrder.Volume}");
        }
Ejemplo n.º 4
0
        //生成子订单
        private void createSubOrder(Order order)
        {
            PositionField position;

            if (mTrader.DicPositionField.TryGetValue(order.InstrumentID + "_" + (order.Direction == DirectionType.Buy ? "Sell" : "Buy"), out position))
            {
                //计算冻结数量
                int frozenTd = 0;
                int frozenYd = 0;

                foreach (SubOrder subOrder in activeOrders)
                {
                    if (order.Direction == subOrder.Direction)
                    {
                        frozenTd += subOrder.Offset == OffsetType.CloseToday ? subOrder.VolumeLeft : 0;
                        frozenYd += subOrder.Offset == OffsetType.Close ? subOrder.VolumeLeft : 0;
                    }
                }

                //剩余数量
                int volLeft = order.Volume;

                //先平今
                if (volLeft <= 0)
                {
                    return;
                }
                int posLeft = position.TdPosition > frozenTd ? position.TdPosition - frozenTd : 0;
                int vol     = posLeft > volLeft ? volLeft : posLeft;
                volLeft -= vol;
                if (vol > 0)
                {
                    SubOrder subOrder = new SubOrder(pOrder: order,
                                                     instrumentID: order.InstrumentID,
                                                     direction: order.Direction,
                                                     offset: OffsetType.CloseToday,
                                                     limitPrice: order.Price,
                                                     insertTime: DateTime.Now,
                                                     volume: vol,
                                                     volumeLeft: vol,
                                                     status: OrderStatus.Normal);

                    order.AddSubOrder(subOrder);
                }

                //后平仓
                if (volLeft <= 0)
                {
                    return;
                }
                posLeft  = position.YdPosition > frozenYd ? position.YdPosition - frozenYd : 0;
                vol      = posLeft > volLeft ? volLeft : posLeft;
                volLeft -= vol;
                if (vol > 0)
                {
                    SubOrder subOrder = new SubOrder(pOrder: order,
                                                     instrumentID: order.InstrumentID,
                                                     direction: order.Direction,
                                                     offset: OffsetType.Close,
                                                     limitPrice: order.Price,
                                                     insertTime: DateTime.Now,
                                                     volume: vol,
                                                     volumeLeft: vol,
                                                     status: OrderStatus.Normal);

                    order.AddSubOrder(subOrder);
                }

                //再开仓
                if (volLeft <= 0)
                {
                    return;
                }
                vol = volLeft;
                if (vol > 0)
                {
                    SubOrder subOrder = new SubOrder(pOrder: order,
                                                     instrumentID: order.InstrumentID,
                                                     direction: order.Direction,
                                                     offset: OffsetType.Open,
                                                     limitPrice: order.Price,
                                                     insertTime: DateTime.Now,
                                                     volume: vol,
                                                     volumeLeft: vol,
                                                     status: OrderStatus.Normal);

                    order.AddSubOrder(subOrder);
                }
            }
            else
            {
                SubOrder subOrder = new SubOrder(pOrder: order,
                                                 instrumentID: order.InstrumentID,
                                                 direction: order.Direction,
                                                 offset: OffsetType.Open,
                                                 limitPrice: order.Price,
                                                 insertTime: DateTime.Now,
                                                 volume: order.Volume,
                                                 volumeLeft: order.Volume,
                                                 status: OrderStatus.Normal);

                order.AddSubOrder(subOrder);
            }
        }
Ejemplo n.º 5
0
 //
 internal void AddSubOrder(SubOrder o)
 {
     mSubOrders.Add(o);
 }