MQL5 交易工具包(第 7 部分):使用最近取消的挂单函数扩展历史管理 EX5 库·进阶篇
(2/3)· MQL5 原生缺位的最近取消挂单数据,靠这套 EX5 函数封装一次打通
接上篇,我们继续深挖 HistoryManager 库的收尾模块。MQL5 并没有单行函数能直接拉取最近取消的挂单明细,开发者往往要在历史池里手动翻找,既费时又容易漏掉关键字段。
「抓最近撤掉的挂单单号」
在 EA 里想复盘上一笔被撤的挂单,靠 LastCanceledPendingOrderTicket() 就能直接拿到它的 ticket。函数接收一个 ulong 引用参数,成功时把单号写进去并返回 true,失败则原变量不动、返回 false。 它内部先调 GetLastCanceledPendingOrderData() 取完整订单数据,再从中摘出 ticket 字段。也就是说,真正的数据来源是后者,这个函数只是个轻量封装,方便你少写一行结构体访问。 外汇和贵金属挂单撤销频繁,用这个函数接小布盯盘的撤单统计脚本时,注意它只保留「最近一次」记录,多次撤单若不清空就可能漏掉更早的信号,属于高频场景下的概率性盲区。
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 再读变量,否则可能拿到上一次的脏值。
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),靠返回值判断而不是靠数值本身,能少踩很多坑。外汇和贵金属波动剧烈,撤单止损价仅作历史参考,实盘仍属高风险操作。
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& 引用传递,调用方变量会被直接改写。
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 做哨兵。
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 点区间,说明挂单者倾向薄利离场,撤单可能只是怕扫损而非改方向。外汇与贵金属波动剧烈,这类行为信号仅作概率参考,实盘须自担高风险。
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); }