トレーダーの皆さん、こんにちは!今日は、MetaTrader 4で新しいバーやキャンドルの開始を検出する方法についてお話ししましょう。特に、エキスパートアドバイザー(EA)を使用している方には役立つ内容です。
通常、MetaTraderのターミナルでは、新しいティックの価格が到着すると、デフォルトのイベント処理関数であるOnTick()が呼び出されます。しかし、残念ながら、新しいバーが開始またはオープンした時のデフォルトのイベント処理関数は存在しません。
そこで、新しいバーの開始を検出するためには、現在の最も最近のバーのオープン時間を監視する必要があります。オープン時間が変わった時、それが新しいバーの開始を示します。以下に、MQL4とMQL5の両方に対応したサンプルコードを示します。
// デフォルトのティックイベントハンドラ void OnTick() { // 新しいバーのチェック(MQL4とMQL5両方に対応) static datetime dtBarCurrent = WRONG_VALUE; datetime dtBarPrevious = dtBarCurrent; dtBarCurrent = iTime( _Symbol, _Period, 0 ); bool bNewBarEvent = ( dtBarCurrent != dtBarPrevious ); // 新しいバーのイベントに反応して処理を行う if( bNewBarEvent ) { // 最初のティックを受信したかどうかを検出し、処理を行う /* 例えば、チャートに最初に添付されたとき、バーが進行中で、実際には新しいバーの開始ではない場合。 */ if( dtBarPrevious == WRONG_VALUE ) { // 最初のティックまたはバーの途中で何かをする ... } else { // 通常のバーの開始時に何かをする ... }; // 上記の条件に関わらず、何かをする ... } else { // 他の処理を行う ... }; // その他の処理 ... };
このコードでは、static変数を使用して、バーのオープン時間を記録します。関数を抜ける際にもデータを保持し、現在のバーのオープン時間の変化を検出するための重要な要素です。
また、EAが初めてチャートに配置されたとき、このコードは新しいバーが開いたかのように反応します。この場合は、特別な処理が必要になりますので注意が必要です。
最後に、私のCodeBaseの出版物のソースコードは、現在MetaEditorの「Public Projects」タブでも入手可能です。ぜひ、探してみてください!