分類
技術
難度
入門
適用情境
策略設計風險管理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-Hant/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,方向則來自移動平均線或價格結構。

相關文章