システムトレーディング(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変数がバーのオープニング時間を記録し、OnTick()関数から戻る際にも保持されます。通常のローカル変数とは異なり、データ内容を記憶し、関数を離れるときに解放されません。これが現在のバーのオープニング時間の変化を検出するための鍵です。
また、EAが初めてチャートに配置された際に、上記のコードがバーが開いたかのように反応することも重要です。この条件は、状況に応じて特別な取り扱いが必要です。
なお、私のすべてのCodeBase出版物のソースコードは、現在MetaEditorの「Public Projects」タブで「FMIC」という名前で入手可能です。