足(バー)作成直後かどうかを判定するもっとシンプルな方法
1本の足で1回だけ仕掛ける機能の記事にて、1本の足で1回だけ仕掛ける機能をご紹介しました。
私はずっとこれを使ってきたのですが、もっとシンプルな方法を他人様のコードから見つけましたので、ご紹介します。
//+------------------------------------------------------------------+ //|【関数】バー生成時チェック | //| | //|【引数】 IN OUT 引数名 説明 | //| --------------------------------------------------------- | //| なし | //| | //|【戻値】true : バー生成時 | //| false : バー生成時ではない | //| | //|【備考】なし | //+------------------------------------------------------------------+ bool IsNewBar() { static datetime dt = 0; if(Time[0] != dt){ dt = Time[0]; return(true); } return(false); }
最大の利点は関数化されていることです。以前はコードのあちこちに仕込みが必要だったのですが、これは関数呼ぶだけです。
関数の内部も実にシンプル!なんて素晴らしいのでしょう。
1つ欠点をあげるとするならば、静的変数を使っているため、呼び出し元のコードでこの関数を何度も呼び出しても意図した動作にはならない点です。
例えば、OnTick()の冒頭と終盤に、足が生成された瞬間かどうかを判定するアルゴリズムを入れたいとします。その場合、IsNewBar()をそれぞれの場所に書いてしまいそうになりますが、これをやってしまうと終盤の方のIsNewBar()が正しく動作してくれません(足が生成された瞬間と判断してくれません)。
コード内の複数箇所で足が生成された瞬間かどうかを判定する場合は、以下のように変数に結果を格納し、その変数を使い回しましょう。
// IsNewBar()関数は一度呼び出すと、静的変数を上書きするため、たとえ同一ティック内でも2回は呼び出せないので注意 bool newBar = IsNewBar();