1本の足で1回だけ仕掛ける機能 改善版

足(バー)作成直後かどうかを判定するもっとシンプルな方法

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();

MT4の無料プログラミング講座

メルマガ登録して、MT4のプログラミング講座を無料で受けちゃおう!

超豪華プレゼントも盛りだくさん♪

MT4プログラミングを習得すると、オリジナルEA運用、作成代行、商品販売等、複数の収入源を手に入れられるよ。副業に最適だね!

↓↓↓ 詳細はこちら ↓↓↓

アイキャッチ

>

エターナル・パートナーPRO ~MT4裁量トレード支援ツール~ 「MT4は裁量トレーダーに優しくない」そう思ったことありませんか?もっと快適にトレードするための強力な売買ツールが必要だと考え、開発したのが「エターナル・パートナーPRO」です。元々は自分自身のために開発したツールですので、手抜き無しのガチものです。既に200名近い方に手に取っていただき、喜びの声が続々と届いております。ぜひご覧ください!

CTR IMG