在 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. 從 MT5 開啟 MetaEditor(按 F4), 選擇這支程式該放的資料夾——Experts、Indicators 或 Scripts。
- 2. 開新檔案、把這段程式貼上去,然後按 F7 編譯。Errors 分頁顯示的錯誤 都修掉。
- 3. 回到 MT5,把它拖到圖表上——如果是 EA,就打開 Strategy Tester。
是終端機在驅動你,不是你驅動它
Pine 腳本在每根 K 線重新執行一次,剩下的由 runtime 處理。MQL5 把這件事反過來:終端機在特定事情發生時呼叫特定函式。如果你把邏輯放在那些函式外面,它永遠不會被執行。
OnInit()——程式被掛上、或終端機啟動時執行一次。在這裡建立指標 handle。回傳 INIT_SUCCEEDED 或 INIT_FAILED。
OnTick()——每次價格跳動(只有 EA 有)。
OnCalculate()——資料變動時(只有指標有)。
OnDeinit(reason)——被移除時。在這裡釋放 handle 並砍掉計時器。
OnStart()——腳本執行一次。
為什麼 OnDeinit 不是選項
你建立的每一個指標 handle 都會佔用記憶體,直到你釋放它。在回測裡,終端機會建立並摧毀你的 EA 數千次;每次漏掉一個 handle,測試器就會慢到爬行甚至直接掛掉。把 OnInit 與 OnDeinit 當成一對——你在其中一個裡建立什麼,就在另一個裡摧毀它。
你會一直用到的預定義變數
_Symbol——程式所掛載的商品,字串。
_Period——圖表時間週期,型別是 ENUM_TIMEFRAMES。
_Digits——商品的小數位數。永遠把價格正規化到這個位數。
_Point——最小價格增量(一個 point)。它不一定等於一個 tick——見第三部分。
這堂課要看什麼
把這個 EA 掛到圖表上,看著 Experts 分頁。tick 出現的頻率遠高於 K 線——在倫敦時段的活躍 CFD 上,你可能每秒看到幾十個。這就是為什麼 EA 幾乎總是把邏輯閘門設在「新 K 線」,而不是對每個 tick 都動作。你會在第三部分蓋出那個閘門。