MT4インジケーターをサブウィンドウに表示する方法 MQL4の基本設定

MT4インジケーターをサブウィンドウに表示する方法とMQL4の基本設定を解説したアイキャッチ画像
MT4ノウハウ・インジケータ

自作インジケーターを作るとき、表示場所には大きく分けてメインチャート上サブウィンドウの2種類があります。

移動平均線や矢印サインのように価格チャート上へ表示するものはメインチャート、MACDやRSIのように別枠で数値の推移を見たいものはサブウィンドウに表示するのが一般的です。

この記事では、MQL4で自作インジケーターをサブウィンドウに表示する方法を、#property indicator_separate_window の使い方とサンプルコードで解説します。

※ インジケーター作成全体の流れやサインツールの作り方は、 MT4インジケーターの作り方 で解説しています。

この記事でわかること
  • メインチャート表示とサブウィンドウ表示の違い
  • #property indicator_separate_window の役割
  • サブウィンドウ表示に必要な基本設定
  • MACDクロス検出をサブウィンドウに表示するサンプルコード
  • コンパイル後にMT4チャートで確認する流れ

メインチャート表示とサブウィンドウ表示の違い

MT4のインジケーターは、表示する場所によって使い方が少し変わります。

表示場所向いているもの代表例
メインチャート価格チャート上に重ねて見たいもの移動平均線、矢印サイン、水平線、トレンドライン
サブウィンドウ価格とは別枠で数値や状態を見たいものMACD、RSI、ストキャスティクス、独自スコア表示

メインチャートに表示するインジケーターが増えると、ローソク足が見づらくなることがあります。

そのような場合は、サブウィンドウに分けて表示することで、チャートを見やすく整理できます。


サブウィンドウに表示する基本設定

自作インジケーターをサブウィンドウに表示する方法はシンプルです。

インジケーターの冒頭に、以下の指定を追加します。

#property indicator_separate_window

この1行を指定すると、インジケーターはメインチャートではなく、チャート下部のサブウィンドウ側に表示されます。

逆に、メインチャート上へ表示したい場合は、以下を使います。

#property indicator_chart_window
表示場所を決める指定
  • #property indicator_chart_window:メインチャート上に表示
  • #property indicator_separate_window:サブウィンドウに表示

MACDやRSIのように、価格とは別に値の推移を見たいインジケーターでは、サブウィンドウ表示が使いやすいです。


サブウィンドウ表示に必要なバッファ設定

サブウィンドウに値を表示するには、表示用のバッファを用意します。

たとえば、1本のラインやヒストグラムを表示する場合は、以下のようにバッファ数を指定します。

#property indicator_buffers 1
#property indicator_color1 Red

そして、配列を作成し、SetIndexBuffer() で表示用バッファとして登録します。

double CrossSignal[];

int OnInit()
{
   SetIndexBuffer(0, CrossSignal);
   SetIndexStyle(0, DRAW_HISTOGRAM, STYLE_SOLID, 2, clrRed);
   SetIndexLabel(0, "MACD Cross");

   return(INIT_SUCCEEDED);
}

これにより、CrossSignal[] に入れた値がサブウィンドウ上に表示されます。

今回のサンプルでは、MACDクロスの状態を以下のように表示します。

  • ゴールデンクロス:+1
  • デッドクロス:-1
  • それ以外:0

実際のサンプルコード MACDクロス検出をサブウィンドウに表示

以下は、MACDのゴールデンクロス・デッドクロスを検出し、サブウィンドウに数値として表示するサンプルコードです。

※ 学習用のサンプルです。実運用向けに使う場合は、確定足判定、リペイント対策、アラート、表示形式の調整などを追加して検証してください。

#property strict
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Red
#property indicator_minimum -1.2
#property indicator_maximum 1.2

input int MACD_FAST_PERIOD   = 12;
input int MACD_SLOW_PERIOD   = 26;
input int MACD_SIGNAL_PERIOD = 9;
input int BarLimit = 1000;

double CrossSignal[];

//+------------------------------------------------------------------+
//| 初期化                                                           |
//+------------------------------------------------------------------+
int OnInit()
{
   SetIndexBuffer(0, CrossSignal);
   ArraySetAsSeries(CrossSignal, true);

   SetIndexStyle(0, DRAW_HISTOGRAM, STYLE_SOLID, 2, clrRed);
   SetIndexLabel(0, "MACD Cross");

   SetLevelValue(0, 0);

   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 < MACD_SLOW_PERIOD + MACD_SIGNAL_PERIOD + 3)
      return(0);

   int limit = MathMin(rates_total - 2, BarLimit);

   for(int i = limit; i >= 1; i--)
   {
      CrossSignal[i] = 0;

      double macd_now = iMACD(NULL, 0,
                              MACD_FAST_PERIOD,
                              MACD_SLOW_PERIOD,
                              MACD_SIGNAL_PERIOD,
                              PRICE_CLOSE,
                              MODE_MAIN,
                              i);

      double sig_now = iMACD(NULL, 0,
                             MACD_FAST_PERIOD,
                             MACD_SLOW_PERIOD,
                             MACD_SIGNAL_PERIOD,
                             PRICE_CLOSE,
                             MODE_SIGNAL,
                             i);

      double macd_prev = iMACD(NULL, 0,
                               MACD_FAST_PERIOD,
                               MACD_SLOW_PERIOD,
                               MACD_SIGNAL_PERIOD,
                               PRICE_CLOSE,
                               MODE_MAIN,
                               i + 1);

      double sig_prev = iMACD(NULL, 0,
                              MACD_FAST_PERIOD,
                              MACD_SLOW_PERIOD,
                              MACD_SIGNAL_PERIOD,
                              PRICE_CLOSE,
                              MODE_SIGNAL,
                              i + 1);

      // MACDがシグナルを下から上へ抜けたら +1
      if(macd_prev <= sig_prev && macd_now > sig_now)
      {
         CrossSignal[i] = 1;
      }
      // MACDがシグナルを上から下へ抜けたら -1
      else if(macd_prev >= sig_prev && macd_now < sig_now)
      {
         CrossSignal[i] = -1;
      }
   }

   CrossSignal[0] = 0;

   return(rates_total);
}

このコードでは、MACDとシグナルラインの前回値・現在値を比較し、クロスが発生した位置に +1 または -1 を表示しています。

サブウィンドウに表示することで、メインチャートを邪魔せずに、MACDクロスの状態だけを確認できます。


コード内で重要なポイント

indicator_separate_window

サブウィンドウに表示するための指定です。

#property indicator_separate_window

これを指定することで、インジケーターが価格チャート上ではなく、別枠に表示されます。

indicator_buffers

表示に使うデータの数を指定します。

#property indicator_buffers 1

今回の例では、MACDクロス状態を表示するために1本のバッファを使っています。

SetIndexBuffer

配列をインジケーター表示用のバッファとして登録します。

SetIndexBuffer(0, CrossSignal);

この指定により、CrossSignal[] に入れた値がサブウィンドウ上に表示されます。

DRAW_HISTOGRAM

値をヒストグラム形式で表示する指定です。

SetIndexStyle(0, DRAW_HISTOGRAM, STYLE_SOLID, 2, clrRed);

ライン表示にしたい場合は、DRAW_LINE を使うこともできます。


実際にチャートで確認してみる

コードをMetaEditorに貼り付け、コンパイルしてからMT4チャートに表示します。

コンパイルやチャートへの追加方法が不安な場合は、以下の記事も参考にしてください。

MT4のサブウィンドウにMACDクロス検出インジケーターを表示した例

メインチャートを邪魔せず、サブウィンドウ側にMACDクロスの状態を表示できます。

MACDやRSIのように「値の推移を別枠で見たい」ときは、サブウィンドウ表示が便利です。


サブウィンドウ表示が向いているインジケーター

サブウィンドウ表示は、価格チャートとは別に状態や数値を確認したいインジケーターに向いています。

  • MACDのようにゼロラインを基準に見たいもの
  • RSIのように買われすぎ・売られすぎを数値で見たいもの
  • ストキャスティクスのように複数ラインを別枠で見たいもの
  • 独自のスコアや判定状態を表示したいもの
  • EA化する前に条件成立状態を確認したいもの

一方で、移動平均線や矢印サインのようにローソク足との位置関係を見たいものは、メインチャート表示の方が向いています。

表示場所は目的で選ぶ

ローソク足と重ねて見たいならメインチャート、数値や状態を別枠で見たいならサブウィンドウが向いています。
インジケーターの目的に合わせて表示場所を選びましょう。


サブウィンドウに表示されない時の確認ポイント

コンパイルできているのにサブウィンドウに表示されない場合は、以下を確認してください。

  • #property indicator_separate_window が指定されているか
  • #property indicator_buffers の数が足りているか
  • SetIndexBuffer() で配列を登録しているか
  • バッファに値が入っているか
  • 値がすべて EMPTY_VALUE になっていないか
  • MT4のナビゲーターを更新、またはMT4を再起動したか

特に、表示用バッファに値が入っていない場合、サブウィンドウは表示されてもラインやヒストグラムが見えないことがあります。

その場合は、まず CrossSignal[i] = 1; のように固定値を入れて表示されるか確認すると、原因を切り分けやすくなります。


MT4インジケーターのサブウィンドウ表示でよくある質問

MT4インジケーターをサブウィンドウに表示するには何が必要ですか?

MQL4コード内で #property indicator_separate_window を指定します。
さらに、表示用のバッファを用意し、SetIndexBuffer() で登録することで、サブウィンドウ上にラインやヒストグラムを表示できます。

indicator_chart_windowとの違いは何ですか?

indicator_chart_window はメインチャート上に表示する指定です。
indicator_separate_window はチャート下部のサブウィンドウに表示する指定です。
移動平均線や矢印サインはメインチャート、MACDやRSIのような数値系はサブウィンドウが向いています。

サブウィンドウに何も表示されない原因は何ですか?

バッファに値が入っていない、SetIndexBuffer() が正しく設定されていない、表示スタイルが合っていない、または条件が一度も成立していない可能性があります。
まずは固定値を入れて表示されるか確認すると、原因を切り分けやすくなります。

サブウィンドウ表示はEA作成にも役立ちますか?

はい。EA化する前に、条件が成立しているかをサブウィンドウで確認できます。
ただし、このページではサブウィンドウ表示の基本設定を中心に扱っています。EA作成全体の流れは、EAプログラミングの学習記事で確認してください。


まとめ MT4インジケーターをサブウィンドウに表示する基本

今回は、自作インジケーターをサブウィンドウに表示する方法を解説しました。

  • #property indicator_separate_window を指定するとサブウィンドウ表示になる
  • 表示用バッファを作り、SetIndexBuffer() で登録する
  • MACDやRSIのような数値系インジケーターはサブウィンドウ向き
  • 移動平均線や矢印サインはメインチャート表示の方が見やすい
  • 表示されない場合は、バッファ設定と値の有無を確認する

サブウィンドウ表示は、インジケーター作成の中でも特定の用途に絞った設定です。

インジケーター全体の作り方や、サインツール作成の流れは以下の記事で解説しています。


コメント

タイトルとURLをコピーしました