MQL5のExpertRemove|EAが自分でチャートから外れる時の動き
MQL5のEAが、条件を満たした時に自分でチャートから外れるには、ExpertRemove()を呼びます。ただし、呼んだ直後にEAが止まるわけではありません。リファレンスによると、EAの動作を止める「フラグ」が立つだけで、次のイベントは処理されず、OnDeinit()が呼ばれて、EAがアンロードされます。OnDeinitの理由コードはREASON_PROGRAM(0)です。
この記事では、MQL5リファレンス「ExpertRemove」にもとづいて、動き方、書き方の例、止まった後に残るものをまとめます。サンプルは、MetaEditorで0エラー・0警告でコンパイルできることを確認しています。
(確認:MQL5リファレンス「ExpertRemove」「OnDeinit」「初期化解除の理由のコード」。サンプルコードは MetaEditor でコンパイル確認。確認日:2026年10月6日。実機での動作確認は、この記事では行っていません)
ExpertRemove() の動き
- EAを停止して、チャートからアンロードする関数
- 呼んだ直後には、止まらない。停止のフラグが立つだけで、
ExpertRemove()を呼んだ関数の、残りの処理は続く - フラグが立つと、次のイベント(新しいティック、タイマーなど)は処理されない
- そのあと、
OnDeinit()が、理由REASON_PROGRAMで呼ばれ、EAがチャートから外れる
だから、ExpertRemove() のあとに、そのイベントの中で書いた処理は、最後まで実行されます。止めたいなら、直後に return を書くのが分かりやすいです(一般的な書き方)。
書き方の例
決まった回数のティックを処理したら、EAが自分で外れる例です(MetaEditorで0エラー・0警告)。
input int InpMaxTicks = 20; // 処理するティックの回数
int g_ticks = 0;
int OnInit()
{
g_ticks = 0;
return INIT_SUCCEEDED;
}
void OnDeinit(const int reason)
{
if(reason == REASON_PROGRAM)
Print("ExpertRemove() により終了します");
}
void OnTick()
{
g_ticks++;
if(g_ticks >= InpMaxTicks)
{
Print("規定のティック数に達したため、EAを外します");
ExpertRemove();
return;
}
}
終了の理由を見分ける考え方はMQL5のOnDeinitの終了理由にまとめています。出力の確認はMQL5のPrintとログの保存場所を参照してください。
ストラテジーテスターでの扱い(リファレンス)
| 場面 | 結果 |
|---|---|
テスターの OnInit() の中で呼ぶ |
現在のパラメータセットでのテストがキャンセルされる。初期化エラーとみなされる |
| 正常に初期化されたあとで呼ぶ | テストは、OnDeinit() と OnTester() が呼ばれて、正常に終了する。取引の統計と最適化の基準値は、すべて取得できる |
テスターの扱いはMT5ストラテジーテスターのモデルの選び方にあります。
外れたあとに残るもの
- EAが外れても、すでに入っているポジションや注文は、残ります(EAのアンロードは、取引の決済ではありません)
- ストップロス・テイクプロフィット・未決注文は、サーバーで働き続けます(PCを閉じても損切りは効く?)。一方、EAが行っていた時間決済やトレールは止まります
- EAが自分で外れる設計にしたら、「ポジションが残ったままEAが消えた」状態が起きないように、外れる前に、ポジションをどうするかを決めておく。決済の方法はMQL5でポジションを決済する方法、MT5の決済方法
- チャートに戻して、再び動かすには、EAを入れ直す必要がある(MT5にEAを入れる方法)
使う場面と、使わない方がよい場面(一般的な考え方)
- 使う:期間限定で動かすEA、目標の達成や、異常の検知のあとに、それ以上動かしたくない場合
- 使わない:一時的に取引を止めたいだけの場合。EAを外さずに、取引の関数を呼ばない条件にするほうが、再開しやすいです。MT5側の「アルゴリズム取引」をオフにする方法もあります(週末・休場中にEAが動かない?に、オフにした時の動きがあります)
- 外れたことに、気づけるようにしておく。外れたことを通知する処理は、
OnDeinitの中より、ExpertRemove()を呼ぶ前に、入れる(通知はMQL5でスマホに通知を送る)
EAが勝手に外れていないかは、チャートの右上の表示で確認できます(MT5でEAが動いているかを確認する方法)。パソコンやVPSが止まって、EAが動いていない場合との見分けは、ログで行います(操作ログとエキスパートログの違い)。
まとめ
ExpertRemove()は停止の印を立てる関数。次のイベントは処理されず、OnDeinit()(REASON_PROGRAM)のあと、EAが外れる- 呼んだあとの処理は続くので、直後に
returnを書く。テスターでは、OnInit()で呼ぶとテストがキャンセルされる - EAが外れても、ポジションと注文は残る。外れる前に、ポジションの扱いと、通知を決めておく
本記事はプログラミングの説明であり、特定の売買を推奨するものではありません。


