【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計算のハンドルを壊して、コンピュータのメモリを片付けます。 |