目录

MT4重新报价 - MT4平仓自动发邮件通知代码编写详解

MT4平仓自动发邮件通知代码编写详解
TITLE: MT4平仓自动发邮件通知代码编写详解

很多外汇交易者在使用MT4平台时,都希望能在每次平仓后自动收到一封邮件通知,这样可以及时掌握交易动态,不用一直盯着屏幕。这个功能其实通过编写一个简单的EA就能实现,而且代码逻辑并不复杂。今天我就来手把手教大家如何在MetaTrader 4的EA里编写平仓后的邮件发送代码,整个过程我会尽量说得通俗易懂,毕竟我自己也是从零开始摸索过来的。

准备工作:开启MT4邮件功能并配置SMTP

在动手写代码之前,你得先确认MT4的邮件发送功能是开启的。很多人卡在这一步,以为代码写对了就能发邮件,结果半天收不到任何东西。其实MT4本身需要配置一个SMTP服务器,说白了就是需要一个“邮局”帮你把邮件发出去。这个配置在MT4的“工具”菜单下的“选项”里,找到“邮件”标签页。

你需要填写的参数包括SMTP服务器地址、端口号、以及你的邮箱账号和密码。我建议使用QQ邮箱或者Gmail的SMTP服务,因为这两个比较稳定。比如QQ邮箱的SMTP地址是smtp.qq.com,端口用465,然后记得开启SSL加密。这里有个小坑:如果你用的是QQ邮箱,得去邮箱设置里生成一个授权码,而不是直接填你的QQ密码,否则会报错。

配置好之后,你可以点击“测试”按钮,MT4会尝试发送一封测试邮件到你的邮箱。如果收到了,说明配置没问题;如果没收到,那就检查一下端口、账号密码或者防火墙设置。说实话,这一步花了我不少时间,因为一开始我忘了开启SSL,结果折腾了半天才发现。所以一定要先确认邮件功能能正常工作,否则后面写的代码全是白费力气。

编写EA核心代码:检测平仓事件并触发邮件发送

接下来就是重头戏了,我们要在EA里编写代码来检测平仓事件。MT4的EA通常运行在OnTick()函数里,但平仓事件并不是每次报价都会触发的,所以我们需要在OnTrade()或者OnDeinit()函数里做文章。我个人的习惯是用OnTrade()函数,因为它专门处理交易事件,包括开仓、平仓、修改订单等。

在OnTrade()函数里,我们需要记录平仓的订单信息。具体做法是:在EA初始化的时候,先获取当前所有持仓订单的票号,然后每次OnTrade()被调用时,对比之前的票号列表,看哪些订单消失了。消失的那些就是被平仓的订单。然后我们把这些消失的订单信息提取出来,比如开仓时间、平仓时间、盈亏金额、货币对等,拼成一封邮件的内容。

这里有个关键点:OnTrade()函数可能会被多次调用,比如同一个订单平仓后,可能会触发多次事件。为了避免重复发送邮件,我通常会加一个标志位或者记录已发送邮件的订单票号列表。说白了就是建一个数组,每次发送前检查一下这个订单的票号是否已经在数组里,如果在就跳过,不在就发送并加入数组。这样就能保证每个平仓订单只发一次邮件。

邮件内容格式化:让通知信息清晰易懂

邮件内容不能太随便,否则你收到邮件后还得自己手动分析,那就失去自动化的意义了。我一般会把邮件内容写成类似这样的格式:“订单平仓通知:EURUSD,开仓时间2023-10-01 10:00,平仓时间2023-10-01 15:30,盈亏+50美元,平仓原因止损/止盈/手动平仓”。这样一看就明白这单是赚是赔,什么原因平掉的。

获取这些信息需要用到订单历史记录函数,比如OrderSelect()和OrderHistoryTotal()。在OnTrade()函数里,当检测到有订单被平仓后,我们可以用OrderSelect()根据票号选中这个订单,然后读取OrderOpenTime()、OrderCloseTime()、OrderProfit()、OrderSymbol()等属性。注意,平仓后的订单会进入历史记录,所以要用历史记录的选择方式。

别忘了处理盈亏金额的显示格式。如果盈利,前面加个“+”号,亏损加个“-”号,这样一目了然。我还会把盈亏点数也加上,这样能更直观地看到波动。另外,平仓原因这块比较难判断,因为MT4没有直接提供“平仓原因”这个字段。我通常的做法是:如果订单的止损价和开仓价很接近,那可能就是止损平仓;如果止盈价和开仓价接近,那就是止盈平仓;否则就认为是手动平仓。虽然不完美,但够用了。

代码调试与常见问题解决

写完代码后,千万别急着直接挂到实盘上,一定要先在模拟账户上跑一跑。我建议你手动开几个模拟单,然后手动平仓,看看邮件能不能正常收到。如果没收到,首先检查MT4的“日志”窗口,那里会显示SendMail()函数的返回值或者错误信息。常见的错误是“邮件发送失败,SMTP连接超时”,这通常是因为网络问题或者SMTP配置不对。

还有一个容易忽略的问题:MT4的SendMail()函数一次只能发送一封邮件,而且发送频率有限制。如果你在短时间内平仓了很多单,可能会触发平台的限制导致邮件发不出去。解决办法是加一个延时,比如每次发送后等待几秒钟再发送下一封。或者干脆把多个订单的信息合并到一封邮件里,这样既节省资源又不会错过通知。

说实话,我在调试过程中遇到最头疼的问题是OnTrade()函数被重复调用导致的重复邮件。后来我用了上面提到的票号记录列表才解决。另外,如果你用的是多个MT4终端同时运行同一个EA,要小心票号冲突,因为不同终端的票号可能重复。这种情况下,最好在邮件内容里加上终端名称或者账户编号来区分。

文章目录