MQL5のOnDeinitの終了理由|REASON_REMOVE・REASON_CHARTCHANGEなど10種類

MQL5のEAがチャートから外れる時や、再読み込みされる時には、OnDeinit関数が呼ばれ、その引数 reason に「なぜ終了するか」の番号が入ります。公式リファレンスには、REASON_PROGRAM から REASON_CLOSE まで、0〜9の10種類が定義されています。理由によって、そのあとEAが再び初期化されるかが違うので、後片付けの処理を分けられます。

この記事では、MQL5リファレンスにもとづいて、10種類の理由と、書き方の例をまとめます。サンプルは、MetaEditorでコンパイルして、0エラー・0警告を確認しています。

(確認:MQL5リファレンス「OnDeinit」「初期化解除の理由のコード」。サンプルコードは MetaEditor でコンパイル確認。確認日:2026年10月6日。実機で各理由が出る様子の確認は、この記事では行っていません)

OnDeinitが呼ばれる場面

リファレンスには、次の場面で、指標とEAにDeinitイベントが生成されると書かれています。

  1. MQL5プログラムが付いているシンボルまたはチャートの期間が変わり、再初期化される前
  2. 入力が変わり、再初期化される前
  3. MQL5プログラムをアンロードする前

10種類の理由

定数 値 意味(リファレンス) そのあと
REASON_PROGRAM 0 EAが ExpertRemove() を呼んで終了した 終了
REASON_REMOVE 1 チャートから削除された 終了
REASON_RECOMPILE 2 再コンパイルされた 新しい版で再開(一般的な動き)
REASON_CHARTCHANGE 3 シンボルかチャート期間が変更された 再初期化される
REASON_CHARTCLOSE 4 チャートが閉じられた 終了
REASON_PARAMETERS 5 入力パラメータがユーザーによって変更された 再初期化される
REASON_ACCOUNT 6 別のアカウントが有効化された、または、アカウント設定の変更で取引サーバーへ再接続が発生した —
REASON_TEMPLATE 7 新しいテンプレートが適用された —
REASON_INITFAILED 8 OnInit() がゼロ以外の値を返した 終了(MQL5のOnInitの戻り値)
REASON_CLOSE 9 端末(ターミナル)が閉じられた 終了

「そのあと」の列は、リファレンスの記載と、一般的な動作を合わせたものです。実際の再開の動きは、MT5の版や操作で変わる可能性があります。

書き方の例

理由を記録するだけのEAです。MetaEditorで、0エラー・0警告でコンパイルできることを確認しました。

int OnInit()
  {
   EventSetTimer(60);
   return INIT_SUCCEEDED;
  }

void OnDeinit(const int reason)
  {
   EventKillTimer();
   switch(reason)
     {
      case REASON_REMOVE:      Print("チャートから外されました");               break;
      case REASON_CHARTCHANGE: Print("銘柄か時間足が変わりました(再初期化)"); break;
      case REASON_PARAMETERS:  Print("入力が変更されました(再初期化)");       break;
      case REASON_CLOSE:       Print("ターミナルが終了します");                 break;
      default:                 Print("終了理由コード=", reason);
     }
  }

出力は、ツールボックスの「エキスパート」タブに出ます(MQL5のPrintとログの保存場所)。UninitializeReason() 関数や、定義済みの変数 _UninitReason でも、理由を取得できます(リファレンス)。

OnDeinitで何をするか

  • タイマーを止める:EventSetTimer() で始めたタイマーは、EventKillTimer() で破棄します。リファレンスの OnTimer の項にも、「EAの動作が止まった場合、タイマーは EventKillTimer() で破棄されるべき」と書かれています(MQL5で一定時間ごとに処理する方法)
  • チャートに描いたオブジェクトや、インジケーターのハンドルの後片付け
  • ポジションを決済する処理は、基本的に入れない(一般的な考え方)。チャートを切り替えるだけでも呼ばれるため、意図せず決済してしまうおそれがあります。決済の仕組みはMQL5でポジションを決済する方法

MT5を閉じたとき(REASON_CLOSE)にOnDeinitが呼ばれても、EAが保っていたポジションや注文は残ります。ストップロスなどサーバーで動くものは、そのまま働きます(PCを閉じても損切りは効く?)。パソコンを閉じない運用はMT5を自動で起動する方法にまとめています。

まとめ

  • OnDeinit の reason に、0〜9の終了理由が入る。再初期化の前にも呼ばれる
  • REASON_CHARTCHANGE・REASON_PARAMETERS は、その後に再初期化される理由
  • OnDeinitでは、タイマーの破棄・オブジェクトの後片付けなどを行い、決済は入れない

本記事はプログラミングの説明であり、特定の売買を推奨するものではありません。