分類
技術
難度
進階
適用情境
策略設計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 中建立 handle——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 在這裡,逆趨勢進場與均值回歸進場通常會被完全封鎖。
讀取的時間週期 進場週期或更高一級 讀取更高一級的週期會給出更慢、更穩的狀態訊號,代價是反應更遲。

常見運行問題

  • 把 handle 建立在 OnTick 而不是 OnInit 裡,這會造成洩漏並最終回傳 INVALID_HANDLE。
  • 啟動時在載入足夠多的 K 線之前 CopyBuffer 就失敗,這會被讀成 ADX 為零,從而悄悄地關閉——或者反過來開啟——過濾器。
  • 門檻恰好落在指標絕大部分時間所停留的位置,於是過濾器不停地開開關關,EA 的行為最終由雜訊決定。
  • 把門檻最佳化到回測中的最佳數值,得到的只是一個僅在被測試視窗內有效的數字。
  • 把 ADX 當成方向指標來讀,在下跌的市場裡看到高讀數就做多。

相關 MT5 函式

iADX(symbol, timeframe, adx_period)
建立 handle;在 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 過濾器反而讓結果變差了?
常見的原因有兩個。門檻可能恰好落在指標絕大部分時間停留的位置,於是它隨著雜訊來回切換;或者過濾器與進場規則是在同一段視窗上最佳化出來的,那麼它擬合的是那段視窗的具體行情,而不是「行情狀態」這個概念。在樣本外資料上分別測試帶過濾器與不帶過濾器的策略,就能把這兩種情況區分開。

相關文章