MT5 EAの処理をOnTickへ集中させると、負荷増大や重複実行の原因になります。本記事ではOnTickとOnTimerの役割を整理し、売買判断・監視・ログ・リスク管理を分離するイベント駆動設計を解説します。
なぜEAのイベント設計が重要なのか
MT5のEAでは、価格更新のたびに呼び出されるOnTickへすべての処理を記述しがちです。しかし、インジケーター計算、ポジション監視、ログ出力、外部データ確認まで同じ関数へ集約すると、ティックが集中する局面で処理負荷が急増します。
特に重要指標発表時や流動性の高い銘柄では、短時間に多数のティックが到着します。前回処理が重い場合、イベントの取りこぼしや売買判断の遅延につながるため、処理内容に応じてOnTickとOnTimerを使い分ける設計が重要です。
OnTickが担うべき処理
OnTickは、EAを配置した銘柄に新しいティックが到着した際に実行されるイベントです。価格変化へ即時に反応する必要がある処理に適しています。
代表例は次のとおりです。
- エントリー条件の判定
- 損切り・利確条件の確認
- トレーリングストップの更新
- スプレッドや現在価格の取得
- 新規バー確定の検出
ただし、同一バー内で毎ティック実行する必要がないロジックまでOnTickへ置くと、無駄な再計算が増えます。移動平均線やMarket Structureを確定足ベースで判定するEAでは、新規バーを検出したときだけ計算する方が効率的です。
OnTimerが適している処理
OnTimerは、EventSetTimerまたはEventSetMillisecondTimerで設定した周期ごとに呼び出されます。価格更新とは独立して実行できるため、一定間隔で確認すればよい処理に向いています。
例えば、次の処理を分離できます。
- 口座全体の損益監視
- 日次損失上限の確認
- 複数銘柄の状態更新
- ダッシュボード表示
- ログや統計情報の保存
- 取引時間帯の判定
ティックが到着しない時間でも動作するため、セッション終了時の処理や口座全体のリスク管理にも利用できます。
イベントキューを意識する
MT5では、イベントが無制限に並列実行されるわけではありません。EAの処理はイベントキューに基づいて順番に実行されるため、OnTickやOnTimer内で長時間処理を行うと、後続イベントが遅れます。
そのため、各イベントでは次の原則が重要です。
- 重いループを避ける
- 不要なインジケーター再計算を減らす
- ファイル書き込みを頻繁に行わない
- Sleepで処理を停止しない
- 必要なデータのみ更新する
OnTimerを利用しても、処理自体が重ければ改善しません。役割分担と同時に、1回あたりの実行時間を短く保つ必要があります。
実用的な役割分担
高性能EAでは、処理を即時性によって分類します。
OnTickでは、現在価格に依存する売買判断と注文管理だけを行います。一方、OnTimerでは、口座監視、統計更新、画面表示、複数銘柄の定期確認を担当させます。
例えば、OnTickでエントリーシグナルを検出し、OnTimerで証拠金維持率や日次損失を確認する設計が考えられます。リスク制限に達した場合は共通フラグを更新し、OnTick側で新規注文を禁止します。
この構造にすると、売買ロジックと管理ロジックの依存関係が小さくなり、テストや修正も容易になります。
マルチシンボルEAでの注意点
OnTickは、基本的にEAを配置したチャートの銘柄に依存します。そのため、複数通貨ペアを監視するEAでは、対象銘柄すべての価格更新をOnTickだけで均等に扱えない場合があります。
マルチシンボル型では、OnTimerを使って各銘柄の最新価格やバー更新を定期確認する方法が有効です。ただし、監視銘柄数が多い場合は、毎回すべての履歴を取得せず、前回更新時刻との差分だけを確認する設計が必要です。
バックテストで確認すべき点
OnTimerを利用するEAは、ストラテジーテスターでも実行周期とテスト速度の関係を確認する必要があります。極端に短いタイマー周期を設定すると、イベント数が増えて最適化時間が長くなります。
検証では、次の項目を比較します。
- 1ティック当たりの処理時間
- テスト完了までの時間
- 注文時刻のずれ
- シグナル発生回数
- CPU負荷
- ライブ環境との挙動差
高速化だけを目的に処理を分離するのではなく、注文結果が変化していないかも確認することが重要です。
まとめ
OnTickは価格変化へ即時に反応する処理、OnTimerは一定間隔で実行すればよい監視・管理処理に適しています。
すべてをOnTickへ集約すると、ティック集中時の遅延や無駄な再計算が増えます。一方、OnTimerを過度に短い周期で動かすと、イベント数が増えてEA全体の負荷を高めます。
即時性、実行頻度、処理負荷を基準に役割を分離し、イベントキューを塞がない設計を行うことが、高性能で保守しやすいMT5 EAの基盤となります。







