返回《給 CFD 交易者的 MetaTrader 5 與 MQL5》
第一部分

MQL5 是什麼(以及不是什麼)

三種程式類型、同一個語言,以及為什麼一個 CFD 交易者會想要一個編譯語言。

初學閱讀時間約 6 分鐘初學 → 進階第 01 / 17 堂
在 MetaEditor 實際跑一次
印出你的券商實際提供的合約規格

存成 MQL5/Scripts/Lesson1ContractSpec.mq5,編譯,然後拖到任何一張圖表上。在 Experts 分頁讀輸出——這裡每一個數字都是券商專屬的,所以永遠不要硬編它們。

//+------------------------------------------------------------------+
//| Lesson 1 - Print the contract spec for the current symbol        |
//+------------------------------------------------------------------+
#property copyright "Strategist Academy"
#property version   "1.00"

void OnStart()
{
   string sym = _Symbol;

   double tickSize   = SymbolInfoDouble(sym, SYMBOL_TRADE_TICK_SIZE);
   double tickValue  = SymbolInfoDouble(sym, SYMBOL_TRADE_TICK_VALUE);
   double contract   = SymbolInfoDouble(sym, SYMBOL_TRADE_CONTRACT_SIZE);
   double volMin     = SymbolInfoDouble(sym, SYMBOL_VOLUME_MIN);
   double volStep    = SymbolInfoDouble(sym, SYMBOL_VOLUME_STEP);
   double volMax     = SymbolInfoDouble(sym, SYMBOL_VOLUME_MAX);
   long   stopsLevel = SymbolInfoInteger(sym, SYMBOL_TRADE_STOPS_LEVEL);
   double ask        = SymbolInfoDouble(sym, SYMBOL_ASK);
   double bid        = SymbolInfoDouble(sym, SYMBOL_BID);

   Print("=== ", sym, " contract spec ===");
   Print("Digits:         ", _Digits);
   Print("Point:          ", DoubleToString(_Point, _Digits));
   Print("Tick size:      ", DoubleToString(tickSize, _Digits));
   Print("Tick value:     ", DoubleToString(tickValue, 2), "  (money per tick, per 1 lot)");
   Print("Contract size:  ", DoubleToString(contract, 2));
   Print("Volume min/step/max: ", DoubleToString(volMin, 2), " / ",
                                   DoubleToString(volStep, 2), " / ",
                                   DoubleToString(volMax, 2));
   Print("Stops level:    ", stopsLevel, " points  (minimum SL/TP distance)");
   Print("Bid / Ask:      ", DoubleToString(bid, _Digits), " / ", DoubleToString(ask, _Digits));
   Print("Spread:         ", DoubleToString((ask - bid) / _Point, 1), " points");
   Print("Account leverage: ", (int)AccountInfoInteger(ACCOUNT_LEVERAGE));
}
如何執行
  1. 1. 從 MT5 開啟 MetaEditor(按 F4), 選擇這支程式該放的資料夾——ExpertsIndicators Scripts
  2. 2. 開新檔案、把這段程式貼上去,然後按 F7 編譯。Errors 分頁顯示的錯誤 都修掉。
  3. 3. 回到 MT5,把它拖到圖表上——如果是 EA,就打開 Strategy Tester

三種程式類型

MQL5 是 MetaTrader 5 背後的語言。你寫的每一個東西都屬於三類之一,而你選哪一類,決定了終端機會呼叫哪一個進入點:

  • EA(Expert Advisor)——持續執行,由 OnTick() 驅動。這就是你的交易程式。
  • 自訂指標——畫在圖表上,由 OnCalculate() 驅動。不交易。
  • 腳本——執行一次就結束,由 OnStart() 驅動。最適合一次性的檢查,也最適合學習。

你存進哪個資料夾就決定了類型:MQL5/Experts/MQL5/Indicators/MQL5/Scripts/。把一個 EA 放進錯的資料夾,它就不會出現在你預期的地方。

既然有 PineScript,為什麼還要這個?

Pine 寫起來快,而且活在瀏覽器裡。MQL5 是編譯語言、更嚴格、也更底層。當你需要下面這些東西時,你會選 MQL5:

  • 執行控制——精確的成交模式、允許滑價(deviation)、訂單類型、淨額(netting)與避險(hedging)帳戶的差別。
  • 真正的策略測試器——多執行緒、逐 tick 建模、walk-forward、自訂最佳化準則。
  • 不綁券商——你的 EA 在任何跑得動 MT5 的地方都能跑,不需要圖表訂閱。
  • 持久化與檔案——讀寫檔案、呼叫 DLL、與外界溝通。

誠實的提醒

一個編譯語言救不了一個壞點子——它只是讓你更快、更自信地賠錢。系統化交易困難的部分仍然是點子本身、樣本數,以及「在一個已經失效的系統上停手」的紀律。MQL5 給你的是機械;它不會給你優勢。

這堂課的腳本裡,你該注意什麼

在一個 CFD 商品上執行它並讀輸出。tick value合約規模(contract size)stops level 是三個決定「你的單會不會被接受」以及「一次停損實際上花你多少錢」的數字。第三部分裡幾乎每一個初學者 bug,追溯回去都是忽略了它們。

你剛完成了什麼

給 CFD 交易者的 MetaTrader 5 與 MQL5》的第 01 / 17 堂課。跑完範例或讀完這段之後, 把它勾起來,然後進下一堂課。