目录

MT4日志清理 - MT4平仓邮件通知设置与EA代码编写实战

MT4平仓邮件通知设置与EA代码编写实战
每次平仓后自动收到邮件通知,对于需要时刻掌握账户动态的交易者来说,简直就是一种效率上的解放。说实话,MT4平台虽然功能强大,但默认并没有提供平仓后自动发邮件的功能,这就需要我们借助MetaEditor编写一个简单的EA程序来实现。
你可能会觉得写代码很复杂,但实际操作下来,只需要几十行MQL4代码就能搞定,而且整个过程并不需要你成为编程专家。

准备工作:开启MT4的邮件功能

在编写代码之前,必须先确保MT4的邮件系统能够正常收发邮件。打开MT4平台,点击“工具”菜单,选择“选项”,然后切换到“邮件”选项卡。这里需要填写你的邮箱服务器信息,包括SMTP服务器地址、端口号、以及你的邮箱账号和密码。以QQ邮箱为例,SMTP服务器是smtp.qq.com,端口号通常使用587或465,具体取决于你的安全设置。

填好信息后,点击“测试”按钮,MT4会尝试发送一封测试邮件到你填写的邮箱地址。如果测试成功,你的邮箱会收到一封来自MT4的邮件,这就代表邮件功能已经配置完毕。如果测试失败,大概率是邮箱的SMTP服务没有开启,或者授权码设置有误。很多邮箱现在都要求使用独立的授权码而不是登录密码,这一点需要特别注意。

邮件功能一旦配置成功,后面的事情就简单多了。你只需要在EA中调用SendMail函数,就能让MT4在平仓后自动发送邮件。实际上,SendMail函数的使用非常直接,它接受一个字符串参数,这个字符串就是你想要发送的邮件内容。但这里有一个关键点:SendMail函数只能发送纯文本内容,不能包含HTML格式,所以邮件内容要写得简洁明了。

EA代码核心:检测平仓事件

编写平仓邮件通知EA的核心逻辑,其实就是实时监控订单状态的变化。MQL4中有一个非常实用的函数叫做OnTrade,它会在任何交易事件发生时被自动调用,包括开仓、平仓、修改止损止盈等。我们只需要在OnTrade函数内部编写代码,判断当前是否发生了平仓事件,然后触发邮件发送。

具体来说,我们可以使用OrdersHistoryTotal函数获取历史订单的总数,然后通过循环遍历OrdersHistoryTotal返回的所有历史订单。每次OnTrade被调用时,将当前的历史订单总数与上一次记录的数量进行比较,如果数量增加了,就说明有新的平仓订单产生。然后我们读取这个新订单的详细信息,比如开仓时间、平仓时间、盈亏点数、交易品种等,把这些信息拼接到邮件内容中。

这里有一个小技巧需要注意:历史订单列表中可能包含已经平仓的挂单,为了确保只发送真实交易订单的通知,我们需要过滤掉订单类型为OP_BUYLIMIT、OP_SELLLIMIT等挂单类型的订单。判断标准很简单,如果订单类型是OP_BUY或OP_SELL,并且订单的关闭时间大于0,那就说明这是一个真正的平仓订单。用代码写出来就是if(OrderType() <= OP_SELL && OrderCloseTime() > 0)。

邮件内容构建:让通知更实用

一封有用的平仓通知邮件,至少应该包含交易品种、开仓方向、手数、平仓价格、盈亏金额和盈亏点数这几个关键信息。你可以根据自己的需求,决定是否加入账户余额、净值等附加信息。我个人习惯把盈亏金额放在邮件标题里,这样在手机通知栏里就能一眼看到这笔交易是赚是亏,不用点开邮件就能掌握大概情况。

在构建邮件内容时,字符串拼接是避免不了的。MQL4中可以使用StringConcatenate函数或者直接使用+号拼接字符串。为了代码的可读性,建议使用StringConcatenate,它在处理大量字符串时性能更好。举个例子,StringConcatenate("品种:", Symbol(), " 方向:", OrderTypeText(OrderType()), " 手数:", DoubleToStr(OrderLots(), 2), " 盈亏:", DoubleToStr(OrderProfit(), 2)),这样拼出来的内容就很清晰。

如果你希望邮件内容更丰富一点,还可以加入平仓时的账户总余额和净值,这样每次平仓后你都能看到账户的整体变化趋势。不过需要注意的是,邮件内容不要写得太长,毕竟手机屏幕显示空间有限,读者扫一眼就能获取关键信息才是最好的。我通常把邮件内容控制在5行以内,包括标题在内,这样阅读体验会非常好。

完整EA代码示例与部署步骤

下面是一个完整的平仓邮件通知EA代码示例,你可以直接复制到MetaEditor中使用。这个EA的核心逻辑已经在上文提到,这里把代码整合起来,方便你直接编译使用。代码中包含了必要的错误处理和注释,新手也能看得懂。需要特别说明的是,这个EA不会进行任何交易操作,它只是一个纯粹的监控工具。

int totalOrders = 0; void OnInit() { totalOrders = OrdersHistoryTotal(); } void OnTick() { if(OrdersHistoryTotal() != totalOrders) { for(int i = OrdersHistoryTotal() - 1; i >= 0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { if(OrderType() <= OP_SELL && OrderCloseTime() > 0 && OrderMagicNumber() == 0) { string subject = "平仓通知: " + Symbol(); string body = "品种: " + OrderSymbol() + " 方向: " + (OrderType() == OP_BUY ? "买入" : "卖出") + " 手数: " + DoubleToStr(OrderLots(), 2) + " 盈亏: " + DoubleToStr(OrderProfit(), 2); SendMail(subject, body); } } } totalOrders = OrdersHistoryTotal(); } }。这段代码虽然短,但已经覆盖了核心功能,你只需要根据自己的需求微调邮件内容的格式即可。

部署这个EA非常简单,打开MetaEditor(按F4),新建一个EA文件,把上面的代码粘贴进去,然后编译一下。编译成功后,把生成的.ex4文件拖到MT4的某个图表上,EA就开始运行了。注意,为了让EA持续监控平仓事件,建议把EA放在一个24小时运行的图表上,比如EURUSD的1分钟周期,这样即使你不在电脑前,EA也能正常工作。

实际使用中,你可能会遇到一个问题:如果MT4在短时间内连续平仓多笔订单,邮件发送可能会有延迟。这是因为MT4的邮件队列处理速度有限,但一般不会丢失通知。如果你对实时性要求非常高,可以考虑使用Telegram通知替代邮件,但那需要额外的API调用,代码复杂度会高一些。对于绝大多数交易者来说,邮件通知已经完全足够用了。

文章目录