MQL5 交易工具包(第 5 部分):使用仓位函数扩展历史管理 EX5 库·进阶篇
(2/3)· 还在手动翻交易历史算平仓利润?这 6 个函数让 EX5 库替你回答
「识别最近平仓的方向类型」
做策略回溯时,经常要弄清上一笔平仓到底是多还是空。LastClosedPositionType() 就是干这个的:它把账户里最近关闭仓位的类型写进引用变量 lastClosedPositionType,供外部调用判断。 这个函数设计成 export,意味着编译进 EX5 库后,别的 MQL5 文件也能直接引。内部先建一个 PositionData 局部变量 lastClosedPositionInfo,调用 GetLastClosedPositionData() 去捞最后平仓的明细。 若底层检索返回 true,就从结构体里取 type 字段赋给引用变量并 return true;若检索失败则直接 return false,调用方据此知道类型不可得。外汇与贵金属杠杆高,这类历史仓位判定只作策略分支参考,不预示后续盈亏。 下面这段是完整实现,注意函数签名里 &lastClosedPositionType 的引用传递,以及失败路径的提前返回。
class="type">bool LastClosedPositionType(class="type">ENUM_POSITION_TYPE &lastClosedPositionType) class="kw">export { class=class="str">"cmt">//-- Our function&class="macro">#x27;s code will go here } PositionData lastClosedPositionInfo; if(GetLastClosedPositionData(lastClosedPositionInfo)) { class=class="str">"cmt">//- Process the retrieved data } lastClosedPositionType = lastClosedPositionInfo.type; class="kw">return(true); class="kw">return(false); class="type">bool LastClosedPositionType(class="type">ENUM_POSITION_TYPE &lastClosedPositionType) class="kw">export { PositionData lastClosedPositionInfo; if(GetLastClosedPositionData(lastClosedPositionInfo)) { lastClosedPositionType = lastClosedPositionInfo.type; class="kw">return(true); } class="kw">return(false); }
◍ 抓取最近平仓的手数
在 MT5 的 EA 或指标里,经常需要拿「上一笔平仓单子吃了多少手」去做风控或加仓判定。LastClosedPositionVolume() 就是干这个的:它去交易历史里翻最近一条已平掉的头寸,把成交量写进你传进来的引用变量。 函数签名是 bool LastClosedPositionVolume(double &lastClosedPositionVolume),带 export 说明可被其他模块直接调用。内部先声明一个 PositionData 结构体的 lastClosedPositionInfo,再调 GetLastClosedPositionData() 去取数据。 如果取到了,就把 lastClosedPositionInfo.volume 赋给入参引用,返回 true;取不到则入参保持原值,返回 false。实战里你可以用返回值判断历史是否完整,避免拿到的手数是 0 导致仓位计算失真——外汇和贵金属波动大,这类数值错误会直接放大高风险敞口。
class="type">bool LastClosedPositionVolume(class="type">class="kw">double &lastClosedPositionVolume) class="kw">export { PositionData lastClosedPositionInfo; if(GetLastClosedPositionData(lastClosedPositionInfo)) { lastClosedPositionVolume = lastClosedPositionInfo.volume; class="kw">return(true); } class="kw">return(false); }
抓取最近平仓品种的实现细节
在 EA 里想跟着上一笔平仓的品种做下一单,第一步就是拿到最近平仓仓位的交易品种。LastClosedPositionSymbol() 这个函数干的就是这件事:它从交易历史里翻出最近一次平仓记录,把品种名写进传入的引用变量里。 函数签名带 export,说明它可以被其他 mqh/mq5 模块直接调用,参数是 string 类型的引用 lastClosedPositionSymbol。内部先声明一个 PositionData 结构体变量 lastClosedPositionInfo,再调用 GetLastClosedPositionData() 去取数据。 如果取数成功,就把结构体里的 symbol 字段赋给引用变量,并返回 true;失败则引用变量保持原值,返回 false。这种布尔返回 + 引用输出的写法,方便调用方用 if 直接判断,不至于误用空字符串去发单。外汇与贵金属杠杆高,历史读取失败时不下单比瞎猜品种更安全。
class="type">bool LastClosedPositionSymbol(class="type">class="kw">string &lastClosedPositionSymbol) class="kw">export { PositionData lastClosedPositionInfo; if(GetLastClosedPositionData(lastClosedPositionInfo)) { lastClosedPositionSymbol = lastClosedPositionInfo.symbol; class="kw">return(true); } class="kw">return(false); }
「抓最近平仓单号的逻辑与代码」
在自动化策略里,经常需要回看上一笔平仓单的编号来衔接风控或加仓判断。下面这个函数只做一件事:从交易历史里捞出最近平仓的 ticket,写进传入的引用变量。 函数返回 bool:成功取到就更新变量并返回 true,取不到则变量保持原值并返回 false。这种「只改引用、状态外抛」的写法,能让调用方自己决定失败时要不要报警或跳过。 代码逐行看:声明 bool 类型、带 export 标记,说明它可被其他 mqh/mq5 模块直接引用;内部先建 PositionData 结构体实例 lastClosedPositionInfo;调 GetLastClosedPositionData 尝试填充,成功就把 .ticket 赋给入参引用并返回 true,否则直接返回 false。 在 MT5 里接这段时,注意 GetLastClosedPositionData 必须已正确遍历 HistorySelect 区间,否则大概率走 false 分支,导致你的后续逻辑误判「无平仓」。外汇与贵金属波动大、滑点频繁,用历史单号做决策前务必先本地回测验证命中率。
class="type">bool LastClosedPositionTicket(class="type">ulong &lastClosedPositionTicket) class="kw">export { PositionData lastClosedPositionInfo; if(GetLastClosedPositionData(lastClosedPositionInfo)) { lastClosedPositionTicket = lastClosedPositionInfo.ticket; class="kw">return(true); } class="kw">return(false); }
◍ 抓取最近平仓利润的实现细节
在 EA 里判断上一笔平仓盈亏,最常见做法是直接翻历史持仓。LastClosedPositionProfit() 把这件事封装成一行调用:传入一个 double 引用,函数内部去找最后平仓的那条记录,把利润写进变量,成功返回 true,失败返回 false 且不改动原值。 下面这段是 MT5 里可直接编译的函数。注意它依赖另一个 GetLastClosedPositionData() 去拿整条持仓数据,本函数只负责把 profit 字段摘出来: bool LastClosedPositionProfit(double &lastClosedPositionProfit) export { PositionData lastClosedPositionInfo; if(GetLastClosedPositionData(lastClosedPositionInfo)) { lastClosedPositionProfit = lastClosedPositionInfo.profit; return(true); } return(false); } 逐行看:第 1 行定义导出函数,用引用形参接外部变量;第 3 行声明局部结构体存持仓信息;第 4 行调辅助函数取最近平仓数据;第 6 行把利润赋给引用变量;第 7 行成功返回 true;第 9 行失败返回 false。 实盘里你可以在 OnTick 开头调它,用上笔利润决定本笔是否反向加仓。外汇和贵金属波动大、杠杆高,历史利润不代表后续走向,信号仅作概率参考。
class="type">bool LastClosedPositionProfit(class="type">class="kw">double &lastClosedPositionProfit) class="kw">export { PositionData lastClosedPositionInfo; if(GetLastClosedPositionData(lastClosedPositionInfo)) { lastClosedPositionProfit = lastClosedPositionInfo.profit; class="kw">return(true); } class="kw">return(false); }
抓最近平仓的净口袋收益
做复盘或策略链衔接时,常需要拿到上一笔已平仓位真正落袋的数字。这里说的净利润不是账面浮动盈利,而是扣掉佣金、库存费之后的实收,MT5 历史池里才有完整记录。 下面这个函数把检索逻辑压到极简:传入一个 double 引用变量,能查到就写值并返回 true,查不到就原值不动并返回 false。调用方据此判断要不要继续跑后续逻辑,不会误把旧数据当新信号。
class="type">bool LastClosedPositionNetProfit(class="type">class="kw">double &lastClosedPositionNetProfit) class="kw">export { PositionData lastClosedPositionInfo; if(GetLastClosedPositionData(lastClosedPositionInfo)) { lastClosedPositionNetProfit = lastClosedPositionInfo.netProfit; class="kw">return(true); } class="kw">return(false); }
class="type">bool LastClosedPositionNetProfit(class="type">class="kw">double &lastClosedPositionNetProfit) class="kw">export { PositionData lastClosedPositionInfo; if(GetLastClosedPositionData(lastClosedPositionInfo)) { lastClosedPositionNetProfit = lastClosedPositionInfo.netProfit; class="kw">return(true); } class="kw">return(false); }