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_CANDLS를 플로팅하는 데 필요한 버퍼의 수는 5개 입니다:

  • 시가, 고가, 저가 및 종가의 값을 저장하는 4개의 버퍼;
  • 색상 인덱스를 저장하는 버퍼 1개, 이 버퍼는 캔들스틱을 그리는 데 사용됩니다(그릴 캔들스틱에 대해서만 설정하는 것이 타당함).

플롯을 위한 모든 버퍼는 지정된 순서(시가, 고가, 저가, 종가 및 색상 버퍼)대로 하나씩 이동해야 합니다. 이 경우에는 아무것도 표시되지 않으므로 가격 버퍼에는 빈 값만 포함될 수 없습니다.

별도의 창에 선택한 금융상품에 대한 캔들스틱을 그리는 지표의 예. 캔들스틱의 색상은 N 틱을 클리할 때마다 임의로 변경됩니다. N 매개변수는 수동 구성 가능성을 위해 지표의 외부 매개변수에서 설정됩니다(지표의 속성 창에 있는 매개변수 탭).

DRAW_COLOR_CANDLES 스타일의 예

plot1의 경우, 컴파일러 지시문 #property를 사용하여 색상을 설정한 다음 OnCalculate() 기능에서 이전에 준비된 목록에서 임의로 색상을 설정합니다.

//+------------------------------------------------------------------+
//|                                           DRAW_COLOR_CANDLES.mq5 |
//|                         Copyright 2000-2024, MetaQuotes Ltd. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2000-2024, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
 
#property description "DRAW_COLOR_CANDLES를 시연할 지표."
#property description "별도의 창에 선택한 심볼의 촛대를 그립니다"
#property description " "
#property description "캔들스틱의 색상과 너비 및 심볼이 변경됩니다"
#property description "모든 N 틱을 임의로"
 
#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("더 많은 수의 막대를 지정하십시오! 지표 작동이 종료되었습니다");
      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;     //  참조. #property indicator_color1 속성에 대한 코멘트
//--- 
   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;
      //--- 플롯 1의 버퍼를 심볼로 5번 채웁니다
      while(!CopyFromSymbolToBuffers(symbol,rates_total,0,
            ColorCandlesBuffer1,ColorCandlesBuffer2,ColorCandlesBuffer3,
            ColorCandlesBuffer4,ColorCandlesColors,candles_colors)
            && tries<5)
        {
         //--- CopyFromSymbolToBuffers() 기능의 호출 카운터
         tries++;
        }
      //--- 틱 카운터를 0으로 재설정
      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;
//--- 원하는 심볼에 시계열을 35회 입력
   while(attempts<25 && (copied=CopyRates(name,_Period,0,bars,rates))<0)
     {
      Sleep(100);
      attempts++;
      if(messagesPrintFormat("%s CopyRates(%s) attempts=%d",__FUNCTION__,name,attempts);
     }
//--- 충분한 수의 막대를 복사하지 못한 경우
   if(copied!=bars)
     {
      //--- 메시지 문자열 형성
      string comm=StringFormat("심볼 %s의 경우 %d 의 요청된 막대 중 %d 만 수신했습니다",
                               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;
      //--- 캔들스틱 색상 설정
      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);
  }