ATR 完整教學
用波動率動態調整部位
ATR(Average True Range,平均真實波幅)是 J. Welles Wilder 1978 年在《New Concepts in Technical Trading Systems》 發明的指標(他同年還發明了 RSI)。
這指標不告訴你買賣方向, 只告訴你「市場目前有多波動」。 但 ATR 是真正高手用的風控核心 — 1983 年的海龜交易系統、Bill Dunn 的 DUNN Capital 40 年複合年化 19%、 幾乎所有 CTA 都用 ATR 做部位管理。
1. 什麼是 ATR?背後的數學
先講「True Range(真實波幅)」 — 一根 K 棒的波動 = 三個值取最大:
TR = max(
high − low, // 當根 K 的高低差
abs(high − close_prev), // 高點到前一根收盤的差
abs(low − close_prev) // 低點到前一根收盤的差
)為什麼要考慮前一根收盤?因為跳空 gap — 當前 K 棒可能 high=100、low=98,看似波動小, 但前一根收盤是 105 → 實際波動 7(從 105 到 98)。
ATR 就是過去 N 根 K 的 TR 平均(N 預設 14):
ATR(14) = 過去 14 根 True Range 的「平滑移動平均」(RMA)2. 用法 ①:動態停損(最常見)
固定停損的問題:用 1% 停損,BTC 高波動時容易被洗、低波動時又太鬆。 ATR 停損自動調整:
//@version=5
strategy("ATR 動態停損", overlay=true)
atrLength = input.int(14, "ATR 週期")
atrMult = input.float(2.0, "停損 ATR 倍數")
atr = ta.atr(atrLength)
// 進場(隨便用 EMA 交叉做示範)
ema9 = ta.ema(close, 9)
ema21 = ta.ema(close, 21)
if (ta.crossover(ema9, ema21))
strategy.entry("Long", strategy.long)
if (ta.crossunder(ema9, ema21))
strategy.entry("Short", strategy.short)
// === 動態停損 ===
longStop = strategy.position_avg_price - atr * atrMult
shortStop = strategy.position_avg_price + atr * atrMult
strategy.exit("LongExit", "Long", stop=longStop)
strategy.exit("ShortExit", "Short", stop=shortStop)
plot(atr, "ATR", color=color.purple, display=display.pane)常見 ATR 倍數:
- 1.5x:緊停損,適合震盪盤、scalp
- 2x:標準(海龜用的就是這個)
- 3x:寬停損,適合波段、給趨勢空間
- 4-5x:超寬停損,適合超長線
3. 用法 ②:海龜部位法(最值得學的)
這是 1983 年海龜交易系統的核心。詳見 CTA 趨勢追蹤 + 海龜交易。
原理:每筆交易的「風險金額」永遠是帳戶 1%。 用 ATR 算出停損距離,反推部位大小。
風險金額 = 帳戶資金 × 1%
停損距離 = ATR × 2
部位大小(口數)= 風險金額 / 停損距離
範例:
帳戶 $10,000
ATR = $500
風險金額 = $100
停損距離 = $1,000
部位大小 = $100 / $1,000 = 0.1 BTC//@version=5
strategy("海龜部位法", overlay=true,
initial_capital=10000, default_qty_type=strategy.fixed)
atrLength = input.int(20, "ATR 週期(海龜原版用 20)")
riskPct = input.float(1.0, "每筆風險 %")
atrMult = input.float(2.0, "停損 ATR 倍數")
atr = ta.atr(atrLength)
// 部位大小 = 風險金額 / 停損距離
riskAmount = strategy.equity * riskPct / 100
stopDistance = atr * atrMult
positionQty = riskAmount / stopDistance
// 進場
if (ta.crossover(close, ta.highest(high, 20)[1]))
strategy.entry("Long", strategy.long, qty=positionQty)
if (ta.crossunder(close, ta.lowest(low, 20)[1]))
strategy.entry("Short", strategy.short, qty=positionQty)
// 動態停損
strategy.exit("LongStop", "Long",
stop=strategy.position_avg_price - atr * atrMult)
strategy.exit("ShortStop", "Short",
stop=strategy.position_avg_price + atr * atrMult)
plot(atr, "ATR", color=color.purple)4. 用法 ③:突破過濾(避免假突破)
很多突破策略會被「假突破」騙 — 價格剛剛突破前高,沒等回頭就回落。
解法:要求突破幅度大於 ATR × N,才算真突破:
//@version=5
strategy("ATR 過濾突破", overlay=true)
prevHigh = ta.highest(high, 20)[1]
atr = ta.atr(14)
breakoutFilter = atr * 0.5 // 至少要突破 ATR 的 50%
// 真突破:close 比前高高 ≥ 0.5 ATR
trueBreakout = close > prevHigh + breakoutFilter
if (trueBreakout)
strategy.entry("Long", strategy.long)5. 用法 ④:趨勢強度判斷
ATR 上升 = 市場波動增加 = 通常有強趨勢或重大事件。ATR 下降 = 市場安靜 = 震盪或盤整。
可以用 ATR 跟它自己的長期平均比較:
atr = ta.atr(14)
atrMa = ta.sma(atr, 50)
highVol = atr > atrMa * 1.5 // 波動率比平均高 50%
lowVol = atr < atrMa * 0.6 // 波動率比平均低 40%
// 高波動率時跑趨勢策略
// 低波動率時跑網格 / 均值回歸
bgcolor(highVol ? color.new(color.red, 90) : na, title="高波動")
bgcolor(lowVol ? color.new(color.blue, 90) : na, title="低波動")6. ATR 跟其他波動率指標的差別
| 指標 | 特性 | 適用 |
|---|---|---|
| ATR | 絕對價格波動,含 gap | 部位管理、動態停損 |
| 標準差(σ) | 統計波動,假設常態分布 | Bollinger Bands 等通道 |
| 歷史波動率 HV | 年化 σ,跨資產可比 | 選擇權定價 |
| 隱含波動率 IV | 市場預期未來波動 | 選擇權策略 |
7. 常見錯誤
❌ ATR 不是訊號
有人把「ATR 變大 → 做多」「ATR 變小 → 做空」當策略。 錯。ATR 只是波動率,沒有方向意義。 要配合趨勢或進出場規則。
❌ 把 ATR 當 %
ATR 是絕對價格,不是百分比。 BTC 在 $30k 時 ATR=$500 對應 1.67%, BTC 在 $60k 時 ATR=$500 對應 0.83%。 跨時間框架比較要正規化。
❌ 週期設太短
有人改 ATR 週期成 5 想「更敏感」。 結果 ATR 跟著最近 1-2 根極端 K 大幅震盪,停損點亂跳。 堅持用預設 14 或 20。
❌ 全部資產用同一 ATR 倍數
BTC 跟山寨幣的特性不同。建議:
- BTC:ATR × 2-3
- ETH / 大型山寨:ATR × 2-2.5
- 小型山寨:ATR × 3-4(噪音大需更寬)
8. 三個關鍵 takeaway
- ATR 是「翻譯機」:把抽象波動率翻成具體金額, 讓你做部位、停損、風險控制
- 海龜部位法是 1983 年的革命性概念: 每筆 1% 風險、ATR 動態調整 — 至今仍是業界標準
- ATR 沒有方向,不要拿來當訊號。 它的價值在讓你的策略適應市場狀態