//撤销订单 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}"); }
//同步订单 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(); }
//发送订单 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}"); }
//生成子订单 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); } }
// internal void AddSubOrder(SubOrder o) { mSubOrders.Add(o); }