分类
平台
难度
入门
适用场景
MT5 操作EA 评估策略设计

智能交易系统

用 MQL5 编写、在 MetaTrader 5 内运行、按编程规则无需人工干预即可下单、改单和平仓的自动交易程序。

亦称:EA, Expert Advisor, 交易机器人, 交易机器

更新于

一句话讲清

一个在 MetaTrader 内替你交易的程序。它没有判断力,也没有超出你所给予的记忆:平台调用它时它醒来,只看它被写出来要看的那几样东西,然后行动。

为什么重要

回测、回撤数字、magic number、VPS 在线时长——这些之所以存在,是因为下单的是程序而不是人。知道平台交给 EA 什么、又不给它什么,正是把结果读对与被结果吓一跳之间的区别。

  • 它执行时毫不犹豫,这既是它的全部价值,也是它的全部风险。那套从不漏掉有效信号的规则,同样也从不会察觉今天有什么不同。
  • 它看到的只是一条窄缝:自己品种的价格、自己请求的指标值、本账户的持仓与余额。新闻、其他经纪商的报价、你的其他账户都在这个窗口之外,除非代码主动去取。
  • 它以编译形式分发。.ex5 文件能运行却读不了,因此买家的信心必须来自公开的测试证据,而不是源代码。
  • 它只在终端运行时才运行。装在休眠笔记本上的 EA 就是没有在交易的 EA——这正是使用 VPS 的全部理由。

在 MetaTrader 5 中

在 MT5 的什么位置

  • 导航器 → 智能交易系统 —— 终端能看到的已编译 EA
  • 文件 → 打开数据文件夹 → MQL5/Experts —— .ex5 文件必须放在这里才会出现在列表中
  • 工具栏 → 算法交易 —— 总开关;图表上显示哭脸的 EA,就是被这个按钮拦住的 EA
  • 图表 → EA 属性(F7)→ 输入参数 / 常规 —— 参数与逐个 EA 的权限
  • 视图 → 策略测试器(Ctrl+R)—— 同一个 EA 在历史数据上运行

EA 如何使用它

  • 终端在附加时调用一次 OnInit(),在图表品种每次有报价进来时调用 OnTick(),在移除时调用 OnDeinit()。
  • 工作通常发生在已收盘的 K 线上而不是每个 tick:EA 把当前 K 线的开盘时间与自己存下的时间比较,没有新 K 线形成就立即返回。
  • 订单以填好的 MqlTradeRequest 发出,或者通过 CTrade 包装类发出,后者替你填好其中大部分内容。
  • 每个实例给自己的订单打上 magic number,只管理属于自己的持仓——没有它,两个 EA 会争抢同一批订单号。

常见设置

设置项 常见取值 备注
算法交易(终端) 启用 安装后默认关闭。不打开就什么都不会交易。
允许算法交易(逐个 EA,F7 → 常规) 启用 这是与终端总开关分开的一项权限。
允许对列出的 URL 使用 WebRequest 除非 EA 需要,否则关闭 只有需要抓取外部数据的 EA 才用得上;按 URL 逐条授予,绝不一次性放开。
图表周期 该 EA 设计所针对的周期 把 M15 的策略放在 H1 图上就是另一套策略——OnTick 按 tick 触发,但 K 线逻辑读的是图表周期。
MagicNumber 每个正在运行的实例各不相同 不是按产品分:同一个 EA 跑在两张图上就需要两个值。

常见运行问题

  • 终端已关闭、处于睡眠,或正在因更新而重启——EA 根本没有在运行,而且不会留下任何错误记录。
  • 经纪商与设置之间的品种名称不一致(EURUSD 与 EURUSD.m),会让 EA 保持附加状态却始终沉默。
  • 可用保证金不足:OrderSend 每次尝试都失败,而 EA 仍不断重试,于是日志被写满,账户却什么也没做。
  • 多个 EA 同时发送订单时交易上下文繁忙——这种失败时有时无,很难复现。
  • EA 是在执行模式或合约规模不同的经纪商上测试的,于是在实盘中一行代码没改却表现不同。

相关 MT5 函数

OnInit() / OnDeinit()
分别在附加时和移除时各调用一次——校验输入参数、创建句柄都在这里完成。
OnTick()
图表品种每有一笔报价进来就调用一次;这是主要入口。
OnTimer()
按 EventSetTimer() 设定的固定间隔调用,适用于不应依赖 tick 是否到来的工作。
OrderSend(request, result)
发送每一笔交易操作的唯一调用;具体是哪一种操作由请求结构体决定。
CTrade (Trade/Trade.mqh)
标准库的包装类,多数 EA 用它来代替手工填写 MqlTradeRequest。

示例

几乎所有 EA,都可以简化成平台调用它的顺序。这里没有一处是策略——这只是策略所处的框架。

1. OnInit()
附加时一次
校验输入参数、创建指标句柄、设置 magic number。
2. OnTick()
每笔报价
只要没有新 K 线形成就立即返回,形成了再去评估规则。
3. OrderSend()
规则触发时
每次操作对应一个填好的 MqlTradeRequest——开仓、改单或平仓。
4. OnDeinit()
移除时一次
释放句柄。未平仓头寸不会因此被平掉——它们仍然留着。

把 EA 从图表上移除,并不会平掉它开出的仓位。仓位仍在,只是再没有任何东西去管理它们。

计算 if (iTime(_Symbol, PERIOD_CURRENT, 0) == lastBarTime) return;

结果 一个按 K 线收盘工作的 EA,忽略两次决策之间的成千上万个 tick

怎么使用

评判一个不是自己写的 EA,是一件讲证据的事:编译后的文件什么也告诉不了你。下面是应该索取的内容。

  • 问清回测用的是什么数据、如何建模。真实 tick 和一个建模质量数值是有意义的;一条没有标注的资金曲线则没有。
  • 问清交易笔数和测试区间。本站公开的中位数 EA 在数年里平仓了 362 笔;四个月四十笔只是轶事。
  • 检查策略是否让亏损单一直挂着。摊低成本和网格解套能画出漂亮的曲线,直到遇上那一篮子回不来的单子,而任何由已平仓交易算出的比率都不会提前示警。
  • 在投入资金前,先用自己经纪商的模拟账户跑一遍。执行模式、点差、合约规模和品种命名各不相同,而且都会改变结果。
  • 给每个实例分配各自的 magic number,并在运行超过两个之前记录清楚哪个是哪个。

本站列出的每个 EA 都会公开其测试区间、数据来源、建模质量和完整成交清单,因此这些证据可以直接核对,而不需要开口索要。

常见误区

把 EA 当成有判断力的交易者

它是一套由平台在每个 tick 上调用的规则。它无法察觉市场已经变了,无法知道十分钟后央行要讲话,也不会发现自己的表现正在恶化——除非有人恰好为此写了一条规则。

假设回测结果会原样搬到你的账户上

点差、佣金、执行模式、合约规模和品种集合都是结果的一部分。在某家经纪商上的测试,是关于那家经纪商的证据;在你自己的账户上跑一次模拟,则是看清有多少能搬过来的最便宜方式。

以为移除 EA 就等于交易也停了

把 EA 卸下来,它的未平仓头寸仍留在原处。此后没有任何东西会为它们移动止损或平仓;它们会一直挂着,直到触及止损、目标价或被强制平仓。

在一个账户上同时运行多个 EA 却不加区分

没有各自不同的 magic number,每个 EA 都会把所有持仓都当成自己该管的,于是互相平掉对方的单子。这种故障是无声的——不会报错,只会得到与任何单一策略都对不上的结果。

深入说明

真实的 EA 记录是什么样子

定义描述机制,记录描述体验。本站公开的十四个 EA 都附带完整的已平仓交易清单——自 2019 年以来共 9,702 笔。

14 个已发布 EA 合计数值
已平仓交易9,702
每个 EA 的交易数(中位数)362,从 108 到 4,725
盈利因子(中位数)1.39,从 1.27 到 1.52
最长连亏(中位数)6 笔,最差 14
未创净值新高的最长时段(中位数)423 天,最差 775
已验证的实盘运行0

EA 真的能盈利吗 会逐个 EA 走一遍该记录,EA 与手动交易的差别 则用人们真正会采用的停止规则重放同一批交易。

常见问题

MetaTrader 5 中的智能交易系统是什么?
是一个用 MQL5 编写并编译成 .ex5 文件的程序,运行在终端内部并按自己的规则交易。平台会在它所附加图表的每一笔报价到来时调用它,而它会在无人操作键盘的情况下开仓、改单和平仓。
EA 运行是否需要一直开着电脑?
是的——EA 运行在终端内部,因此只有终端在运行并保持连接时它才交易。这正是无人看管的 EA 通常放在 VPS 上,而不是放在会休眠或重启的电脑上的原因。
我能读出买来的 EA 里的策略吗?
从 .ex5 文件里读不出来。编译后的 EA 运行时并不暴露其逻辑,卖家正是因此才以这种形式交付。所以策略必须在商品页里被如实描述,并有公开的测试证据支撑。
同一个账户能运行多个 EA 吗?
可以,而且很常见。每个实例都需要自己的 magic number,才能只管理由它自己开出的仓位;账户也需要同时容纳全部实例的可用保证金——这些策略彼此并不知情。