【MQL4メモ】イベントハンドラ関数(On~関数)とは?

ブログ

MQL4において On~ で始まる関数は 「イベントハンドラ関数(Event Handler Functions)」 と呼ばれます。

イベントハンドラ関数(Event Handler Functions)とは?

MQL4のイベントハンドラ関数は、特定の状況が発生した際に 自動的に実行 される関数です。
エキスパートアドバイザー(EA)、カスタムインジケーター、スクリプトなどで使用され、取引や分析を効率的に行うために役立ちます。

ここでは、それぞれのイベントハンドラ関数が どのような場面で必要になるのかやさしく詳しく 解説します。


イベントハンドラ関数の特徴

  1. ユーザーが明示的に呼び出すことはできない
    • OnTick()OnTrade() などは、システム(MT4)が自動的に実行する。
  2. 関数名が固定されており、変更不可
    • 例えば OnTick() の名前を CustomOnTick() に変更すると、イベントハンドラとして認識されなくなる。
  3. 定義しないとイベントが発生しても何も実行されない
    • 例:OnTick() を定義しなければ、ティックが更新されても何も処理されない。
  4. エキスパートアドバイザー(EA)、カスタムインジケーター、スクリプトで異なる適用範囲がある
    • OnTick() → EAで利用可能(スクリプトでは使用不可)
    • OnChartEvent() → カスタムインジケーターやEAで利用可能

MQL4のイベントハンドラ関数一覧

1. OnInit()(プログラムの初期化時に実行)

どんな場面で必要?

EAやインジケーターを起動した際に、最初に必要な処理をまとめて実行したいときに使用します。

あると便利な理由

  • 取引に必要なパラメータの初期設定(例:ロットサイズやストップロスの設定)
  • インジケーターを表示する準備(例:チャート上にラインやテキストを配置)
  • 取引履歴をログに記録する準備

例えば…
MT4でEAを起動するときに「このEAは適切に起動しました!」と表示させたり、取引の初期設定を行うのに役立ちます。


2. OnDeinit()(プログラム終了時に実行)

どんな場面で必要?

EAやインジケーターが 削除される・再起動される・シャットダウンされる などで 終了 するときに、後処理を行いたい場合に使用します。

あると便利な理由

  • チャート上のオブジェクトを削除(不要なラインやテキストを消す)
  • ログに記録を残す(プログラムがいつ終了したかを確認する)
  • 使用したリソースを解放(メモリの無駄遣いを防ぐ)

例えば…
チャートに引いたラインやテキストを、EAを削除したときに自動で消す処理をするのに役立ちます。


3. OnTick()(新しいティックが発生したときに実行)

どんな場面で必要?

為替レート(BidやAsk)が更新されるたびに、何らかの処理を行いたい場合に使用します。

あると便利な理由

  • リアルタイムでの自動売買(条件に合ったらエントリーや決済を実行)
  • 特定の価格に達したらアラートを出す
  • マーケットデータを記録する(価格変動のログを取る)

例えば…
「価格が一定レベルに到達したらエントリーする」EAのような、リアルタイムでの自動売買を行う場合に不可欠です。


4. OnTimer()(一定間隔で実行)

どんな場面で必要?

時間ベース で何か処理を実行したいときに使用します。

あると便利な理由

  • 定期的な処理を実行(例:1分ごとに市場状況を確認)
  • 負荷を軽減(毎ティック実行するより、決まった時間ごとに処理する方が負担が少ない)
  • 定期的にログを記録する

例えば…
「5分ごとに現在のトレンド方向を分析し、取引する」EAを作るときに便利です。


5. OnChartEvent()(チャート上でユーザー操作があったときに実行)

どんな場面で必要?

マウス操作やキーボード操作に応じてプログラムを実行したい場合に使用します。

あると便利な理由

  • ボタンやチェックボックスを作る(クリックで売買を行うカスタムボタンなど)
  • マウスホイールでインジケーターのパラメータを調整する
  • チャート上でオブジェクトをドラッグする

例えば…
「チャート上のボタンをクリックすると自動でエントリーする」など、ユーザーインターフェースを作るときに便利です。


6. OnTrade()(取引が発生したときに実行)

どんな場面で必要?

エントリー・決済・変更などの取引操作が実行されたときに、それを検知して何らかの処理を行いたい場合に使用します。

あると便利な理由

  • 取引履歴をログに記録する
  • 一定の条件で取引回数を制限する(例:1日5回以上の取引をしない)
  • 取引後に特定の処理を行う(例:決済後に別の注文を出す)

例えば…
「特定の条件で決済が完了したら、新しい注文を出す」といった連続売買を行うEAに活用できます。


7. OnTradeTransaction()(取引の詳細情報を取得)

どんな場面で必要?

OnTrade() よりもさらに詳細な情報を取得し、取引状況を管理したい場合に使用します。

あると便利な理由

  • 注文の変更や取消も監視できる
  • 注文の約定状況をリアルタイムで確認する
  • エラー処理を細かく設定できる

例えば…
「成行注文の約定状況をリアルタイムで監視し、スリッページが発生した場合にアラートを出す」ような高機能なEAを作るのに便利です。


8. OnTester()(バックテスト終了時に実行)

どんな場面で必要?

ストラテジーテスター(バックテスト)が終了したときに、テスト結果を保存したり、特定の処理を実行したい場合に使用します。

あると便利な理由

  • バックテストの結果をファイルに保存する
  • 複数のパラメータを最適化する際に結果を整理する
  • 特定のルールで最適な設定を自動で選ぶ

例えば…
「異なるロットサイズやストップロスの設定を試して、最も利益が高かった設定を記録する」ような最適化作業に活用できます。


まとめ

MQL4のイベントハンドラ関数は、状況に応じて自動的に実行されるため、 「何か特定のタイミングで処理を実行したいとき」 に便利です。
特に OnTick()(リアルタイム処理)OnTimer()(定期処理) は、EAやインジケーターでよく使われます。

どのイベント関数を使うべき?

イベント関数使うべき場面
OnInit()初期設定を行う
OnDeinit()プログラム終了時に処理をする
OnTick()毎ティック処理を実行する
OnTimer()一定間隔で処理を実行する
OnChartEvent()ユーザーの操作に応じた処理をする
OnTrade()取引が発生したら処理を実行する
OnTradeTransaction()取引の詳細情報を取得する
OnTester()バックテスト終了後に処理をする

用途に応じて、適切なイベント関数を使い分けましょう!

コメント