DRAW_FILLING

DRAW_FILLING スタイルは、2個の指標バッファの値の間の色の領域をプロットします。実際に、このスタイルは 2 つの線を描画しそれらの間の空間を指定された 2 つの色のいずれかで塗りつぶします。これは、チャンネルを描く指標の作成に使用されます。いずれのバッファも空の値のみを含むことは出来ません。この場合プロットがなされません。

塗りつぶしの色は 2 つ設定することが出来ます。

  • 最初の色は、1 番目のバッファの値が2 番目の指標バッファの値よりも大きい領域に使用されます。
  • 2 番目の色は、2 番目のバッファの値が1 番目の指標バッファの値よりも大きい領域に使用されます。

塗りつぶしの色はコンパイラディレクティブまたは動的に PlotIndexSetInteger() 関数で設定出来ます。プロットのプロパティの動的な変更は、指標の外観が現在の状況に応じて変わるようにして「盛り上げる」ことが出来ます。

指標は、両方の指標バッファの値が 0 でも空値でもない全てのバーに計算されます。「空」値を指定するには PLOT_EMPTY_VALUE プロパティで値を設定します。

  #define INDICATOR_EMPTY_VALUE -1.0
  ...
//--- INDICATOR_EMPTY_VALUE (空)値は以下に使用されない
  PlotIndexSetDouble (DRAW_FILLING_creation_index,PLOT_EMPTY_VALUE,INDICATOR_EMPTY_VALUE);

指標の計算に関与しないバーの描画は指標バッファ内の値に依存します。

  • 両方の指標バッファの値が 0 に等しいバーは、指標描画に関与しません。これは、ゼロの値を持つ領域が記入されていないことを意味します。

DRAW_FILLING_without_drawing

  • 指標バッファの値が「空の値」に等しいバーは、指標描画に関与します。空の値を持つ領域が有意な値と領域を接続するように記入されます。

DRAW_FILLING_with_drawing

「空の値」がゼロに等しい場合、指標の計算に関与しないバーも記入されていることに留意すべきです。

DRAW_FILLING のプロットに必要なバッファの数は 2 です。

別々のウィンドウで別々の平均期間を持つ 2 つのMAの間のチャンネルを描画する指標の例です。移動平均の交差点での色の変化は視覚的に上向きと下向きのトレンドの変化を示しています。色は N ティックごとにランダムに変わります。パラメータは手動設定の可能性を持って(指標の「プロパティ」ウィンドウの「パラメータ」タブ)指標外部パラメータに設定されています。

DRAW_FILLING

DRAW_FILLING を持つ plot1 では、プロパティは #property コンパイラディレクティブを使用して指定され、後に OnCalculate() 関数で新しい色がランダムに設定されます。

//+------------------------------------------------------------------+
//|                                                 DRAW_FILLING.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                             https://www.MQL5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2000-2024, MetaQuotes Ltd."
#property link     "https://www.mql5.com"
#property version   "1.00"
 
#property description "An indicator to demonstrate DRAW_FILLING"
#property description "It draws a channel between two MAs in a separate window"
#property description "The fill color is changed randomly"
#property description "after every N ticks"
 
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   1
//--- 交差点をプロットする
#property indicator_label1 "Intersection"
#property indicator_type1   DRAW_FILLING
#property indicator_color1 clrRed,clrBlue
#property indicator_width1  1
//--- 入力パラメータ
input int     Fast=13;         // 高速 MA 期間
input int     Slow=21;         // 低速 MA 期間
input int     shift=1;         // 将来(正)に向けた MA のシフト
input int     N=5;             // 変化をもたらすティックの数
//--- 指標バッファ
double         IntersectionBuffer1[];
double         IntersectionBuffer2[];
int fast_handle;
int slow_handle;
//--- 色を格納する配列
color colors[]={clrRed,clrBlue,clrGreen,clrAquamarine,clrBlanchedAlmond,clrBrown,clrCoral,clrDarkSlateGray};
//+------------------------------------------------------------------+
//| カスタム指標を初期化する関数                                            |
//+------------------------------------------------------------------+
int OnInit()
 {
//--- 指標バッファマッピング
  SetIndexBuffer(0,IntersectionBuffer1,INDICATOR_DATA);
  SetIndexBuffer(1,IntersectionBuffer2,INDICATOR_DATA);
//---
  PlotIndexSetInteger(0,PLOT_SHIFT,shift);
//---
  fast_handle=iMA(_Symbol,_Period,Fast,0,MODE_SMA,PRICE_CLOSE);
  slow_handle=iMA(_Symbol,_Period,Slow,0,MODE_SMA,PRICE_CLOSE);
//---
  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[])
 {
  static int ticks=0;
//--- 線のスタイル、色、及び幅を変更するティックを計算する
  ticks++;
//--- 充分なティックの数が蓄積されている場合
  if(ticks>=N)
    {
    //--- 線のプロパティを変更する
     ChangeLineAppearance();
    //--- ティックカウンタをゼロにリセットする
     ticks=0;
    }
 
//--- 指標の最初の計算を行う。またはデータが変更されており、完全な再計算が必要。
  if(prev_calculated==0)
    {
    //--- 指標値の全てをバッファに複製する
    int copied1=CopyBuffer(fast_handle,0,0,rates_total,IntersectionBuffer1);
    int copied2=CopyBuffer(slow_handle,0,0,rates_total,IntersectionBuffer2);
    }
  else // 更新されたデータのみを書き込む
    {
    //--- OnCalculate() の現在及び以前の開始点の間でのバーの違いを取得
    int to_copy=rates_total-prev_calculated;
    //--- 違いがなければゼロバーに値をひとつ複製する
    if(to_copy==0) to_copy=1;
    //--- to_copy 値を指標バッファの終わりに複製する
    int copied1=CopyBuffer(fast_handle,0,0,to_copy,IntersectionBuffer1);
    int copied2=CopyBuffer(slow_handle,0,0,to_copy,IntersectionBuffer2);
    }
//--- 次の呼び出しのために prev_calculated の値を返す
  return(rates_total);
 }
//+------------------------------------------------------------------+
//| チャンネル塗りつぶしの色を変更                                            |
//+------------------------------------------------------------------+
void ChangeLineAppearance()
 {
//--- 線のプロパティに関する情報を形成するための文字列
  string comm="";
//--- 線の色を変更するブロック
  int number=MathRand(); // 乱数を取得
//--- 除数は colors[] 配列のサイズと同じ
  int size=ArraySize(colors);
 
//--- 新しい色を選択するためのインデックスを整数除算の余りから取得
  int color_index1=number%size;
//--- 最初の色を PLOT_LINE_COLOR プロパティとして設定
  PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,colors[color_index1]);
//--- 最初の色を書く
  comm=comm+"\r\nColor1 "+(string)colors[color_index1];
 
//--- 新しい色を選択するためのインデックスを整数除算の余りから取得
  number=MathRand(); // 乱数を取得
  int color_index2=number%size;
//--- 2 番目の色を PLOT_LINE_COLOR プロパティとして設定
  PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,colors[color_index2]);
//--- 2 番目の色を書く
  comm=comm+"\r\nColor2 "+(string)colors[color_index2];
//--- コメントを使用して、チャート上の情報を表示する
  Comment(comm);
 }