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

程式結構與事件模型

OnInit、OnTick、OnDeinit、OnCalculate——MQL5 不是從上往下跑。它在等事件。

初學閱讀時間約 7 分鐘初學 → 進階第 02 / 17 堂
在 MetaEditor 實際跑一次
一個會印出自己生命週期的 EA 骨架

存成 MQL5/Experts/Lesson2Skeleton.mq5。掛到圖表上,然後切換時間週期、移除它、重新編譯——觀察 OnDeinit 的 reason code 如何變化。

//+------------------------------------------------------------------+
//| Lesson 2 - EA lifecycle: OnInit / OnTick / OnDeinit              |
//+------------------------------------------------------------------+
#property copyright "Strategist Academy"
#property version   "1.00"

int OnInit()
{
   Print("OnInit: attached to ", _Symbol, " on ", EnumToString((ENUM_TIMEFRAMES)_Period));
   Print("Digits = ", _Digits, "   Point = ", DoubleToString(_Point, _Digits));
   Print("Bars available = ", Bars(_Symbol, _Period));
   return(INIT_SUCCEEDED);
}

void OnDeinit(const int reason)
{
   // 0 = removed from chart, 1 = recompiled, 2 = symbol/timeframe changed,
   // 3 = chart closed, 4 = terminal shutdown, 5 = account changed, ...
   Print("OnDeinit. Reason code: ", reason);
}

void OnTick()
{
   static int tickCount = 0;
   tickCount++;

   // Print every 200 ticks so the log stays readable.
   if(tickCount % 200 == 0)
   {
      double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
      Print("Ticks seen: ", tickCount,
            "   bid = ", DoubleToString(bid, _Digits),
            "   time = ", TimeToString(TimeCurrent(), TIME_SECONDS));
   }
}
如何執行
  1. 1. 從 MT5 開啟 MetaEditor(按 F4), 選擇這支程式該放的資料夾——ExpertsIndicators Scripts
  2. 2. 開新檔案、把這段程式貼上去,然後按 F7 編譯。Errors 分頁顯示的錯誤 都修掉。
  3. 3. 回到 MT5,把它拖到圖表上——如果是 EA,就打開 Strategy Tester

是終端機在驅動你,不是你驅動它

Pine 腳本在每根 K 線重新執行一次,剩下的由 runtime 處理。MQL5 把這件事反過來:終端機在特定事情發生時呼叫特定函式。如果你把邏輯放在那些函式外面,它永遠不會被執行。

  • OnInit()——程式被掛上、或終端機啟動時執行一次。在這裡建立指標 handle。回傳 INIT_SUCCEEDEDINIT_FAILED
  • OnTick()——每次價格跳動(只有 EA 有)。
  • OnCalculate()——資料變動時(只有指標有)。
  • OnDeinit(reason)——被移除時。在這裡釋放 handle 並砍掉計時器。
  • OnStart()——腳本執行一次。

為什麼 OnDeinit 不是選項

你建立的每一個指標 handle 都會佔用記憶體,直到你釋放它。在回測裡,終端機會建立並摧毀你的 EA 數千次;每次漏掉一個 handle,測試器就會慢到爬行甚至直接掛掉。把 OnInitOnDeinit 當成一對——你在其中一個裡建立什麼,就在另一個裡摧毀它。

你會一直用到的預定義變數

  • _Symbol——程式所掛載的商品,字串。
  • _Period——圖表時間週期,型別是 ENUM_TIMEFRAMES
  • _Digits——商品的小數位數。永遠把價格正規化到這個位數。
  • _Point——最小價格增量(一個 point)。它一定等於一個 tick——見第三部分。

這堂課要看什麼

把這個 EA 掛到圖表上,看著 Experts 分頁。tick 出現的頻率遠高於 K 線——在倫敦時段的活躍 CFD 上,你可能每秒看到幾十個。這就是為什麼 EA 幾乎總是把邏輯閘門設在「新 K 線」,而不是對每個 tick 都動作。你會在第三部分蓋出那個閘門。

你剛完成了什麼

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