【MQL5】サブウィンドウにヒストグラムを表示し、色分けでトレンド変化を視覚化するコードを公開

ヒストグラム

【MQL5】サブウィンドウにヒストグラム(MACD線-シグナル線)を表示し、色分けでトレンド変化を視覚化するコードを公開しています。

ヒストグラムは「ヒストグラム=MACD線-シグナル線」

MACD線は「期間12の短期EMA - 期間26の長期EMA」

シグナル線は「MACD線の移動平均線(EMA)9日移動平均線」になります。

ヒストグラム(MACD−Signal)表示コード



//+------------------------------------------------------------------+
//|                       Histogram Only                             |
//+------------------------------------------------------------------+
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   1

//--- プロパティ設定
#property indicator_label1 "Histogram"
#property indicator_type1   DRAW_COLOR_HISTOGRAM
#property indicator_width1  2

//--- カラー設定
#property indicator_color1 clrLightSkyBlue, clrSteelBlue

//--- インプットパラメータ
input int FastEMA = 12;
input int SlowEMA = 26;
input int SignalEMA = 9;

//--- バッファ
double HistogramBuffer[];
double ColorBuffer[];

//--- ハンドル
int handleFastEMA, handleSlowEMA;

//+------------------------------------------------------------------+
//| 初期化関数                                                       |
//+------------------------------------------------------------------+
int OnInit()
  {
   // バッファ設定
   SetIndexBuffer(0, HistogramBuffer, INDICATOR_DATA);
   SetIndexBuffer(1, ColorBuffer, INDICATOR_COLOR_INDEX);

   // Fast EMA ハンドル作成
   handleFastEMA = iMA(NULL, 0, FastEMA, 0, MODE_EMA, PRICE_CLOSE);
   if(handleFastEMA == INVALID_HANDLE)
     {
      Print("Fast EMA handle creation failed. Error: ", GetLastError());
      return INIT_FAILED;
     }

   // Slow EMA ハンドル作成
   handleSlowEMA = iMA(NULL, 0, SlowEMA, 0, MODE_EMA, PRICE_CLOSE);
   if(handleSlowEMA == INVALID_HANDLE)
     {
      Print("Slow EMA handle creation failed. Error: ", GetLastError());
      return INIT_FAILED;
     }

   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[])
  {
   int start = prev_calculated;

   if(start == 0)
     {
      ArrayInitialize(HistogramBuffer, EMPTY_VALUE);
      ArrayInitialize(ColorBuffer, 0);
      start = MathMax(FastEMA, SlowEMA);
     }

   double FastEMAArray[], SlowEMAArray[];

   // Fast EMA データ取得
   if(CopyBuffer(handleFastEMA, 0, 0, rates_total, FastEMAArray) <= 0) return 0;

   // Slow EMA データ取得
   if(CopyBuffer(handleSlowEMA, 0, 0, rates_total, SlowEMAArray) <= 0) return 0;

   // Signal Line (EMA) 計算
   double alpha = 2.0 / (SignalEMA + 1);
   double SignalValue = 0.0;
   double prevHistogram = 0.0;

   for(int i = start; i < rates_total; i++)
     {
      double MACDValue = FastEMAArray[i] - SlowEMAArray[i];
      SignalValue = (i == start) ? MACDValue : SignalValue + alpha * (MACDValue - SignalValue);

      // ヒストグラム計算 (MACD - Signal)
      double HistogramValue = MACDValue - SignalValue;
      HistogramBuffer[i] = HistogramValue;

      // 前回のヒストグラム値
      double prevHistogramValue = (i > 0) ? HistogramBuffer[i - 1] : 0;

      // 色分け条件(逆にしたバージョン)
      if(HistogramValue >= 0)
        {
         if(HistogramValue >= prevHistogramValue)
            ColorBuffer[i] = 0; // 上昇中 → LightSkyBlue
         else
            ColorBuffer[i] = 1; // 下降中 → SteelBlue
        }
      else
        {
         if(HistogramValue <= prevHistogramValue)
            ColorBuffer[i] = 1; // 下降中 → SteelBlue
         else
            ColorBuffer[i] = 0; // 上昇中 → LightSkyBlue
        }

      prevHistogram = HistogramValue;
     }

   return rates_total;
  }
//+------------------------------------------------------------------+
//| 終了関数                                                         |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   if(handleFastEMA != INVALID_HANDLE) IndicatorRelease(handleFastEMA);
   if(handleSlowEMA != INVALID_HANDLE) IndicatorRelease(handleSlowEMA);
  }
//+------------------------------------------------------------------+


#property の設定

設定項目 初心者向け説明
indicator_separate_window チャートの下に小さな“別窓”を作ってヒストグラムを表示します。
indicator_buffers 2 データ保存用の場所を2つ用意します(1つは数字、1つは色情報用)。
indicator_type1 DRAW_COLOR_HISTOGRAM ヒストグラムの棒を値に応じて自動で色分けします。
indicator_color1 clrLightSkyBlue, clrSteelBlue 値に応じて「水色」か「青色」で表示します。

バッファの定義

変数名 何をするもの?
HistogramBuffer[] MACD−Signal の計算結果(ヒストグラムの高さ)を一時的に保存します。
ColorBuffer[] 各バーごとに「水色(0)」か「青色(1)」の情報を保存します。

OnInit() の処理(インジケーター起動時に一度だけ実行)

ステップ 初心者向け説明
SetIndexBuffer() 先ほどのバッファ配列をチャート描画用に登録します。
iMA() FastEMA と SlowEMA を計算するための“計算機”(ハンドル)を準備します。
エラーチェック もし計算機の準備に失敗したら、エラーメッセージを出して処理を止めます。

OnCalculate() のロジック(新しい足が来るたびに実行)

処理内容 初心者向け説明
CopyBuffer() FastEMA と SlowEMA の値を最新の足すべて分、配列に取り込みます。
MACDValue の計算 「FastEMA − SlowEMA」で今のMACD値を求めます。
SignalValue の計算 前のSignalValueを使って自分でEMAを計算し直します。
HistogramValue の計算 「MACDValue − SignalValue」でヒストグラムの値を出します。
ColorBuffer の設定 前のヒストグラムと比べて上がっていれば水色、下がっていれば青色をセットします。

色分けルール

状態
ヒストグラム ≥ 0 かつ 前の値より上昇中 水色
ヒストグラム ≥ 0 かつ 前の値より下降中 青色
ヒストグラム < 0 かつ 前の値より下降中 青色
ヒストグラム < 0 かつ 前の値より上昇中 水色

OnDeinit() の処理(インジケーター解除時に実行)

処理 初心者向け説明
IndicatorRelease() 準備したEMA計算のハンドルを壊して、コンピュータのメモリを片付けます。