轻松快捷开发 MetaTrader 程序的函数库(第六部分):净持帐户事件·进阶篇
🧩

轻松快捷开发 MetaTrader 程序的函数库(第六部分):净持帐户事件·进阶篇

(2/3)·净持与对冲账户持仓表述差异直接决定事件跟踪代码路径,多数库作者在此踩坑

案例拆解新手友好 第 2/3 篇

不少开发者直接把对冲账户的事件处理套到净持结算帐户上,结果仓位反转和 partial close 的触发逻辑全乱。净持账户同一品种只允许一笔单向持仓,逆向订单可能改变方向而非开新仓,用错模型就会漏掉关键事件。

◍ 订单属性枚举里的整数与实数分界

在 MT5 的订单/成交/仓位统一属性体系里,整数型属性由 ENUM_ORDER_PROP_INTEGER 枚举定义,从 ORDER_PROP_TYPE 一路列到 ORDER_PROP_DIRECTION,覆盖了类型、来源、状态、仓位 ID、父子票据、盈亏点数与 SL/TP 平仓标志等。其中 ORDER_PROP_GROUP_ID 和 ORDER_PROP_DIRECTION 是后期扩充进来的字段,老版本终端可能不识别。 宏定义给出了硬数字:ORDER_PROP_INTEGER_TOTAL 为 24,即整数属性共 24 个;ORDER_PROP_INTEGER_SKIP 为 1,表示排序时有 1 个属性不参与。实数型属性则另起 ENUM_ORDER_PROP_DOUBLE 枚举,起点直接接在整数总数之后——ORDER_PROP_PRICE_OPEN = ORDER_PROP_INTEGER_TOTAL,也就是下标 24。 开 MT5 按 F4 进 MetaEditor,搜 ENUM_ORDER_PROP_INTEGER 能看到你本地头文件里的实际条目数;若总数不是 24,说明终端版本比文中示例更新或偏旧,写通用 EA 时别写死下标。

MQL5 / C++
  ORDER_PROP_TYPE,                                                                         class=class="str">"cmt">// 订单/成交类型
  ORDER_PROP_REASON,                                                                         class=class="str">"cmt">// 成交/订单/仓位原因或来源
  ORDER_PROP_STATE,                                                                          class=class="str">"cmt">// 订单状态(来自 ENUM_ORDER_STATE 枚举)
  ORDER_PROP_POSITION_ID,                                                                    class=class="str">"cmt">// 仓位 ID
  ORDER_PROP_POSITION_BY_ID,                                                                 class=class="str">"cmt">// 逆向仓位 ID
  ORDER_PROP_DEAL_ORDER_TICKET,                                                              class=class="str">"cmt">// 触发成交的订单的票据
  ORDER_PROP_DEAL_ENTRY,                                                                     class=class="str">"cmt">// 成交方向 – IN, OUT 或 IN/OUT
  ORDER_PROP_TIME_UPDATE,                                                                    class=class="str">"cmt">// 仓位变更时间(秒)
  ORDER_PROP_TIME_UPDATE_MSC,                                                                class=class="str">"cmt">// 仓位变更时间(毫秒)
  ORDER_PROP_TICKET_FROM,                                                                    class=class="str">"cmt">// 父订单票据
  ORDER_PROP_TICKET_TO,                                                                      class=class="str">"cmt">// 派生订单票据
  ORDER_PROP_PROFIT_PT,                                                                      class=class="str">"cmt">// 盈利点数
  ORDER_PROP_CLOSE_BY_SL,                                                                    class=class="str">"cmt">// 由止损平仓标志
  ORDER_PROP_CLOSE_BY_TP,                                                                    class=class="str">"cmt">// 由止盈平仓标志
  ORDER_PROP_GROUP_ID,                                                                       class=class="str">"cmt">// 订单/仓位分组 ID
  ORDER_PROP_DIRECTION,                                                                      class=class="str">"cmt">// 基于方向的类型(买入,卖出)
  };
class="macro">#define ORDER_PROP_INTEGER_TOTAL(class="num">24)                                                       class=class="str">"cmt">// 整数型属性的总数
class="macro">#define ORDER_PROP_INTEGER_SKIP(class="num">1)                                                        class=class="str">"cmt">// 排序中未使用的订单属性数量
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| 订单, 成交, 仓位的实数型属性                                                  |
class=class="str">"cmt">//+------------------------------------------------------------------+
enum ENUM_ORDER_PROP_DOUBLE
  {
  ORDER_PROP_PRICE_OPEN = ORDER_PROP_INTEGER_TOTAL,                                          class=class="str">"cmt">// 开单价 (MQL5 成交价)

订单属性枚举与排序基址的拆解

在 MT5 的订单/成交/仓位结构里,属性被拆成整数、实数、字符串三类枚举。上面这段定义里,实数型 ENUM_ORDER_PROP_DOUBLE 从平单价一路列到 StopLimit 激活价,共计 11 项,由宏 ORDER_PROP_DOUBLE_TOTAL 写死为 (11),字符串型再叠加 3 项,总数靠 ORDER_PROP_STRING_TOTAL 控为 (3)。 字符串枚举的起始偏移直接吃掉了前面两类总量:ORDER_PROP_SYMBOL 的赋值就是 (ORDER_PROP_INTEGER_TOTAL+ORDER_PROP_DOUBLE_TOTAL),也就是说它的值依赖于前面整数和实数属性的累计数,改了前两类总数这里会自动顺延,不用手调。 排序基址的两个宏更值得注意:FIRST_ORD_DBL_PROP 和 FIRST_ORD_STR_PROP 都减了一个 ORDER_PROP_INTEGER_SKIP。这个 SKIP 量代表整数属性里不参与订单排序的预留位,真实可排序列要从跳过之后算起。开 MT5 进 Include/Trade 相关头文件搜 ORDER_PROP_INTEGER_SKIP,把它的实际值抄出来,你就能算出订单按实数或字符串排序时,枚举下标从几开始。外汇和贵金属杠杆高,跑这类枚举遍历前先在小周期回测,避免实盘漏单。

MQL5 / C++
  ORDER_PROP_PRICE_CLOSE,                                                                     class=class="str">"cmt">// 平单价
  ORDER_PROP_SL,                                                                                class=class="str">"cmt">// 止损价
  ORDER_PROP_TP,                                                                                class=class="str">"cmt">// 止盈价
  ORDER_PROP_PROFIT,                                                                            class=class="str">"cmt">// 盈利
  ORDER_PROP_COMMISSION,                                                                        class=class="str">"cmt">// 佣金
  ORDER_PROP_SWAP,                                                                              class=class="str">"cmt">// 隔夜利息
  ORDER_PROP_VOLUME,                                                                            class=class="str">"cmt">// 交易量
  ORDER_PROP_VOLUME_CURRENT,                                                                    class=class="str">"cmt">// 未执行交易量
  ORDER_PROP_PROFIT_FULL,                                                                       class=class="str">"cmt">// 盈利+佣金+隔夜利息
  ORDER_PROP_PRICE_STOP_LIMIT,                                                                  class=class="str">"cmt">// 当 StopLimit 挂单激活时的 Limit 订单价
  };
class="macro">#define ORDER_PROP_DOUBLE_TOTAL(class="num">11)                                                        class=class="str">"cmt">// 实数型属性的总数
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| 订单, 成交, 仓位字符串型属性                                                                    |
class=class="str">"cmt">//+------------------------------------------------------------------+
enum ENUM_ORDER_PROP_STRING
  {
  ORDER_PROP_SYMBOL = (ORDER_PROP_INTEGER_TOTAL+ORDER_PROP_DOUBLE_TOTAL), class=class="str">"cmt">// 订单品种
  ORDER_PROP_COMMENT,                                                                          class=class="str">"cmt">// 订单注释
  ORDER_PROP_EXT_ID                                                                            class=class="str">"cmt">// 外部交易系统中的订单 ID
  };
class="macro">#define ORDER_PROP_STRING_TOTAL(class="num">3)                                                         class=class="str">"cmt">// 字符串型属性的总数
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| 订单和成交排序的可能标准                                                                       |
class=class="str">"cmt">//+------------------------------------------------------------------+
class="macro">#define FIRST_ORD_DBL_PROP(ORDER_PROP_INTEGER_TOTAL-ORDER_PROP_INTEGER_SKIP)
class="macro">#define FIRST_ORD_STR_PROP(ORDER_PROP_INTEGER_TOTAL+ORDER_PROP_DOUBLE_TOTAL-ORDER_PROP_INTEGER_SKIP)
enum ENUM_SORT_ORDERS_MODE
  {
  class=class="str">"cmt">//--- 按整数型属性排序
  SORT_BY_ORDER_TICKET         =  class="num">0,                                                            class=class="str">"cmt">// 按订单票据排序

「订单历史排序的 21 个枚举键」

在 MT5 的 HistorySelect 返回序列里,想精准定位某笔成交,靠肉眼翻太慢。MQL5 提供了 ENUM_ORDER_SORT 系列枚举,给 OrderGetInteger(ORDER_SORT_KEY) 当排序依据,覆盖从魔幻数字到平仓触发标志的维度。 下面这 21 个常量从 1 到 21 连续编号,分别对应不同的订单属性键。比如 SORT_BY_ORDER_MAGIC=1 按 EA 的 magic number 聚类,SORT_BY_ORDER_TIME_OPEN_MSC=4 精确到毫秒开单时间,SORT_BY_ORDER_CLOSE_BY_SL=20 和 SORT_BY_ORDER_CLOSE_BY_TP=21 能直接筛出被止损或止盈打掉的那些单。 实盘里若你同时跑多个策略共用一个账户,用 magic 或 position_id(枚举 11)排序,能在几毫秒内剥离出目标仓的来龙去脉。外汇与贵金属杠杆高、滑点随机,任何排序后的批量操作都先在策略测试器回放验证。

MQL5 / C++
SORT_BY_ORDER_MAGIC                =  class="num">1,             class=class="str">"cmt">// 按订单魔幻数字排序
SORT_BY_ORDER_TIME_OPEN         =  class="num">2,             class=class="str">"cmt">// 按开单时间排序
SORT_BY_ORDER_TIME_CLOSE        =  class="num">3,             class=class="str">"cmt">// 按平单时间排序
SORT_BY_ORDER_TIME_OPEN_MSC     =  class="num">4,             class=class="str">"cmt">// 按开单时间毫秒值排序
SORT_BY_ORDER_TIME_CLOSE_MSC    =  class="num">5,             class=class="str">"cmt">// 按平单时间毫秒值排序
SORT_BY_ORDER_TIME_EXP          =  class="num">6,             class=class="str">"cmt">// 按订单到期日期排序
SORT_BY_ORDER_STATUS            =  class="num">7,             class=class="str">"cmt">// 按订单状况排序(在场订单/挂单/成交/余额信贷操作)
SORT_BY_ORDER_TYPE              =  class="num">8,             class=class="str">"cmt">// 按订单类型排序
SORT_BY_ORDER_REASON            =  class="num">9,             class=class="str">"cmt">// 按成交/订单/仓位原因/来源排序
SORT_BY_ORDER_STATE             =  class="num">10,            class=class="str">"cmt">// 按订单状态排序
SORT_BY_ORDER_POSITION_ID       =  class="num">11,            class=class="str">"cmt">// 按仓位 ID 排序
SORT_BY_ORDER_POSITION_BY_ID    =  class="num">12,            class=class="str">"cmt">// 按逆向仓位 ID 排序
SORT_BY_ORDER_DEAL_ORDER        =  class="num">13,            class=class="str">"cmt">// 按成交所依据的订单排序
SORT_BY_ORDER_DEAL_ENTRY        =  class="num">14,            class=class="str">"cmt">// 按成交方向排序 –  IN,OUT 或 IN/OUT
SORT_BY_ORDER_TIME_UPDATE       =  class="num">15,            class=class="str">"cmt">// 按仓位变更时间排序,以秒为单位
SORT_BY_ORDER_TIME_UPDATE_MSC   =  class="num">16,            class=class="str">"cmt">// 按仓位变更时间排序,以毫秒为单位
SORT_BY_ORDER_TICKET_FROM       =  class="num">17,            class=class="str">"cmt">// 按父订单票据排序
SORT_BY_ORDER_TICKET_TO         =  class="num">18,            class=class="str">"cmt">// 按衍生订单票证排序
SORT_BY_ORDER_PROFIT_PT         =  class="num">19,            class=class="str">"cmt">// 按订单利润排序
SORT_BY_ORDER_CLOSE_BY_SL       =  class="num">20,            class=class="str">"cmt">// 按由止损标志平单排序
SORT_BY_ORDER_CLOSE_BY_TP       =  class="num">21,            class=class="str">"cmt">// 按由止盈标志平单排序

◍ 订单排序枚举与账户事件标志的底层定义

在 MT5 的订单与仓位管理接口里,排序方式被拆成了整型、实数型、字符串型三组枚举。整数组里 SORT_BY_ORDER_GROUP_ID 固定为 22,用于按订单或仓位组 ID 归类;实数组则从 FIRST_ORD_DBL_PROP 起算,开单价、平单价、SL、TP 依次 +0 到 +3,盈利、佣金、隔夜利息、交易量顺延到 +4~+7,未执行量、全盈利(含费息)、StopLimit 激活价分别占 +8~+10。 字符串组只有三个槽位:品种名(FIRST_ORD_STR_PROP)、注释(+1)、外部系统订单 ID(+2)。如果你写 EA 时要按「盈利+佣金+隔夜利息」综合排序,直接传 SORT_BY_ORDER_PROFIT_FULL,比自己循环算浮点省事。 账户事件标志 ENUM_TRADE_EVENT_FLAGS 用的是 2 的幂位掩码:下挂单=1、删挂单=2、挂单激活=4、开仓=8、持仓变更=16、持仓反转=32。用位或就能同时监听多种动作,例如 1|8 表示既关心挂单提交也关心新开仓。 外汇与贵金属杠杆高,事件监听逻辑若漏掉持仓反转(32)这类标志,面板统计可能和真实账户对不上,复盘时倾向出现偏差。

MQL5 / C++
SORT_BY_ORDER_GROUP_ID       =  class="num">22,              class=class="str">"cmt">// 按订单/仓位组 ID 排序
  class=class="str">"cmt">//--- 按实数型属性排序
  SORT_BY_ORDER_PRICE_OPEN     =  FIRST_ORD_DBL_PROP,   class=class="str">"cmt">// 按开单价排序
  SORT_BY_ORDER_PRICE_CLOSE   =  FIRST_ORD_DBL_PROP+class="num">1,  class=class="str">"cmt">// 按平单价排序
  SORT_BY_ORDER_SL            =  FIRST_ORD_DBL_PROP+class="num">2,  class=class="str">"cmt">// 按止损价排序
  SORT_BY_ORDER_TP            =  FIRST_ORD_DBL_PROP+class="num">3,  class=class="str">"cmt">// 按止盈价排序
  SORT_BY_ORDER_PROFIT        =  FIRST_ORD_DBL_PROP+class="num">4,  class=class="str">"cmt">// 按盈利排序
  SORT_BY_ORDER_COMMISSION    =  FIRST_ORD_DBL_PROP+class="num">5,  class=class="str">"cmt">// 按佣金排序
  SORT_BY_ORDER_SWAP          =  FIRST_ORD_DBL_PROP+class="num">6,  class=class="str">"cmt">// 按隔夜利息排序
  SORT_BY_ORDER_VOLUME        =  FIRST_ORD_DBL_PROP+class="num">7,  class=class="str">"cmt">// 按交易量排序
  SORT_BY_ORDER_VOLUME_CURRENT=  FIRST_ORD_DBL_PROP+class="num">8,  class=class="str">"cmt">// 按未执行交易量排序
  SORT_BY_ORDER_PROFIT_FULL   =  FIRST_ORD_DBL_PROP+class="num">9,  class=class="str">"cmt">// 按盈利+佣金+隔夜利息条件排序
  SORT_BY_ORDER_PRICE_STOP_LIMIT= FIRST_ORD_DBL_PROP+class="num">10, class=class="str">"cmt">// 按激活StopLimit 挂单时的 Limit 挂单价格排序
  class=class="str">"cmt">//--- 按字符串型属性排序
  SORT_BY_ORDER_SYMBOL        =  FIRST_ORD_STR_PROP,    class=class="str">"cmt">// 按品种排序
  SORT_BY_ORDER_COMMENT       =  FIRST_ORD_STR_PROP+class="num">1,  class=class="str">"cmt">// 按注释排序
  SORT_BY_ORDER_EXT_ID        =  FIRST_ORD_STR_PROP+class="num">2   class=class="str">"cmt">// 按外部交易系统中的订单 ID 排序
};
enum ENUM_TRADE_EVENT_FLAGS
  {
  TRADE_EVENT_FLAG_NO_EVENT       =  class="num">0,                 class=class="str">"cmt">// 无事件
  TRADE_EVENT_FLAG_ORDER_PLASED   =  class="num">1,                 class=class="str">"cmt">// 下挂单
  TRADE_EVENT_FLAG_ORDER_REMOVED  =  class="num">2,                 class=class="str">"cmt">// 删除挂单
  TRADE_EVENT_FLAG_ORDER_ACTIVATED =  class="num">4,                class=class="str">"cmt">// 挂单由价格激活
  TRADE_EVENT_FLAG_POSITION_OPENED =  class="num">8,                class=class="str">"cmt">// 开仓
  TRADE_EVENT_FLAG_POSITION_CHANGED=  class="num">16,               class=class="str">"cmt">// 持仓变更
  TRADE_EVENT_FLAG_POSITION_REVERSE=  class="num">32                class=class="str">"cmt">// 持仓反转
  };

成交标志位与账户事件枚举的对应关系

在 MT5 的底层交易事件体系里,平仓、部分执行、反向仓位触发等动作都被拆成了独立的标志位常量。比如 TRADE_EVENT_FLAG_POSITION_CLOSED 对应数值 64,TRADE_EVENT_FLAG_PARTIAL 是 256,TRADE_EVENT_FLAG_SL 与 TRADE_EVENT_FLAG_TP 则分别是 1024 和 2048,用 2 的幂次排列方便按位或运算做组合判断。 账户层面的事件则单独收进 ENUM_TRADE_EVENT 枚举,从 TRADE_EVENT_NO_EVENT = 0 开始,到挂单放置、删除,再到信贷收取(与 DEAL_TYPE_CREDIT 对齐,值为 3)、各类日终/月终佣金、利息与股息。注释里明确要求这组常量顺序不能改、不能增删,否则会破坏与成交类型的映射。 实盘里接小布盯盘或自写 EA 时,直接拿这些枚举做 switch 分支比字符串比对稳。外汇和贵金属波动大、高风险,事件回调里务必先判标志位再动仓位,避免部分执行或反向平仓被漏算。

MQL5 / C++
  TRADE_EVENT_FLAG_POSITION_CLOSED =  class="num">64,                class=class="str">"cmt">// 平仓
  TRADE_EVENT_FLAG_ACCOUNT_BALANCE =  class="num">128,                class=class="str">"cmt">// 余额操作 (按成交类型厘清)
  TRADE_EVENT_FLAG_PARTIAL         =  class="num">256,                class=class="str">"cmt">// 部分执行
  TRADE_EVENT_FLAG_BY_POS          =  class="num">512,                class=class="str">"cmt">// 由逆向仓位执行
  TRADE_EVENT_FLAG_SL              =  class="num">1024,               class=class="str">"cmt">// 由止损执行
  TRADE_EVENT_FLAG_TP              =  class="num">2048                class=class="str">"cmt">// 由止盈执行
  };
class=class="str">"cmt">//+------------------------------------------------------------------+
class=class="str">"cmt">//| 帐户上可能的交易事件列表                                      |
class=class="str">"cmt">//+------------------------------------------------------------------+
enum ENUM_TRADE_EVENT
  {
  TRADE_EVENT_NO_EVENT = class="num">0,                                              class=class="str">"cmt">// 无交易事件
  TRADE_EVENT_PENDING_ORDER_PLASED,                                      class=class="str">"cmt">// 下挂单
  TRADE_EVENT_PENDING_ORDER_REMOVED,                                     class=class="str">"cmt">// 挂单删除
class=class="str">"cmt">//--- 与 ENUM_DEAL_TYPE 枚举成员匹配的枚举成员
class=class="str">"cmt">//--- (下面的常数顺序不应该改变,不应该添加/删除常量)
  TRADE_EVENT_ACCOUNT_CREDIT = DEAL_TYPE_CREDIT,                         class=class="str">"cmt">// 收取信贷 (class="num">3)
  TRADE_EVENT_ACCOUNT_CHARGE,                                            class=class="str">"cmt">// 额外费用
  TRADE_EVENT_ACCOUNT_CORRECTION,                                        class=class="str">"cmt">// 账目调整
  TRADE_EVENT_ACCOUNT_BONUS,                                             class=class="str">"cmt">// 收取奖金
  TRADE_EVENT_ACCOUNT_COMISSION,                                         class=class="str">"cmt">// 额外佣金
  TRADE_EVENT_ACCOUNT_COMISSION_DAILY,                                    class=class="str">"cmt">// 当日结束时收取的佣金
  TRADE_EVENT_ACCOUNT_COMISSION_MONTHLY,                                  class=class="str">"cmt">// 当月结束时收取的佣金
  TRADE_EVENT_ACCOUNT_COMISSION_AGENT_DAILY,                              class=class="str">"cmt">// 交易日结束时收取的代理佣金
  TRADE_EVENT_ACCOUNT_COMISSION_AGENT_MONTHLY,                            class=class="str">"cmt">// 交易月结束时收取的代理佣金
  TRADE_EVENT_ACCOUNT_INTEREST,                                          class=class="str">"cmt">// 可用资金的应计利息
  TRADE_EVENT_BUY_CANCELLED,                                             class=class="str">"cmt">// 取消买入成交
  TRADE_EVENT_SELL_CANCELLED,                                            class=class="str">"cmt">// 取消卖出成交
  TRADE_EVENT_DIVIDENT,                                                  class=class="str">"cmt">// 应计股息

「交易事件枚举里的净持结算分支」

上面这组枚举把账户层面的充值提款、挂单激活、开平仓,以及净持账户(netting)下的持仓逆转与加仓都列成了独立事件常量。 注意高亮的那几行:TRADE_EVENT_POSITION_REVERSED_BY_MARKET 到 TRADE_EVENT_POSITION_VOLUME_ADD_BY_PENDING_PARTIAL,它们只在净持结算模式下才可能触发。也就是说,当你用市价单或挂单(含部分成交)去反向吃掉原仓位时,系统不报普通平仓,而报「逆转」;同向补单则报「加仓」。 在 MT5 里如果你写 EA 监听 OnTradeTransaction,靠 DEAL_TYPE 判断可能漏掉这些细分事件。直接比对这组枚举,能在回测里把「净持逆转」和「普通平仓」区分开——两者对浮盈曲线和手续费统计的影响不一样。外汇与贵金属杠杆高,净持模式下的批量平仓逻辑若判断错事件类型,可能误算风险敞口。 常量顺序本身可改,DEAL_TAX+3 之后都是自定义偏移,复制进头文件就能用。

MQL5 / C++
  TRADE_EVENT_DIVIDENT_FRANKED,                                                                     class=class="str">"cmt">// 应计派发股息
  TRADE_EVENT_TAX                                                                 = DEAL_TAX,       class=class="str">"cmt">// 应计税款
class=class="str">"cmt">//--- 与 ENUM_DEAL_TYPE 枚举中的 DEAL_TYPE_BALANCE 成交类型相关的常量
  TRADE_EVENT_ACCOUNT_BALANCE_REFILL    = DEAL_TAX+class="num">1,     class=class="str">"cmt">// 账户余额充值
  TRADE_EVENT_ACCOUNT_BALANCE_WITHDRAWAL = DEAL_TAX+class="num">2,     class=class="str">"cmt">// 从账户中提取资金
class=class="str">"cmt">//--- 其余可能的交易事件
class=class="str">"cmt">//--- (可以更改下面的常量顺序,可以添加/删除常量)
  TRADE_EVENT_PENDING_ORDER_ACTIVATED    = DEAL_TAX+class="num">3,     class=class="str">"cmt">// 挂单由价格激活
  TRADE_EVENT_PENDING_ORDER_ACTIVATED_PARTIAL,                                     class=class="str">"cmt">// 挂单由价格部分激活
  TRADE_EVENT_POSITION_OPENED,                                                      class=class="str">"cmt">// 开仓
  TRADE_EVENT_POSITION_OPENED_PARTIAL,                                              class=class="str">"cmt">// 部分开仓
  TRADE_EVENT_POSITION_CLOSED,                                                      class=class="str">"cmt">// 平仓
  TRADE_EVENT_POSITION_CLOSED_BY_POS,                                               class=class="str">"cmt">// 由逆向仓位平仓
  TRADE_EVENT_POSITION_CLOSED_BY_SL,                                                class=class="str">"cmt">// 由止损平仓
  TRADE_EVENT_POSITION_CLOSED_BY_TP,                                                class=class="str">"cmt">// 由止盈平仓
  TRADE_EVENT_POSITION_REVERSED_BY_MARKET,                                          class=class="str">"cmt">// 由新成交逆转持仓(净持结算)
  TRADE_EVENT_POSITION_REVERSED_BY_PENDING,                                         class=class="str">"cmt">// 由激活挂单(净持结算)来平仓
  TRADE_EVENT_POSITION_REVERSED_BY_MARKET_PARTIAL,                                  class=class="str">"cmt">// 由部分入场订单执行(净持结算)的持仓逆转
  TRADE_EVENT_POSITION_REVERSED_BY_PENDING_PARTIAL,                                 class=class="str">"cmt">// 由部分挂单激活(净持结算)进行的持仓逆转
  TRADE_EVENT_POSITION_VOLUME_ADD_BY_MARKET,                                        class=class="str">"cmt">// 由新成交加仓(净持结算)
  TRADE_EVENT_POSITION_VOLUME_ADD_BY_MARKET_PARTIAL,                                class=class="str">"cmt">// 由部分执行入场订单(净持结算)向某笔持仓增加交易量
  TRADE_EVENT_POSITION_VOLUME_ADD_BY_PENDING,                                       class=class="str">"cmt">// 由激活挂单(净持结算)为持仓增加交易量
  TRADE_EVENT_POSITION_VOLUME_ADD_BY_PENDING_PARTIAL,                               class=class="str">"cmt">// 由部分激活挂单(净持结算)为某笔持仓增加交易量
  TRADE_EVENT_POSITION_CLOSED_PARTIAL,                                              class=class="str">"cmt">// 部分平仓
  TRADE_EVENT_POSITION_CLOSED_PARTIAL_BY_POS,                                       class=class="str">"cmt">// 持仓由逆向仓位部分平仓
  TRADE_EVENT_POSITION_CLOSED_PARTIAL_BY_SL,                                        class=class="str">"cmt">// 持仓由止损部分平仓
  TRADE_EVENT_POSITION_CLOSED_PARTIAL_BY_TP                                         class=class="str">"cmt">// 持仓由止盈部分平仓
  };
让小布替你跑这套账户差异校验
这些账户类型分支和枚举排序的稳定性诊断,小布盯盘的 AIGC 已内置,打开对应品种页即可看到净持/对冲事件流是否按预期分离。

常见问题

净持账户每笔仓位 ID 等于开仓订单票据且加仓不改票据,逆向订单超量时票据随逆转订单变;对冲账户每笔仓位有独立票据等于开仓订单票据,加仓开新仓新 ID。
可以,小布盯盘的品种页把净持账户事件流单独呈现,方向反转、部分平仓、全部平仓都会按类型标注,省去自己写分支判断。
事件/订单属性匹配按枚举内位置排序而非常量编号,未用于搜索的属性若插在中间会打乱顺序,应将其挪到属性类型列表末尾。
激活订单交易量直接加到当前持仓交易量,仓位票据和 ID 均保持不变,不会像对冲账户那样新开一笔仓位。