MetaTrader 5 EA 开发:从策略到实盘账户
MT5 EA 如何开发:EA 与指标的区别、把策略写成规格说明、MQL5 结构、风险管理、回测、优化与 VPS。
MetaTrader 5(MT5)是外汇、大宗商品和指数市场中广泛使用的交易平台。它最强大的地方在于,用 MQL5 语言编写的程序可以在图表上运行,并自行开仓和平仓。这类程序被称为智能交易系统(Expert Advisor,简称 EA)。我是 Berke Özyaşar,为 MetaTrader 4 和 5 开发 EA 和指标,也为 TradingView 开发 Pine Script 指标。在这篇文章中,我会介绍一个 EA 项目从头到尾如何推进,尤其是流程中代码之外的部分。
EA 还是指标?
这通常是第一个问题。两者都用 MQL5 编写,但作用不同:
- 指标在图表上绘制信息:一条线、一个箭头、一次颜色变化或一个提醒。决策和下单由您来做。
- EA在条件满足时自行发送订单、管理仓位并平仓。
如果您对自己的策略还没有十足把握,或者部分决策需要主观判断,先从指标开始往往更合适。规则明确之后,同样的逻辑可以迁移到 EA 中。有些项目会两者同时编写:指标生成信号,EA 读取信号并执行交易。
最重要的一步:把策略写成规格说明
大多数需求都从一句话开始,比如“均线交叉时买入”。这句话对人来说也许够了,但对程序来说远远不够。写代码之前,以下问题都必须有答案:
- 哪个品种、哪个时间周期?是否同时在多个品种上运行?
- 信号是在 K 线收盘时检查,还是每次价格变动都检查?
- 入场条件具体是什么?用哪些指标、哪些参数?
- 仓位如何平仓:固定止损和止盈、移动止损,还是反向信号?
- 同时最多可以持有几个仓位?出现反向信号时怎么办?
- 哪些时段不交易:重要数据公布、周末收盘前、点差扩大的时段?
- 手数如何计算?
一起把这份清单填完,有时比写代码本身还要久,但它能在很大程度上避免事后“我不是这个意思”的争论。规格说明同时也是测试阶段检验 EA 行为是否正确的参照。
MQL5 EA 的结构
一个 MQL5 EA 围绕几个事件函数构建:
- OnInit():EA 加载到图表上时运行一次。在这里创建指标句柄(handle)并校验输入参数。如果参数不合理,EA 应在此处停止,不予启动。
- OnTick():品种每收到一个新报价时运行,是策略的核心所在。对于按 K 线收盘运行的策略,第一件事是检查是否形成了新 K 线;否则同一个信号会在一根 K 线内被反复处理。
- OnDeinit():EA 被移除或终端关闭时运行。释放指标句柄,清理图表上绘制的对象。
此外,还可以用 OnTimer() 处理定时任务,用 OnTradeTransaction() 监听订单和仓位事件。订单通常通过标准库中的 CTrade 类发送。稳健的 EA 应检查每个订单的返回码:保证金不足、市场休市、止损位无效或重新报价等情况,在实盘账户中出现的频率比您想象的要高。代码还应根据品种的最小手数步长、最小止损距离和小数位数自行调整;一个在某家经纪商那里运行顺畅的 EA,可能会因为这些细节在另一家经纪商那里报错。
风险管理必须写进代码
EA 最重要的部分不是入场信号,而是风险管理。我在每个 EA 中都作为标准处理的事项:
- 仓位规模:不用固定手数,而是每笔交易只拿账户的一定比例冒险,并根据止损距离计算手数。
- 每笔交易都设止损:不开没有止损的仓位。
- 每日和总亏损上限:亏损达到一定程度时,EA 当天或彻底停止交易。
- 点差过滤:点差高于设定值时不开仓。
- 重启容错:终端重启后,EA 能通过 magic number 识别自己的持仓并继续管理。
用 Strategy Tester 回测
MT5 的 Strategy Tester 工具会在历史数据上运行 EA 并生成报告。这里有几点需要注意。测试模型很重要:只用开盘价测试速度快,但对于依赖 K 线内部走势的策略会产生误导;用真实 tick 数据测试更慢,但更贴近实际。点差、佣金和隔夜利息等成本都应纳入测试。与其只看报告中的一个净利润数字,更应该研究最大回撤(drawdown)、交易次数,以及收益在时间上的分布。
优化与过度拟合
Strategy Tester 可以遍历参数组合,找出效果最好的一组。这是一个强大的工具,但最常见的错误也出在这里:只要把足够多的参数调得足够细,您就会得到一个在历史上表现极好、却完全抓不住未来的系统。这被称为过度拟合(overfitting)。
为了避免这种情况,我会单独留出一部分数据,完全不让它参与优化,再用这段未见过的时期来测试找到的参数。MT5 的前向测试(forward)选项可以自动完成这一步。此外,相比单一的峰值,我更倾向于选择一片在相邻参数上也能给出合理结果的宽区域。参数越少,就越能相信结果背后有真实的依据。
模拟账户与前向测试
无论回测结果多好,EA 在上实盘之前,都应该先在模拟账户上,或用极小手数在真实账户上运行一段时间。这个阶段的目的与其说是衡量盈利,不如说是观察 EA 在真实条件下是否按规格说明行事:订单是否在正确的时间开出?滑点有多大?经纪商的规则会不会造成问题?让 EA 把每个决策都写入日志,会让这种检查容易得多。
VPS:EA 的家
EA 只在 MetaTrader 终端开着时运行。电脑关机、网络中断或操作系统因更新而重启时,EA 也会停止。因此,需要持续运行的 EA 通常托管在 VPS 上。可以使用 MetaQuotes 自己的虚拟主机服务,也可以使用独立的 Windows VPS。选择靠近经纪商服务器的位置可以降低延迟。
结论
一个好的 EA 始于一份好的规格说明,并把风险管理放在代码的核心位置。回测是起点,而不是证明;优化若不谨慎,就会产生误导。没有任何 EA 能保证盈利,本文也不构成投资建议。我在这一领域的作品可以在 MetaTrader EA 与指标页面查看,行情追踪方面则可以看看 All Financial Market Watcher 应用。如果您想为自己的策略定制 EA 或 MQL5 指标,可以通过交易机器人页面与我联系。