예제의 지표 스타일.

MetaTrader 5 클라이언트 터미널에는 적절한 기능을 사용하여 MQL5 프로그램에서 사용할 수 있는 38개의 기술 지표가 포함되어 있습니다. 그러나 MQL5 언어의 주요 장점은 사용자 지정 지표를 생성할 수 있다는 것이며, 이 지표를 엑스퍼트 어드바이저에서 사용하거나 기술 분석을 목적으로 가격 차트에 적용할 수 있습니다.

전체 지표 세트는 플롯이라고 하는 몇 가지 기본 그리기 스타일에서 파생될 수 있습니다. 플로팅은 지표가 요청에 따라 계산, 저장 및 제공하는 데이터를 표시하는 방법을 나타냅니다. 다음과 같은 7가지 기본 플롯 유형이 있습니다:

  1. 섹션(세그먼트)
  2. 히스토그램
  3. 화살표(심볼)
  4. 그려진 영역(채워진 채널)
  5. 막대
  6. 일본 캔들스틱

각 플로팅에는 지표 값이 저장되는 double유형의 배열이 1~5개씩 필요합니다. 편의를 위해 이러한 배열은 지표 버퍼와 연결됩니다. 지표의 버퍼 수는 컴파일러 지시문을 사용하여 미리 선언해야하는데, 예를 들면:

#property indicator_buffers 3 // 버퍼의 수
#property indicator_plots   2 // 프롯의 수

지표의 버퍼 수는 항상 지표의 플롯 수보다 크거나 같습니다.

각 기본 플롯 타입은 색상 변화 또는 구성상 특이사항이 있을 수 있으므로 MQL5의 실제 플롯 타입은 18개 입니다:

플로팅

설명

값 버퍼

색상 버퍼

DRAW_NONE

차트에 시각적으로 표시되지 않지만 해당 버퍼 값은 데이터 창에서 볼 수 있습니다

1

-

DRAW_LINE

해당 버퍼의 값에 선이 표시됩나다(버퍼의 빈 값은 바람직하지 않음)

1

-

DRAW_SECTION

해당 버퍼 값 사이의 선 세그먼트로 그려집니다(일반적으로 빈 값이 많음)

1

-

DRAW_HISTOGRAM

0 라인에서 해당 버퍼 값까지 히스토그램으로 그려집니다(빈 값이 있을 수 있음)

1

-

DRAW_HISTOGRAM2

두 지표 버퍼를 기준으로 히스토그램으로 그려집니다(빈 값이 있을 수 있음)

2

-

DRAW_ARROW

심볼로 그려집니다(빈 값이 있을 수 있음)

1

-

DRAW_ZIGZAG

DRAW_SECTION스타일과 유사하지만, 이와 달리 수직 세그먼트를 하나의 막대에 플롯할 수 있습니다

2

-

DRAW_FILLING

두 줄 사이의 색 채우기 해당 버퍼의 값 2개가 데이터 창에 표시됩니다.

2

-

DRAW_BARS

막대로 그려집니다. 해당 버퍼의 4개의 값이 데이터 창에 표시됩니다

4

-

DRAW_CANDLES

일본 캔들스틱으로 그려집니다. 해당 버퍼의 4개의 값이 데이터 창에 표시됩니다

4

-

DRAW_COLOR_LINE

언제든지 서로 다른 막대의 색상을 바꾸거나 색상을 변경할 수 있는 선

1

1

DRAW_COLOR_SECTION

DRAW_SECTION스타일과 유사하지만 각 섹션의 색상을 개별적으로 설정할 수 있으며, 색상을 동적으로 설정할 수도 있습니다

1

1

DRAW_COLOR_HISTOGRAM

DRAW_HISTOGRAM스타일과 유사하지만 각 스트립의 색상이 다를 수 있으므로 색상을 동적으로 설정할 수 있습니다

1

1

DRAW_COLOR_HISTOGRAM2

DRAW_HISTOGRAM2 스타일과 유사하지만 각 스트립의 색상이 다를 수 있으므로 색상을 동적으로 설정할 수 있습니다

2

1

DRAW_COLOR_ARROW

DRAW_ARROW스타일과 유사하지만 각 심볼은 색상을 가질 수 있습니다. 동적으로 색상을 변경할 수 있습니다

1

1

DRAW_COLOR_ZIGZAG

DRAW_ZIGZAG 스타일로 섹션 컬러링 옵션과 동적 색상 전환 옵션이 제공됩니다

2

1

DRAW_COLOR_BARS

DRAW_BARS 스타일로 막대의 개별 컬러링 옵션과 동적 색상 변경 옵션이 제공됩니다

4

1

DRAW_COLOR_CANDLES

DRAW_CANDLES 스타일로 캔들스틱의 개별 컬러링 옵션과 동적 색상 변경 옵션이 제공됩니다

4

1

 

지표 버퍼와 배열의 차이

각 지표의 글로벌 레벨에서, double 유형의 배열을 하나 이상 선언해야 하며, 이 배열은 SetIndexBuffer() 기능을 사용하여 지표 버퍼로 사용해야 합니다. 지표 플롯을 그리려면 지표 버퍼의 값만 사용되며, 이 용도로는 다른 배열을 사용할 수 없습니다. 또한 버퍼 값이 데이터 창에 표시됩니다.

지표 버퍼는 동적이어야 하며 크기를 지정할 필요가 없으며, 지표 버퍼로 사용되는 배열의 크기는 터미널 실행 하위 시스템에 의해 자동으로 설정됩니다.

배열이 지표 버퍼에 바인딩된 후에는, 인덱싱 방향이 일반 배열과 같이 기본적으로 설정되지만 ArraySetAsSeries() 기능을 사용하여 배열 요소에 대한 액세스 방법을 변경할 수 있습니다. 기본적으로 지표 버퍼는 플로팅에 사용되는 데이터를 저장하는 데 사용됩니다(INDICATOR_DATA).

지표 값을 계산하기 위해 중간 계산을 보류하고 각 막대에 대한 추가 값을 저장해야 하는 경우, 바인딩 중에 이러한 배열을 계산 버퍼로 선언할 수 있습니다 (INDICATOR_CALCULATIONS). 중간 값의 경우 일반 배열도 사용할 수 있지만 이 경우에는 프로그래머가 배열 크기를 관리해야 합니다.

일부 플롯에서는 각 막대의 색상을 설정할 수 있습니다. 색에 대한 정보를 저장하려면 색상 버퍼를 사용합니다 (INDICATOR_COLOR_INDEX). 색상은 정수 유형 색상이지, 모든 지표 버퍼는 double 유형이어야 합니다. CopyBuffer()를 사용하여 색상 및 보조 (INDICATOR_CALCULATIONS) 버퍼 값을 가져올 수 없습니다.

지표 버퍼 수는 컴파일러 지시문 #property indicator_buffers number_of_buffers를 사용하여 지정해야 합니다:

#property indicator_buffers 3  //  지표는 3개의 버퍼가 있습니다

하나의 지표에 허용되는 최대 버퍼 수는 512개입니다.

 

지표 버퍼 및 플롯의 연관성

각 플롯은 하나 이상의 지표 버퍼를 기반으로 합니다. 따라서 간단한 캔들스틱을 표시하기 위해서는 시가, 고가, 저가, 종가의 네 가지 값이 필요합니다. 따라서 캔들스틱 형태의 지표를 표시하려면 지표 버퍼 4개와 double 유형의 배열 4개를 선언해야 합니다. 예를 들어:

//--- 지표에는 4개의 지표 버퍼가 있습니다
#property indicator_buffers 4
//--- 지표에는 하나의 플로팅이 있습니다
#property indicator_plots   1
//--- 그래픽 플로팅 1번이 캔들스틱으로 나타납니다
#property indicator_type1   DRAW_CANDLES
//--- 캔들스틱은 clrDodgerBlue로 그려집니다
#property indicator_color1  clrDodgerBlue
//--- 지표 버퍼를 위한 4개의 배열
double OBuffer[];
double HBuffer[];
double LBuffer[];
double CBuffer[];

 

그래픽 플롯은 플롯 번오에 따라 지표 버퍼를 자동으로 사용합니다. 플롯 번호 지정은 1로 시작하고 버퍼 번호 지정은 0으로 시작합니다. 첫 번째 플로팅에 지표 버퍼 4개가 필요한 경우, 지표 버퍼 4개를 사용하여 지표 버퍼를 그립니다. 이러한 4개 퍼버는 SetIndexBuffer() 기능을 사용하여 올바른 인덱싱을 가진 배열과 연결해야 합니다.

//--- 지표 버퍼로 배열 바인딩
   SetIndexBuffer(0,OBuffer,INDICATOR_DATA);  // 첫 번째 버퍼는 0 인덱스에 해당합니다
   SetIndexBuffer(1,HBuffer,INDICATOR_DATA);  // 두 번째 버퍼는 1 인덱스에 해당합니다
   SetIndexBuffer(2,LBuffer,INDICATOR_DATA);  // 세 번째 버퍼는 2 인덱스에 해당합니다
   SetIndexBuffer(3,CBuffer,INDICATOR_DATA);  // 네 번째 버퍼는 3 인덱스에 해당합니다

"캔들스틱"의 플로팅이 첫 번째 번호로 발표되었기 때문에, 지표인 캔들스틱은 첫 번째 4개의 버퍼만 사용합니다.

예를 변경하고 간단한 선의 플로팅을 추가하는 - DRAW_LINE. 이제 선 번호가 1이고 캔들스틱이 2라고 가정합니다. 버퍼 수와 플롯 수가 증가했습니다.

//--- 지표에는 5개의 지표 버퍼가 있습니다
#property indicator_buffers 5
//--- 지표에는 2개의 플롯이 있습니다
#property indicator_plots   2
//--- 플롯 1은 선입니다
#property indicator_type1   DRAW_LINE
//--- 선의 색상은 clrDodgerRed 입니다
#property indicator_color1  clrDodgerRed
//--- 플롯 2는 일본 캔들스틱으로 그려집니다
#property indicator_type2   DRAW_CANDLES
//--- 캔들스틱의 색은 clrDodgerBlue입니다
#property indicator_color2  clrDodgerBlue
//--- 지표 버퍼를 위한 5개의 배열
double LineBuffer[];
double OBuffer[];
double HBuffer[];
double LBuffer[];
double CBuffer[];

변경된 플롯의 순서가 바뀌어서 이제 선이 먼저 나오고, 이어서 일본 캔들스틱이 나옵니다. 따라서 버퍼 순서가 적절하며, 먼저 인덱스가 0인 선에 버퍼를 발표한 다음 캔들스틱에 버퍼를 4개 지정합니다.

   SetIndexBuffer(0,LineBuffer,INDICATOR_DATA);  // The first buffer corresponds to index 0
//--- 캔들스틱에 대한 지표 버퍼로 배열 바인딩
   SetIndexBuffer(1,OBuffer,INDICATOR_DATA);     // 두 번째 버퍼는 1 인덱스에 해당합니다
   SetIndexBuffer(2,HBuffer,INDICATOR_DATA);     // 세 번째 버퍼는 2 인덱스에 해당합니다
   SetIndexBuffer(3,LBuffer,INDICATOR_DATA);     // 네 번째 버퍼는 3 인덱스에 해당합니다
   SetIndexBuffer(4,CBuffer,INDICATOR_DATA);     // 다섯 번째 버퍼는 4 인덱스에 해당합니다

 

버퍼와 플롯의 수는 컴파일러 지시문을 사용해서만 설정할 수 있으며, 함수를 사용해서 이러한 속성을 동적으로 변경할 수는 없습니다.

 

스타일의 색상 버전

표에서 볼 수 있듯이 스타일은 두 그룹으로 나뉩니다. 첫 번째 그룹은 이름에 COLOR 단어가 없는 스타일을 포함하며, 이러한 스타일을 기본 스타일이라고 합니다:

  • DRAW_LINE
  • DRAW_SECTION
  • DRAW_HISTOGRAM
  • DRAW_HISTOGRAM2
  • DRAW_ARROW
  • DRAW_ZIGZAG
  • DRAW_FILLING
  • DRAW_BARS
  • DRAW_CANDLES

두 번째 그룹은 이름에 COLOR단어를 포함하는 스타일이며, 이를 색상 버전이라고 합니다:

  • DRAW_COLOR_LINE
  • DRAW_COLOR_SECTION
  • DRAW_COLOR_HISTOGRAM
  • DRAW_COLOR_HISTOGRAM2
  • DRAW_COLOR_ARROW
  • DRAW_COLOR_ZIGZAG
  • DRAW_COLOR_BARS
  • DRAW_COLOR_CANDLES

모든 색상 버전은 플롯의 각 부분에 색상을 지정할 수 있다는 점에서 기본 버전과 다릅니다. 플로팅의 최소 부분은 막대이므로 각 막대에 색상을 설정할 수 있습니다.

색상 버전에 없는 DRAW_NONEDRAW_FILLING, 스타일은 예외입니다.

각 막대에 플로팅 색상을 설정하기 위해 색상 인덱스을 저장하기 위한 버퍼가 색상 버전에 추가되었습니다. 이러한 인덱스는 미리 정의된 색상 세트를 포함하는 특수 배열의 색상 수를 나타냅니다. 색상 배열의 크기는 64입니다. 즉, 스타일의 각 색상 버전은 64가지 색상으로 플롯을 그릴 수 있습니다.

필요한 모든 색상을 쉼표로 구분하여 지정할 수 있는 컴파일러 지시문 #property indicator_color를 통해 색상 세트와 섹상을 설정할 수 있습니다. 예를 들어 지표에 있는 이러한 항목은 다음과 같습니다:

//--- 컬러링 캔들스틱에 8가지 색상을 정의(특수 배열에 저장됨)
#property indicator_color1  clrRed,clrBlue,clrGreen,clrYellow,clrMagenta,clrCyan,clrLime,clrOrange

플롯 1, 8가지 색상이 설정되며, 이는 특수 배열에 배치됩니다. 또한 이 프로그램에서는 플롯의 색상은 지정하지 않고 인덱스만 지정합니다. 막대 번호K에 대해 빨강색으로 설정하려면 배열의 색상 인덱스 값ㅇ을 지표의 색상 버퍼에 설정해야 합니다. 빨강색은 지시문에 먼저 지정되며 인덱스 번호 0에 해당합니다.

  //--- 캔들스틱 색상을 clrRed로 설정
  col_buffer[buffer_index]=0;

색상 세트는 한 번 제공되는 것이 아니며, PlotIndexSetInteger()를 사용하여 동적으로 변경할 수 있습니다. 예:

      //--- 각 인덱스의 색상을 PLOT_LINE_COLOR 속성으로 설정
      PlotIndexSetInteger(0,                    //  그래픽 스타일의 수
                          PLOT_LINE_COLOR,      //  속성 식별자
                          plot_color_ind,       //  색의 인덱스, 색상을 쓰는 곳
                          color_array[i]);      //  새로운 색상

 

지표 및 플로팅의 속성

지표 플롯의 경우 컴파일러 지시문과 적절한 함수를 사용하여 속성을 설정할 수 있습니다. 지표 속성 및 기능 간의 연결에서 이에 대한 자세한 정보 읽기. 특수 기능을 사용하여 지표 속성을 동적으로 변경하면 보다 유연한 사용자 정의 지표를 만들 수 있습니다.

 

차트에 지표 그리기 시작

대부분의 경우, 알고리즘 조건에 따라 내역에서 사용할 수 있는 최소 개수의 이전 막대를 제공해야 하므로 현재 막대로 지표 값 계산을 즉시 시작할 수 없습니다. 예를 들어, 많은 유형의 스무딩은 이전 N 막대에 대한 가격 배열을 사용하는 것을 의미하며, 이러한 값을 기반으로 현재 막대의 지표 값이 계산됩니다.

이러한 경우, 첫 번째 N 막대에 대한 지표 값을 계산할 방법이 없거나, 이러한 값은 차트에 표시되도록 의도한 것이 아니며 추가 값을 계산하기 위한 보조적인 것일 뿐입니다. 히스토리의 첫 N 막대에 지표가 플로팅되지 않도록 하려면 N값을 해당 플롯의 PLOT_DRAW_BEGIN 속성으로 설정합니다:

//--- 캔들스틱에 대한 지표 버퍼로 배열 바인딩
PlotIndexSetInteger(number_of_plot,PLOT_DRAW_BEGIN,N);

이곳:

  • number_of_plot – 0에서 indicator_plots-1까지의 값 (플롯의 합은 0으로 시작됨).
  • N - 차트에 표시해서는 안 되는 내역의 첫 번째 막대 수.