DRAW_FILLING

DRAW_FILLING 스타일은 두 지표 버퍼 값 사이의 색상 영역을 표시합니다. 실제로 이 스타일은 두 개의 선을 그리고 두 개의 지정된 색상 중 하나로 선 사이의 공간을 채웁니다. 채널을 그리는 지표를 만드는 데 사용됩니다. 이 경우에는 아무것도 표시되지 않으므로 어떤 버퍼도 빈 값만 포함할 수 없습니다.

두 가지 채우기 색상을 설정할 수 있습니다:

  • 첫 번째 색상은 첫 번째 버퍼의 값이 두 번째 지표 버퍼의 값보다 큰 영역에 사용됩니다;
  • 두 번째 색상은 두 번째 버퍼의 값이 첫 번째 지표 버퍼의 값보다 큰 영역에 사용됩니다.

채우기 색상은 컴파일러 지시문을 사용하거나 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인 막대는 지표 그리기에 참여하지 않습니다. 즉, 값이 0인 영역이 채워지지 않습니다.

DRAW_FILLING_without_drawing

  • 지표 버퍼의 값이 "빈 값"과 같은 막대는 지표 그리기에 참여합니다. 값이 비어 있는 영역은 유의미한 값을 가진 영역을 연결할 수 있도록 채워집니다.

DRAW_FILLING_with_drawing

"빈 값"이 0이면 지표 계산에 참여하지 않는 막대도 채워지지 않습니다.

DRAW_FILLING를 플로팅하는 데 필요한 버퍼의 수는 2개입니다.

별도의 창에서 평균 주기가 서로 다른 두 MA 사이에 채널을 그리는 지표의 예. 이동 평균 교차점의 색상 변화는 상승 및 하강 경향의 변화를 시각적으로 보여줍니다. 색상은 N 틱마다 임의로 변경됩니다. N 매개변수는 수동 구성 가능성을 위해 지표의 외부 매개변수에서 설정됩니다(지표의 속성 창에 있는 매개변수 탭).

DRAW_FILLING

처음에는 DRAW_FILLING의 plot1의 경우 컴파일러 지시문 #property를 사용하여 속성을 설정한 다음, OnCalculate() 기능에서 새로운 색상이 임의로 설정됩니다.

//+------------------------------------------------------------------+
//|                                                 DRAW_FILLING.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_FILLING을 시연하기 위한 지표"
#property description "별도의 창에서 두 개의 MA 사이에 채널을 그립니다"
#property description "채우기 색상은 임의로 변경됩니다"
#property description "모든 N 틱 후"
 
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   1
//--- Intersection 플롯
#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();
      //--- 틱 카운터를 0으로 재설정
      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;
      //--- 차이가 없는 경우에도 0 막대에 하나의 값을 복사합니다
      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(); // Get a random number
   int color_index2=number%size;
//--- 두 번째 색상을 PLOT_LINE_COLOR 속성으로 설정
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,colors[color_index2]);
//--- 두 번째 색상 쓰기
   comm=comm+"\r\nColor2 "+(string)colors[color_index2];
//--- 설명을 사용하여 차트에 정보 표시
   Comment(comm);
  }