ATR % 指标:公式、参数与读法
ATR % 是 Wilder 平均真实波幅除以当前收盘价并以百分比表示,使价格水平相差很大的品种之间,逐根K线的波动可以相互比较。Senzoukria 默认使用 14 周期 Wilder 平均,在独立面板中绘制。
Senzoukria · 指标 · Updated September 2026
ATR % — 波动率, 显示在图表下方的独立面板中.
ATR % 测量的是什么
每根K线的真实波幅取三段距离中的最大者:自身最高价减最低价、最高价与前收盘价的差、最低价与前收盘价的差,因此两根K线之间的隔夜波动会被计入而不是被忽略。已加载历史的第一根K线没有前一根,其真实波幅就是自身幅度。这些真实波幅用 Wilder 递推平滑,以前 N 个值的算术平均作为种子,再除以该K线收盘价并乘以 100。因此读数 0.35 表示平均每根K线覆盖约三分之一个百分点的价格,无论品种是 MNQ 还是 6E。平均值仍在预热时序列不返回任何值;收盘价为零或负数时也不返回,因为以非正数为基数的百分比不构成刻度。
公式:代码中的实现
这不是别处常见的定义,而是所发布代码实际计算的内容,记录在实现旁边:
True Range de Wilder : TR[0] = high − low ; TR[i] = max(high − low, |high − closeₚ|, |low − closeₚ|). */ function trueRanges(bars: readonly FootprintBar[]): number[] { const tr: number[] = new Array(bars.length); for (let i = 0; i < bars.length; i++) { const b = bars[i]; if (i === 0) { tr[i] = b.high - b.low; } else { const pc = bars[i - 1].close; tr[i] = Math.max( b.high - b.low, Math.abs(b.high - pc), Math.abs(b.low - pc), ); } } return tr; } /** ATR de Wilder (1978) : graine = moyenne des N premiers TR, puis ATR[i] = (ATR[i−1]·(N−1) + TR[i]) / N. Warm-up (< N barres) → null. Même récurrence que `atrSeries` d'averages.ts — recopiée pour que la famille reste autonome pendant la migration (cf. note d'en-tête). */ function wilderAtr( bars: readonly FootprintBar[], period: number, ): Array<number | null> { const n = Math.max(1, Math.floor(period)); const out: Array<number | null> = new Array(bars.length).fill(null); if (bars.length < n) return out; const tr = trueRanges(bars); let atr = 0; for (let i = 0; i < n; i++) atr += tr[i]; atr /= n; out[n - 1] = atr; for (let i = n; i < bars.length; i++) { atr = (atr * (n - 1) + tr[i]) / n; out[i] = atr; } return out; } /** σ de POPULATION fenêtré (÷N — la convention Bollinger, parité TradingView/ATAS). Two-pass autour de la moyenne de fenêtre (stabilité numérique, cf. en-tête). Warm-up (< N échantillons) → null. */ function stdPopSeries( values: readonly number[], period: number, ): Array<number | null> { const n = Math.max(1, Math.floor(period)); const means = smaSeries(values, n); const out: Array<number | null> = new Array(values.length).fill(null); for (let i = n - 1; i < values.length; i++) { const m = means[i]; if (m === null) continue; let acc = 0; for (let j = i - n + 1; j <= i; j++) { const d = values[j] - m; acc += d * d; } out[i] = Math.sqrt(acc / n); } return out; } // ── Defs ──────────────────────────────────────────────────────────────────── /** ATR % : ATR_N / close × 100 — l'ATR normalisé par le prix, comparable d'un instrument à l'autre (MNQ vs 6E). Même lissage Wilder que `atr`, défaut N=14. close ≤ 0 → null (pas d'échelle honnête) ; warm-up → null.
如何解读
- ATR % 上升表示每根K线相对价格覆盖的幅度更大;下降表示即使价格仍在移动,K线幅度也在收缩。
- 由于数值按价格归一化,两个品种上的同一读数代表可比的波动量,这正是它可用于跨品种仓位计算的原因。
- 该度量没有方向:从低位平台开始的扩张,无论幅度是在上涨还是下跌中放大,读数都一样。
- 应将当前读数与此前交易时段同一时刻的读数比较,而不是与某个绝对阈值比较——开盘和移仓期各有其正常水平。
- 单根异常大的K线会被 Wilder 平均摊到 N 根K线上,所以线条上可见的台阶比造成它的那根K线要小。
参数与默认值
周期默认 14,即 Wilder 最初的选择,它同时控制种子平均和每个新真实波幅所占的权重。可设为 1 到 200:5 这样的短设置在几根K线内就会反应,但噪音更大;50 或以上则把线条变成缓慢的状态度量。最小值 1 时,输出退化为原始真实波幅除以收盘价。
| 参数 | 类型 | 默认值 | 取值范围 |
|---|---|---|---|
| Period | number | 14 | 1 – 200 |
它无法显示的内容
ATR % 只说明K线动了多少,从不说明方向,也不说明是谁推动的——幅度相同的两根K线,delta 可能相反,结果也可能相反。Wilder 平滑按构造必然滞后,所以状态变化会在大约 N 根K线内逐渐显现。在清淡时段,因为成交很少,K线幅度缩小,读数随之降低,但市场并不一定真正平静。分母是该K线自身的收盘价,因此即便绝对幅度不变,随着价格趋势变化,百分比也会略有漂移。
相关指标
- True Range — 波动率
- Std Dev — 波动率
- Squeeze — 波动率
- Chaikin Volatility — 波动率
- Realized Vol — 波动率
- Skewness — 波动率
其他语言版本
Frequently asked questions
- ATR 和 ATR % 有什么区别?
- ATR 以品种的价格单位表示,所以一个合约上的 12 点无法与另一个合约上的 12 点比较。ATR % 把同一个 Wilder 平均除以当前收盘价再乘以 100,得到一个无单位的数值。平滑方式和真实波幅定义完全相同,变的只是刻度。
- 为什么图表开头的 ATR % 是空的?
- Wilder 平均以前 N 个真实波幅的均值作为种子,所以在加载满 N 根K线之前不存在任何数值。指标在这些K线上不返回值,而不是用不完整的样本画出部分平均。默认周期为 14 时,线条从第十四根K线开始。
- ATR % 能在期货图和加密货币图之间比较吗?
- 百分比形式消除了价格水平的差异,因此数字落在同一刻度上。无法迁移的是交易环境:交易时段、流动性和K线构成都不同,而且 Senzoukria 中的加密货币品种仅用于分析,不支持订单路由。应在相近的流动性条件下比较数值,而不是拿安静的隔夜时段与现货交易时段开盘相比。