MQL5のOnInitの戻り値|EAとインジで挙動が違う

MQL5の OnInit は、戻り値で初期化の成否を伝えます。成功なら INIT_SUCCEEDED、失敗なら INIT_FAILED を返します。

ここで押さえておくべき点があります。同じ INIT_FAILED を返しても、EAとインジケーターでその後の挙動が違います。EAはチャートから外されますが、インジケーターはチャートに残ったまま、何も動かない状態になります。

(確認環境:MetaTrader 5 / Windows 11)

3つの戻り値

定数 意味
INIT_SUCCEEDED 初期化成功。0を返すのと同じ
INIT_FAILED 初期化失敗。続行できない
INIT_PARAMETERS_INCORRECT 入力パラメータの組み合わせが不正

MQL5公式リファレンスによると、0以外を返すと初期化失敗とみなされ、REASON_INITFAILED という理由で OnDeinit が呼ばれます。

🔴 EAとインジケーターで結果が違う

公式リファレンスの記述はこうなっています。

プログラム INIT_FAILED を返した時
EA チャートから取り外される
インジケーター チャートに残るが動作しない(イベントハンドラが呼ばれない)

インジケーター側が厄介です。チャート右上には名前が出たままなので、動いているように見えます。線が引かれないので「計算が合っていない」と疑ってしまいますが、実際にはOnCalculate が一度も呼ばれていません。

同じ「静かに壊れる」系の問題として、MT5でインジケーターの初期値を変更しても反映されない理由があります。どちらもエラーが出ないのに結果が違うため、原因の切り分けに時間がかかります。

まず疑う場所

インジケーターが何も描かない時は、計算部分より先に OnInit を見てください。

int OnInit()
  {
   if(InpPeriod <= 0)
     {
      Print("期間が不正です: ", InpPeriod);
      return(INIT_FAILED);        // ここで止まっている
     }

   handle = iMA(_Symbol, _Period, InpPeriod, 0, MODE_EMA, PRICE_CLOSE);
   if(handle == INVALID_HANDLE)
     {
      Print("ハンドル取得に失敗 err=", GetLastError());
      return(INIT_FAILED);        // ここも
     }

   return(INIT_SUCCEEDED);
  }

ハンドルの取得失敗は実際によく起きます。パラメータが範囲外だったり、銘柄のデータが揃っていなかったりすると INVALID_HANDLE が返ります。

🔴 Print を必ず入れる

return(INIT_FAILED); だけを書くと、なぜ失敗したのかがどこにも残りません。

返す前に必ず理由を出力してください。出力先は「エキスパート」タブです。確認方法はMQL5のPrintとログの場所にまとめています。

逆に言えば、ログに何も出ていないなら OnInit は通っているという切り分けができます。

INIT_PARAMETERS_INCORRECT はいつ使うか

これは最適化を回す時のための戻り値です。公式リファレンスによると、このコードを返した組み合わせは最適化の結果一覧で赤く表示され、その条件ではテストが実行されません。

if(InpFastPeriod >= InpSlowPeriod)
   return(INIT_PARAMETERS_INCORRECT);

「短期が長期以上」のような意味を成さない組み合わせを最適化から除外できます。無駄なテストが減るので、パラメータの数が多いほど効きます。

最適化をしないなら INIT_FAILED で足ります。使い分けに悩む必要はありません。

OnInit を通ったのに動かない場合

ログに何も出ておらず、それでも値が出ない場合は初期化ではなく取得側の問題です。

まとめ

  1. 成功は INIT_SUCCEEDED、失敗は INIT_FAILED。0以外は全て失敗扱い
  2. 🔴 EAは外されるが、インジケーターはチャートに残って動かない
  3. インジケーターが描かない時は計算部分より先に OnInit を見る
  4. 🔴 INIT_FAILED を返す前に必ず Print で理由を出す
  5. INIT_PARAMETERS_INCORRECT は最適化で無駄な組み合わせを弾くためのもの

本記事はMQL5の仕様と実装方法を説明したものであり、特定の売買を推奨するものではありません。仕様はビルドによって変わる可能性があります。投資判断はご自身の責任で行ってください。