分類
技術
難度
入門
適用情境
策略設計MT5 操作

指數移動平均線

一種給予近期價格更高權重的移動平均線,因此比簡單平均更早轉向。EA 的趨勢過濾與交叉進場建立在它之上的次數,多過任何其他指標。

亦稱:EMA, 指數均線

更新於 · 審閱於

一句話講清

一條近期價格的平均線,對剛剛發生的事比對一段時間之前發生的事更上心。它比普通平均線轉得更快,所以在趨勢裡更有用,在盤整區裡更聒噪。

為什麼重要

指數均線是 EA 趨勢邏輯的預設積木:它提供 ADX 這類指標刻意不提供的方向。它同時也是散戶 EA 中最被濫用、最被過度最佳化的部件——因為交叉規則寫起來容易,而它的兩個週期又太容易調到任何一段歷史都顯得獲利為止。

  • 它給策略一個符號。趨勢強度與波動率本身沒有方向;把上漲與下跌帶進規則裡的,是價格與均線、或快線與慢線之間的比較。
  • 它比簡單平均反應更快,而這一點要到轉折處才見分曉——趨勢策略的大部分結果就在那裡被決定。
  • 它天生是落後指標。任何移動平均都在描述已經發生的事,所以交叉是確認而不是預測。
  • 兩個週期就是兩個參數,在它們上面做網格搜尋,總能找到一對在任意給定視窗上看起來極佳的組合。這就是 EA 設計裡最經典的過度擬合陷阱。

在 MetaTrader 5 中

在 MT5 的什麼位置

  • 插入 → 指標 → 趨勢 → Moving Average,然後把 Method 設為 Exponential
  • 均線屬性對話方塊還會設定套用價格——Close 是慣常選擇,而且會明顯改變數值
  • 它畫在主視窗的價格刻度上,這一點與 ATR 或 ADX 不同
  • 策略測試器 → 輸入參數——快週期與慢週期是最容易被過度最佳化的兩個輸入項

EA 如何使用它

  • 在 OnInit 中建立 handle——iMA(_Symbol, PERIOD_CURRENT, 21, 0, MODE_EMA, PRICE_CLOSE)——每個週期一個,並在 EA 的整個生命週期中保留。
  • 作為方向過濾:只在價格或快線位於慢線之上時做多,位於其下時做空。
  • 作為交叉進場:快線在一根已收盤的 K 線上穿過慢線,這要求同時讀取第 1 根與第 2 根 K 線,才抓得到交叉而不是狀態。
  • 作為移動停損的參照:當價格收在所選均線的另一側時離場,這條移動規則會跟著趨勢自身的節奏調整。
  • 更高週期的均線用同一個呼叫、換一個週期參數來讀取;M15 的 EA 從 H4 取方向就是這麼做的。

常見設定

設定項 常見取值 備註
快/慢組合,短線 8 / 21 反應很快;會產生大量交叉,而其中多數並不是趨勢。
快/慢組合,中線 50 / 200 被廣泛關注的一對。訊號很少,而且給出的訊號來得晚。
單一趨勢過濾 進場週期上的 EMA 200 當作方向閘門用,而不是當作進場訊號。
套用價格 Close 常規且穩定。中位價或典型價會進一步平滑,並改變每一個回測結果。
訊號 K 線 最後一根已收盤的 K 線 讀取正在形成的 K 線,會產生在這根 K 線內部出現又消失的交叉。

常見運行問題

  • 偵測狀態(快線在慢線之上)而不是事件(快線剛剛穿過慢線),結果在整段趨勢裡每根 K 線都重新進場。
  • 讀取索引 0,使交叉隨每個跳價閃爍,產生實盤無法重現的回測結果。
  • handle 建立在 OnTick 裡,會一直洩漏到 iMA 傳回 INVALID_HANDLE 為止。
  • 在慢週期還沒有足夠歷史時就於啟動階段呼叫 CopyBuffer,傳回的 0 會被當成交叉來比較。
  • 在同一段視窗上同時最佳化兩個週期並把峰值發布出去——這是 EA 在測試中看起來極佳、緊接著就失效的最常見方式。

相關 MT5 函式

iMA(symbol, timeframe, period, shift, MODE_EMA, applied_price)
建立 handle;讓它成為指數而非簡單平均的,正是 MODE_EMA。
CopyBuffer(handle, 0, start, count, array)
從它唯一的緩衝區裡讀出均值。
ArraySetAsSeries(array, true)
讓索引 0 成為當前 K 線,這是絕大多數交叉程式碼預設的約定。
iTime(symbol, timeframe, 0)
用來做到每根 K 線動作一次,而不是每個跳價動作一次。

範例

讀狀態與讀事件的差別,這是 EA 程式碼裡最常見的一個均線錯誤。

第 2 根 K 線——快線對慢線
快線在慢線之下
第 1 根 K 線——快線對慢線
快線在慢線之上
正是這一對讀數,才讓它成為交叉而不是一個條件。
狀態偵測的結果
每根 K 線都觸發
只要趨勢還在就一直觸發,而且每次都再加一筆部位。
事件偵測的結果
只觸發一次

在強趨勢裡測試時,兩個版本看起來都獲利。但其中只有一個是原本想要的策略。

計算 if (fast[2] <= slow[2] && fast[1] > slow[1]) → 向上交叉

結果 每次交叉進場一次,而不是每根 K 線進場一次

怎麼使用

一條均線規則寫起來容易,湊出來也容易。所有值得檢查的事情,都關乎參數被挪動之後還站不站得住。

區間 含義
週期挪動 10% 結果就崩掉 被擬合到了測試視窗上。穩健的設定,它的鄰居也同樣能用。
很寬一段週期組合都表現相近 這個效應更可能是結構性的而不是擬合出來的,這正是最佳化曲面上出現平台區的含意。
沒有盤勢過濾的交叉 訊號在盤整區裡同樣會觸發,而在那裡它們大多虧損。這正是通常要加上 ADX 或波動率過濾去修正的問題。
在正在形成的 K 線上讀取 無法重現。同一段行情會因為跳價到達的時間不同而產生不同的進場。
  • 挑週期時,寧要平台區也不要尖峰。回測裡最好的那個單一結果,恰恰是最不可能重演的。
  • 給交叉配一個盤勢過濾。沒有過濾的趨勢規則,會在它最不擅長的環境裡做出最差的交易。
  • 用兩根 K 線來判定交叉,絕不要只用一次比較,而且只在已收盤的 K 線上動作。
  • 記住移動平均是跟著價格走的。它無法領先,所以建立在它之上的策略是參與型策略,而不是預測型策略。

移動平均的 `/indicators` 頁面講的是計算方式以及與 SMA 的比較;這一條講的是指數均線如何接進 EA 的邏輯裡。

常見誤解

把狀態當成事件

偵測快線是否在慢線之上,在整段趨勢裡都為真。偵測它是否剛剛穿過,則還需要前一根 K 線——兩者的差別就是一次進場和幾十次進場的差別。

把兩個週期都最佳化一遍,然後發布最好的那一對

平滑曲面上的兩個自由參數,總能生出一份漂亮的回測。真正有價值的是相鄰的組合是否表現相近,這就是效應與擬合之間的分界。

使用交叉卻不加市場狀況過濾

在盤整區裡均線會不停交叉,而那些交叉幾乎全是虧的。過濾器不是對策略的最佳化——它是讓這套策略變得可用的前提。

認定 EMA 一定優於 SMA

它反應更快,而這把刀是雙刃的:在真實趨勢裡進場更早,在雜訊裡假訊號更多。哪一個更合適取決於策略,而兩者的差別比週期選擇的差別還要小。

深入說明

已發布的 EA 用什麼來代替它判斷方向

這裡發布了十四個 EA,並附有各自完整的平倉記錄。其中沒有任何一個從指數移動平均線裡取方向。

判斷方向的機制EA 數量具體是什麼
一目均衡表轉換線/基準線交叉5Kestrel Hover、Orrery、Peregrine、Tessera、Zerqon
疊放的簡單移動平均線1Lanternfish —— M30 上的 SMA 25/50/75,進場在 M5
指數移動平均線0——
交叉之外的其他機制8RSI 極值、通道邊緣的回歸、K 線型態

這五個留下了交叉、捨棄了調參:轉換線與基準線的週期來自指標本身的定義,而不是來自網格搜尋。五個都讀取已收盤的 K 線,其中 Orrery 與 Peregrine 還要等訊號 K 線的實體超過其近期均值的若干倍才動手——這正是一個裸交叉所需要的盤勢過濾。它們的獲利因子在 1.27 到 1.46 之間,和目錄裡其餘產品處在同一檔,並沒有更高。

策略測試器的輸入參數頁為每個週期提供起始值、步長與終止值。請讀完整份結果,而不是只看最上面一行:一片彼此相鄰、表現接近的組合是效應,孤零零的一個尖峰則是擬合。這就是過度擬合在實務中的樣子,也是為什麼像ADX 這樣的過濾器應該排在再調一個週期之前。

常見問題

MT5 的 EA 一般用哪些 EMA 週期?
短線系統最常見的是 8/21 這一對,中線判趨勢最常見的是 50/200,而單獨一條 EMA 200 常常只被當作方向閘門。具體數字並不如另一件事重要:把這些數字挪動之後策略是否還成立——只依賴某一對精確取值的結果,是被擬合到測試視窗上的。
對 EA 來說 EMA 比 SMA 更好嗎?
EMA 反應更快,因此在真實趨勢裡進場更早,在雜訊裡假訊號更多。沒有哪一個是普遍更優的,而且兩者的差別通常小於同一類型內部兩種週期選擇之間的差別。
我的 EMA 交叉 EA 為什麼開這麼多部位?
幾乎總是因為程式碼偵測的是快線是否位於慢線之上,而不是它是否剛剛穿過。前一個條件在整段趨勢裡都為真,於是每根 K 線都觸發;要抓住交叉,就必須同時和前一根 K 線做比較。
EMA 能預測趨勢反轉嗎?
不能。它是已經發生過的價格的平均,因此必然跟在後面。交叉確認的是變化已經發生,而不是變化即將到來,這份落後正是平滑所付出的代價。