MT5 EA自动交易实战指南:从策略编写到实盘部署全流程
MT5 EA自动交易实战指南:从策略编写到实盘部署全流程
说出来可能有人不信:我统计过自己经手的四十多套MT5 EA,真正能在实盘稳定跑满三个月的不到三分之一。剩下的不是逻辑崩了,而是死在部署环节——参数没对齐、品种后缀没改、VPS掉线没人管。策略写得再漂亮,最后一步掉链子,账户照样挨打。黄金这种波动品种尤其明显,一个滑点处理不当,回测里盈利因子1.4的策略,实盘能给你干到0.9。

所以这篇不讲虚的,从代码骨架到实盘挂载,把整条链路走一遍。你手上有现成的EA可以直接跳到第三节。
先搞清楚你的策略在MT5里怎么落地
MT5和MT4的EA结构差异不小,最直接的是订单系统改成了MqlTradeRequest结构体。写黄金策略绕不开这几件事:点差过滤、滑点控制、持仓管理。给个最小可运行的骨架逻辑,伪代码形式,方便你套自己的策略:
- OnTick() 里先判断 NewBar(),避免每个tick都计算信号
- 用 CopyRates() 拉最近N根K线,计算你的指标值(比如ATR、均线偏离)
- 信号触发后,先检查 Spread 是否小于设定阈值,黄金在数据发布前后点差能扩大数倍
- 组装 MqlTradeRequest:action=TRADE_ACTION_DEAL,symbol=_Symbol,volume按风险百分比换算手数
- 用 OrderSend() 发送,检查返回码,10009是成功,10004是重新报价,10021是无效价格
注意一个坑:MT5默认是净持仓账户,如果你写的是对冲逻辑(同时持有多空),必须确认账户是 hedging 模式,否则第二单会直接平掉第一单。XM和Exness的MT5标准账户大多是净持仓,Exness的部分账户类型支持对冲,开户前问清楚。
常见错误:很多人直接把MT4的 OrderSend() 签名复制过来,编译报错还找不到原因。MT5的 OrderSend 返回的是 bool,实际结果要看 MqlTradeResult 结构体里的 retcode。
回测数据别只看胜率,这三个指标一起看
我见过太多人拿着胜率70%的回测报告来找我,一看盈利因子0.8——赚小亏大,胜率再高也是慢性失血。黄金EA的回测我通常看四个数:
- 盈利因子(Profit Factor):低于1.2的基本不用考虑实盘,1.5以上算及格
- 最大回撤(Max Drawdown):黄金策略回撤超过25%就要警惕,实盘往往更狠
- 交易次数:少于200次的回测样本没有统计意义
- 平均持仓时间:和你的策略逻辑是否匹配,剥头皮策略持仓几小时就不对劲
拿我最近调的一套黄金趋势EA举例。初始参数下,2020-2023年回测胜率58%,盈利因子1.1,最大回撤31%。问题出在止损太宽,黄金一波急拉直接打穿。把ATR倍数从3.0降到2.0,同时加入点差过滤(点差大于50点不进场),盈利因子提到1.6,回撤压到18%。改动就两行参数,效果差出一倍。
注意:MT5回测的「每个tick」模式最接近实盘,但速度慢。我一般先用「1分钟OHLC」快速筛参数,再用「每个tick」验证最终版本。历史数据质量很重要,在MT5里用「符号」右键导入真实tick数据,别用经纪商默认的合成数据。
从回测到实盘,中间隔着五个配置项
回测赚钱、实盘亏钱,八成是下面这几个地方没对齐:
品种后缀。XM的黄金代码是GOLD,Exness是XAUUSDm或XAUUSD,IC Markets是XAUUSD。EA里硬编码 _Symbol 一般没事,但如果你的代码里写了 "XAUUSD" 字符串,换经纪商直接失效。建议用 SymbolInfoString(_Symbol, SYMBOL_DESCRIPTION) 动态获取。
合约大小。标准黄金合约是100盎司/手,但Exness的某些账户类型是10盎司/手。手数换算公式要跟着改,否则风险敞口差10倍。这个坑我踩过,一笔本该0.1手的单子下成了1手,幸好止损及时。
止损水平(Stops Level)。不同经纪商对最小止损距离要求不同。Exness的黄金最小止损距离可能是0,但XM可能要求至少10个点。用 SYMBOL_TRADE_STOPS_LEVEL 动态读取,别写死。
VPS延迟。黄金对执行速度敏感。我实测过,同一套EA在普通VPS上平均滑点1.8个点,换到延迟低于5ms的VPS后降到0.6个点。按每月200笔交易算,光滑点就差出不少利润。选VPS看三点:离经纪商服务器近、内存至少2G、支持MT5的64位版本。
自动交易开关。MT5顶部工具栏那个「算法交易」按钮必须是绿色。很多人挂上EA发现没反应,就是这里没开。另外在「工具-选项-EA」里勾选「允许算法交易」,两个地方都要确认。
实盘运行后的排查清单
EA挂上去不是就完事了。我习惯在第一个月每天检查这几项:
- 日志里有没有 OrderSend 返回 10004(重新报价)或 10006(请求被拒绝)
- 实际成交价和信号价的偏差是否在可接受范围(黄金一般不超过2个点)
- 持仓手数和预期是否一致,尤其注意经纪商有没有悄悄改合约规格
- VPS内存占用,MT5跑久了内存泄漏不是新鲜事,超过500M就重启一次
遇到EA突然不交易,先看日志。最常见的是「invalid stops」——止损设得太近被拒。其次是「not enough money」——保证金不够,黄金波动大时占用保证金会临时上升。还有一种情况是周末收盘后EA还在跑,周一开盘第一笔单子容易出问题,建议在代码里加个交易时段过滤。
你在部署MT5 EA时遇到过哪种报错?是订单被拒、参数对不上,还是VPS半夜掉线?留言说说你的情况,我帮你看看日志里该翻哪一行。
免责声明:本文仅代表作者观点,不构成任何投资建议。市场有风险,交易需谨慎。
