고객 지표

사용자 지정 지표를 생성하는 데 사용되는 그룹 기능. 이러한 기능은 엑스퍼트 어드바이저 및 스크립트를 작성할 때 사용할 수 없습니다.

기능

액션

SetIndexBuffer

지정된 지표 버퍼를 다음 유형의 1차원 동적 배열 로 바인딩: double 유형

IndicatorSetDouble

다음 유형의 지표 속성 값을 설정: double 유형

IndicatorSetInteger

다음 유형의 지표 속성 값을 설정: int 유형

IndicatorSetString

다음 유형의 지표 속성 값을 설정: string 유형

PlotIndexSetDouble

다음 유형의 지시선 속성 값을 설정: double

PlotIndexSetInteger

다음 유형의 지시선 속성 값을 설정: int 유형

PlotIndexSetString

다음 유형의 지시선 속성 값을 설정: string 유형

PlotIndexGetInteger

다음 유형의 지시선 속성 값을 반환: 정수 유형

지표 속성은 컴파일러 지시 또는 함수를 사용하여 설정할 수 있습니다. 이를 보다 잘 이해하려면 예제의 지표 스타일을 학습하는 것이 좋습니다.

사용자 지정 지표의 모든 필요한 계산은 사전에 설정된 OnCalculate()함수에 배치되어야 합니다. OnCalculate() 기능 호출의 간단한 형식을 사용하는 다음과 같은 경우

int OnCalculate (const int rates_total, const int prev_calculated, const int begin, const double& price[])

rates_total 변수에는 지표 값 계산을 위한 입력 매개변수로 전달된 price[] 배열의 총 요소 수 값이 포함됩니다.

매개변수 prev_calculated는 이전 호출에서 OnCalculate()를 실행한 결과이며, 이를 통해 지표 값을 계산하기 위한 저장 알고리즘을 구성할 수 있습니다. 예를들어, 현재 값 rates_total = 1000, prev_calculated = 999, 이면 각 지표 버퍼의 값 하나만 계산하면 충분할 수 있습니다.

입력 배열 가격의 크기에 대한 정보를 사용할 수 없었다면 각 지표 버퍼의 1000개 값을 계산해야할 필요가 있었을 겁니다. OnCalculate() 값을 처음 호출할 때 prev_calculated = 0. price[] 배열이 변경된 경우 prev_calculated도 0입니다.

시작 매개변수는 계산을 위한 데이터가 없는 가격 배열의 초기 값 수를 나타냅니다. 예를 들어, 가속기 오실레이터 값(처음 37개 값이 계산되지 않음)을 입력 매개변수로 사용한 경우 = 37을 시작합니다. 예를 들어 다음과 같은 간단한 지표를 살펴보겠습니다:

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
//---- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- 지표 버퍼
double         Label1Buffer[];
//+------------------------------------------------------------------+
//| 사용자 지정 지표 초기화 함수                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- 지표 버퍼 맵핑
   SetIndexBuffer(0,Label1Buffer,INDICATOR_DATA);
//---
  }
//+------------------------------------------------------------------+
//| 사용자 지정 지표 반복 함수                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
 
  {
//---
   Print("begin = ",begin,"  prev_calculated = ",prev_calculated,"  rates_total = ",rates_total);
//--- 다음 번 호출에 대해 prev_calculated 값을 반환
   return(rates_total);
  }

"탐색기" 창에서 가속기 오실레이터 지표 창으로 끌어다 놓으면 이전 지표의 값을 기준으로 계산이 수행됨을 알 수 있습니다.

이전에 부착된 지표 값에 대한 지표 계산

결과적으로, OnCalculate()의 첫 번째 호출은 prev_calculated의 값이 0이 되며, 추가 호출에서는 (가격 차트의 막대 수가 증가할 때까지) rates_total 값과 같을 것입니다.

시작 매개변수는 값이 생략된 초기 막대 수를 나타냅니다.

시작 매개변수의 값은 이 지표의 논리에 따라 가속기 지표의 값이 계산되지 않는 초기 막대 수와 정확히 같습니다. 사용자 지정 지표 Accelerator.mq5의 소스코드를 살펴보면 OnInit() 기능에 다음의 줄이 표시됩니다:

//--- 인덱스를 끌어올 첫 번째 막대를 설정
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,37);

PlotIndexSetInteger(0, PLOT_DRAW_BEGIN, empty_first_values) 함수를 사용하여 사용자 지정 지표의 0 지표 배열에 존재하지 않는 첫 번째 값의 수를 설정했으며, 이 값은 계산에 사용할 필요가 없습니다(empty_first_values). 따라서 다음과 같은 메커니즘이 있습니다:

  1. 지표의 초기값 수를 설정하며, 이 값은 다른 사용자 지정 지표의 계산에 사용해서는 안 됩니다;
  2. 계산 논리에 들어가지 않고 다른 사용자 지정 지표를 호출할 때 무시할 첫 번째 값의 수에 대한 정보를 가져옵니다.