分类
技术
难度
入门
适用场景
策略设计MT5 操作

指数移动平均线

一种给近期价格更高权重的移动平均线,因此比简单平均更早转向。EA 的趋势过滤和交叉入场建立在它之上的次数,多过任何其他指标。

亦称:EMA, 指数均线

更新于 · 审阅于

一句话讲清

一条近期价格的平均线,对刚刚发生的事比对一段时间之前发生的事更上心。它比普通平均线转得更快,所以在趋势里更有用,在震荡区里更聒噪。

为什么重要

指数均线是 EA 趋势逻辑的默认积木:它提供 ADX 这类指标刻意不提供的方向。它同时也是散户 EA 中被滥用最多、被过度优化最多的部件——因为交叉规则写起来容易,而它的两个周期又太容易调到任何一段历史都显得盈利为止。

  • 它给策略一个符号。趋势强度和波动率本身没有方向;把上涨和下跌带进规则里的,是价格与均线、或快线与慢线之间的比较。
  • 它比简单平均反应更快,而这一点在转折处才见分晓——趋势策略的大部分结果就在那里被决定。
  • 它天生是滞后指标。任何移动平均都在描述已经发生的事,所以交叉是确认而不是预测。
  • 两个周期就是两个参数,在它们上面做网格搜索,总能找到一对在任意给定窗口上看起来极佳的组合。这就是 EA 设计里最经典的过拟合陷阱。

在 MetaTrader 5 中

在 MT5 的什么位置

  • 插入 → 指标 → 趋势 → Moving Average,然后把 Method 设为 Exponential
  • 均线属性对话框还会设定应用价格——Close 是惯常选择,而且会明显改变数值
  • 它画在主窗口的价格刻度上,这一点与 ATR 或 ADX 不同
  • 策略测试器 → 输入参数——快周期和慢周期是最容易被过度优化的两个输入项

EA 如何使用它

  • 在 OnInit 中创建句柄——iMA(_Symbol, PERIOD_CURRENT, 21, 0, MODE_EMA, PRICE_CLOSE)——每个周期一个,并在 EA 的整个生命周期中保留。
  • 作为方向过滤:只在价格或快线位于慢线之上时做多,位于其下时做空。
  • 作为交叉入场:快线在一根已收盘的 K 线上穿过慢线,这要求同时读取第 1 根和第 2 根 K 线,才抓得到交叉而不是状态。
  • 作为移动止损的参照:当价格收在所选均线的另一侧时离场,这条移动规则会跟着趋势自身的节奏调整。
  • 更高周期的均线用同一个调用、换一个周期参数来读取;M15 的 EA 从 H4 取方向就是这么做的。

常见设置

设置项 常见取值 备注
快/慢组合,短线 8 / 21 反应很快;会产生大量交叉,而其中多数并不是趋势。
快/慢组合,中线 50 / 200 被广泛关注的一对。信号很少,而且给出的信号来得晚。
单一趋势过滤 入场周期上的 EMA 200 当作方向闸门用,而不是当作入场信号。
应用价格 Close 常规且稳定。中位价或典型价会进一步平滑,并改变每一个回测结果。
信号 K 线 最后一根已收盘的 K 线 读取正在形成的 K 线,会产生在这根 K 线内部出现又消失的交叉。

常见运行问题

  • 检测状态(快线在慢线之上)而不是事件(快线刚刚穿过慢线),结果在整段趋势里每根 K 线都重新入场。
  • 读取索引 0,使交叉随每个跳价闪烁,产生实盘无法复现的回测结果。
  • 句柄创建在 OnTick 里,会一直泄漏到 iMA 返回 INVALID_HANDLE 为止。
  • 在慢周期还没有足够历史时就在启动阶段调用 CopyBuffer,返回的 0 会被当成交叉来比较。
  • 在同一段窗口上同时优化两个周期并把峰值发布出去——这是 EA 在测试中看起来极佳、紧接着就失效的最常见方式。

相关 MT5 函数

iMA(symbol, timeframe, period, shift, MODE_EMA, applied_price)
创建句柄;让它成为指数而非简单平均的,正是 MODE_EMA。
CopyBuffer(handle, 0, start, count, array)
从它唯一的缓冲区里读出均值。
ArraySetAsSeries(array, true)
让索引 0 成为当前 K 线,这是绝大多数交叉代码默认的约定。
iTime(symbol, timeframe, 0)
用来做到每根 K 线动作一次,而不是每个跳价动作一次。

示例

读状态和读事件的区别,这是 EA 代码里最常见的一个均线错误。

第 2 根 K 线——快线对慢线
快线在慢线之下
第 1 根 K 线——快线对慢线
快线在慢线之上
正是这一对读数,才让它成为交叉而不是一个条件。
状态检测的结果
每根 K 线都触发
只要趋势还在,就一直触发,并且每次都再加一笔仓位。
事件检测的结果
只触发一次

在强趋势里测试时,两个版本看起来都盈利。但其中只有一个是原本想要的策略。

计算 if (fast[2] <= slow[2] && fast[1] > slow[1]) → 向上交叉

结果 每次交叉入场一次,而不是每根 K 线入场一次

怎么使用

一条均线规则写起来容易,凑合起来也容易。所有值得检查的事情,都关乎参数被挪动之后还能不能站住。

区间 含义
周期挪动 10% 结果就崩掉 被拟合到了测试窗口上。稳健的设置,它的邻居也同样能用。
很宽一段周期组合都表现相近 这个效应更可能是结构性的而不是拟合出来的,这正是优化曲面上出现平台区的含义。
没有市况过滤的交叉 信号在震荡区里同样会触发,而在那里它们大多亏损。这正是通常要加上 ADX 或波动率过滤去修正的问题。
在正在形成的 K 线上读取 无法复现。同一段行情会因为跳价到达的时间不同而产生不同的入场。
  • 挑周期时,宁要平台区也不要尖峰。回测里最好的那个单一结果,恰恰是最不可能重演的。
  • 给交叉配一个市况过滤。没有过滤的趋势规则,会在它最不擅长的环境里做出最差的交易。
  • 用两根 K 线来判定交叉,绝不要只用一次比较,并且只在已收盘的 K 线上动作。
  • 记住移动平均是跟着价格走的。它无法领先,所以建立在它之上的策略是参与型策略,而不是预测型策略。

移动平均的 `/indicators` 页面讲的是计算方式以及与 SMA 的比较;这一条讲的是指数均线如何接进 EA 的逻辑里。

常见误区

把状态当成事件

检测快线是否在慢线之上,在整段趋势里都为真。检测它是否刚刚穿过,则还需要前一根 K 线——两者的差别就是一次入场和几十次入场的差别。

把两个周期都优化一遍,然后发布最好的那一对

光滑曲面上的两个自由参数,总能生成一份漂亮的回测。真正有价值的是相邻的组合是否表现相近,这就是效应与拟合之间的分界。

使用交叉却不加市场状况过滤

在震荡区里均线会不停交叉,而那些交叉几乎全是亏的。过滤器不是对策略的优化——它是让这套策略变得可用的前提。

认定 EMA 一定优于 SMA

它反应更快,而这把刀是双刃的:在真实趋势里入场更早,在噪音里假信号更多。哪一个更合适取决于策略,而两者的差别比周期选择的差别还要小。

深入说明

已发布的 EA 用什么来代替它判断方向

这里发布了十四个 EA,并附有各自完整的平仓记录。其中没有任何一个从指数移动平均线里取方向。

判断方向的机制EA 数量具体是什么
一目均衡表转换线/基准线交叉5Kestrel Hover、Orrery、Peregrine、Tessera、Zerqon
叠放的简单移动平均线1Lanternfish —— M30 上的 SMA 25/50/75,入场在 M5
指数移动平均线0——
交叉之外的其他机制8RSI 极值、通道边缘的回归、K 线形态

这五个留下了交叉、舍弃了调参:转换线和基准线的周期来自指标本身的定义,而不是来自网格搜索。五个都读取已收盘的 K 线,其中 Orrery 和 Peregrine 还要等信号 K 线的实体超过其近期均值的若干倍才动手——这正是一个裸交叉所需要的市况过滤。它们的盈利因子在 1.27 到 1.46 之间,和目录里其余产品处在同一档,并没有更高。

策略测试器的输入参数页为每个周期提供起始值、步长和终止值。请读完整份结果,而不是只看最上面一行:一片彼此相邻、表现接近的组合是效应,孤零零的一个尖峰则是拟合。这就是过拟合在实务中的样子,也是为什么像ADX 这样的过滤器应该排在再调一个周期之前。

常见问题

MT5 的 EA 一般用哪些 EMA 周期?
短线系统最常见的是 8/21 这一对,中线判趋势最常见的是 50/200,而单独一条 EMA 200 常常只被当作方向闸门。具体数字并不如另一件事重要:把这些数字挪动之后策略是否还成立——只依赖某一对精确取值的结果,是被拟合到测试窗口上的。
对 EA 来说 EMA 比 SMA 更好吗?
EMA 反应更快,因此在真实趋势里入场更早,在噪音里假信号更多。没有哪一个是普遍更优的,而且两者的差别通常小于同一类型内部两种周期选择之间的差别。
我的 EMA 交叉 EA 为什么开这么多仓?
几乎总是因为代码检测的是快线是否位于慢线之上,而不是它是否刚刚穿过。前一个条件在整段趋势里都为真,于是每根 K 线都触发;要抓住交叉,就必须同时和前一根 K 线做比较。
EMA 能预测趋势反转吗?
不能。它是已经发生过的价格的平均,因此必然跟在后面。交叉确认的是变化已经发生,而不是变化即将到来,这份滞后正是平滑所付出的代价。