OnOrder 中 order结构体中 ord.combOffset 开平标志有哪些枚举值?
老师好,请教个问题,在平仓时OnOrder事件域获取到的 ord.combOffset 值是 5 ,这个值 代表是什么意思。当是平仓的委托时,ord.combOffset 得是 Enum_Exit ,这样理解正确吗?以下是OnOrder的代码:OnOrder(OrderRef ord) { // Order 的订阅是以执行的策略程序(Enum_Trade_Source_Program)进行的订阅,一个策略程序可被应用于多个品种,这里只对当前执行策略的品种(同一个委托源)进行操作. If (ord.symbol <> Symbol Or ord.createSource <> A_GetOrderCreateSource) Return; If (ord.status >= Enum_Deleted) { myLogInfo(9, "OnOrder", "持仓数据状态更新--前:"); outPutPositionRecordMaps(PositionRecordMaps, 9, "OnOrder--更新前"); myLogInfo(9, "OnOrder", " (委托更新) " + "报单状态=" + Text(ord.status) + ", 报单id=" + Text(ord.orderId) + ", note=" + ord.note + ", 账户id:" + ord.accountId + ", 交易所报单编号=" + ord.exchOrderId + "," + ord.createSource); } //如果没有同步过的账号委托,暂时不加入监控,要先在Timer同步 //检查当前key是否已经添加到Map变量中 If (!MapContain(accountIdMap, ord.accountId)) { Return; } //如果委托已经撤单,且撤单操作员是当前策略,则重新委托 If (ord.status == Enum_Canceled) { //检查当前key是否已经添加到Map变量中 If (MapContain(activeOrderMap, ord.orderId)) { //根据Key删除当前记录 MapErase(activeOrderMap, ord.orderId); myLogInfo(9, "OnOrder", " (委托更新) " + "报单状态=已撤单" + ", 账户id:" + ord.accountId + ", 报单id=" + Text(ord.orderId) + ", 交易所报单编号=" + ord.exchOrderId); If (ord.cancelSource == A_GetOrderCreateSource) { // 撤单时要更新原报单状态数据,可能有部分成交 If (ord.combOffset == Enum_Entry And ord.fillVolume > 0) { If (MapContain(PositionRecordMaps, ord.orderId)) { myLogInfo(9, "OnOrder", "撤单的报单id= " + Text(ord.orderId) + " 更新前持仓数据:" + TextArray(PositionRecordMaps[ord.orderId])); PositionRecordMaps[ord.orderId][Enum_myEntryOrder_Num] = ord.fillVolume; PositionRecordMaps[ord.orderId][Enum_myEntryOrder_Status] = Enum_FillPart; PositionRecordMaps[ord.orderId][Enum_myEntryOrder_FillTime] = ord.createDateTime; Bool ret = updateEntryOrderFilledNews(PositionRecordMaps, ord.orderId, ord.fillVolume); myLogInfo(9, "OnOrder", "撤单有部分成交,更新报单id= " + Text(ord.orderId) + IIFString(ret, " 成功", " 失败") + ", 更新后持仓数据为:" + TextArray(PositionRecordMaps[ord.orderId])); myLogInfo(9, "OnOrder", "持仓数据状态更新--撤单部分成交:"); outPutPositionRecordMaps(PositionRecordMaps, 9, "OnOrder-撤单"); } } Array<Integer> orders; // 买开仓或平仓,为 开多 或 平空,为使能成交委托价格应加价,相反 卖开仓或平仓,为 开空 或 平多,应减价. Numeric newPrice = IIF(ord.side == Enum_Buy, ord.price + priceOffset*MinPoint, ord.price - priceOffset*MinPoint); Bool ret = mySendOrderEx(ord.side, ord.combOffset, ord.volume - ord.fillVolume, newPrice, orders, "OnOrder-OrderReSent", Enum_myOrder_NotExit, BeExitOrderIdMaps[ord.orderId]); // 如果是开仓则进行记录 If (ret == True And ord.combOffset == Enum_Entry) { myLogInfo(9, "OnOrder", "撤单后重新开仓,新建持仓数据..."); Array<Numeric> newEntryOrder; createNewEntryOrder(newEntryOrder, ord.side, ord.volume - ord.fillVolume, newPrice); If (GetArraySize(orders) == 1) { newEntryOrder[Enum_myEntryOrder_OrderId] = orders[0]; // 报单id(委托单id) PositionRecordMaps[orders[0]] = newEntryOrder; last_orderId = orders[0]; } Else If (GetArraySize(orders) > 1) { myLogInfo(9, "!!! Order Warn", "委托单返回多个订单id的情况:" + TextArray(orders)); Integer i; For i = 0 To GetArraySize(orders) - 1 { newEntryOrder[Enum_myEntryOrder_OrderId] = orders[i]; PositionRecordMaps[orders[i]] = newEntryOrder; last_orderId = orders[i]; } } myLogInfo(9, "OnOrder", "持仓数据状态更新--撤单重发:"); outPutPositionRecordMaps(PositionRecordMaps, 9, "OnOrder-撤单重发"); } If (ret == True) { myLogInfo(9, "OnOrder", " (撤单后重新委托成功) " + "账户id:" + ord.accountId + ", 重新报单id=" + TextArray(orders) + ", 交易所报单编号=" + ord.exchOrderId); } Else { myLogInfo(9, "OnOrder", " (撤单后重新委托失败!!!) " + "账户id:" + ord.accountId + ", 原报单id=" + Text(ord.orderId) + ", 交易所报单编号=" + ord.exchOrderId); } } } } Else If (ord.status == Enum_Filled || ord.status == Enum_Deleted) { String ordStatusStr = IIFString(ord.status == Enum_Filled, "全部成交", "已废除"); myLogInfo(9, "OnOrder", " (委托更新) " + "报单状态=" + ordStatusStr + " 账户id:" + ord.accountId + ", 报单id=" + Text(ord.orderId) + ", 交易所报单编号=" + ord.exchOrderId + "," + ord.createSource + IIFString(ord.status == Enum_Deleted, "," + ord.note, "")); //检查当前key是否已经添加到Map变量中 If(MapContain(activeOrderMap, ord.orderId)) { //根据Key删除当前记录 MapErase(activeOrderMap, ord.orderId); //myLogInfo(9, "OnOrder", "删除监控委托" + "账户id:" + ord.accountId + ", 报单id=" + Text(ord.orderId) + ", 交易所报单编号=" + ord.exchOrderId); } // 如果是完全成交且是开仓则更新持仓状态数据 If (ord.status == Enum_Filled And ord.combOffset == Enum_Entry) { If (MapContain(PositionRecordMaps, ord.orderId)) { PositionRecordMaps[ord.orderId][Enum_myEntryOrder_Num] = ord.fillVolume; PositionRecordMaps[ord.orderId][Enum_myEntryOrder_Status] = Enum_Filled; PositionRecordMaps[ord.orderId][Enum_myEntryOrder_FillTime] = ord.createDateTime; updateEntryOrderFilledNews(PositionRecordMaps, ord.orderId, ord.fillVolume); myLogInfo(9, "OnOrder", "持仓数据状态更新--开仓完全成交:"); outPutPositionRecordMaps(PositionRecordMaps, 9, "OnOrder-开仓完全成交"); } } myLogInfo(9, "OnOrder-完全成交debug-2", "ord.status:" + Text(ord.status) + ", ord.combOffset:" + Text(ord.combOffset) + ", ord.orderId:" + Text(ord.orderId) + ", BeExitOrderId:" + Text(BeExitOrderIdMaps[ord.orderId])); myLogInfo(9, "OnOrder-完全成交debug-2", "BeExitOrderIdMaps:" + TextMap(BeExitOrderIdMaps)); myLogInfo(9, "OnOrder-完全成交debug-2", "PositionRecordMaps:" + TextMap(PositionRecordMaps)); // 如果是完全成交且是平仓则更新持仓状态数据 If (ord.status == Enum_Filled And ord.combOffset == Enum_Exit) { myLogInfo(9, "OnOrder-完全平仓成交debug", "---------------1"); If (MapContain(BeExitOrderIdMaps, ord.orderId)) { myLogInfo(9, "OnOrder-完全平仓成交debug", "---------------2"); Integer beExitOrderId = BeExitOrderIdMaps[ord.orderId]; If (MapContain(PositionRecordMaps, beExitOrderId)) { myLogInfo(9, "OnOrder-完全平仓成交debug", "---------------3"); PositionRecordMaps[beExitOrderId][Enum_myEntryOrder_isClosed] = Enum_myOrder_Exited; PositionRecordMaps[beExitOrderId][Enum_myEntryOrder_ExitTime] = ord.createDateTime; myLogInfo(9, "OnOrder", "持仓数据状态更新--平仓完全成交:"); outPutPositionRecordMaps(PositionRecordMaps, 9, "OnOrder-平仓完全成交"); } } } // 如果是废单且是开仓操作则更新持仓数据为关闭 If (ord.status == Enum_Deleted And ord.combOffset == Enum_Entry) { If (MapContain(PositionRecordMaps, ord.orderId)) { PositionRecordMaps[ord.orderId][Enum_myEntryOrder_Status] = Enum_Deleted; PositionRecordMaps[ord.orderId][Enum_myEntryOrder_isClosed] = Enum_myOrder_Exited; myLogInfo(9, "OnOrder", "持仓数据状态更新--交易所开仓废单:"); outPutPositionRecordMaps(PositionRecordMaps, 9, "OnOrder-交易所开仓废单"); } } // 如果是废单且是平仓操作则更新持仓数据 If (ord.status == Enum_Deleted And ord.combOffset == Enum_Exit) { If (MapContain(BeExitOrderIdMaps, ord.orderId)) { Integer beExitOrderId = BeExitOrderIdMaps[ord.orderId]; If (MapContain(PositionRecordMaps, beExitOrderId)) { PositionRecordMaps[beExitOrderId][Enum_myEntryOrder_Status] = Enum_Deleted; PositionRecordMaps[beExitOrderId][Enum_myEntryOrder_isClosed] = Enum_myOrder_NotExit; myLogInfo(9, "OnOrder", "持仓数据状态更新--交易所平仓废单:"); outPutPositionRecordMaps(PositionRecordMaps, 9, "OnOrder-交易所平仓废单"); } } } } Else { activeOrderMap[ord.orderId] = ord; If (ord.status >= Enum_Deleted) myLogInfo(5, "OnOrder", "提示: 报单id=" + Text(ord.orderId) + " 状态未完成,存入定时器处理..."); } }