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

平均趋向指标(ADX)

ADX 指标在 0 到 100 的刻度上衡量趋势的强度,但不指明方向。EA 把它当作行情状态过滤器:趋势策略等待高读数,均值回归策略等待低读数。

亦称:ADX, Average Directional Movement Index, DMI

更新于

一句话讲清

一个数字,告诉你市场朝一个方向走得有多强,却不告诉你是哪个方向。数值低意味着它没有特别往哪儿去;数值高意味着它正在往某处去,而方向的正负号必须从别处取得。

为什么重要

大多数 EA 失败,并不是因为入场逻辑本身错了,而是因为那套逻辑在一种行情里正确、在另一种行情里错误。ADX 是让策略对「自己此刻身处哪一种行情」形成判断的最廉价方式,这也正是它作为过滤器出现的次数远多于作为信号出现的原因。

  • 它把互相摧毁的两个家族分开。网格或均值回归 EA 在强趋势中稳定地亏损,而趋势跟随 EA 在震荡区间里慢慢失血;一个阈值就能让两者各自避开对方的天气。
  • 它在构造上没有方向,这使它成为过滤器而不是信号,也解释了为什么它总要与某个带方向的东西搭配使用。
  • 它很慢。让它保持稳定的那层平滑,同时意味着它要在趋势已经开始之后才确认趋势,所以它更擅长排除糟糕的条件,而不是提前抓住好的条件。
  • 过滤器是可以检验的:把同一套策略分别在开启和关闭过滤器的情况下跑一遍,然后去读回撤上的差别,而不只是利润上的差别。

在 MetaTrader 5 中

在 MT5 的什么位置

  • 插入 → 指标 → 趋势 → Average Directional Movement Index
  • 指标窗口会画出三条线:ADX 线本身、+DI 和 −DI
  • DI 这一对承担了 ADX 所没有的方向——+DI 位于 −DI 之上就是多头排列
  • 策略测试器 → 输入参数——周期和阈值都是输入项,其中尤以阈值最容易招来过度拟合

EA 如何使用它

  • 在 OnInit 中创建句柄——iADX(_Symbol, PERIOD_CURRENT, 14)——然后读取缓冲区 0 得到 ADX,缓冲区 1 得到 +DI,缓冲区 2 得到 −DI。
  • 作为入场规则前面的一道闸门:只要 ADX 未高于其阈值,趋势 EA 就立刻返回;只要 ADX 未低于阈值,区间 EA 就返回。
  • 在使用 DI 线时作为方向校验:做多要求 +DI 在 −DI 之上,做空则相反,而 ADX 负责确认确实存在一个值得跟随的趋势。
  • 读取最后一根已收盘的 K 线,而不是正在形成的那根——在 K 线内部围绕阈值来回闪烁的 ADX 读数,会制造出在测试中无法复现的入场。
  • 有些 EA 还要求 ADX 正在上升而不只是处于高位,这样可以滤掉一段行情尾声处那种强但已经衰减的读数。

常见设置

设置项 常见取值 备注
周期 14 约定俗成的默认值。周期越短反应越快,穿越阈值也越频繁,而且是双向都更频繁。
趋势阈值 20–25 高于此处便启用趋势跟随逻辑。确切数值并不如它相对于相邻数值的稳定性重要。
区间阈值 低于 20 网格与均值回归 EA 通常要求满足这一条件之后才开仓。
强趋势 高于 40 在这里,逆趋势入场和均值回归入场通常会被完全封锁。
读取的时间周期 入场周期或更高一级 读取更高一级的周期会给出更慢、更稳的状态信号,代价是反应更迟。

常见运行问题

  • 把句柄创建在 OnTick 而不是 OnInit 里,这会造成泄漏并最终返回 INVALID_HANDLE。
  • 启动时在加载够足够多的 K 线之前 CopyBuffer 就失败,这会被读成 ADX 为零,从而悄悄地关闭——或者反过来打开——过滤器。
  • 阈值恰好落在指标绝大部分时间所停留的位置,于是过滤器不停地开开关关,EA 的行为最终由噪声决定。
  • 把阈值优化到回测中的最佳数值,得到的只是一个仅在被测试窗口内有效的数字。
  • 把 ADX 当成方向指标来读,在下跌的市场里看到高读数就做多。

相关 MT5 函数

iADX(symbol, timeframe, adx_period)
创建句柄;在 OnInit 中调用一次,并在 EA 的整个生命周期中保留。
CopyBuffer(handle, 0, …)
ADX 线本身——趋势强度,没有方向。
CopyBuffer(handle, 1, …) / CopyBuffer(handle, 2, …)
+DI 与 −DI,即 ADX 线由之推导出来的那一对方向性指标。
iTime(symbol, timeframe, 1)
已收盘 K 线的时间戳,EA 用它来确保读到的数值是稳定的。

示例

一条入场规则,两个状态过滤器,条件正好相反。规则本身不变;变的是它被允许触发的时机。

ADX 低于 20
区间状态
启用均值回归与网格逻辑;封锁趋势入场。
ADX 20–40
温和趋势
启用趋势入场;逆趋势入场通常不启用。
ADX 高于 40
强趋势
完全封锁均值回归——正是这种状态会把它摧毁。
+DI 对 −DI
方向
ADX 说的是有多强;这一对说的是往哪边。

状态过滤器可测量的效果,通常是更小的回撤而不是更大的利润——它移除的是亏损,而不是添加盈利。

计算 if (adx[1] < TrendThreshold) return; // 趋势 EA 在区间行情里什么都不做

结果 一套在自己从来都不擅长的条件下选择弃权的策略

怎么使用

评判一个过滤器,要看它移除了什么。正确的比较,是同一套策略在同一段窗口上开启与关闭过滤器的两次运行,并且既要读净结果也要读回撤。

区间 含义
ADX 低于 20 没有有效趋势。趋势跟随入场在这里的期望值最差,突破信号也大多失败。
ADX 20–40 确有一段真实趋势正在进行。这是趋势逻辑通常的工作区间。
ADX 高于 40 强趋势,而且往往已进入后段。趋势入场依然有效;逆趋势与网格策略此刻最危险。
按回测最佳值调出来的阈值 一个被拟合出来的参数。在相信它之前,先检查相邻的阈值是否给出相近的结果。
  • 把过滤器当作一次独立的改动来测试,而不是当作一整套方案的一部分:在同一份数据上关闭过滤器再跑一遍策略,然后比较回撤、成交笔数和盈利因子。
  • 要预期成交笔数下降。一个不会减少成交笔数的过滤器,其实什么都没过滤。
  • 在已收盘的 K 线上读取 ADX,并考虑用更高一级的时间周期来做状态判断,这样策略才不会在一个交易时段内反复改变性格。
  • 不要单独用它来定方向。正负号必须由 +DI/−DI 这一对或者一条移动平均线来提供。

ADX 的 `/indicators` 页面讲的是计算方法与看图方式;本词条讲的则是它作为 EA 状态过滤器的用法。

常见误区

把 ADX 读成看涨或看跌

它是一个没有正负号的强度度量。暴跌途中的高读数,和暴涨途中的高读数一样高,这正是它总要与带方向的东西搭配使用的原因。

把阈值设在指标常驻的位置

如果 ADX 绝大部分时间都在阈值附近徘徊,过滤器就会不停切换,策略的行为将由噪声决定。阈值只有在被少次而果断地穿越时才是有用的。

把过滤器当成免费的

任何过滤器都会移除成交,包括那些盈利的成交。检验标准在于它移除的亏损是否多于移除的盈利——而这是一次测量,不是一个假设。

用更快的 ADX 周期来求得更早的反应

ADX 在设计上被平滑了两次。缩短周期只会让它在两个方向上都更频繁地穿越阈值,通常带来的是来回打脸而不是更早的入场。

常见问题

ADX 到什么水平才算有趋势?
读数大致在 20 到 25 以上,是把市场当作处于趋势中的约定俗成阈值,高于 40 则视为强趋势。确切数字并不如它的稳定性重要:一个只在某个特定数值、某段特定测试窗口上才有效的阈值,是被拟合出来的参数,而不是一条关于行情状态的规则。
ADX 会说明趋势是向上还是向下吗?
不会。ADX 线只衡量强度。方向来自构成它的 +DI 与 −DI 两条线——+DI 位于 −DI 之上就是多头排列——或者来自一个独立的方向性指标,例如移动平均线。
EA 是怎样把 ADX 用作过滤器的?
把它当作入场规则前面的一道闸门。趋势跟随 EA 在 ADX 未高于其阈值之前什么都不做;网格或均值回归 EA 则在 ADX 未低于阈值之前什么都不做。效果通常表现为更小的回撤而不是更大的利润,因为过滤器移除的正是那些在策略最不擅长的条件下开出的仓位。
为什么我的 ADX 过滤器反而让结果变差了?
常见的原因有两个。阈值可能恰好落在指标绝大部分时间停留的位置,于是它随着噪声来回切换;或者过滤器与入场规则是在同一段窗口上优化出来的,那么它拟合的是那段窗口的具体行情,而不是「行情状态」这个概念。在样本外数据上分别测试带过滤器和不带过滤器的策略,就能把这两种情况区分开。

相关文章