老师好,请教个问题,在平仓时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) + " 状态未完成,存入定时器处理...");
}
}
已找到答案。

谢谢!