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イベントが生成されると書かれています。
- MQL5プログラムが付いているシンボルまたはチャートの期間が変わり、再初期化される前
- 入力が変わり、再初期化される前
- 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では、タイマーの破棄・オブジェクトの後片付けなどを行い、決済は入れない
本記事はプログラミングの説明であり、特定の売買を推奨するものではありません。


