Linux安装MT4 - MT4当日亏损达点自动停交易EA编写详解

理解MT4的订单与账户数据结构
在动手写代码之前,得先搞清楚MT4里跟订单和账户相关的几个关键函数。MT4的HistorySelect函数能按时间范围提取历史订单,而HistoryDealsGetTicket和HistoryDealsGetDouble则是用来遍历这些订单详情的关键工具。想要统计当日亏损,第一步就是把这些历史数据正确读出来,否则后面全是空中楼阁。
账户层面有个AccountInfoDouble函数,它可以返回账户的当前余额、净值、保证金占用等核心数据。不过要注意,这个函数返回的是实时快照,如果你想知道从零点到现在的累计盈亏,光看这个是不够的,必须结合已平仓订单的数据来计算。我一开始就犯过这个错误,直接拿净值跟昨日收盘净值比,结果因为持仓浮动的干扰,统计出来的数字完全不靠谱。
还有个细节容易被忽略,就是订单类型。MT4里订单分买入、卖出、限价单、止损单等好几种,统计亏损时应该只算已经平仓的市场单,那些挂单还没触发的不能算进去。另外,隔夜利息和手续费也需要考虑进去,因为它们会直接吞噬你的账户余额,如果忽略它们,统计出来的亏损点数和实际账户缩水之间会有偏差。
统计当日累计亏损的核心算法思路
要做当日亏损统计,最稳妥的办法是按时间戳过滤。每天凌晨零点是一个自然的分界点,你可以把这一天的开始时间设为当天0点0分0秒,结束时间设为当前时刻。在MT4的MQL4语言里,可以使用TimeCurrent函数获取服务器当前时间,然后用TimeToString把它转成日期字符串,再加上" 00:00:00"重新转回datetime类型,这样就能精确锁定当天的起始点。
遍历订单的时候,需要检查每个订单的平仓时间是否落在这个时间窗口内,同时确认订单是已经平仓的,不是还在持仓中的单子。对于符合条件的订单,用OrderProfit获取它的盈亏金额,用OrderCommission和OrderSwap分别获取手续费和隔夜利息。把这些数值全部累加起来,得到的就是当日已实现盈亏总额。如果这个总和是负数且绝对值大于等于你设定的X点,就触发停止交易的逻辑。
这里有个容易踩的坑,就是"点"和"金额"之间的换算关系。因为不同货币对、不同账户杠杆下,一个标准点对应的金额是不一样的。稳妥的做法是直接按金额来设定阈值,比如设定当日亏损超过200美元就停止交易。如果你确实想按点数来,那需要先明确是哪个交易品种的点值,再用点值乘以手数换算成金额。我个人其实建议直接用金额,因为账户风控说到底管的是钱,不是点数。
EA中实现自动停止交易的具体代码逻辑
核心代码其实并不复杂,关键是逻辑要清晰。在EA的OnTick函数开头,先调用一个自定义函数CalculateDailyLoss(),这个函数内部完成前面说的历史订单遍历和盈亏累加。
拿到当日亏损值后,用一个全局布尔变量g_isTradingAllowed来记录当前是否允许交易,如果亏损达到阈值,就把这个变量设为false。
在EA的OnInit初始化函数里,要把g_isTradingAllowed初始化为true,同时记录一下当天日期。要注意跨天重置的问题,因为新的一天开始时,亏损统计应该清零,交易权限也要恢复。所以每次调用OnTick时,先检查当前日期和记录的日期是否相同,如果不同就重置变量。这个细节很多人会忘,结果第二天EA一直不交易,还找不到原因。
当检测到亏损超标时,除了禁止开新仓,最好还能做两件事:一是把现有的挂单全部删除,防止它们意外触发成交;二是如果有持仓,可以考虑是否平仓。不过是否平仓这个要看个人策略,有些人只要求停止新开仓,让现有持仓继续跑完,有些人则希望彻底清仓离场。我把这个做成一个外部输入参数,用bool类型让使用者自己选。
完整EA代码框架与关键函数详解
下面我把一个可用的EA骨架写出来供参考。首先定义外部输入参数,包括触发停止的亏损金额阈值和是否清仓的开关。然后在OnTick里做日期检查、亏损统计、交易权限判断这三步。统计函数里用for循环从HistorySelect返回的订单总数减1开始向前遍历,这样能保证拿到的是最新的订单,效率也更高。
有个小技巧值得分享,就是HistorySelect的时间范围最好不要设成整整24小时,而是从当日零点到当前时间加一个小时的余量。这样做是为了防止某些经纪商服务器时间跟本地时间存在偏差,导致凌晨刚过几分钟的订单被误判为前一天。我实际测试过,加这一个小时的缓冲区能有效避免边界问题,而且不会影响统计准确性。
测试阶段建议先用模拟账户跑几天,把打印信息打开,在日志里输出每天的统计结果和触发记录。你可以手动做几笔亏损交易,看看EA是否在正确的时间点停止了交易。别嫌麻烦,这个验证步骤特别重要,因为如果边界条件处理不好,EA可能在净值已经亏了很多之后才启动保护,那就失去意义了。
最后提醒一下,这个EA只能管住它自己的交易逻辑,如果你同时开着多个EA或者手动交易,那它是拦不住其他途径开仓的。想要实现真正的全天候风控,要么把所有的交易入口都统一到这个EA管理下,要么用账户级别的风控工具。
对于大多数个人交易者来说,一个EA管理单一策略已经够用了,关键是要严格执行纪律。