MT4/MT5 EA 搬家到 Web API:MQL 轉 Python 完整對照與範例
EA 搬家不是「重寫一遍」,而是「對照轉換」。本篇把 MQL 的進入點、報價、下單,逐一對映到元大 Web API,附並排程式碼範例與五大轉碼陷阱——照著搬,少踩坑。
一句話:把 EA 搬到 Web API,核心就是三個對映:OnInit→登入連線、OnTick→報價推播回呼、OrderSend→API 下單。最容易出錯的是三個換算:手數→合約單位、方向碼、商品代碼格式。把這些搞定,策略邏輯幾乎原封不動搬過來。
搬家前先懂:架構差在哪
EA 和 Web API 最大的不同,是「誰在驅動你的程式」。先理解這點,後面的對照就很順:
MT4/MT5 EA
平台驅動:MetaTrader 每來一個報價 tick,就自動呼叫你的 OnTick() 一次。Bid/Ask 隨時可讀,下單、指標都是平台內建函式。
Web API(Python)
自己驅動:你自己跑一個程式、連上 WebSocket,報價推播進來時觸發你的函式。報價要自己接著存、指標要自己算、下單改呼叫 API。
※ 一句話:從「平台呼叫你」變成「你自己跑迴圈、聽報價」。策略的「判斷邏輯」不變,變的是周邊的接線方式。不熟 API 基礎先看 元大 Web API 指南。
核心對照表:MQL ↔ Web API
搬家時把 EA 的每個動作,對到右邊的 Web API 寫法(以下函式名稱依官方文件與元大 API 客戶端):
| 功能 | MQL4 | MQL5 | 元大 Web API (Python) |
|---|---|---|---|
| 初始化 | OnInit() | OnInit() | client.start()(登入+WS) |
| 逐筆觸發 | OnTick() | OnTick() | on_quote 回呼(報價推播) |
| 取買/賣價 | Bid / Ask | SymbolInfoTick() | 回呼參數 bid / ask |
| 市價買 | OrderSend(sym,OP_BUY,lots,Ask,..) | trade.Buy(lots,sym) | place_market_order(sym,"1",qty) |
| 市價賣 | OrderSend(sym,OP_SELL,lots,Bid,..) | trade.Sell(lots,sym) | place_market_order(sym,"2",qty) |
| 限價單 | OrderSend(..,OP_BUYLIMIT,..,price) | trade.BuyLimit(..) | place_limit_order(sym,side,qty,price) |
| 數量單位 | 手數 lots | 手數 lots | 合約單位(lots×100000) |
| 技術指標 | iRSI(..) 直接回值 | iRSI→CopyBuffer | 自抓 K 線用 pandas/TA-Lib 算 |
| 停損停利 | sl/tp 參數(價格) | sl/tp 參數(價格) | place_market_order 的 sl/tp |
| 商品代碼 | "EURUSD" | "EURUSD" | "EUR/USD"(含斜線) |
實戰範例:一個簡單策略的搬家
以最常見的「RSI 低於 30 就買進」為例(僅示意、非投資建議),看 MQL5 EA 怎麼一段段對應到 Python+Web API:
#include <Trade/Trade.mqh> CTrade trade; int h; // 初始化:建立 RSI 指標 int OnInit(){ h = iRSI(_Symbol,_Period,14,PRICE_CLOSE); return INIT_SUCCEEDED; } // 平台每個 tick 自動呼叫 void OnTick(){ double r[]; CopyBuffer(h,0,0,1,r); if(r[0] < 30) trade.Buy(0.1,"EURUSD"); // 0.1手 }
from ltm_client import LTMClient client = LTMClient() # 對應 OnInit:登入+WebSocket client.start() client.subscribe_quote(["EUR/USD"]) # 對應 OnTick:報價推播時觸發 def on_quote(sym, bid, ask, t): if calc_rsi("EUR/USD",14) < 30: # 指標自己算 client.place_market_order( "EUR/USD", "1", 10000) # "1"=買, 0.1手=10000 client.on_quote = on_quote client.run_forever() # 事件迴圈
⚠ 程式碼為流程示意。真實連線位址(endpoint)、API 金鑰與 SDK 文件,需完成開戶後由業務協理史本安提供官方資料;calc_rsi() 代表「你自己抓 K 線算指標」。完整端點與錯誤碼見 開發者文件。
看得出來:策略判斷(RSI < 30 就買)幾乎一模一樣,真正要改的是「接線」——登入、訂報價、下單的寫法,以及下面五個一定要注意的換算。
五大轉碼陷阱:沒換會出錯
這五點是 EA 搬家最常見的錯誤來源,務必逐一檢查:
手數 → 合約單位
MQL 用「手數 lots」,元大 API 用「合約單位」。EUR/USD 0.1 手 = qty 10000(×100000)。✓ 直接照搬 0.1 會嚴重下錯量,務必換算
方向碼相反
MQL4 OP_BUY=0/OP_SELL=1;元大 API side "1"=買/"2"=賣。✓ 數字剛好相反,別把 0/1 直接抄過去
商品代碼格式
MQL 是 "EURUSD";元大 API 是 "EUR/USD"(含斜線)。✓ 代碼對不上會找不到商品、下單失敗
報價是「推播」不是「隨時讀」
MQL 的 Bid/Ask 隨時可讀;API 是 WebSocket 主動推播。✓ 要在 on_quote 回呼裡接、自己存最新報價
指標要自己算
MQL 內建 iRSI/iMA;Web API 沒有內建指標。✓ 抓 K 線(get_chart_history)用 pandas/TA-Lib 自行計算
其他官方眉角
市價單 px 填 "0"、停損停利方向與開倉相反、時間用 UTC、REST 密碼 SHA-256。✓ 詳見 api-doc「10 大常見錯誤」
※ 這些細節(含停損停利方向、UTC、ACK)在 開發者文件的「下單前必讀:10 個常見錯誤」 有完整說明,搬家前強烈建議先讀一遍。
EA 搬家步驟|五步上手
- 盤點你的 EA 邏輯:把進場、出場、停損、加碼條件,從 MQL 抽成「純策略規則」(這部分不用改)。
- 開戶並申請 API 金鑰:API 對槓桿保證金客戶免費。線上開戶。
- 接好三條線:登入(start)、訂報價(subscribe_quote)、下單(place_market_order),對照上面的表。
- 過五大陷阱檢查:手數→合約單位、方向碼、商品代碼、報價回呼、指標自算,逐項核對。
- 先用模擬帳號實測:跑通登入→報價→下單,確認滑價、停損行為,再上真倉。
※ 還沒建立程式交易整體概念?先看 程式交易完整入門;要申請與串接細節看 元大 Web API 指南。
四句話帶走
- EA 搬家=對照轉換:OnInit→登入、OnTick→報價回呼、OrderSend→API 下單。
- 策略判斷邏輯幾乎不變,要改的是「接線」與幾個換算。
- 三大致命換算:手數→合約單位、方向碼(0/1≠”1″/”2″)、商品代碼(EURUSD≠EUR/USD)。
- 報價要自己接、指標要自己算;搬完先用模擬帳號實測再上真倉。
搬完先用模擬帳號跑一遍
真倉前,用模擬帳號驗證搬家後的下單量、方向、停損是否正確,零風險、無使用期限。
EA 搬家 常見問題 FAQ
Q1:EA 搬到 Web API 要整個重寫嗎?
不用。策略判斷邏輯幾乎可以原封不動,要改的是「接線」——把 OnInit 換成登入連線、OnTick 換成報價回呼、OrderSend 換成 API 下單,再處理幾個換算即可。
Q2:MQL 的「手數」在 API 要怎麼填?
元大 Web API 的數量是「合約單位」,不是手數。以 EUR/USD 為例,1 手 = 100000,所以 0.1 手 = qty 10000。這是搬家最常見的錯誤,務必換算,別直接填 0.1。
Q3:買賣方向的代碼一樣嗎?
不一樣。MQL4 是 OP_BUY=0/OP_SELL=1;元大 API 是 side "1"=買/"2"=賣。數字剛好相反,不能直接照抄。
Q4:EA 內建的 RSI、均線等指標怎麼辦?
MQL 有內建 iRSI/iMA;Web API 沒有。做法是用 API 抓 K 線(get_chart_history),再用 Python 的 pandas 或 TA-Lib 自行計算同樣的指標。
Q5:搬家後要用哪個語言?一定要 Python 嗎?
不限。Web API 走 REST+WebSocket+JSON,Python、JavaScript、Java、C# 等都可以。本文以 Python 示範因為它最常用於量化、生態系最完整。
Q6:搬家有官方文件可以參考嗎?
有。元大提供 開發者使用指南,含登入、報價、下單端點與「下單前必讀:10 個常見錯誤」。建議搭配本文對照表一起看。真實 endpoint 於開戶後提供。
※ 本文為一般技術教育性資訊,說明 EA 程式碼搬遷至 Web API 的對照方式,不構成投資建議、策略推薦或獲利保證。文中策略(如 RSI < 30 買進)與程式碼僅為流程示意,不代表任何特定操作建議,回測績效不代表未來表現。MQL 函式以 MetaQuotes 官方文件為準、元大 API 規格以官方公告與開戶後提供之文件為準;程式碼省略錯誤處理,正式使用請補齊。請務必使用券商官方提供之 API,切勿使用來路不明來源。差價合約(CFD)為槓桿交易,可能導致超過原始投入保證金的損失,台灣券商並無「負餘額保護」機制。交易平台為「槓桿全球贏家」。