ブログタイトルを「FX自動売買システム開発部」から「autoFX」に変更しました!

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

MQL4プログラミングの最新記事8件

>完全放ったらかしEA 「AutoEndlessCatchRange」

完全放ったらかしEA 「AutoEndlessCatchRange」

「本業が忙しい!」「でも資産運用したい!」そんなあなたに最適なEAです。兼業トレーダーの方はチャートを毎日みて分析してトレードする時間はなかなか確保できないものです。トレードは本EAに任せて、本業やプライベートの時間をもっと増やしませんか?元々は自分自身のために開発したEAですので、手抜き無しのガチものです。

CTR IMG