DRAW_CANDLES

DRAW_CANDLES スタイルは、始値、高値、安値、終値の値を含む 4 つの指標バッファからローソク足を描画します。これは、チャートの別々のサブウィンドウ内及びその他の金融商品のカスタム指標をローソク足として作成するために使用されます。

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

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

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

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

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

DRAW_CANDLESスタイルでは3色までを設定してローソク足の外観を変えることができます。一色のみが設定された場合、それがチャート上のすべてのローソク足に適用されます。

//--- 単一の色が適用された同一のローソク足
#property indicator_label1 "One color candles"
#property indicator_type1   DRAW_CANDLES
//--- 1色のみが設定されたのでローソク足の色はすべて同じ
#property indicator_color1 clrGreen  

2つのカンマで区切られた色が指定された場合は、1番目の色がローソク足の輪郭、2番目が実体に適用されます。<

//--- ローソク足と芯での異なる色
#property indicator_label1 "Two color candles"
#property indicator_type1   DRAW_CANDLES
//--- 緑が芯と輪郭、白が実体に適応される
#property indicator_color1 clrGreen,clrWhite

上昇および下降のローソク足が異なって表示されるためにはコンマで区切られた3つの色を指定します。その場合は、1番目の色がローソク足の輪郭、2番目と3番目は強気と弱気ローソク足に使われます。

//--- ローソク足と芯での異なる色
#property indicator_label1 "One color candles"
#property indicator_type1   DRAW_CANDLES
//--- 緑が芯と輪郭、強気ローソク足の実体は白で弱気ローソク足の実体は赤
#property indicator_color1 clrGreen,clrWhite,clrRed

よって、DRAW_CANDLESスタイルでカスタムキャンドル着色オプションを作成することができます。また、すべての色はPlotIndexSetInteger function (composition_index_DRAW_CANDLES, PLOT_LINE_COLOR, modifier_index, color)関数を使用してインディケータの動作中に動的に変更することができ、ここでmodifier_indexの持つ値は次のいずれかです。

  • 0 – 輪郭と芯の色
  • 1– 強気のローソク足の実体の色
  • 2 – 弱気のローソク足の実体の色

//--- 輪郭と芯の色を設定する
PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,clrBlue);
//--- 強気のローソク足の実体の色を設定する
PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,clrGreen);
//--- 弱気のローソク足の実体の色を設定する
PlotIndexSetInteger(0,PLOT_LINE_COLOR,2,clrRed);

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

DRAW_CANDLES スタイルの例

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

//+------------------------------------------------------------------+
//|                                                 DRAW_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_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 4
#property indicator_plots   1
//--- バーをプロットする
#property indicator_label1 "DRAW_CANDLES1"
#property indicator_type1   DRAW_CANDLES
#property indicator_color1 clrGreen
#property indicator_style1 STYLE_SOLID
#property indicator_width1  1
 
//--- 入力パラメータ
input int     N=5;             // 種類を変更するティック数
input int     bars=500;         // 表示するバーの数
input bool     messages=false;   // エキスパートアドバイザー操作ログにメッセージを表示する
//--- 指標バッファ
double         Candle1Buffer1[];
double         Candle1Buffer2[];
double         Candle1Buffer3[];
double         Candle1Buffer4[];
//--- 銘柄名
string symbol;
//--- 色を格納する配列
color colors[]={clrRed,clrBlue,clrGreen,clrPurple,clrBrown,clrIndianRed};
//+------------------------------------------------------------------+
//| カスタム指標を初期化する関数                                            |
//+------------------------------------------------------------------+
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,Candle1Buffer1,INDICATOR_DATA);
  SetIndexBuffer(1,Candle1Buffer2,INDICATOR_DATA);
  SetIndexBuffer(2,Candle1Buffer3,INDICATOR_DATA);
  SetIndexBuffer(3,Candle1Buffer4,INDICATOR_DATA);
//--- 空の値
  PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
//--- バーが描画される銘柄名
  symbol=_Symbol;
//--- シンボルの表示を設定
  PlotIndexSetString(0,PLOT_LABEL,symbol+" Open;"+symbol+" High;"+symbol+" Low;"+symbol+" Close");
  IndicatorSetString(INDICATOR_SHORTNAME,"DRAW_CANDLES("+symbol+")");
//---
  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();
    //--- 「気配値表示」 ウィンドウで新しいシンボルを選ぶ
    int tries=0;
    //--- シンボルからの価格で plot1 バッファを埋めることを五回試みる
    while(!CopyFromSymbolToBuffers(symbol,rates_total,0,
           Candle1Buffer1,Candle1Buffer2,Candle1Buffer3,Candle1Buffer4)
           && 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[]
                            )
 {
//--- 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");
    }
//--- バッファを空の値で初期化する
  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;
    }
  return(true);
 }
//+------------------------------------------------------------------+
//| 「気配値表示」 からランダムにシンボルを返す                                   |
//+------------------------------------------------------------------+
string GetRandomSymbolName()
 {
//--- 「気配値表示」 ウィンドウに表示されるシンボルの数
  int symbols=SymbolsTotal(true);
//--- リスト内のシンボルの位置 - 0〜シンボル数の乱数
  int number=MathRand()%symbols;
//--- 指定された位置のシンボルの名称を返す
  return SymbolName(number,true);
 }
//+------------------------------------------------------------------+
//| バーの外観を変更する                                                  |
//+------------------------------------------------------------------+
void ChangeLineAppearance()
 {
//--- バーのプロパティに関する情報を形成するための文字列
  string comm="";
//--- バーの色を変更するブロック
  int number=MathRand(); // 乱数を取得
//--- 除数は colors[] 配列のサイズと同じ
  int size=ArraySize(colors);
//--- 新しい色を選択するためのインデックスを整数除算の余りから取得
  int color_index=number%size;
//--- 色をPLOT_LINE_COLOR プロパティとして設定
  PlotIndexSetInteger(0,PLOT_LINE_COLOR,colors[color_index]);
//--- 色を書く
  comm=comm+"\r\n"+(string)colors[color_index];
//--- 銘柄名を書く
  comm="\r\n"+symbol+comm;
//--- コメントを使用して、チャート上の情報を表示する
  Comment(comm);
 }