MQL5のOnTickとOnTimer|EA設計での使い分け
目次
結論:判断は「新しい足」で、時間の処理は OnTimer で
先に結論を書きます。H1やH4のような長めの時間足で売買を決めるEAなら、売買の判断は「新しい足ができた最初のティック」だけで行えば足ります。ティックが来るたびに同じ計算を繰り返すと、CPUを使うだけで判断は変わりません。いっぽう、ティックが来なくても動かしたい処理には OnTimer を使います。週末に状態を書き出す、決まった時刻に注文を整理する、といった処理です。
ただし、どちらが正しいかは戦略によって決まります。この記事では、2つの仕組みの違いと、EAを選ぶ側が確かめられるポイントを整理します。
おすすめブローカー比較 →
🎁 無料EAをダウンロード📧 無料メール講座(全8通)+登録者限定 MT5 インジケーター13本パック
登録するとすぐに、サイトの MT5 インジケーター13本をコンパイル済みファイル(.ex5)・ソースコード・使い方ガイドにまとめた登録者限定パックのダウンロードリンクが届きます。続けて、FX自動売買の本質、バックテストの正しい見方、ブローカー選びのコツなどを全8通(最初の5日間は毎日1通、その後は登録7・14・30日後)でお届けします。MQL5 Market 版(ローンチ価格・販売数に応じて段階的に値上げ)の値上げ前のお知らせも届きます。当サイトのEAは提携ブローカーのリアル口座があれば無料です。
※ プライバシーは厳守。配信解除はいつでも可能です。
仕組み:ティック駆動と時間駆動
OnTick(ティック駆動)
OnTick は、EAを動かしている銘柄に新しい価格(ティック)が届くたびに呼ばれます。値動きが激しい時間帯には1秒に何度も呼ばれ、相場が止まっている週末には一度も呼ばれません。
ここで知っておくべき仕様があります。前回の OnTick の処理がまだ終わっていないあいだに届いたティックは、順番待ちに積まれず読み飛ばされます。つまり、1回の処理が重いEAは、急な値動きの最中にティックを取りこぼします。
OnTimer(時間駆動)
OnTimer は、EventSetTimer() で決めた間隔ごとに呼ばれます。値動きとは関係なく動くため、市場が閉まっている間も呼ばれます。タイマーは1つのEAに1つだけで、処理が詰まっていると同じように読み飛ばされます。また、指定した間隔ぴったりに呼ばれる保証はありません。
| 項目 | OnTick | OnTimer |
|---|---|---|
| 呼ばれるきっかけ | 価格の更新 | 一定時間の経過 |
| 市場が閉まっている間 | 呼ばれない | 呼ばれる |
| 呼ばれる回数 | 相場が荒いほど多い | ほぼ一定 |
| 向いている処理 | エントリー・決済の判断 | 定期的な集計・時刻で決まる処理 |
| 主な注意点 | 重い処理でティックを取りこぼす | 新しい価格が来ていなくても動く |
低頻度戦略でCPUを無駄にしない書き方
H4足で判断する戦略なら、1本の足が続く4時間のあいだに何千回 OnTick が呼ばれても、判断に使う確定足の値は変わりません。そこで私たちは、次のように「足が変わったときだけ」重い処理を通す形を基本にしています。
datetime g_lastBar = 0;
void OnTick()
{
datetime cur = iTime(_Symbol, PERIOD_H4, 0);
if(cur == g_lastBar) return; // 同じ足の間は何もしない
g_lastBar = cur;
// ここで確定足(シフト1)を使って判断する
}
インジケーターのハンドルは OnInit で一度だけ作り、OnTick の中で毎回作り直さないことも大切です。OnTimer を使う場合は、OnDeinit で EventKillTimer() を呼んでタイマーを止めます。
VPSで複数のチャートにEAを入れていると、こうした差がCPU負荷として表れます。VPS選びの考え方は VPS情報 にまとめています。
EAを選ぶ側が確かめられること
中身のコードを見られなくても、次の点はある程度確かめられます。
- 説明書きやパラメータ:「新しい足でのみ判断」のような設定があるか
- VPSのCPU使用率:1つのEAを外したときに負荷がはっきり下がるなら、毎ティック重い処理をしている可能性がある
- エキスパートログ:同じ内容の出力が毎ティック並んでいないか
- テスターの結果:足の始値で判断するEAなら、「始値のみ」と「全ティック」で結果が大きく変わらないはず。大きくずれるなら、足の途中の値動きにも反応している
EAの入れ方や設定の基本は EA設定方法 を参照してください。
限界と注意
都合の悪い面も書いておきます。
- 足の途中のリスクは見ていない:判断を新しい足に限ると、足の途中での急変には反応しません。損切りは注文に付ける逆指値で守る設計にしないと、思わぬ損失を許すことになります。
- 新しい足のずれ:新しい足ができても、その足で最初のティックが届くまでは処理が動きません。値動きの少ない銘柄や時間帯では、判断が足の始まりより遅れることがあります。
- OnTimer はテスターと実際の動きがずれやすい:テスターではタイマーが仮想の時刻で呼ばれるため、実際の口座と同じ間隔になるとは限りません。
- 処理が軽くても成績は変わらない:CPU負荷を下げても勝ちやすくなるわけではありません。戦略の良し悪しは別の問題です。
H4足のEA、たとえば ETHEREUM EA のように取引の少ない戦略ほど、こうした設計の差はわかりにくくなります。ただし、外から確かめられる範囲には限りがあります。私たちが断定できるのは、私たち自身が書いたコードについてだけです。
まとめ
- OnTick は価格が届いたとき、OnTimer は一定時間ごとに呼ばれる
- 処理中に届いたイベントは順番待ちに積まれず読み飛ばされる。重い処理は取りこぼしにつながる
- 低頻度戦略は「新しい足のときだけ判断する」形にすると、CPUを無駄にしない
- ティックがない時間にも動かしたい処理には OnTimer を使う
- 足の途中のリスクへの備えは逆指値で行う。軽い処理が成績を上げるわけではない
- ほかのノウハウは EA・MT5ノウハウ にまとめています
関連記事
📧 無料メール講座(全8通)+登録者限定 MT5 インジケーター13本パック
登録するとすぐに、サイトの MT5 インジケーター13本をコンパイル済みファイル(.ex5)・ソースコード・使い方ガイドにまとめた登録者限定パックのダウンロードリンクが届きます。続けて、FX自動売買の本質、バックテストの正しい見方、ブローカー選びのコツなどを全8通(最初の5日間は毎日1通、その後は登録7・14・30日後)でお届けします。MQL5 Market 版(ローンチ価格・販売数に応じて段階的に値上げ)の値上げ前のお知らせも届きます。当サイトのEAは提携ブローカーのリアル口座があれば無料です。
※ プライバシーは厳守。配信解除はいつでも可能です。