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

平均真实波幅(ATR)

一个以价格单位衡量近期价格波动平均幅度的波动率指标。EA 用它来设定能随当前行情自动调整的止损距离和仓位大小,而不是沿用昨天的条件。

亦称:ATR, True Range

更新于

一句话讲清

这个市场在一根K线里通常能走多远,取近期的平均值。它对方向没有任何看法——它是一把量距离的尺子,而 EA 用点数衡量的几乎所有东西,用这个单位来衡量都更合适。

为什么重要

EA 里的每一段距离——止损、目标、移动止损的步长、突破阈值——都是某个人挑出来的点数。ATR 的作用,是把这些固定数字变成比例,让它们在市场加速或放缓时仍然表达同一件事。

  • 它是波动率的实用形态。EA 很难在每个 tick 上计算收益率的标准差,但它可以从一个指标句柄里读出 ATR。
  • 它以价格为单位,因此能直接换算成止损距离,中间不需要任何统计步骤。
  • 它让一套策略在不同品种和不同周期之间具备可比性。两个点在一个品种上是宽止损,在另一个品种上则落在噪声里;而两倍 ATR 在哪里都是同一句话。
  • 它把跳空计算在内,而单纯的最高价减最低价做不到——真实波幅还要对照前一根K线的收盘价来衡量,而不只是当前这根K线。

在 MetaTrader 5 中

在 MT5 的什么位置

  • 插入 → 指标 → 震荡指标 → Average True Range —— 添加到图表时带一个周期参数
  • 导航器 → 指标 → Average True Range —— 拖到图表上,效果相同
  • 指标画在独立的子窗口里,因为它的刻度是价格距离而不是价格
  • 策略测试器 → 输入参数 —— EA 的 ATR 周期和倍数都是输入项,而且两者都很容易被过度优化

EA 如何使用它

  • 在 OnInit 中只创建一次句柄 —— iATR(_Symbol, PERIOD_CURRENT, 14) —— 然后用 CopyBuffer 读取数值,而不是在 OnTick 里反复创建句柄。
  • 止损距离 = 倍数 × 入场时的 ATR,这样止损落在常规波动之外,而不是落在一个整数点位上。
  • 仓位大小 = 风险金额 ÷(止损距离 × 每点价值),于是波动率上升时手数会自动变小。
  • 移动止损的距离是同一个思路的持续应用:行情快时跟随距离变宽,行情静时收窄。
  • 从已收盘的K线(索引 1)读取 ATR,而不是从正在形成的K线(索引 0)读取,后者的数值每个 tick 都在变。
  • 不要想当然地认为 iATR 就是 Wilder 的 ATR。MetaTrader 自带的 ATR 在 Wilder 做平滑的地方改成了滚动一个固定窗口。因此两者按不同的时钟反应:在波动率突然变成三倍之后,我们测得达到新水平 90% 分别需要 19 根和 59 根K线。

常见设置

设置项 常见取值 备注
周期 14 约定俗成的默认值。较短的周期(7–10)反应更快;较长的(20–30)更平滑,适合日线系统。
止损倍数 1.5–2.5 × ATR 低于约 1.5 时,止损在多数品种上会落进常规波动之内。
移动止损倍数 2–3 × ATR 通常比入场止损更宽,这样一次正常回撤不会终结一笔趋势交易。
目标倍数 2–4 × ATR 在行情条件变化时保持盈亏比稳定。
读取所用周期 策略自身的周期 M5 的 ATR 和 D1 的 ATR 回答的是不同的问题;把它们混用会悄悄改变每一段距离。

常见运行问题

  • 在 OnTick 内创建指标句柄,会造成句柄泄漏并最终失败——句柄该放在 OnInit。
  • 启动阶段历史数据尚未加载够时,CopyBuffer 返回的数据少于请求数量,于是得到为零的 ATR,进而得到距离为零的止损。
  • 从正在形成的K线读取 ATR,使止损距离取决于信号在K线的哪个时刻触发。
  • 混淆点(point)与点数(pip):ATR 返回的是价格单位,5 位报价意味着 0.00120 而不是 12——把它当作 pip 去乘,会得到宽或窄一百倍的止损。
  • 在同一段数据上同时优化 ATR 周期和倍数,这会把这一对参数拟合到那段窗口特有的回撤形态上。

相关 MT5 函数

iATR(symbol, timeframe, ma_period)
创建指标句柄;在 OnInit 中调用一次并保留该句柄。
CopyBuffer(handle, 0, start, count, array)
从缓冲区 0 读取 ATR 数值——这是该指标唯一的缓冲区。
SymbolInfoDouble(symbol, SYMBOL_POINT)
把以价格为单位的 ATR 换算成点,也就是止损距离通常使用的单位。
NormalizeDouble(price, _Digits)
在发送之前,把算出来的止损价位按品种精度四舍五入。

示例

同一条风控规则,放在两种波动率环境下。EA 本身没有任何变化——变的是它用来测量的那把尺子。

平静环境 — ATR(14)
12 点
2 × ATR 的止损是 24 点。
剧烈环境 — ATR(14)
34 点
同样 2 × ATR 的止损变成 68 点。
每笔风险
10,000 美元的 1% = 100 美元
手数,平静 / 剧烈
0.42 / 0.15
承担的金额相同,距离不同,因此手数也不同。

把止损放宽却不缩小手数,会让承担的资金变成三倍。只有当这两半一起变动时,ATR 才真正有用。

计算 100 ÷ (24 × 10) = 0.42 · 100 ÷ (68 × 10) = 0.15

结果 一条风控规则,产生两个止损距离和两个仓位大小

怎么使用

ATR 是距离,不是信号。它告诉 EA 把东西放多远,从不告诉它该不该放。

区间 含义
当前 ATR 远低于回测均值 以 ATR 定义的目标同步缩小,于是策略赚到的每笔更小,而成本仍然固定。
当前 ATR 接近回测均值 正是这些参数被调校时所处的环境。公布的预期依然适用。
当前 ATR 明显高于回测均值 固定点数的止损现在落进了噪声里;基于 ATR 的止损会变宽,仓位大小必须相应下降来抵消。
把 ATR 当作入场信号 一种误用。它没有方向——数值高只说明市场在动,并不说明往哪边动。
  • 把 EA 里的每一段距离都表达为 ATR 的倍数,然后去优化这个倍数而不是点数。这样得到的结果在不同品种和不同行情环境之间迁移得好得多。
  • 永远不要跨品种比较 ATR 的原始数值。GBP/JPY 上的四十点和 EUR/USD 上的四十点是不同的活跃度;确实需要比较时请除以价格。
  • 让 ATR 周期与持仓时间相匹配。一个读日线 ATR 的短线交易者,是在为一段自己永远不会参与的行情计算仓位。
  • 检查倍数在相邻取值上是否稳定。一个在 2.0 × ATR 有效、却在 1.8 或 2.2 失效的止损,是被拟合到了测试窗口上。

[ATR 指标完整页面](/zh-Hans/indicators/atr)详细讲解了计算方式和参数设置。其中也包含我们的实测:MetaTrader 的 iATR 是一个滚动窗口,而不是 Wilder 的平滑。本词条讲的则是 ATR 在 EA 风控规则中扮演的角色。

常见误区

把 ATR 当作方向信号

它衡量的是走了多远,而不是往哪边走。ATR 上升意味着市场波动得更多——这在趋势里、在暴跌里、在剧烈震荡里同样会发生。

放宽 ATR 止损却不减手数

自适应止损的全部意义在于每笔风险保持恒定。如果距离变成三倍而手数没有下降,那么变成三倍的是亏损。

把价格单位与点数混为一谈

iATR 返回的是价格距离——在 5 位报价的 EUR/USD 上是 0.00120,而不是 12。把它当作点数处理的代码,会把止损放到一百倍远或一百倍近,而且这个错误在测试中很容易被漏掉,因为结果只是变差,而不是彻底出错。

从正在形成的K线读取 ATR

索引 0 每个 tick 都在变,所以同一个信号会因触发时刻不同而产生不同的止损。凡是需要可复现的地方,都请使用最后一根已收盘的K线。

常见问题

EA 应该使用多大的 ATR 周期?
14 是约定俗成的默认值,也是一个合理的起点。七到十的短周期对条件变化反应更快,但也更嘈杂;二十到三十更平滑,适合以日线运行的策略。比确切数值更重要的是,它在测试时于相邻取值上仍然保持稳定。
怎样把 ATR 变成止损距离?
乘一个倍数。2 × ATR 的止损位于入场点两个平均K线波幅之外,对多数品种来说已在常规波动之外。不可省略的第二步,是用这个距离和你的风险上限去计算手数,这样更宽的止损意味着更小的仓位,而不是更大的亏损。
ATR 比固定点数止损更好吗?
对于无人值守运行多年的 EA,通常是的,因为固定距离在不同波动率环境下含义不同,而 ATR 的倍数自始至终含义一致。代价是多出一个需要防止被过度优化的参数。
MT5 的 ATR 和 Wilder 的 ATR 是同一个吗?
并不完全相同,而在移植参数时这一点很关键。Wilder 对真实波幅做平滑,因此每一根过去的K线都在数值里持续衰减;MetaTrader 自带的 ATR 则是滚动一个固定窗口,也就是简单移动平均。两者都是权重之和为一的线性滤波器,所以长期水平一致——在周期 20 上、跨越 2,700 根K线,我们测得 9.571 对 9.573 点。不同的是响应:当波动率在某根K线上突然变成三倍之后,MetaTrader 的版本用 19 根K线达到新水平的 90%,Wilder 的版本用了 59 根。因此同样一条 2 × ATR 的止损规则,在 MT5 上会比在基于 Wilder 的平台上更早变宽;而且把周期调成一样也无法让两者重合——最接近 Wilder 周期 20 的 iATR 周期实测为 32–33。
ATR 会告诉我趋势方向吗?
不会。它是纯粹的距离度量,完全没有方向成分。衡量趋势强度通常搭配 ADX,方向则来自移动平均线或价格结构。

相关文章