免寫程式生成 MT4 或 MT5 EA:從回測到 EA
能匯出 MQL4 或 MQL5 原始碼的策略生成軟體,會把 EA 直接給你一個檔案。在 MetaEditor 編譯後,用對齊的資料與成本在策略測試器中執行,從第一筆交易開始比對交易明細,修正那個不一致的設定,再分階段進入模擬帳戶與實單交易。
作者 Soren Huang · 發佈 · 更新於 · 編輯原則
目錄
不用寫 MQL,如何把測試過的策略變成 MT4 或 MT5 的 EA?
你不需要寫 MQL。能匯出 MQL4 或 MQL5 原始碼的策略生成軟體,例如 AlphaPrime(Valynox),會把 EA 以原始碼檔案的形式交給你。你在 MetaEditor 中開啟檔案並編譯,在策略測試器中執行,將它的交易與原本的回測比對,之後再掛到圖表上。
EA(expert advisor)是用 MQL4(MetaTrader 4)或 MQL5(MetaTrader 5)寫成的程式,由 MetaTrader 在單一圖表上執行,可自行開倉、修改與平倉。EA 生成軟體則是把你已測試過的交易規則轉成該原始碼檔案的程式,因此寫程式這一步已經替你完成。MetaEditor 是每個 MetaTrader 終端都附帶的編輯器;按一下即可把 .mq4 檔編譯成 .ex4 檔,或把 .mq5 檔編譯成 .ex5 檔,之後終端就能載入。同一支策略也能搬到其他平台,TradeStation 和 TradingView 各有一篇教學。
AlphaPrime 可將策略原始碼匯出到六個平台,MetaTrader 4(MQL4)與 MetaTrader 5(MQL5)是其中兩個;完整清單請見支援匯出的平台頁面。你匯出的策略已經過 AlphaPrime 的回測,其中計入手續費、滑價與下一根 K 棒執行,所以 EA 是最後一步,而不是第一次測試。
- 先完成研究。在研究程式中,用你信任的 K 棒資料檢驗策略。不要打算「到 MetaTrader 再修」。
- 匯出 MQL4 或 MQL5 原始碼檔。選擇與券商提供的終端相符的檔案;MQL4 與 MQL5 是不同的語言,為其中一種寫的檔案無法在另一種編譯。
- 在 MetaEditor 編譯。把檔案複製到終端的 Experts 資料夾,在 MetaEditor 開啟並編譯。編譯成功時錯誤數為零。
- 執行策略測試器並比對。這是多數人略過的一步,也正是能在動用資金之前抓出交易時段或手數錯誤的一步。
- 把 EA 掛到圖表上。先在模擬帳戶,再以最小部位實單交易。
匯出前先檢查一件事:MetaTrader 提供的是固定的 K 棒週期清單。MetaTrader 4 有九個,從 M1 到 MN1;MetaTrader 5 再多出幾個,例如 M2、M10 與 H2。如果你的研究用了 MetaTrader 不提供的 K 棒週期,請改用它提供的週期重做研究,然後再匯出。
為什麼 MetaTrader 的回測起點資料與原本的不同?
MetaTrader 用券商的報價來源、券商的時區、券商的商品代號來建立 K 棒,所以在你對齊交易時段、時區、商品與成本之前,同樣的規則看到的 K 棒開盤與收盤,與原本的回測並不相同。規則沒變,變的是它們讀到的 K 棒。
伺服器時間是券商交易伺服器的時鐘,MetaTrader 中每根 K 棒都以該時鐘標記時間,而不是你的當地時間,也不是交易所的時間。針對指數期貨的研究回測通常使用交易所時間與交易者自選的交易時段。在 MetaTrader 中,商品常是同一指數的差價合約(CFD),採用券商自己的交易時間,而 H1 K 棒是在伺服器的整點收盤,不管交易所的交易時段是否從整點開始。交易所與券商會調整交易時段與商品規格;比對前請查看 MetaTrader 的商品規格視窗與交易所的合約頁面,並用期貨交易時間工具查看以你所在時區表示的交易所交易時段。
| 不同之處 | 原本的回測 | MetaTrader | 比對前要不要使其一致 |
|---|---|---|---|
| K 棒時間戳記 | 交易所時間 | 券商伺服器時間 | 要:把交易時段時間換算成伺服器時間 |
| 交易時段 | 由交易者設定 | 券商對該商品的交易時間 | 要:把 EA 限制在相同時段 |
| 商品 | 交易所期貨合約 | 券商商品,常是同一指數的 CFD | 要:相同標的與相同 K 棒週期 |
| K 棒收盤 | 依交易所交易時段邊界 | 依券商時鐘邊界 | 要:對齊交易時段的第一根 K 棒 |
| 成本 | 每邊手續費加滑價 | 價差加手續費,以及測試器的延遲設定 | 要:把測試器的價差與延遲設成相同的一買一賣(來回)總成本 |
成本最需要小心。研究回測是以每邊計算手續費與滑價;MetaTrader 則模擬價差(買價與賣價之間的差距)、券商設定的手續費,以及在 MetaTrader 5 測試器中的執行延遲。請把兩邊的一買一賣(來回)成本加總並使總額相等,做法見回測中的交易成本。如果你希望 EA 讀到的 K 棒與研究所用的完全一樣,MetaTrader 5 可讓你建立自訂商品並匯入自己的 K 棒歷史,MetaTrader 4 則可在歷史中心為商品匯入歷史資料;這樣剩下的差異就只有成本與執行。
如何執行策略測試器,並確認它與原本的回測一致?
在相同的商品、K 棒週期、日期範圍與成本設定下執行測試器,然後從第一筆進場開始逐筆比對兩份交易明細;良好的吻合是進場時間與方向相同,價格差異不超過你設定的價差或滑價,而第一筆出現分歧的交易會告訴你哪個設定有誤。這就像逐行核對同一張發票的兩份副本:第一行不同的地方就指向錯誤。
- 選擇 EA、商品與 K 棒週期。在策略測試器視窗中,選擇已編譯的 EA、上一節中對齊好的商品,以及研究所用的 K 棒週期。
- 設定日期範圍。使用與原本回測相同的起訖日期。確認終端已下載整段範圍的歷史資料;因缺少歷史資料而較晚開始的測試器,看起來會像是策略停止交易。
- 選擇建模模式。在 K 棒收盤時做決定、並在下一根開盤執行的策略,可用「僅開盤價」測試;它速度快,進場也符合研究的慣例。如果策略在 K 棒內部使用停損或停利,請使用逐筆報價模式(MetaTrader 4 的「每個報價」;MetaTrader 5 的「基於真實報價的每個報價」或「1 分鐘 OHLC」),讓出場價格以正確的順序被觸及。
- 設定成本。設定固定價差,而不是「目前」價差,讓測試可重複;並在 MetaTrader 5 中設定延遲,使其符合你假設的滑價。
- 設定輸入值。輸入研究選出的參數值,以及相當於一口的手數(見下一節)。
- 執行並儲存報表。打開報表,儲存交易明細,並把它與研究程式的交易明細並排比較。
依下列順序比對兩份明細:先看交易筆數,再看第一筆進場的時間與方向,最後才是價格。多數進場差一個跳動點,是價差或延遲在發揮作用。若 MetaTrader 中的進場晚了一根 K 棒,表示 K 棒邊界有偏移:請檢查伺服器時間偏移與交易時段的第一根 K 棒。若有進場不見了,表示被交易時段過濾條件或停損距離擋下。兩份明細的每一筆交易時間與方向都一致,價格也落在你設定的成本範圍內,就已經是兩個不同程式、兩個不同報價來源所能達到的最接近程度;這也是確認沒有任何交易使用自身訊號 K 棒價格的好時機,因為那樣的成交是未來函數洩漏,實單的 EA 永遠無法重現。
哪些 EA 設定最容易造成不一致:手數、魔術數字、券商設定?
資料對齊之後,剩下的差異大多來自少數幾項設定:固定手數不等於一口、魔術數字缺少或與他人共用、券商的停損水平與凍結水平、商品的合約規模與每跳動點價值,以及券商的成交政策。每一項都有能在測試報表中看到的徵兆,也有在 MetaTrader 中檢查的位置。
魔術數字是 EA 寫入它所送出每一張委託單的整數,讓它之後能在同一帳戶的其他單子中認出自己的部位。停損水平是券商要求目前價格與掛單或停損之間至少要相隔的距離,以點計。凍結水平是在該距離內,既有委託單不能被修改或刪除。成交政策是券商對部分成交的規則:全部成交否則取消、立即成交否則取消,或返回(成交可成交的部分,其餘保留)。這四項都在商品規格視窗中,在報價看板的商品上按右鍵即可開啟。
| 徵兆 | 可能原因 | 檢查什麼 |
|---|---|---|
| 每筆損益差 10 倍或 100 倍 | 手數與口數的對應 | 商品的合約規模與手數步進 |
| EA 平掉不是它開的單,或忽略自己的單 | 魔術數字 | 每個 EA、每張圖表使用獨一無二的魔術數字 |
| 停損單被拒絕 | 券商停損水平與凍結水平 | 商品規格中的最小停損距離 |
| 進場成交價不同 | 成交政策與價差 | 執行模式與測試器使用的價差 |
| EA 在預期之外的時段交易 | 券商伺服器時間 | 換算成伺服器時間的交易時段過濾條件 |
手數是最容易造成大驚喜的一項,因為 MetaTrader 以手數計算部位,而研究以口數計算。券商商品的一手,每點價值可能與一口交易所合約不同,而且商品的手數步進決定了你究竟能送出哪些手數。請用期貨合約計算機取得交易所合約的每點價值,再讀取券商商品的合約規模,算出能得到相同每點價值的手數。
假設範例
研究回測交易一口指數期貨,每個指數點價值 50 美元。券商針對同一指數的 CFD,合約規模為 1,所以一手每點賺 1 美元,手數步進為 0.1 手。要符合研究,EA 必須送出 50 手,而不是 1 手。如果送 1 手,測試器顯示的交易時間相同,但每筆結果都小了 50 倍,而且每手固定的手續費,佔每筆交易的比例會比研究假設的更大。
魔術數字方面,請讓每張圖表上的每個 EA 都有自己的值,並留一份簡短的清單。停損水平方面,請確認策略使用的最小停損距離大於券商的停損水平(以點計);否則券商會拒絕該委託,測試器記錄的會是一個錯誤,而不是一筆交易。成交政策方面,請選擇券商商品規格中列為允許的那一種;EA 送出券商不接受的政策,得到的是拒絕,而不是成交。
如何讓 EA 上線,並確認它仍在做回測時做的事?
分階段上線,且在每個階段,都把 EA 實際做的事與回測在同一根 K 棒上會做的事做比較,這樣滑價漂移、錯過交易時段或券商變更,幾天內就會被看到,而不是幾個月後。EA 只在終端運行且連線時才會執行;虛擬私人伺服器或一部永遠開機的電腦,可讓它整個全時段持續運作。AlphaPrime 的策略檢驗在匯出之前就先定好門檻,EA 在模擬與實單的交易,比對的是你事前設好的標準。
- 模擬帳戶,預定部位大小。讓 EA 至少運行幾週的交易。每天為每筆交易記錄:研究程式中的訊號 K 棒時間、終端中的成交時間,以及成交價相對於 K 棒開盤的差距。這三項應該與測試器時一樣吻合。記下三個數字:實際交易筆數、預期交易筆數、平均成交差距(以跳動點計)。
- 實單帳戶,最小手數。此時成交是真的了。記錄每筆進場與出場相對於回測所假設價格的滑價,並把滾動平均與你在研究中使用的滑價設定比較。如果實際滑價是假設的兩倍,在加大部位前,請用該值重跑研究回測。記錄:每邊平均滑價、最差滑價、被拒絕的委託單數。
- 實單帳戶,預定部位大小。改為每週檢討。記錄該週的交易筆數與回測中典型一週的筆數、平均滑價,以及策略預期的每個交易時段小時,是否都確實有連線的終端涵蓋。錯過的交易時段,會先以較低的交易筆數顯現,之後才在結果中顯現。
任何你無法解釋的差異,都要讓你回到模擬階段,用與測試器相同的逐筆比對方式處理。常見原因有:券商變更(新的伺服器時間偏移、轉倉後的新商品名稱、新的停損水平)、終端在某段交易時段中斷連線,或策略交易時段的價差有變。請保留 EA 的日誌檔;它以時間戳記顯示每張送出的委託單、每次拒絕與每次重新連線。
如果你使用 AlphaPrime,這代表:你匯出成 MQL4 或 MQL5 的策略,已在計入成本與下一根 K 棒執行的條件下評估過,所以與測試器的比對,重點在於對齊 MetaTrader 的 K 棒、手數與券商設定,而績效報表中的交易明細,就是你在每個階段用來比對的基準。
常見問題
EA 生成軟體和 EA builder 是一樣的嗎?
這兩個名稱描述的都是讓交易者不必自己寫 MQL 就能產生 EA 程式碼的軟體。EA builder 通常讓你從選單中手動組合規則;策略生成軟體則會搜尋大量的規則組合、進行測試,並把通過的策略匯出成原始碼檔案。兩者的輸出都是你在 MetaEditor 編譯的 .mq4 或 .mq5 檔。
可以在 MT4 上執行 MT5 的 EA 嗎?
不行。MQL4 與 MQL5 是不同的語言,交易函式也不同,為其中一種寫的檔案無法在另一種編譯。請匯出與你的終端相符的檔案;AlphaPrime 同時匯出 MQL4 與 MQL5,所以你在匯出時選擇即可,不需要手動轉換。
為什麼策略測試器顯示的交易筆數比我原本的回測少?
最常見的原因有:日期範圍中有一段缺少歷史資料、交易時段過濾條件沒有換算成伺服器時間,以及停損單因距離低於券商的停損水平而被拒絕。請先查看測試器日誌中的錯誤,再把第一筆缺少的交易與原本的明細比對,看是哪一種原因。
我可以直接下載現成的 EA,而不用自己匯出嗎?
已編譯的 .ex4 或 .ex5 檔可以執行,但你看不到它的規則,因此無法把它的交易與你掌控的回測比對,也無法在券商變更商品時調整設定。從自己的研究匯出的原始碼檔案,可以被編譯、閱讀並逐筆比對,這正是本文測試器比對的重點。
執行 EA 需要 VPS 嗎?
EA 只在其終端開啟並連上券商時才會執行。如果策略交易的時段是你的電腦可能關機或離線的時間,虛擬私人伺服器或一部永遠開機的機器,可讓該交易時段被涵蓋。錯過的交易時段,會先以每週交易筆數低於回測預期的方式顯現。

