皆さん、こんにちは!今日は、MetaTrader 5で新しいバー(キャンドル)の開始を検出する方法についてお話ししたいと思います。システムトレーディング(EA)を使っていると、新しいティック(tick)が受信されると、標準のOnTick()イベント処理関数が呼び出されるのですが、新しいバーが開始される際の標準的なイベント処理関数はないんですね。
新しいバーの開始を検出するには、最新のバーのオープン時間を監視する必要があります。オープン時間が変わると、新しいバーの開始を示すことになり、その状況に応じて反応してイベントを処理することができます。以下に示すのは、MQL4とMQL5の両方で動作するコード例です。
// 標準のティックイベントハンドラー void OnTick() { // 新しいバーを確認(MQL4およびMQL5に対応) static datetime dtBarraCorrente = WRONG_VALUE; datetime dtBarraPrecedente = dtBarraCorrente; dtBarraCorrente = iTime( _Symbol, _Period, 0 ); bool bEventoBarraNova = ( dtBarraCorrente != dtBarraPrecedente ); // 新しいバーのイベントに反応し、状況を処理する if( bEventoBarraNova ) { // 最初のティックを受信したかどうかを確認 /* 例えば、グラフに最初に適用されたとき、バーが進行中で、実際には新しいバーの開始ではない場合 */ if( dtBarraPrecedente == WRONG_VALUE ) { // 最初のティックまたはバーの途中で何かを実行... } else { // 通常のバーが現れたときに何かを実行... }; // 前の条件に関係なく何かを実行... } else { // 別のことを実行... }; // その他の処理... };
このコードでは、static変数がバーのオープン時間を記録します。これは、OnTick()関数から戻ってもデータを保持するため、現在のバーのオープン時間の変化を検出するための重要なポイントです。
また、EAが初めてチャートに配置されるとき、前述のコードは新しいバーが開いたかのように反応します。この条件は、異なる状況で処理が必要な場合には特別な対応が求められますので、注意が必要です。
最後に、私のCodeBaseの公開物に関するソースコードは、MetaEditorの「Public Projects」から「FMIC」という名前でアクセス可能になっていますので、ぜひご覧ください。