「陽線がもう5本も続いている、そろそろ反転しそうだ」チャートを目で追っていると、

こういう感覚になったことがあるはずです。

ですがこの「そろそろ」は、多くの場合ただの主観であり、

実際に何本続いているのかを正確に数えている人は少ないはずです。

この記事では、陽線・陰線が連続した本数をその場でカウントし、

一定本数を超えたら色を変えて教えてくれるインジケーターを作ります。

設計思想: 「そろそろ」を数値に変換する

裁量トレードでよく言われる「そろそろ反転」という感覚は、

言い換えると「同じ方向のローソク足が普段より多く連続している」

という状態を指しています。

これを毎回目で数えるのは大変なので、現在の連続本数を常にチャート上に表示しておけば、

判断の材料が1つ増えます。

重要なのは、この連続本数はあくまで「珍しさ」を示すだけの数値であり、

それ自体が反転を予測する魔法の数字ではないという点です。

陽線・陰線を判定し、連続本数を数えるロジック

1本のローソク足が陽線か陰線かは、

始値(Open)と終値(Close)の大小関係で判定します。

if(Close[i] > Open[i])       方向 = 陽線;
else if(Close[i] < Open[i])  方向 = 陰線;
else                          方向 = 同値(十字線);

連続本数のカウントは、1本前の足と同じ方向であれば加算し、

方向が変わったら1にリセットする、

というシンプルな仕組みです。

if(現在の方向 == 1本前の方向)
   streak = 1本前のstreak + 1;
else
   streak = 1;

実際に動くコード全体

連続本数をサブウィンドウにヒストグラムで表示し、

入力パラメーター`WarningStreak`で指定した本数を超えたら

色を変えて注意を促す、

実際にMetaEditorでコンパイルできるインジケーターです。

//+------------------------------------------------------------------+
//|                              ConsecutiveCandleCounter.mq4         |
//|                     Copyright 2026, FX-EA System Project Creator |
//|                        https://creator.fx-ea-system-project.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2026, FX-EA System Project Creator"
#property link      "https://creator.fx-ea-system-project.com/"
#property version   "1.00"
#property strict
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 Lime
#property indicator_color2 DeepPink

input int WarningStreak = 5;//この本数を超えたら警告色に切り替える

double UpStreak[];
double DownStreak[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   SetIndexBuffer(0,UpStreak);
   SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_SOLID,2);
   SetIndexLabel(0,"陽線の連続本数");

   SetIndexBuffer(1,DownStreak);
   SetIndexStyle(1,DRAW_HISTOGRAM,STYLE_SOLID,2);
   SetIndexLabel(1,"陰線の連続本数(マイナス表示)");

   IndicatorShortName("Consecutive Candle Counter");
   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//| 1本のローソク足の方向を返す(1=陽線, -1=陰線, 0=同値)              |
//+------------------------------------------------------------------+
int GetDirection(int i)
  {
   if(Close[i] > Open[i]) return(1);
   if(Close[i] < Open[i]) return(-1);
   return(0);
  }

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[])
  {
   int limit = rates_total - 2;
   if(prev_calculated > 1)
      limit = rates_total - prev_calculated;
   if(limit > rates_total - 2)
      limit = rates_total - 2;

   for(int i=limit; i>=0; i--)
     {
      int dir = GetDirection(i);
      int prevDir = GetDirection(i+1);
      int prevStreak = (i+1 < rates_total) ? (int)MathAbs(UpStreak[i+1]-DownStreak[i+1]) : 0;

      int streak;
      if(dir != 0 && dir == prevDir)
         streak = prevStreak + 1;
      else if(dir != 0)
         streak = 1;
      else
         streak = 0;

      if(dir > 0)
        {
         UpStreak[i]   = streak;
         DownStreak[i] = 0;
        }
      else if(dir < 0)
        {
         UpStreak[i]   = 0;
         DownStreak[i] = -streak;
        }
      else
        {
         UpStreak[i]   = 0;
         DownStreak[i] = 0;
        }
     }

   if(UpStreak[1] >= WarningStreak)
      Comment("陽線が", (int)UpStreak[1], "本連続。そろそろ変化に注意(反転を保証するものではありません)");
   else if(-DownStreak[1] >= WarningStreak)
      Comment("陰線が", (int)(-DownStreak[1]), "本連続。そろそろ変化に注意(反転を保証するものではありません)");
   else
      Comment("");

   return(rates_total);
  }
//+------------------------------------------------------------------+
Copy

MetaEditorで実際に動かす手順

  1. MT4の「ツール」→「MetaQuotes Language Editor」でMetaEditorを開く
  2. 「ファイル」→「新規作成」→「カスタムインディケータ」を選び、名前を「ConsecutiveCandleCounter」にして作成する
  3. テンプレートの中身をすべて削除し、上のコードを丸ごと貼り付ける
  4. F7キーでコンパイルし、「0 error(s), 0 warning(s)」になることを確認する
  5. チャートへ適用し、陽線が連続する場面で緑のヒストグラムが積み上がり、`WarningStreak`(標準5本)を超えるとチャート左上にコメントが出ることを確認する

この数値の使いどころと限界

連続本数はあくまで「普段より珍しい状態かどうか」を示すだけの数値で、

反転を予測する根拠にはなりません。

強いトレンド相場では、陽線が10本以上連続することも珍しくなく、

その途中で逆張りすると大きく含み損を抱えるリスクがあります。

実際にエントリー判断へ使う場合は、この記事の連続本数を「注意信号」

として扱い、RSIやCCIのような逆張り系指標と組み合わせて、

複数の根拠が揃ったときだけ検討するようにしてください。

コピペして動かない・意図と違うときに確認すること

  • ヒストグラムが常に0のまま変化しない場合、`Open[]`・`Close[]`の並び順(MT4は0が最新)を取り違えていないか確認する
  • 連続本数がリセットされるタイミングが想定と違う場合、同値(十字線、`Close[i]==Open[i]`)の足を挟むと連続がリセットされる仕様になっている点を確認する(意図的な仕様だが、通貨ペアによっては同値の足が多く発生することがある)
  • 警告コメントが出ない場合、`WarningStreak`の値がチャートの通貨ペア・時間足に対して大きすぎないか調整する

まとめ

「陽線・陰線が続いて、そろそろ反転しそう」という裁量トレーダーの感覚を、

連続本数という具体的な数値に変換し、

一定本数を超えたら知らせてくれるインジケーターを作りました。

ただしこの連続本数は珍しさを示す目安であり、強いトレンドでは何本でも続き得ます。

単独のシグナルにはせず、他の逆張り系指標と組み合わせて使ってください。

関連記事