MQL5 交易工具包(第 7 部分):使用最近取消的挂单函数扩展历史管理 EX5 库·进阶篇
📚

MQL5 交易工具包(第 7 部分):使用最近取消的挂单函数扩展历史管理 EX5 库·进阶篇

(2/3)· MQL5 原生缺位的最近取消挂单数据,靠这套 EX5 函数封装一次打通

偏理论 第 2/3 篇

接上篇,我们继续深挖 HistoryManager 库的收尾模块。MQL5 并没有单行函数能直接拉取最近取消的挂单明细,开发者往往要在历史池里手动翻找,既费时又容易漏掉关键字段。

「抓最近撤掉的挂单单号」

在 EA 里想复盘上一笔被撤的挂单,靠 LastCanceledPendingOrderTicket() 就能直接拿到它的 ticket。函数接收一个 ulong 引用参数,成功时把单号写进去并返回 true,失败则原变量不动、返回 false。 它内部先调 GetLastCanceledPendingOrderData() 取完整订单数据,再从中摘出 ticket 字段。也就是说,真正的数据来源是后者,这个函数只是个轻量封装,方便你少写一行结构体访问。 外汇和贵金属挂单撤销频繁,用这个函数接小布盯盘的撤单统计脚本时,注意它只保留「最近一次」记录,多次撤单若不清空就可能漏掉更早的信号,属于高频场景下的概率性盲区。

MQL5 / C++
class="type">bool LastCanceledPendingOrderTicket(class="type">ulong &lastCanceledPendingOrderTicket) class="kw">export
  {
   PendingOrderData lastCanceledPendingOrderInfo;
   if(GetLastCanceledPendingOrderData(lastCanceledPendingOrderInfo))
     {
       lastCanceledPendingOrderTicket = lastCanceledPendingOrderInfo.ticket;
       class="kw">return(true);
     }
   class="kw">return(false);
  }

抓取最近撤掉的挂单开仓价

在 MT5 的 EA 逻辑里,有时候需要回溯刚刚被取消的那张挂单当初挂在什么价位。LastCanceledPendingOrderPriceOpen() 干的就是这件事:它把最近取消挂单的开仓价格写进你传进来的引用变量里,成功就返 true,失败返 false 且不动原变量。 它内部先调 GetLastCanceledPendingOrderData() 拿到整条挂单数据,再从中摘出 priceOpen 字段。这种写法把“取数据”和“取某个字段”拆开,后面要拿止损价、成交量也能照葫芦画瓢套同样结构。 下面这段是完整实现,注意参数用了 double& 引用传递,调用方传进去的变量会被直接改写,不用再靠返回值拿价格。外汇和贵金属挂单撤单频繁,用这个函数做撤单后策略回退时,先确认返回 true 再读变量,否则可能拿到上一次的脏值。

MQL5 / C++
class="type">bool LastCanceledPendingOrderPriceOpen(class="type">class="kw">double &lastCanceledPendingOrderPriceOpen) class="kw">export
  {
   PendingOrderData lastCanceledPendingOrderInfo;
   if(GetLastCanceledPendingOrderData(lastCanceledPendingOrderInfo))
     {
      lastCanceledPendingOrderPriceOpen = lastCanceledPendingOrderInfo.priceOpen;
      class="kw">return(true);
     }
   class="kw">return(false);
  }

◍ 抓最近撤掉的挂单止损价

做撤单回测或风控复盘时,经常要拿到刚被取消的那张挂单当初设的止损位。LastCanceledPendingOrderSlPrice() 就是干这个的:它把最近取消挂单的止损价格写进你传进去的引用变量里,成了就返 true,没拿到就返 false 且不动变量。 底层依赖 GetLastCanceledPendingOrderData() 先拉出整条撤单记录,再从中摘出 slPrice 字段。只要你前面正确维护了取消挂单的数据缓存,这个函数调用一次就能拿到精确数值,不用自己遍历订单历史。 下面这段是完整实现,注意参数用了 double& 引用传递,调用方传一个变量进来就能原地接收结果: 别把失败当零值 函数失败时变量不会被改写,所以调用前最好给 lastCanceledPendingOrderSlPrice 赋一个明显非法值(如 -1),靠返回值判断而不是靠数值本身,能少踩很多坑。外汇和贵金属波动剧烈,撤单止损价仅作历史参考,实盘仍属高风险操作。

MQL5 / C++
class="type">bool LastCanceledPendingOrderSlPrice(class="type">class="kw">double &lastCanceledPendingOrderSlPrice) class="kw">export
  {
   PendingOrderData lastCanceledPendingOrderInfo;
   if(GetLastCanceledPendingOrderData(lastCanceledPendingOrderInfo))
     {
      lastCanceledPendingOrderSlPrice = lastCanceledPendingOrderInfo.slPrice;
      class="kw">return(true);
     }
   class="kw">return(false);
  }

「抓取最近撤掉的挂单止盈位」

做撤单行为分析时,最实用的一个数据是:最近被取消的挂单当时挂的止盈价是多少。LastCanceledPendingOrderTpPrice() 就是干这个的——它把最近取消挂单的 tp 值写进你传进去的引用变量,成功返回 true,拿不到数据就返回 false 且不改动原变量。 它内部依赖 GetLastCanceledPendingOrderData() 先取出整条撤单记录,再从中摘出 tpPrice 字段。逻辑很短,但能让你在 EA 里快速判断:撤单者的止盈是贴近市价还是远挂——外汇与贵金属波动剧烈,这类微观撤单痕迹只能作为概率参考,不构成方向结论。 下面这段是完整实现,注意参数用了 double& 引用传递,调用方变量会被直接改写。

MQL5 / C++
class="type">bool LastCanceledPendingOrderTpPrice(class="type">class="kw">double &lastCanceledPendingOrderTpPrice) class="kw">export
  {
   PendingOrderData lastCanceledPendingOrderInfo;
   if(GetLastCanceledPendingOrderData(lastCanceledPendingOrderInfo))
     {
       lastCanceledPendingOrderTpPrice = lastCanceledPendingOrderInfo.tpPrice;
       class="kw">return(true);
     }
   class="kw">return(false);
  }

抓最后撤掉的挂单止损距离

做撤单行为分析时,最近一笔被取消的挂单留了多宽的保护垫,往往比成交单更有信号意义。LastCanceledPendingOrderSlPips() 就是干这个的:它把最近取消挂单的止损点数写进你传进来的引用变量里,成功就返 true,捞不到数据就返 false 且不改动原变量。 内部逻辑很薄——先调 GetLastCanceledPendingOrderData() 把那笔撤单的完整信息拉出来,成功就从结构体里取 slPips 字段赋值并返回;失败直接返 false。这意味着如果终端历史里根本没有撤单记录,变量保持调用前的值,调用方得自己兜底判断。 下面这段是完整实现,注意参数是 int& 引用传递,export 标记说明它能跨模块被小布这类分析脚本直接调用: 别在没撤单的账户上硬读 新开模拟户或清过历史时,这个函数必然返 false。写 EA 逻辑时若拿返 false 的变量去算仓位,可能把上一次的旧值当真,建议调用前先把变量置 -1 做哨兵。

MQL5 / C++
class="type">bool LastCanceledPendingOrderSlPips(class="type">int &lastCanceledPendingOrderSlPips) class="kw">export
  {
  PendingOrderData lastCanceledPendingOrderInfo;
  if(GetLastCanceledPendingOrderData(lastCanceledPendingOrderInfo))
    {
      lastCanceledPendingOrderSlPips = lastCanceledPendingOrderInfo.slPips;
      class="kw">return(true);
    }
  class="kw">return(false);
  }

◍ 抓最近撤掉的挂单盈利点数

做撤单行为分析时,最近一笔被取消的挂单带了多少点获利空间,往往比成交单更能暴露策略犹豫区。LastCanceledPendingOrderTpPips() 就是干这个的:它把最近取消挂单的 tpPips 读出来,写进你传进去的引用变量里。 函数内部先建一个 PendingOrderData 临时结构,再调 GetLastCanceledPendingOrderData() 去填数据。填成功了就从结构里摘出 tpPips 赋值给引用变量,返回 true;填失败直接返回 false,你的变量原样不动,不会留脏数据。 下面这段是完整实现,注意参数用了 int& 引用传递,调用方传个空变量就能接值: bool LastCanceledPendingOrderTpPips(int &lastCanceledPendingOrderTpPips) export { PendingOrderData lastCanceledPendingOrderInfo; if(GetLastCanceledPendingOrderData(lastCanceledPendingOrderInfo)) { lastCanceledPendingOrderTpPips = lastCanceledPendingOrderInfo.tpPips; return(true); } return(false); } 在 MT5 里接好这两个函数后,你可以每隔一段时间扫一遍撤单 tpPips 的分布:若连续多笔撤单的获利点数都卡在 15~30 点区间,说明挂单者倾向薄利离场,撤单可能只是怕扫损而非改方向。外汇与贵金属波动剧烈,这类行为信号仅作概率参考,实盘须自担高风险。

MQL5 / C++
class="type">bool LastCanceledPendingOrderTpPips(class="type">int &lastCanceledPendingOrderTpPips) class="kw">export
  {
  PendingOrderData lastCanceledPendingOrderInfo;
  if(GetLastCanceledPendingOrderData(lastCanceledPendingOrderInfo))
    {
    lastCanceledPendingOrderTpPips = lastCanceledPendingOrderInfo.tpPips;
    class="kw">return(true);
    }
  class="kw">return(false);
  }
把挂单回溯交给小布盯盘
这些诊断小布盯盘的 AIGC 已内置,打开对应品种页即可看到取消挂单的脉络,你专注策略迭代而非底层翻库。

常见问题

语言核心 API 侧重活跃订单与成交,已取消挂单需遍历历史交易池并按时间倒序筛选,本库将此过程封装为单函数调用。
覆盖交易品种、开价、止损止盈价与点数、单号、幻数、到期与完成时间、注释及取消原因等属性。
可以,小布盯盘的品种页内置了相关 AIGC 诊断,省去自己写 EX5 库也能快速回顾挂单取消分布。
是的,本篇第 5 节与第 3 节分别给出按点数和按价格两种 retrieval 函数,便于不同风控模型调用。
代码在同文件 LastFilledPendingOrderComment 下方续写,逻辑分组保持连贯,关于完整架构见《MQL5 交易工具包(第 7 部分):使用最近成交的挂单函数扩展历史管理 EX5 库·基础篇》。