分類
平台
難度
入門
適用情境
MT5 操作EA 評估策略設計

智慧交易系統

用 MQL5 撰寫、在 MetaTrader 5 內執行、依程式規則無需人工介入即可下單、改單與平倉的自動交易程式。

亦稱:EA, Expert Advisor, 交易機器人, 交易機器

更新於

一句話講清

一個在 MetaTrader 內替你交易的程式。它沒有判斷力,也沒有超出你所給予的記憶:平台呼叫它時它醒來,只看它被寫出來要看的那幾樣東西,然後行動。

為什麼重要

回測、回撤數字、magic number、VPS 上線時間——這些之所以存在,是因為下單的是程式而不是人。知道平台交給 EA 什麼、又不交給它什麼,正是把結果讀對與被結果嚇一跳之間的差別。

  • 它執行時毫不猶豫,這既是它的全部價值,也是它的全部風險。那套從不漏掉有效訊號的規則,同樣也從不會察覺今天有什麼不同。
  • 它看到的只是一條窄縫:自己商品的價格、自己請求的指標值、本帳戶的持倉與餘額。新聞、其他券商的報價、你的其他帳戶都在這個視窗之外,除非程式碼主動去取。
  • 它以編譯形式散布。.ex5 檔能執行卻讀不了,因此買家的信心必須來自公開的測試證據,而不是原始碼。
  • 它只在終端執行時才執行。裝在休眠筆電上的 EA 就是沒有在交易的 EA——這正是使用 VPS 的全部理由。

在 MetaTrader 5 中

在 MT5 的什麼位置

  • 導覽器 → 智慧交易系統 —— 終端看得到的已編譯 EA
  • 檔案 → 開啟資料夾 → MQL5/Experts —— .ex5 檔必須放在這裡才會出現在清單中
  • 工具列 → 自動交易 —— 總開關;圖表上顯示哭臉的 EA,就是被這個按鈕擋住的 EA
  • 圖表 → EA 屬性(F7)→ 輸入參數 / 一般 —— 參數與逐個 EA 的權限
  • 檢視 → 策略測試器(Ctrl+R)—— 同一個 EA 在歷史資料上執行

EA 如何使用它

  • 終端在附加時呼叫一次 OnInit(),在圖表商品每次有報價進來時呼叫 OnTick(),在移除時呼叫 OnDeinit()。
  • 工作通常發生在已收盤的 K 線上而不是每個 tick:EA 把當前 K 線的開盤時間與自己存下的時間比較,沒有新 K 線形成就立即返回。
  • 訂單以填好的 MqlTradeRequest 送出,或者透過 CTrade 包裝類別送出,後者替你填好其中大部分內容。
  • 每個實例會為自己的訂單標上 magic number,只管理屬於自己的部位——沒有它,兩個 EA 會搶奪同一批單號。

常見設定

設定項 常見取值 備註
自動交易(終端) 啟用 安裝後預設關閉。不打開就什麼都不會交易。
允許自動交易(逐個 EA,F7 → 一般) 啟用 這是與終端總開關分開的一項權限。
允許對列出的 URL 使用 WebRequest 除非 EA 需要,否則關閉 只有需要抓取外部資料的 EA 才用得上;按 URL 逐條授予,絕不一次全開。
圖表週期 該 EA 設計所針對的週期 把 M15 的策略放在 H1 圖上就是另一套策略——OnTick 依 tick 觸發,但 K 線邏輯讀的是圖表週期。
MagicNumber 每個正在執行的實例各不相同 不是按產品分:同一個 EA 跑在兩張圖上就需要兩個值。

常見運行問題

  • 終端已關閉、處於睡眠,或正因更新而重新啟動——EA 根本沒有在執行,而且不會留下任何錯誤紀錄。
  • 券商與設定之間的商品名稱不一致(EURUSD 與 EURUSD.m),會讓 EA 保持附加狀態卻始終沉默。
  • 可用保證金不足:OrderSend 每次嘗試都失敗,而 EA 仍不斷重試,於是日誌被寫滿,帳戶卻什麼也沒做。
  • 多個 EA 同時送單時交易情境忙碌——這種失敗時有時無,很難重現。
  • EA 是在成交模式或合約規模不同的券商上測試的,於是在實盤中一行程式碼沒改卻表現不同。

相關 MT5 函式

OnInit() / OnDeinit()
分別在附加時與移除時各呼叫一次——檢核輸入參數、建立 handle 都在這裡完成。
OnTick()
圖表商品每有一筆報價進來就呼叫一次;這是主要進入點。
OnTimer()
依 EventSetTimer() 設定的固定間隔呼叫,適用於不應依賴 tick 是否到來的工作。
OrderSend(request, result)
送出每一筆交易操作的唯一呼叫;究竟是哪一種操作由請求結構決定。
CTrade (Trade/Trade.mqh)
標準函式庫的包裝類別,多數 EA 用它來取代手動填寫 MqlTradeRequest。

範例

幾乎所有 EA,都可以簡化成平台呼叫它的順序。這裡沒有一處是策略——這只是策略所處的框架。

1. OnInit()
附加時一次
檢核輸入參數、建立指標 handle、設定 magic number。
2. OnTick()
每筆報價
只要沒有新 K 線形成就立即返回,形成了再去評估規則。
3. OrderSend()
規則觸發時
每次操作對應一個填好的 MqlTradeRequest——開倉、改單或平倉。
4. OnDeinit()
移除時一次
釋放 handle。未平倉部位不會因此被平掉——它們仍然留著。

把 EA 從圖表上移除,並不會平掉它開出的部位。部位仍在,只是再沒有任何東西去管理它們。

計算 if (iTime(_Symbol, PERIOD_CURRENT, 0) == lastBarTime) return;

結果 一個依 K 線收盤工作的 EA,忽略兩次決策之間的成千上萬個 tick

怎麼使用

評斷一個不是自己寫的 EA,是一件講證據的事:編譯後的檔案什麼也告訴不了你。下面是應該索取的內容。

  • 問清回測用的是什麼資料、如何建模。真實 tick 與一個建模品質數值是有意義的;一條沒有標註的資金曲線則沒有。
  • 問清交易筆數與測試區間。本站公開的中位數 EA 在數年間平倉了 362 筆;四個月四十筆只是軼事。
  • 檢查策略是否讓虧損單一直掛著。攤平成本與網格解套能畫出漂亮的曲線,直到遇上那一籃子回不來的單子,而任何由已平倉交易算出的比率都不會事先示警。
  • 在投入資金前,先用自己券商的模擬帳戶跑一遍。成交模式、點差、合約規模與商品命名各不相同,而且都會改變結果。
  • 為每個實例配置各自的 magic number,並在執行超過兩個之前記錄清楚哪個是哪個。

本站列出的每個 EA 都會公開其測試區間、資料來源、建模品質與完整成交清單,因此這些證據可以直接核對,而不需要開口索要。

常見誤解

把 EA 當成有判斷力的交易者

它是一套由平台在每個 tick 上呼叫的規則。它無法察覺市場已經變了,無法知道十分鐘後央行要講話,也不會發現自己的表現正在惡化——除非有人恰好為此寫了一條規則。

假設回測結果會原樣搬到你的帳戶上

點差、手續費、成交模式、合約規模與商品清單都是結果的一部分。在某家券商上的測試,是關於那家券商的證據;在你自己的帳戶上跑一次模擬,則是看清有多少能搬過來的最便宜方式。

以為移除 EA 就等於交易也停了

把 EA 卸下來,它的未平倉部位仍留在原處。此後沒有任何東西會為它們移動停損或平倉;它們會一直掛著,直到觸及停損、目標價或被強制平倉。

在一個帳戶上同時執行多個 EA 卻不加區分

沒有各自不同的 magic number,每個 EA 都會把所有部位都當成自己該管的,於是互相平掉對方的單子。這種故障是無聲的——不會報錯,只會得到與任何單一策略都對不上的結果。

深入說明

真實的 EA 紀錄是什麼樣子

定義描述機制,紀錄描述體驗。本站公開的十四個 EA 都附上完整的已平倉交易清單——自 2019 年以來共 9,702 筆。

14 個已發布 EA 合計數值
已平倉交易9,702
每個 EA 的交易數(中位數)362,從 108 到 4,725
獲利因子(中位數)1.39,從 1.27 到 1.52
最長連虧(中位數)6 筆,最差 14
未創淨值新高的最長期間(中位數)423 天,最差 775
已驗證的實盤運行0

EA 真的能獲利嗎 會逐個 EA 走一遍該紀錄,EA 與手動交易的差別 則以人們真正會採用的停止規則重放同一批交易。

常見問題

MetaTrader 5 中的智慧交易系統是什麼?
是一個用 MQL5 撰寫並編譯成 .ex5 檔的程式,執行在終端內部並依自己的規則交易。平台會在它所附加圖表的每一筆報價到來時呼叫它,而它會在無人操作鍵盤的情況下開倉、改單與平倉。
EA 執行是否需要一直開著電腦?
是的——EA 執行在終端內部,因此只有終端在執行並保持連線時它才交易。這正是無人看管的 EA 通常放在 VPS 上,而不是放在會休眠或重新啟動的電腦上的原因。
我能讀出買來的 EA 裡的策略嗎?
從 .ex5 檔裡讀不出來。編譯後的 EA 執行時並不揭露其邏輯,賣家正是因此才以這種形式交付。所以策略必須在商品頁裡被如實描述,並有公開的測試證據支撐。
同一個帳戶能執行多個 EA 嗎?
可以,而且很常見。每個實例都需要自己的 magic number,才能只管理由它自己開出的部位;帳戶也需要同時容納全部實例的可用保證金——這些策略彼此並不知情。