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 を通ったのに動かない場合
ログに何も出ておらず、それでも値が出ない場合は初期化ではなく取得側の問題です。
- ハンドルは取れているが、値のコピーに失敗している(iCustom・CopyBufferの値が取れない原因)
- 配列のインデックスの向きが逆になっている(MQL5で足データを取得する方法)
- そもそもコンパイルが通っていない(MQL5のコンパイルエラーが消えない)
まとめ
- 成功は
INIT_SUCCEEDED、失敗はINIT_FAILED。0以外は全て失敗扱い - 🔴 EAは外されるが、インジケーターはチャートに残って動かない
- インジケーターが描かない時は計算部分より先に
OnInitを見る - 🔴
INIT_FAILEDを返す前に必ずPrintで理由を出す INIT_PARAMETERS_INCORRECTは最適化で無駄な組み合わせを弾くためのもの
本記事はMQL5の仕様と実装方法を説明したものであり、特定の売買を推奨するものではありません。仕様はビルドによって変わる可能性があります。投資判断はご自身の責任で行ってください。


