策略測試器的優化,會依你選的標準(例如最後餘額)從一堆參數裡排出第一名。問題是它排名時已經看過答案:同一段資料拿來挑參數又拿來打分數,成績容易偏好看。這篇把歷史切成三段,用一段挑參數,另外兩段考試,看冠軍在沒看過的年份還站不站得住。
範例沿用均線交叉下單的 MaCrossTrade.mq5(快慢 EMA 交叉進場、ATR 倍數停損停利、固定 0.10 手),程式一行沒改。商品 EURUSD、H1,報價模式「1分鐘OHLC」。先講結論:訓練段的冠軍,在樣本外和鎖定段兩段都賠錢。
1. 為什麼要切三段
- 訓練段:拿來優化、挑參數。
- 樣本外:冠軍參數凍結後第一次考試。
- 鎖定段:最後一關,只考一次。樣本外考完,人總會想回頭調參數;鎖定段完全不碰,留到最後才用,調過的版本也只能在這裡考一次。
MT5 測試器設置頁的前向測試只切一刀(一段優化、一段前向),前向結果就列在優化結果旁邊,看完很容易回頭改參數。三段切法多留一段完全不碰的資料,這是兩者最大的差別。
測試器也沒有自動「滾動」的功能(每隔一段重新優化、往前推)。這篇只做一次切分,嚴格說是單次前推,不是滾動式的 Walk-Forward。
2. 開跑前先把規則寫死
挑參數的方法如果是看完結果才決定的,三段切得再漂亮也沒用。所以開跑前先寫一份登記,存進版本控制,之後不改:
- 網格:快線 5~20、慢線 20~60、停損 1~3 倍 ATR、停利 2~4 倍 ATR,共 180 組,完整算法、優化標準「最大本日餘額」。
- 選冠軍:交易筆數至少 100、獲利因子大於 1 的組合裡,淨利最高的那組。
- 通過條件:樣本外和鎖定段的獲利因子都要大於 1.2、各至少 30 筆,而且樣本外的獲利因子不能低於訓練段的 6 成。
三段的日期這樣切:
| 段 | 期間 | 用途 |
|---|---|---|
| 訓練 | 2019-01~2021-12 | 挑參數 |
| 樣本外 | 2022-01~2023-12 | 第一次考試 |
| 跳過 | 2024-01~2025-06 | 已經看過 |
| 鎖定 | 2025-07~2026-09 | 只考一次 |

訓練段從 2019 年開始,是因為我這家券商 2018 年的歷史資料不夠細。同一隻 EA 拿 2018 年整年來跑,報告只有 258 根 H1 K 線、1032 個報價(每根 4 個),「質量歷史」0%;樣本外兩年則有 12431 根。一年的 H1 只剩兩百多根,幾乎是一天一根,H1 策略用這種資料回測沒有參考價值。
跳過的那一年半,是之前用同一隻 EA、同一組網格優化過的期間。看過的資料不能再當作沒看過,所以鎖定段改用之後的 15 個月。另外,測試器的結束日期是當天 0 點,不含那一天:樣本外實際測到 2023-12-30,鎖定段測到 2026-09-29。
3. 訓練段:180 組選出冠軍
訓練段 180 組裡,快線等於慢線的 9 組一筆都不會交易;賺錢的有 41 組。照登記的規則,冠軍是快線 20、慢線 40、停損 3 倍 ATR、停利 4 倍 ATR:三年 353 筆、淨利 +723.33、獲利因子 1.12。這組剛好也是 180 組裡淨利最高的,合格條件沒有排掉更好的組合。
執行時出了一個小差錯:登記要求冠軍先存進版本控制再考樣本外,結果那次存檔的指令失敗了,樣本外先跑了。冠軍是程式照規則從訓練結果選出來的,選出的時間早於樣本外開跑,參數沒有因此改動;補存之後,後面每一步都先確認存檔成功才往下做。
4. 考試:樣本外與鎖定段
冠軍參數凍結後,各段都從入金 10,000、空倉重新開始,各跑一趟:
| 段 | 筆數 | 淨利/獲利因子 |
|---|---|---|
| 訓練 | 353 | +723.33/1.12 |
| 樣本外 | 296 | −667.43/0.90 |
| 鎖定 | 155 | −468.63/0.83 |
兩段考試都賠錢,獲利因子 0.90 和 0.83 都在 1 以下,離 1.2 的門檻很遠:判定不通過。筆數(296、155 筆)和「質量歷史」(99%、100%)都達到登記的門檻。
淨利已經扣掉點差、手續費和隔夜利息。把樣本外的成交表逐筆加起來:手續費 −177.60、隔夜利息 −39.23,扣這兩項之前的成交損益是 −450.60;鎖定段是 −93.00、−10.93、−364.70。點差已經算在成交價裡,拆不出來;但不計手續費和隔夜利息,兩段也一樣賠錢。
樣本外已經不過,照理可以停在這裡;鎖定段還是照登記跑了,判定用的單趟只跑這一次,結果一樣是賠錢。
5. 換個角度看:冠軍其實排在哪
判定寫下之後,才拿其他資料做對照,這些都不影響結論:
- 樣本外整個網格:同樣 180 組在 2022~2023 年只有 8 組賺錢(另有 9 組沒交易),訓練冠軍排第 78 名。訓練段賺錢的 41 組裡,到樣本外還賺錢的剩 6 組;樣本外至少 30 筆的組合,獲利因子最高 1.13,沒有一組過 1.2。
- 樣本外最賺的那組(快線 20、慢線 50、停損 3、停利 3)在訓練段排第 23 名,照登記的規則事前挑不到它。
- 全段一起優化:把 2019 到 2026 年 9 月全部丟進去優化,180 組只有 3 組賺錢,第一名獲利因子也只有 1.02(898 筆、+323.35),就是上面樣本外最賺的那組。訓練冠軍放在全段是 −597.30。
- 換報價模式:冠軍改用「每次報價」重跑兩段,筆數相同,獲利因子 0.90、0.83,跟「1分鐘OHLC」幾乎一樣。這兩種模式都是從 1 分鐘資料模擬報價,真實報價模式沒有測。
全段第一名就是樣本外最賺的那組。全段本來就包含樣本外那兩年,在其中一段特別好的組合,加總起來也容易排在前面。拿全段優化的第一名當成「這個策略最好的設定」,等於用考試答案回頭挑參數。
6. 這個結果能說明什麼
照登記選出的冠軍沒有通過。整個網格看,訓練段賺錢的 41 組到樣本外只剩 6 組還賺錢,也沒有一組達到 1.2 的門檻:這個均線交叉策略在 EURUSD H1 上,這組網格裡沒有參數達到事先定的通過門檻。
結論的範圍只到這裡:只測了一個商品、一個週期、一種切法。不代表均線交叉在其他商品或週期上一定沒用;反過來,就算某組通過了三段,也還要檢查是不是靠一兩筆大單撐起來、換個商品還成不成立,這些檢查本文沒做。
三段驗證最有用的地方,是把「挑參數」和「打分數」分開。只要在動手前把規則寫死、鎖定段只碰一次,不通過的結果至少是可信的,不會被事後的調整蓋過去。
本篇檔案:MaCrossTrade.mq5 放 MQL5\Experts\,在 MetaEditor 打開按 F7。