MQL4において On~
で始まる関数は 「イベントハンドラ関数(Event Handler Functions)」 と呼ばれます。
イベントハンドラ関数(Event Handler Functions)とは?
MQL4のイベントハンドラ関数は、特定の状況が発生した際に 自動的に実行 される関数です。
エキスパートアドバイザー(EA)、カスタムインジケーター、スクリプトなどで使用され、取引や分析を効率的に行うために役立ちます。
ここでは、それぞれのイベントハンドラ関数が どのような場面で必要になるのか を やさしく詳しく 解説します。
イベントハンドラ関数の特徴
- ユーザーが明示的に呼び出すことはできない
OnTick()
やOnTrade()
などは、システム(MT4)が自動的に実行する。
- 関数名が固定されており、変更不可
- 例えば
OnTick()
の名前をCustomOnTick()
に変更すると、イベントハンドラとして認識されなくなる。
- 例えば
- 定義しないとイベントが発生しても何も実行されない
- 例:
OnTick()
を定義しなければ、ティックが更新されても何も処理されない。
- 例:
- エキスパートアドバイザー(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() | バックテスト終了後に処理をする |
用途に応じて、適切なイベント関数を使い分けましょう!
コメント