MQL5 交易工具包(第 5 部分):使用仓位函数扩展历史管理 EX5 库·综合运用
(3/3)·从持仓时长到净盈亏,把 HistoryManager 库的用户级查询函数全量铺开
◍ 抓最近平仓的点数盈亏
做复盘或跟单逻辑时,经常要拿到上一笔平仓到底赚了多少点。下面这个函数只干一件事:从交易历史里翻出最近平仓记录的 pip 利润,塞进你传进来的引用变量里。 函数叫 LastClosedPositionPipProfit,入参是 int 类型的引用 lastClosedPositionPipProfit。内部先建了一个 PositionData 结构体的局部变量 lastClosedPositionInfo,再调 GetLastClosedPositionData 去取最近平仓数据。 如果取数成功,就把结构体里的 pipProfit 赋给引用变量,然后返回 true;取不到就原样返回 false,引用变量不会被改动。你在 EA 里只要判一下返回值,就能知道这笔历史抓取是否靠谱,再决定要不要拿这个点值去算后续加仓或风控阈值。 外汇和贵金属杠杆高、滑点随机,历史点利润只代表已发生结果,不能直接推下次平仓概率。
class="type">bool LastClosedPositionPipProfit(class="type">int &lastClosedPositionPipProfit) class="kw">export { PositionData lastClosedPositionInfo; if(GetLastClosedPositionData(lastClosedPositionInfo)) { lastClosedPositionPipProfit = lastClosedPositionInfo.pipProfit; class="kw">return(true); } class="kw">return(false); }
抓取最近平仓价的引用函数
在 MT5 的 EA 或指标里,想拿历史中最后一笔平仓单的出场价做基准,可以靠 LastClosedPositionClosePrice() 这个出口函数。它不自己翻历史,而是调 GetLastClosedPositionData() 拿到整条平仓记录,再把 closePrice 写进你传进来的引用变量。 函数签名是 bool LastClosedPositionClosePrice(double &lastClosedPositionClosePrice),返回布尔值:成功取到就改引用变量并返回 true,取不到则变量原样不动并返回 false。调用方靠返回值判断,比直接读全局变量更不容易踩空。 下面这段是原生实现,重点看引用符号 & 和内部那次委托调用:
class="type">bool LastClosedPositionClosePrice(class="type">class="kw">double &lastClosedPositionClosePrice) class="kw">export { PositionData lastClosedPositionInfo; if(GetLastClosedPositionData(lastClosedPositionInfo)) { lastClosedPositionClosePrice = lastClosedPositionInfo.closePrice; class="kw">return(true); } class="kw">return(false); }
class="type">bool LastClosedPositionClosePrice(class="type">class="kw">double &lastClosedPositionClosePrice) class="kw">export { PositionData lastClosedPositionInfo; if(GetLastClosedPositionData(lastClosedPositionInfo)) { lastClosedPositionClosePrice = lastClosedPositionInfo.closePrice; class="kw">return(true); } class="kw">return(false); }
「抓最近平仓单的开仓价」
做历史持仓复盘时,常需要拿到上一笔已平掉头寸的进场价。LastClosedPositionOpenPrice() 就是干这个的:它把最近平仓单的开仓价写进引用变量 lastClosedPositionOpenPrice,成功返回 true,失败保持原值并返回 false。 下面这段 MQL5 是函数本体,逻辑很薄,依赖 GetLastClosedPositionData() 去翻交易历史。 bool LastClosedPositionOpenPrice(double &lastClosedPositionOpenPrice) export { PositionData lastClosedPositionInfo; if(GetLastClosedPositionData(lastClosedPositionInfo)) { lastClosedPositionOpenPrice = lastClosedPositionInfo.openPrice; return(true); } return(false); } 逐行看:第1行定义导出函数,入参是 double 类型的引用,方便回写价格;第3行声明一个 PositionData 结构体存持仓数据;第4行调辅助函数捞最近平仓信息;第6行把结构体里的 openPrice 赋给引用变量;第7行成功退出;第9行失败直接返 false。 在 MT5 里把这段塞进你的 EA 或脚本,配合 GetLastClosedPositionData 的实现,就能在下一根 K 线开盘时对比新信号与上一笔平仓价,做价差过滤。外汇与贵金属波动大、滑点频繁,这类历史价读取只反映已成交记录,不预示后续走势。
class="type">bool LastClosedPositionOpenPrice(class="type">class="kw">double &lastClosedPositionOpenPrice) class="kw">export { PositionData lastClosedPositionInfo; if(GetLastClosedPositionData(lastClosedPositionInfo)) { lastClosedPositionOpenPrice = lastClosedPositionInfo.openPrice; class="kw">return(true); } class="kw">return(false); }
◍ 抓最近平仓单的止损价
在 MT5 回测或实盘复盘里,经常需要拿上一笔已平头寸的止损位做参考,比如判断当前挂单是否和上次止损聚类。LastClosedPositionSlPrice() 就是干这个的:它去交易历史里翻最近平仓的那条记录,把止损价写进你传进来的引用变量。 函数返回 bool。成功拿到数据就更新变量并返回 true;拿不到(比如历史里根本没有平仓记录)就不动变量、返回 false。调用方必须用返回值判断,别直接读变量,否则可能读到脏值。 下面这段是核心实现,依赖一个 GetLastClosedPositionData() 辅助函数去捞数据: bool LastClosedPositionSlPrice(double &lastClosedPositionSlPrice) export { PositionData lastClosedPositionInfo; if(GetLastClosedPositionData(lastClosedPositionInfo)) { lastClosedPositionSlPrice = lastClosedPositionInfo.slPrice; return(true); } return(false); } 逐行看:第1行定义导出函数,入参是 double 引用,方便回写;第3行建一个 PositionData 结构存结果;第4行调辅助函数,成功才进分支;第6行把结构里的 slPrice 赋给引用变量;第7行返回 true;拿不到就掉到第9行返回 false。 外汇和贵金属波动大、滑点频繁,历史止损价只反映过去那笔的退出逻辑,不能直接当下一单的入场依据,参考时务必结合当下波动环境。
class="type">bool LastClosedPositionSlPrice(class="type">class="kw">double &lastClosedPositionSlPrice) class="kw">export { PositionData lastClosedPositionInfo; if(GetLastClosedPositionData(lastClosedPositionInfo)) { lastClosedPositionSlPrice = lastClosedPositionInfo.slPrice; class="kw">return(true); } class="kw">return(false); }
抓最近平仓的止盈价怎么写
做复盘或跟单逻辑时,常需要拿到上一笔已平订单的止盈位。下面这个函数只干一件事:从交易历史里翻出最近平仓单的 TP 价格,塞进你传进来的引用变量里。 函数返回 bool。能查到就改写引用变量并返回 true;查不到就保持原值并返回 false,调用方得自己判断这个结果,别默认一定有数。
class="type">bool LastClosedPositionTpPrice(class="type">class="kw">double &lastClosedPositionTpPrice) class="kw">export { PositionData lastClosedPositionInfo; if(GetLastClosedPositionData(lastClosedPositionInfo)) { lastClosedPositionTpPrice = lastClosedPositionInfo.tpPrice; class="kw">return(true); } class="kw">return(false); }
class="type">bool LastClosedPositionTpPrice(class="type">class="kw">double &lastClosedPositionTpPrice) class="kw">export { PositionData lastClosedPositionInfo; if(GetLastClosedPositionData(lastClosedPositionInfo)) { lastClosedPositionTpPrice = lastClosedPositionInfo.tpPrice; class="kw">return(true); } class="kw">return(false); }
「抓最近平仓的止损点数」
想复盘上一笔离场单亏了多少点,直接调 LastClosedPositionSlPips() 就能拿到最近平仓位的止损点数(pips),不用自己翻历史池。 函数声明里用了 int& 引用传参,意味着 lastClosedPositionSlPips 会在函数内被直接改写;外部传进来的旧值,只有在取数失败时才保留原样。 内部先调 GetLastClosedPositionData() 取结构,成功就把结构体里的 slPips 赋给引用变量并返回 true,失败直接返回 false。在 MT5 里接这个函数,用返回值判断比读变量更稳,避免拿到脏数据还以为正常。 外汇与贵金属杠杆高、滑点大,该点数仅反映已平仓单的设定止损距离,不代表实际盈亏,验证时请结合成交明细。
class="type">bool LastClosedPositionSlPips(class="type">int &lastClosedPositionSlPips) class="kw">export { PositionData lastClosedPositionInfo; if(GetLastClosedPositionData(lastClosedPositionInfo)) { lastClosedPositionSlPips = lastClosedPositionInfo.slPips; class="kw">return(true); } class="kw">return(false); }
◍ 抓最近平仓单的止盈点数
做复盘或跟单逻辑时,经常要拿到上一笔已平掉持仓的止盈设置到底是多少点。LastClosedPositionTpPips() 就是干这个的:它把最近平仓单的 tp 点数写进一个引用变量,成功就回 true,拿不到就回 false 且变量不动。 这个函数本身很薄,真正找数据的活交给 GetLastClosedPositionData()。只要后者能填出 PositionData 结构里的 tpPips 字段,它就原样转交,调用层据此判断要不要继续跑后续策略。 外汇和贵金属波动快、点差跳变频繁,这类历史平仓数据在高波动时段可能延迟刷新,回测或实盘读到的点数和实际成交环境存在偏差,属于正常概率现象,验证时建议在 MT5 策略测试器里先跑一轮。
class="type">bool LastClosedPositionTpPips(class="type">int &lastClosedPositionTpPips) class="kw">export { PositionData lastClosedPositionInfo; if(GetLastClosedPositionData(lastClosedPositionInfo)) { lastClosedPositionTpPips = lastClosedPositionInfo.tpPips; class="kw">return(true); } class="kw">return(false); }
抓最近平仓单的开仓时刻
在 EA 回测或实盘里,经常需要参照上一张已平掉订单是何时进场的。LastClosedPositionOpenTime() 就是干这个的:它把最近平仓单的 openTime 写进你传进去的引用变量,成功就回 true,失败保持原值并回 false。 调用前要确保底层 GetLastClosedPositionData() 能拿到历史平仓记录;若账户历史被清空或同步延迟,函数会直接返回 false,变量不会被篡改。 下面这段是函数本体,逻辑极短但容易在引用传参上踩坑: 别把引用当普通变量 传参必须带 &,否则编译期就报错;调用方拿到的 lastClosedPositionOpenTime 只在返回 true 时才有效,false 时别拿去算间隔,否则可能用的是上一次的旧值。
class="type">bool LastClosedPositionOpenTime(class="type">class="kw">datetime &lastClosedPositionOpenTime) class="kw">export { PositionData lastClosedPositionInfo; if(GetLastClosedPositionData(lastClosedPositionInfo)) { lastClosedPositionOpenTime = lastClosedPositionInfo.openTime; class="kw">return(true); } class="kw">return(false); }
「抓最近平仓时间的那一层封装」
在回测或实盘里,想知道上一笔仓位什么时候平掉,最直接的入口就是 LastClosedPositionCloseTime()。它把最近平仓的 close time 写进一个 datetime 引用变量,成功返回 true,失败返回 false,调用方据此判断是否拿到了有效时间。 函数内部其实很薄:先调 GetLastClosedPositionData() 去取最近平仓的结构体,取到后把 closeTime 赋给入参引用并返回 true;取不到就直接返回 false,入参保持原值不动。 这种写法意味着,如果你在 EA 里用它做「距上次平仓超过 N 分钟才允许开新仓」的节流逻辑,必须判断返回值。否则当历史里没有平仓记录时,lastClosedPositionCloseTime 可能是个脏值,会让你误判冷却期已过的状态。外汇与贵金属杠杆高,这类时间窗误判可能放大无效交易频次。
class="type">bool LastClosedPositionCloseTime(class="type">class="kw">datetime &lastClosedPositionCloseTime) class="kw">export { PositionData lastClosedPositionInfo; if(GetLastClosedPositionData(lastClosedPositionInfo)) { lastClosedPositionCloseTime = lastClosedPositionInfo.closeTime; class="kw">return(true); } class="kw">return(false); }
◍ 抓最近平仓的库存费放进变量
在 EA 或脚本里想拿「上一笔已平仓位吃了多少库存费」,可以交给 LastClosedPositionSwap() 这个函数。它不自己翻历史,而是调用 GetLastClosedPositionData() 去取最近平仓的明细,再把其中的 swap 字段写进你传进来的引用变量。 函数签名带 export,说明它能被其他 mq5 模块直接引用,不用重复写历史检索逻辑。入参是 double &lastClosedPositionSwap,用引用方式改值,调用方传一个 double 变量就行。 成功路径很直接:GetLastClosedPositionData() 返回 true 时,把 lastClosedPositionInfo.swap 赋给入参,函数返回 true;失败则该引用变量保持原值,函数返回 false。调用方务必判断返回值,别默认变量已被更新。 外汇与贵金属持仓过夜会产生库存费,正负皆有可能,属高风险品种下的常规成本项;用这个函数做平仓后成本统计或策略衰减分析时,先在 MT5 策略测试器里跑一笔带过夜的平仓验证返回值。
class="type">bool LastClosedPositionSwap(class="type">class="kw">double &lastClosedPositionSwap) class="kw">export { PositionData lastClosedPositionInfo; if(GetLastClosedPositionData(lastClosedPositionInfo)) { lastClosedPositionSwap = lastClosedPositionInfo.swap; class="kw">return(true); } class="kw">return(false); }
抓最近平仓的佣金落点
做返佣统计或成本复盘时,最常被忽略的就是已平单的佣金字段。下面这个函数只干一件事:把最近一笔平仓的佣金写进一个引用变量,成功返回 true,失败返回 false,调用方据此决定要不要继续算账。 函数声明了一个 double 类型的引用参数 lastClosedPositionCommission,并带 export 修饰,意味着其他 mqh/mq5 模块也能直接引。内部先建一个 PositionData 结构体实例 lastClosedPositionInfo,交给 GetLastClosedPositionData() 去填最近平仓的数据。 若取数成功,就把结构体里的 commission 赋给引用变量,返回 true;取数失败则引用变量保持原值,返回 false。这样设计的好处是调用处不用判空,只看布尔返回值就能分支处理。 外汇与贵金属交易杠杆高、佣金虽小但频次大,多次平仓累积的成本可能明显侵蚀净值,建议把这个返回值接进你的每日盯盘脚本里验证。
class="type">bool LastClosedPositionCommission(class="type">class="kw">double &lastClosedPositionCommission) class="kw">export { PositionData lastClosedPositionInfo; if(GetLastClosedPositionData(lastClosedPositionInfo)) { lastClosedPositionCommission = lastClosedPositionInfo.commission; class="kw">return(true); } class="kw">return(false); }
「抓出最近平仓的建仓来源」
在 MT5 的持仓闭环分析里,分清一笔已平仓位当初是市价单砸进去的还是挂单触发的,直接决定你复盘时归哪类策略。LastClosedPositionInitiatingOrderType() 就是干这个的:它把最近平仓位的初始订单类型写进引用变量 lastClosedPositionInitiatingOrderType,类型涵盖买入止损、买入限价、卖出止损、卖出限价、买入止损限价、卖出止损限价,以及直接入场。 函数跑通时返回 true,并把 initOrderType 赋值给外部变量;若底层取数失败则返回 false,变量原值不动,调用方据此判断要不要跳过这次统计。外汇与贵金属杠杆高,历史订单类型只是行为痕迹,不构成方向结论。 下面这段是原生 MQL5 实现,注意它依赖 GetLastClosedPositionData() 先拿到整条平仓记录: bool LastClosedPositionInitiatingOrderType(ENUM_ORDER_TYPE &lastClosedPositionInitiatingOrderType) export { PositionData lastClosedPositionInfo; if(GetLastClosedPositionData(lastClosedPositionInfo)) { lastClosedPositionInitiatingOrderType = lastClosedPositionInfo.initiatingOrderType; return(true); } return(false); } 逐行看:第1行声明导出函数,入参是订单类型引用;第3行定义本地持仓结构;第4行尝试获取最近平仓数据;第6行把结构里的建仓类型赋给引用变量;第7行成功返 true;第9行失败返 false。开 MT5 挂上这段,打印 lastClosedPositionInitiatingOrderType 就能验证你上周平的黄金仓是哪类单子开的。
class="type">bool LastClosedPositionInitiatingOrderType(ENUM_ORDER_TYPE &lastClosedPositionInitiatingOrderType) class="kw">export { PositionData lastClosedPositionInfo; if(GetLastClosedPositionData(lastClosedPositionInfo)) { lastClosedPositionInitiatingOrderType = lastClosedPositionInfo.initiatingOrderType; class="kw">return(true); } class="kw">return(false); }
◍ 抓最近平仓仓位的 ID 怎么写
在 EA 里追踪「上一笔平仓」往往是为了做连续性统计或防重复处理。LastClosedPositionId() 这个函数只干一件事:把最近平仓的仓位 ID 写进你传进去的引用变量里。 它内部先调 GetLastClosedPositionData() 去拿最近平仓的明细,拿到就提取 positionId 赋值给 lastClosedPositionId,然后返回 true;拿不到就原样不动、返回 false。调用方靠返回值判断成败,比直接读全局变量更稳。 外汇与贵金属杠杆高、滑点可能让平仓记录延迟,实战中建议调用后判 false 就跳过本次逻辑,别拿旧 ID 当新信号。
class="type">bool LastClosedPositionId(class="type">ulong &lastClosedPositionId) class="kw">export { PositionData lastClosedPositionInfo; if(GetLastClosedPositionData(lastClosedPositionInfo)) { lastClosedPositionId = lastClosedPositionInfo.positionId; class="kw">return(true); } class="kw">return(false); }
识别最近平仓是否由挂单触发
在 EA 回测或实盘统计里,区分「市价平仓」和「挂单成交后平仓」很关键。下面这个函数把最近一笔已平仓位是否源于挂单,写进一个布尔引用变量,方便后续逻辑分流。 函数 LastClosedPositionInitiatedByPendingOrder 接收一个 bool 型引用参数 lastClosedPositionInitiatedByPendingOrder。它先调用 GetLastClosedPositionData 捞取最近平仓数据;若成功,就把结构体里的 initiatedByPendingOrder 字段赋给引用变量并返回 true,失败则原值不动并返回 false。
class="type">bool LastClosedPositionInitiatedByPendingOrder(class="type">bool &lastClosedPositionInitiatedByPendingOrder) class="kw">export { PositionData lastClosedPositionInfo; if(GetLastClosedPositionData(lastClosedPositionInfo)) { lastClosedPositionInitiatedByPendingOrder = lastClosedPositionInfo.initiatedByPendingOrder; class="kw">return(true); } class="kw">return(false); }
class="type">bool LastClosedPositionInitiatedByPendingOrder(class="type">bool &lastClosedPositionInitiatedByPendingOrder) class="kw">export { PositionData lastClosedPositionInfo; if(GetLastClosedPositionData(lastClosedPositionInfo)) { lastClosedPositionInitiatedByPendingOrder = lastClosedPositionInfo.initiatedByPendingOrder; class="kw">return(true); } class="kw">return(false); }
「抓最近平仓单的开仓母单编号」
做平仓后回测或跟单逻辑时,经常需要反查「这一笔平仓当初是由哪张开仓订单生成的」。MQL5 里用 LastClosedPositionOpeningOrderTicket() 把最近平仓头寸对应的开仓订单编号写进引用变量,成功返回 true,失败保持原值并返回 false。 函数签名是 bool LastClosedPositionOpeningOrderTicket(ulong &lastClosedPositionOpeningOrderTicket),带 export 修饰说明可被其他模块直接调用。内部先声明 PositionData 结构体实例,再调 GetLastClosedPositionData() 取最近平仓数据;若取到,就把 openingOrderTicket 赋给入参引用并返回 true,否则返回 false。 实盘里若你要统计「最近平仓的单子盈亏比对其原始挂单价」,就得靠这个编号去翻历史订单。外汇与贵金属波动剧烈、滑点频发,该函数只解决编号获取,不保证历史订单未被平台清理,调用前需自行确认账户历史已同步。
class="type">bool LastClosedPositionOpeningOrderTicket(class="type">ulong &lastClosedPositionOpeningOrderTicket) class="kw">export { PositionData lastClosedPositionInfo; if(GetLastClosedPositionData(lastClosedPositionInfo)) { lastClosedPositionOpeningOrderTicket = lastClosedPositionInfo.openingOrderTicket; class="kw">return(true); } class="kw">return(false); }
◍ 抓最近平仓单的开仓成交号
在跟单或复盘逻辑里,经常需要反查某笔已平仓头寸最初是怎么建进去的。LastClosedPositionOpeningDealTicket() 就是干这个的:它把最近平仓头寸对应的开仓成交编号写进引用变量 lastClosedPositionOpeningDealTicket。 函数返回 true 表示查到了,变量被更新为真实开仓 deal ticket;返回 false 表示没查到,变量保持原值不动。这个设计让调用方可以用 if 直接判断,不必担心误用旧编号。 下面这段是 MT5 里的实际写法,注意参数用了 ulong& 引用传递,函数标了 export 方便跨文件调用: bool LastClosedPositionOpeningDealTicket(ulong &lastClosedPositionOpeningDealTicket) export { PositionData lastClosedPositionInfo; if(GetLastClosedPositionData(lastClosedPositionInfo)) { lastClosedPositionOpeningDealTicket = lastClosedPositionInfo.openingDealTicket; return(true); } return(false); } 逐行看:第1行定义函数,入参是开仓编号的引用,export 暴露给其它模块。第3行声明一个 PositionData 结构存平仓信息。第4行调 GetLastClosedPositionData 尝试取最近平仓数据。第6行把结构里的 openingDealTicket 赋给引用变量。第7行成功返回 true。第9行失败返回 false。 开 MT5 新建一个 mqh,把这段代码贴进去,再配一个能填 lastClosedPositionInfo 的 GetLastClosedPositionData,就能在 EA 里直接拿到上一笔平仓的原始开仓单号,外汇和贵金属品种都适用,但这类历史反查在 tick 跳空时可能失效,属正常高风险环境现象。
class="type">bool LastClosedPositionOpeningDealTicket(class="type">ulong &lastClosedPositionOpeningDealTicket) class="kw">export { PositionData lastClosedPositionInfo; if(GetLastClosedPositionData(lastClosedPositionInfo)) { lastClosedPositionOpeningDealTicket = lastClosedPositionInfo.openingDealTicket; class="kw">return(true); } class="kw">return(false); }
抓取最近平仓的成交单号
在 MT5 的 EA 调试里,经常需要回看上一笔平仓是由哪张成交单(deal)收尾的。这个对外暴露的函数干的事很纯粹:把最近平仓对应的成交编号写进一个引用变量,成功就返 true,拿不到就返 false 且变量原值不动。 底层依赖 GetLastClosedPositionData() 去翻账户历史里的最后一笔平仓记录,再把其中的 closingDealTicket 字段抽出来。注意它传参用的是 ulong & 引用,调用方必须事先声明一个 ulong 变量承接,否则编译直接报错。 外汇与贵金属品种在高波动时段平仓频繁,这种取号逻辑若用在跟单或对冲判定上,要意识到历史缓存可能因服务器同步延迟出现一两次偏差,属正常概率风险。
class="type">bool LastClosedPositionClosingDealTicket(class="type">ulong &lastClosedPositionClosingDealTicket) class="kw">export { PositionData lastClosedPositionInfo; if(GetLastClosedPositionData(lastClosedPositionInfo)) { lastClosedPositionClosingDealTicket = lastClosedPositionInfo.closingDealTicket; class="kw">return(true); } class="kw">return(false); }
「抓最近平仓的幻数怎么写」
在 EA 里区分不同策略的持仓,幻数是关键标签。想读取「最近一笔已平仓位」用的幻数,可以封装一个带引用参数的函数,把结果直接写回调用方的变量。 下面这个函数只做一件事:调 GetLastClosedPositionData() 拿到最近平仓的结构体,若成功就把其中的 magic 赋给传入的引用变量 lastClosedPositionMagic,并返回 true;拿不到就原样返回 false,变量不被改动。 实战里你可以用返回值判断历史缓存是否失效——比如返回 false 时跳过后续信号逻辑,避免用过期幻数去匹配当前订单。外汇与贵金属杠杆高,历史数据缺口可能导致检索失败,务必在调用处处理这种分支。
class="type">bool LastClosedPositionMagic(class="type">ulong &lastClosedPositionMagic) class="kw">export { PositionData lastClosedPositionInfo; if(GetLastClosedPositionData(lastClosedPositionInfo)) { lastClosedPositionMagic = lastClosedPositionInfo.magic; class="kw">return(true); } class="kw">return(false); }
◍ 抓取末平仓备注的轻量封装
在 EA 调试或跟单复盘时,经常要拿到刚刚平掉那笔单子写进去的自定义备注。LastClosedPositionComment() 做的就是这件事:它把最近平仓的 comment 字段塞进一个引用字符串里,成不成功靠返回值说话。 函数签名带 export,说明它能被其他模块直接调,不用再包一层。入参是 string &lastClosedPositionComment,引用传参避免了字符串拷贝,MT5 里处理长备注时也省点开销。 内部只调了 GetLastClosedPositionData() 拿整体仓位数据,再从中取 comment 赋值。若底层取数失败,外部变量原样不动并返回 false,调用方据此判断要不要走兜底逻辑。
class="type">bool LastClosedPositionComment(class="type">class="kw">string &lastClosedPositionComment) class="kw">export { PositionData lastClosedPositionInfo; if(GetLastClosedPositionData(lastClosedPositionInfo)) { lastClosedPositionComment = lastClosedPositionInfo.comment; class="kw">return(true); } class="kw">return(false); }
class="type">bool LastClosedPositionComment(class="type">class="kw">string &lastClosedPositionComment) class="kw">export { PositionData lastClosedPositionInfo; if(GetLastClosedPositionData(lastClosedPositionInfo)) { lastClosedPositionComment = lastClosedPositionInfo.comment; class="kw">return(true); } class="kw">return(false); }
抓取最近平仓的持仓秒数
在 EA 回测或实盘监控里,知道上一笔平仓单扛了多久,往往比看盈亏本身更能暴露策略的持仓偏好。下面这个函数只干一件事:把最近平仓的持续时间以秒为单位捞出来,塞进一个引用变量里。 函数签名是 bool LastClosedPositionDuration(long &lastClosedPositionDuration),带 export 说明它可被其他模块直接调用。内部先声明一个 PositionData 结构的 lastClosedPositionInfo,随后调用 GetLastClosedPositionData() 去取最近平仓的明细。 若取数成功,就把结构体里的 duration 字段赋给入参引用变量,并返回 true;取不到就原样不动、返回 false。调用方靠这个布尔值判断要不要信任拿到的秒数,避免拿脏数据去算平均持仓时长。 外汇与贵金属杠杆高、滑点随机,这套秒级统计只能作为行为画像参考,不能单独用作进场依据。
class="type">bool LastClosedPositionDuration(class="type">long &lastClosedPositionDuration) class="kw">export { PositionData lastClosedPositionInfo; if(GetLastClosedPositionData(lastClosedPositionInfo)) { lastClosedPositionDuration = lastClosedPositionInfo.duration; class="kw">return(true); } class="kw">return(false); }
「把库拆细之后怎么接着往下写」
这一节把前面几篇攒下的思路收了一下:把取最近平仓属性的小函数单独隔离出来,EX5 库整体保持模块清晰,HistoryManager.mq5 当前版本 55.17 KB,比第一版的 33.95 KB 胖了一圈,但逻辑边界更干净。你打开 MT5 的 MetaEditor 载入这个文件,能直接看到上篇和本篇的函数都已经在同一个命名空间里协同。 下一篇才会补上「最后完成和取消的挂单」属性提取函数,再往后要做的是基于历史数据跑分析报告的函数。外汇和贵金属行情跳空频繁,这类历史统计只反映过去样本,实盘复用前先在策略测试器用最近 3 个月 tick 数据回一遍。 库按这个节奏一块块叠,不会一次塞太多东西。你今晚如果闲着,可以把 HistoryManager.mq5 里 GetLastClosedProfit() 这类函数单独拎出来,挂到自己的 EA 里试调一次参数。