ATRの数値を見て、「これは大きいのか小さいのか」の判断に迷ったことはないでしょうか。

ATRは通貨ペアや時間軸によって水準がバラバラなため、

数値だけ見ても「今が動きやすい相場か」はすぐに分かりません。

この記事では、直近のATRを長期平均のATRで割った「比率」に変換し、

1.0を基準にサブウィンドウのヒストグラムで「今は動きやすい相場か」を判定表示するインジケーターの作り方を解説します。

この記事で分かること

・ATRを比率に変換して水準を気にせず判定する発想

・indicator_separate_windowでサブウィンドウに表示する方法

・iMAOnArrayで長期平均を計算する方法

・SetLevelValueで判定の基準線を引く方法

ボラティリティ判定の考え方

まず、なぜATRの数値をそのまま使わないのか、考え方を確認します。

ATRの数値だけでは何が分からないか

ATRは通貨ペアごとに桁も水準もまったく違います。

ドル円のATR0.3と、ポンド円のATR0.3では意味が異なり、

「0.3なら動きやすい」と一律に判断できません。

比率にするという発想

そこで、直近のATRを「長期平均のATR」で割ります。

ATR比率 = 直近のATR ÷ 過去100本分のATRの平均

比率にすれば、通貨ペアや時間軸が違っても、

「普段の何倍動いているか」という同じ物差しで比較できます。

1.0を基準にした読み方

比率が1.0のときは、普段どおりの値動きです。

ATR比率 意味
1.3以上 普段より動きやすい相場
0.7〜1.3 普段どおりの相場
0.7以下 普段より動きにくい相場

ATRの値を配列に保存する

比率を計算するには、まずATRの値を自分の配列に保存しておく必要があります。

隠しバッファにiATRの値を入れる

double ATRBuffer[];
double RatioBuffer[];

表示用のRatioBufferとは別に、計算専用のATRBufferを用意します。

indicator_buffersとSetIndexBufferの設定

#property indicator_separate_window
#property indicator_buffers 2

サブウィンドウに表示するためindicator_separate_windowを指定し、

バッファは表示用・計算用の2本を確保します。

DRAW_NONEで計算用バッファを非表示にする

SetIndexBuffer(1, ATRBuffer);
SetIndexStyle(1, DRAW_NONE);

DRAW_NONEを指定すると、

バッファとして計算には使えますがチャートには描画されません。

移動平均との比率を計算する

保存したATRの値から、長期平均との比率を計算します。

iMAOnArrayで基準値を求める

double baseline = iMAOnArray(ATRBuffer, 0, InpBaselinePeriod, 0, MODE_SMA, i);

第2引数の0は「配列全体を対象にする」という意味です。

ATRBufferに保存した値の単純移動平均を基準値として求めます。

ゼロ除算・計算不可期間のガード

過去データが十分に無い期間は、基準値を計算できません。

if(i + InpBaselinePeriod >= rates_total || baseline <= 0.0)
  {
   RatioBuffer[i] = EMPTY_VALUE;
   continue;
  }

古いバーのうち、平均を計算する分のデータが無い部分は表示しません。

ヒストグラムバッファへの書き込み

RatioBuffer[i] = ATRBuffer[i] / baseline;

直近のATRを基準値で割った値を、そのままヒストグラムのバッファに書き込みます。

基準線をSetLevelValueで引く

数値だけでなく、見た目でも判断しやすくするため基準線を引きます。

1.0ラインを引く理由

SetLevelValue(0, 1.0);

ヒストグラムがこのラインを超えているかどうかで、

「普段より動いているか」を一目で判断できます。

閾値ラインも合わせて引く

SetLevelValue(1, 1.3);
SetLevelValue(2, 0.7);

「動きやすい」「動きにくい」の目安ラインも追加し、3本の基準線でゾーンを可視化します。

見た目を整えるその他の設定

補足

・indicator_minimumを0にすると比率0未満の無駄な余白が減ります

・ヒストグラムの色はindicator_color1で変更できます

・基準線の見た目はSetLevelStyle()でさらに調整できます

実際に動くコード全体

ATRの比率をサブウィンドウのヒストグラムに表示するカスタムインジケーターです。

//+------------------------------------------------------------------+
//|                              ATRVolatilityRatio.mq4               |
//|                     Copyright 2026, FX-EA System Project Creator |
//|                        https://creator.fx-ea-system-project.com/ |
//+------------------------------------------------------------------+
#property strict
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 DodgerBlue
#property indicator_width1 2
#property indicator_minimum 0

input int InpATRPeriod      = 14;
input int InpBaselinePeriod = 100;

double RatioBuffer[];
double ATRBuffer[];

int OnInit()
  {
   SetIndexBuffer(0, RatioBuffer);
   SetIndexStyle(0, DRAW_HISTOGRAM, STYLE_SOLID, 2);
   SetIndexLabel(0, "ATR比率");

   SetIndexBuffer(1, ATRBuffer);
   SetIndexStyle(1, DRAW_NONE);

   SetLevelValue(0, 1.0);
   SetLevelValue(1, 1.3);
   SetLevelValue(2, 0.7);

   IndicatorShortName("ATR Volatility Ratio(" + IntegerToString(InpATRPeriod) + "," + IntegerToString(InpBaselinePeriod) + ")");

   return(INIT_SUCCEEDED);
  }

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[])
  {
   if(rates_total < InpATRPeriod + InpBaselinePeriod + 1)
      return(rates_total);

   int limit = (prev_calculated == 0) ? rates_total - 1 : rates_total - prev_calculated + 1;
   if(limit > rates_total - 1)
      limit = rates_total - 1;

   for(int i = limit; i >= 0; i--)
     {
      ATRBuffer[i] = iATR(NULL, 0, InpATRPeriod, i);

      if(i + InpBaselinePeriod >= rates_total)
        {
         RatioBuffer[i] = EMPTY_VALUE;
         continue;
        }

      double baseline = iMAOnArray(ATRBuffer, 0, InpBaselinePeriod, 0, MODE_SMA, i);

      if(baseline <= 0.0)
        {
         RatioBuffer[i] = EMPTY_VALUE;
         continue;
        }

      RatioBuffer[i] = ATRBuffer[i] / baseline;
     }

   return(rates_total);
  }

MetaEditorでのコンパイル・実行手順

  1. MetaEditorで新規カスタムインジケーター「ATRVolatilityRatio」を作成し、上のコードを貼り付けてコンパイルする
  2. MT4のナビゲーターからチャートへドラッグ&ドロップして適用する
  3. チャートの下にサブウィンドウが追加され、ヒストグラムと3本の基準線が表示されることを確認する
  4. 相場が急に動いた直後にヒストグラムが1.0のラインを超えることを確認する

よくあるエラーと注意点

実際に使うときにつまずきやすいポイントをまとめます。

baselinePeriodを長くしすぎると反応が遅れる

注意

・InpBaselinePeriodを極端に長くすると基準値が動きにくくなります

・相場環境が変わっても比率がなかなか1.0から動かなくなります

・まずは既定値の100前後から試し、通貨ペアに合わせて調整してください

効率比インジケーターとの違い

既刊の効率比(Efficiency Ratio)インジケーターは「一方向にムダなく進んでいるか」という方向性を判定します。

本記事のATR比率は方向性を見ず、

「普段と比べて値幅が大きいか小さいか」だけを判定する点が異なります。

MQL4とMQL5の違い

このコードはMQL4のiATR・iMAOnArrayを使った書き方です。

MQL5ではiATRはハンドルを返す方式に変わり、

CopyBufferで値を取得してから自分で移動平均を計算する設計になります。

よくある質問

ATRの比率によるボラティリティ判定について、よく検索される疑問に回答します。

この比率だけでエントリー判断してよいですか?

この記事の設計は、あくまで「今の値動きの大きさ」を判定する補助的な指標としての利用を想定しています。

エントリーの合図には、既刊のRSIや効率比等の記事と組み合わせて使うことをおすすめします。

1.3や0.7の閾値はどう決めればよいですか?

絶対的な正解はありません。

まずは既定値で試し、ヒストグラムの触れ幅を見ながら通貨ペアや時間軸に合わせて調整してみてください。

なぜメインウィンドウのパネルではなくサブウィンドウにしたのですか?

既刊のパネル系インジケーター記事はメインウィンドウでの常時表示を扱ってきたため、

本記事ではあえてヒストグラム・基準線というサブウィンドウ特有の表現方法を選びました。

【MQL】ATRの比率で『今は動きやすい相場か』をサブウィンドウに表示するインジケーターの作り方:まとめ

ATRをそのまま見るのではなく、長期平均との比率に変換することで、

通貨ペアや時間軸を問わず同じ基準で判断できるようになります。

サブウィンドウのヒストグラムと3本の基準線を組み合わせれば、

数値を覚えていなくても一目で「今は動きやすい相場か」が分かります。

関連記事