MT5 策略測試器:報價模式、報告數字、參數優化與前向測試

這篇不寫新程式。把均線交叉的 MaCrossTrade 放進策略測試器,從頭到尾走一遍:設定怎麼填、四種報價模式跑出來差在哪、報告該看哪幾個數字、參數優化怎麼設、前向測試怎麼抓過度擬合。文中的數字全是我這台 MT5 實跑出來的。

範例用 MaCrossTrade.mq5(EMA 10/30 交叉、ATR 倍數停損停利),放到 MQL5\Experts\、在 MetaEditor 按 F7 編譯好就能跟著做。

設定頁怎麼填

「查看」選單的「策略測試」或 Ctrl+R 打開測試器。「概述」頁是幾個捷徑,「設置」頁才是完整的設定,這次用的值:

  • 專家:MaCrossTrade;交易品種:EURUSD;週期:H1。
  • 日期:自定義週期,2025.01.02 到 2025.01.31。
  • 延遲:零延遲,理想執行。先不模擬網路延遲。
  • 模式:每次報價。下一節講差別。
  • 入金:10000 USD;杠杆:1:100。
  • 優化:已禁用。「轉寄」是 Forward 的怪翻譯,就是前向測試,先選否,優化那節再用。

「輸入」頁列出 EA 的 input 參數,值可以直接改,不用重新編譯。按「開始」,跑完會自動切到結果頁。「日誌」頁是測試器和 EA 的 Print 輸出,出錯先看這裡。

四種報價模式,同一隻 EA 四種結果

除了真實報價那種模式,測試器手上只有 K 線,最細到 1 分鐘,中間的每一筆報價(tick)是模擬出來的,差別在每根 K 線裡模擬幾個價。同一個月、同一隻 EA、四種模式(名稱照「模式」下拉):

模式報價數交易筆數總淨盈利 (USD)跑的時間
每個報價基於真實報價2,445,55714+184.832.3 秒
每次報價2,282,86114+237.232.2 秒
1分鐘OHLC119,48714+237.030.9 秒
僅使用開價1,98513+194.530.7 秒

「每次報價」從 1 分鐘 K 線的開高低收把中間的走法畫出來;「1分鐘OHLC」一分鐘只給開高低收四個價;「僅使用開價」一根 H1 也只給四個價:開盤在整點,最高、最低、收盤擠在那根結束前的最後幾秒,日誌裡停損停利都在 59 分 57、58 秒觸發。「每個報價基於真實報價」用券商真的記錄下來的每一筆報價,含當時的點差。要券商有提供 tick 歷史才有意義:缺 tick 的分鐘會退回每次報價模式模擬,報告的「質量歷史」就不會是「100% 真實報價」;我的 Tickmill 帳號 2025 年 1 月的 EURUSD 是。

三種模擬模式的進場訊號完全一樣,訊號在 K 線收盤判斷,每種模式都有那個價;差在停損停利。1分鐘OHLC 跟每次報價幾乎一樣,差的 0.2 塊是 2 筆停利成交價各差 1 點:有一分鐘的最高最低就知道碰沒碰到,只有停損停利近到同一分鐘內兩邊都碰得到時才會猜錯,這隻 EA 兩邊都離進場價兩倍 ATR 以上。

僅使用開價少一筆:第一個訊號的 tick 落在週一 00:00,市場還沒開,下單被拒「市場關閉」,其他模式週一第一筆 tick 是 00:05。停損停利只在一小時四個價上檢查,一小時內先碰哪邊只能猜。

真實報價差最多,兩個地方。週一開盤第一筆多單買在 1.03102 而不是 1.03042,Bid 一樣、Ask 差 60 點:那一分鐘每次報價模式用的點差是 34 點,真實報價是 94 點;不過那筆最後只差 0.1 塊,停利跟著進場價一起挪了。1 月 23 日那筆空單,每次報價模式 18:12 碰到停利,真實報價模式那時價格沒碰到、18:45 打到停損,一來一回差 53 塊,兩種模式的缺口幾乎全在這一筆。模擬出來的 tick 只是「這一分鐘內可能的一條路」,不是真的走過的路。

怎麼選:像這種只在收盤判斷、停損停利離得遠的策略,開發和優化用 1分鐘OHLC,快得多(這裡 2.2 秒對 0.9 秒)、結果幾乎一樣,定案前用每次報價或真實報價再跑一次確認;盤中追蹤停損、掛單這類靠 tick 的策略一開始就用每次報價。僅使用開價只適合完全在收盤判斷、不掛停損停利的策略。

報告要看哪幾個數字

結果頁幾十個數字,先看這幾個(每次報價那次):

項目意思
總淨盈利237.23 USD毛利減毛損,這個月賺的錢
交易總計14開了幾筆
盈利交易(%在全部)8 (57.14%)賺錢的筆數與勝率
盈利因子3.19毛利 ÷ 毛損,1 以下是賠錢的系統
預期收益16.94平均每筆賺多少
最大權益數虧損103.56 (1.02%)權益從高點掉下來最深的一次(金額與百分比)
採收率2.29總淨盈利 ÷ 最大回撤,賺的錢是回撤的幾倍
夏普比率4.80報酬除以波動,越高越平穩

報告裡的「本日餘額」是 Balance 的怪翻譯,「最大本日餘額虧損」就是餘額回撤,只算已平倉的;「權益數」是 Equity,含浮動盈虧。看回撤看權益數那個。「柱」是 K 線數,「報價」是 tick 數。

一個月 14 筆,夏普比率 4.80 這種數字沒有意義,樣本太少。報告要拉長到幾年、幾百筆才值得認真看,下面的優化就用整年。

參數優化

「輸入」頁每個參數後面有開始、步長、停止三格和一個勾。勾起來的參數會在範圍裡逐一嘗試,沒勾的固定用「值」那格。我勾了四個:快線 5 到 20 步長 5、慢線 20 到 60 步長 10、停損 1 到 3 倍、停利 2 到 4 倍,後兩個步長 1,4×5×3×3 = 180 組。

手數和魔術碼不該優化,把勾拿掉;更乾淨的做法是在程式裡把 input 改成 sinput,輸入頁還看得到、值照改,只是開始、步長、停止那幾格和勾都不能用,優化結果也不會有這一欄(實測過:標了 sinput 的參數就算給了範圍,測試器也只跑其他參數的組合):

sinput double i_Lots  = 0.10;     // 手數:不優化
sinput long   i_Magic = 20250401; // 魔術碼:不優化

「設置」頁的優化選「完整算法」,每一組都跑;組數多到跑不完時才用「基於快速遺傳算法」,它只往有希望的方向試。旁邊的標準是排名依據,用預設的「最大本日餘額」,也就是最終餘額最高。日期改成 2024 整年,轉寄那格下一節講;模式我還是用每次報價,求穩。按「開始」,180 組在我的 6 個代理並行跑了 8 分 45 秒,每一組平均 10 秒(加上下一節的前向 180 趟,全部 11 分 27 秒);跑完看「優化結果」頁,可以點欄位標題排序。

2024 年的結果:180 組只有 1 組賺錢,+12.23(快線 20、慢線 30、停損 1 倍、停利 3 倍,157 筆);9 組快慢線同為 20,沒交易;其餘全賠,最差賠 1,277.77。均線交叉在 2024 年的 EURUSD H1 上,這 180 組裡沒有哪組救得了。這才是優化的用途:不是找「最好的參數」,是看整片參數空間長什麼樣

前向測試:把優化出來的參數往後跑

「設置」頁的「轉寄」把測試期切成兩段:前段優化,後段(前向時期)拿優化出來最好的那批參數原封不動再跑一次:少於 256 組時全部都跑,這次 180 組全跑了,更多時只跑前 10%(遺傳算法是前 25%)。切法可以選 1/2、1/3、1/4 或自定義日期。我用自定義:2024 整年優化,2025 上半年前向。跑完多一個「向前結果」頁,每一組並排前段和後段的成績(下表參數欄是快線 / 慢線 / 停損倍數 / 停利倍數):

參數2024 盈利(優化段)2025 上半年盈利(前向段)前向筆數
20 / 30 / 1 / 3,2024 第 1 名+12.23-41.5275
10 / 50 / 2 / 4-793.81+746.7469
10 / 50 / 3 / 4-891.83+631.8469
15 / 20 / 3 / 2-851.19+515.01107
10 / 30 / 2 / 3,預設值-1,090.91+206.24109

2024 唯一賺錢的那組,2025 上半年賠 41.52;2025 上半年賺最多的那組 +746.74,2024 賠 793.81。兩段的排名沒有關係。2024 年 180 組只有 1 組賺,2025 上半年 96 組賺:賺不賺錢主要是那段行情決定的,不是參數。

這叫過度擬合:在一段歷史裡挑出來的「最佳參數」,只是最貼合那段走勢的參數,不代表下一段還貼合。前向測試是最便宜的檢查:優化完的參數,往後那段沒跑過的資料還賺,才算數。判斷時看整片,一組參數附近的鄰居都賺,比單一組冠軍可信;前向冠軍一樣是回頭挑出來的,不能拿它當下一段的答案。

回測還會在哪裡騙你

  • 歷史資料。報告的「質量歷史」不是 100% 就有缺口。券商早期的資料常常只有用日線填出來的 1 分鐘 K,我這家 2019 年以前就是這樣,盤中策略的回測我從 2019 年起算。
  • 隔夜利息和合約規格用的是現在的,不是當時的;點差倒是歷史的,存在每根 1 分鐘 K 裡,真實報價模式更是每一筆 tick 的。同一份設定、同一個月,我上次跑總淨盈利 237.28,這次 237.23,成交價、手續費、每筆盈利逐筆相同,差的 0.05 塊全在隔夜利息欄。
  • 樣本。一個月十幾筆什麼都證明不了;至少幾年、幾百筆,再加前向。

本篇檔案:MaCrossTrade.mq5,放到 MQL5\Experts\ 底下,在 MetaEditor 打開按 F7 就能用。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料