DRAW_COLOR_CANDLES

DRAW_COLOR_CANDLES スタイルは、DRAW_CANDLES の様に始値、高値、安値、終値の値を含む 4 つの指標バッファからローソク足を描画します。更に、指定されたセットから各ローソク足の色を指定することが出来ます。この目的のために、このスタイルには各足の色のインデックスを格納する特殊なカラーバッファがあります。これは、チャートの別々のサブウィンドウ内及びその他の金融商品のカスタム指標をローソク足として作成するために使用されます。

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

指標は 4 つの価格バッファ全部に空以外の値があるバーにのみ描画されます。「空」値を指定するには PLOT_EMPTY_VALUE プロパティで値を設定します。

//--- 0(空)値は描画されない
  PlotIndexSetDouble(index_of_plot_DRAW_COLOR_CANDLES,PLOT_EMPTY_VALUE,0);

バッファの値は常に明示的に入力し、バーをスキップするにはバッファに空の値を設定します。

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

  • 始値、高値、安値、終値を格納する 4 つのバッファ
  • ローソク足を描画するのに使用される色のインデックスを格納するための 1 つのバッファ(描画されるバーのためのみに設定する)

プロットバッファは、始値、高値、安値、終値、カラーバッファの順番であるべきです。いずれのバッファも空の値のみを含むことは出来ません。この場合プロットがなされません。

別のウィンドウで選択された金融商品のローソク足を描画する指標の例です。ローソク足の色はN ティックごとにランダムに変わります。パラメータは手動設定の可能性を持って(指標の「プロパティ」ウィンドウの「パラメータ」タブ)指標外部パラメータに設定されています。

An example of the DRAW_COLOR_CANDLES style

plot1では、色が #property コンパイラディレクティブによって指定された後、OnCalculate() 関数で事前に準備されたリストからランダムに設定されます。

//+------------------------------------------------------------------+
//|                                           DRAW_COLOR_CANDLES.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_COLOR_CANDLES."
#property description "It draws candlesticks of a selected symbol in a separate window"
#property description " "
#property description "The color and width of candlesticks, as well as the symbol are changed"
#property description "randomly every N ticks"
 
#property indicator_separate_window
#property indicator_buffers 5
#property indicator_plots   1
//---- ColorCandles をプロットする
#property indicator_label1 "ColorCandles"
#property indicator_type1   DRAW_COLOR_CANDLES
//--- ローソク足を塗るために(特殊な配列に格納されている)8 色を定義する
#property indicator_color1 clrRed,clrBlue,clrGreen,clrYellow,clrMagenta,clrCyan,clrLime,clrOrange
#property indicator_style1 STYLE_SOLID
#property indicator_width1  1
 
//--- 入力パラメータ
input int     N=5;             // 種類を変更するティック数
input int     bars=500;         // 表示するローソク足の数
input bool     messages=false;   // エキスパートアドバイザー操作ログにメッセージを表示する
//--- 指標バッファ
double         ColorCandlesBuffer1[];
double         ColorCandlesBuffer2[];
double         ColorCandlesBuffer3[];
double         ColorCandlesBuffer4[];
double         ColorCandlesColors[];
int            candles_colors;
//--- 銘柄名
string symbol;
//--- 色を格納する14 要素の配列
color colors[]=
 {
clrRed,clrBlue,clrGreen,clrChocolate,clrMagenta,clrDodgerBlue,clrGoldenrod,
  clrIndigo,clrLightBlue,clrAliceBlue,clrMoccasin,clrMagenta,clrCyan,clrMediumPurple
 };
//+------------------------------------------------------------------+
//| カスタム指標を初期化する関数                                            |
//+------------------------------------------------------------------+
int OnInit()
 {
//--- バーが小さい場合は、前もって完成する
  if(bars<50)
    {
    Comment("Please specify a larger number of bars! The operation of the indicator has been terminated");
    return(INIT_PARAMETERS_INCORRECT);
    }
//--- 指標バッファマッピング
  SetIndexBuffer(0,ColorCandlesBuffer1,INDICATOR_DATA);
  SetIndexBuffer(1,ColorCandlesBuffer2,INDICATOR_DATA);
  SetIndexBuffer(2,ColorCandlesBuffer3,INDICATOR_DATA);
  SetIndexBuffer(3,ColorCandlesBuffer4,INDICATOR_DATA);
  SetIndexBuffer(4,ColorCandlesColors,INDICATOR_COLOR_INDEX);
//--- 空の値
  PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
//--- バーが描画される銘柄名
  symbol=_Symbol;
//--- シンボルの表示を設定
  PlotIndexSetString(0,PLOT_LABEL,symbol+" Open;"+symbol+" High;"+symbol+" Low;"+symbol+" Close");
  IndicatorSetString(INDICATOR_SHORTNAME,"DRAW_COLOR_CANDLES("+symbol+")");
//---- ローソク足を塗る色の数
  candles_colors=8;     //   プロパティのコメントを参照
//---
  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=INT_MAX-100;
//--- スタイルと色を変更するティックを数える
  ticks++;
//--- 充分なティックの数が蓄積されている場合
  if(ticks>=N)
    {
    //--- 「気配値表示」 ウィンドウで新しいシンボルを選ぶ
    symbol=GetRandomSymbolName();
    //--- 形を変更する
     ChangeLineAppearance();
    //--- ローソク足を塗る色を変更する
     ChangeColors(colors,candles_colors);
 
    int tries=0;
    //--- シンボルからの価格で plot1 バッファを埋めることを五回試みる
    while(!CopyFromSymbolToBuffers(symbol,rates_total,0,
           ColorCandlesBuffer1,ColorCandlesBuffer2,ColorCandlesBuffer3,
           ColorCandlesBuffer4,ColorCandlesColors,candles_colors)
           && tries<5)
       {
        //--- CopyFromSymbolToBuffers() 関数呼び出しのカウンタ
        tries++;
       }
    //--- ティックカウンタをゼロにリセットする
     ticks=0;
    }
//--- 次の呼び出しのために prev_calculated の値を返す
  return(rates_total);
 }
//+------------------------------------------------------------------+
//| 指定されたローソク足に書き込む                                           |
//+------------------------------------------------------------------+
bool CopyFromSymbolToBuffers(string name,
                            int total,
                            int plot_index,
                            double &buff1[],
                            double &buff2[],
                            double &buff3[],
                            double &buff4[],
                            double &col_buffer[],
                            int    cndl_colors
                            )
 {
//--- rates[] 配列で、始値、高値、安値、終値を複製する
  MqlRates rates[];
//--- 試みのカウンタ
  int attempts=0;
//--- 複製された量
  int copied=0;
//--- 希望する記号の時系列を取得するための25の試みをする
  while(attempts<25 && (copied=CopyRates(name,_Period,0,bars,rates))<0)
    {
    Sleep(100);
     attempts++;
    if(messages) PrintFormat("%s CopyRates(%s) attempts=%d",__FUNCTION__,name,attempts);
    }
//--- 充分な数のバーの複製が失敗した場合
  if(copied!=bars)
    {
    //--- メッセージ文字列を作る
    string comm=StringFormat("For the symbol %s, managed to receive only %d bars of %d requested ones",
                              name,
                              copied,
                              bars
                              );
    //--- メインチャートウィンドウでコメントを表示する
    Comment(comm);
    //--- メッセージを表示する
    if(messages) Print(comm);
    return(false);
    }
  else
    {
    //--- シンボルの表示を設定する
    PlotIndexSetString(plot_index,PLOT_LABEL,name+" Open;"+name+" High;"+name+" Low;"+name+" Close");
    IndicatorSetString(INDICATOR_SHORTNAME,"DRAW_COLOR_CANDLES("+symbol+")");
    }
//--- バッファを空の値で初期化する
  ArrayInitialize(buff1,0.0);
  ArrayInitialize(buff2,0.0);
  ArrayInitialize(buff3,0.0);
  ArrayInitialize(buff4,0.0);
//--- ティックのたびに価格をバッファに複製する
  for(int i=0;i<copied;i++)
    {
    //--- バッファの適切なインデックスを計算する
    int buffer_index=total-copied+i;
    //--- 価格をバッファに書く
     buff1[buffer_index]=rates[i].open;
     buff2[buffer_index]=rates[i].high;
     buff3[buffer_index]=rates[i].low;
     buff4[buffer_index]=rates[i].close;
    //--- Set the candlestick color
    int color_index=i%cndl_colors;
     col_buffer[buffer_index]=color_index;
    }
  return(true);
 }
//+------------------------------------------------------------------+
//| 「気配値表示」 からランダムにシンボルを返す           |
//+------------------------------------------------------------------+
string GetRandomSymbolName()
 {
//--- 「気配値表示」 ウィンドウに表示されるシンボルの数
  int symbols=SymbolsTotal(true);
//--- リスト内のシンボルの位置 - 0〜シンボル数の乱数
  int number=MathRand()%symbols;
//--- 指定された位置のシンボルの名称を返す
  return SymbolName(number,true);
 }
//+------------------------------------------------------------------+
//| ローソク足セグメントの色を変更する                    |
//+------------------------------------------------------------------+
void  ChangeColors(color  &cols[],int plot_colors)
 {
//--- 色の数
  int size=ArraySize(cols);
//---
  string comm=ChartGetString(0,CHART_COMMENT)+"\r\n\r\n";
 
//--- それぞれのカラーインデックに新しい色をランダムに定義する
  for(int plot_color_ind=0;plot_color_ind<plot_colors;plot_color_ind++)
    {
    //--- 乱数を取得
    int number=MathRand();
    //--- 整数除算の余りから col[] 配列のインデックスを取得
    int i=number%size;
    //--- 各インデックスの色をPLOT_LINE_COLOR として設定する
    PlotIndexSetInteger(0,                   //  グラフィックスタイルの番号
                        PLOT_LINE_COLOR,     //  プロパティの識別子
                         plot_color_ind,       //  色を書き込む色インデックス
                         cols[i]);             //  新しい色
    //--- 色を書く
     comm=comm+StringFormat("CandleColorIndex[%d]=%s \r\n",plot_color_ind,ColorToString(cols[i],true));
    ChartSetString(0,CHART_COMMENT,comm);
    }
//---
 }
//+------------------------------------------------------------------+
//| ローソク足の外観を変更する                           |
//+------------------------------------------------------------------+
void ChangeLineAppearance()
 {
//--- ローソク足のプロパティに関する情報を形成するための文字列
  string comm="";
//--- 銘柄名を書く
  comm="\r\n"+symbol+comm;
//--- コメントを使用して、チャート上の情報を表示する
  Comment(comm);
 }