OnCalculate

함수는 가격 데이터 변경을 처리하기 위해 Calculate 이벤트가 발생할 때 지표에서 호출됩니다. 두 가지 함수 유형이 있습니다. 이 중 하나만 단일 지표 내에서 사용할 수 있습니다.

데이터 배열을 기반으로 계산

int  OnCalculate(
   const int        rates_total,       // price[] 배열 크기
   const int        prev_calculated,   // 이전 호출의 처리 막대 수
   const int        begin,             // price[] 배열의 인덱스 번호의 의미 있는 데이터는 다음에서 시작합니다
   const double&    price[]            // 계산할 값의 배열
   );

현재 시간 프레임 시계열을 기반으로 계산

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[]           // 스프레드 배열
   );

매개변수

rates_total

[in]  계산 지표에서 사용할 수 있는 price[] 배열 또는 입력 시리즈의 크기. 두 번째 기능 유형에서 매개변수 값은 차트에서 시작되는 막대 수에 해당합니다.

prev_calculated

[in] 이전 호출 중 OnCalculate() 기능으로 반환된 값을 포함. 이 기능은 이전 기능 실행 이후 변경되지 않은 막대를 건너 뛰도록 설계되었습니다.

시작

[in]  price[] 배열의 의미 있는 인덱스 값부터 시작합니다. 그러면 올바른 값이 없는 누락 또는 초기 데이터를 건너뛸 수 있습니다.

price[]

[in]  계산을 위한 값의 배열. 가격 시계열 또는 계산된 지표 버퍼 중 하나를 price[] 배열로 전달할 수 있습니다. 계산을 위한 전달된 데이터 유형은 _AppliedTo 사전 정의된 변수를 사용하여 정의할 수 있습니다.

time{}

[in]  막대 열기 시간 값이 있는 배열.

open[]

[in]  시가 값이 포함된 배열.

high[]

[in]  고가 값이 포함된 배열.

low[]

[in]  저가 값이 포함된 배열.

close[]

[in]  종가 값이 포함된 배열.

tick_volume[]

[in]  틱 볼륨 값이 포함된 배열.

volume[]

[in]  거래 볼륨 값이 포함된 배열.

spread[]

[in]  막대를 위한 스프레드 값이 포함된 배열.

반환 값

int 유형 값은 다음 함수 호출 시 prev_calculated 매개변수로 전달됩니다.

참고

OnCalculate() 기능이 0이면 클라이언트 터미널의 DataWindow에 아무런 지표 값도 표시되지 않습니다.

OnCalculate() 함수의 마지막 호출 이후 가격 데이터가 변경된 경우 (더 깊은 내역이 로드되었거나 내역 공백이 채워진 경우) prev_calculated 입력 매개변수의 값은 터미널 자체에서 0으로 설정됩니다.

time[], open[], high[], low[], close[], tick_volume[], volume[]spread[] 배열에서 인덱싱 방향을 정의하려면 ArrayGetAsSeries() 기능을 호출. 기본값을 사용하지 않으려면 배열과 함께 사용할 ArraySetAsSeries() 기능을 호출.

첫 번째 기능 유형을 사용하는 경우 사용자가 지표를 실행할 때 매개변수 탭에서 price[] 배열로 필요한 시계열 또는 지표를 선택합니다. 이렇게 하려면 "적용 대상" 필드의 드롭다운 목록에서 필요한 요소를 지정.

다른 mql5 프로그램에서 사용자 지정 지표 값을 가져오려면 iCustom() 기능이 사용됩니다. 후속 작업에 대한 지표 핸들을 반환합니다. 필요한price [] 배열 또는 다른 지표의 핸들을 지정할 수도 있습니다. 이 매개변수는 사용자 지정 지표의 입력 변수 목록에서 마지막 매개변수를 전달해야 합니다.

OnCalculate() 기능에 의해 반환되는 값과 prev_calculated 초 입력 매개변수 사이의 연결을 사용해야 합니다. 기능을 호출할 때 prev_calculated 매개변수에는 이전 호출 중 OnCalculate() 함수가 반환한 값이 포함됩니다. 따라서 이 기능의 이전 실행 이후 변경되지 않은 막대에 대한 반복적인 계산을 방지하기 위해 사용자 지정 지표를 계산하기 위한 리소스 절약 알고리즘을 구현할 수 있습니다.

 

샘플 지표

//+------------------------------------------------------------------+
//|                                           OnCalculate_Sample.mq5 |
//|                        Copyright 2018, 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 "샘플 모멘텀 지표 계산"
 
//---- 지표 설정
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
#property indicator_type1   DRAW_LINE
#property indicator_color1  Blue
//---- 입력
input int MomentumPeriod=14; // 계산 주기
//---- 지표 버퍼
double    MomentumBuffer[];
//--- 계산 주기를 저장을 위한 글로벌 변수
int       IntPeriod;
//+------------------------------------------------------------------+
//| 사용자 지정 지표 초기화 함수                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- 입력 매개변수를 확인
   if(MomentumPeriod<0)
     {
      IntPeriod=14;
      Print("주기 매개변수 값이 잘못되었습니다. 다음 값은 계산에서 사용됩니다 ",IntPeriod);
     }
   else
      IntPeriod=MomentumPeriod;
//---- 버퍼  
   SetIndexBuffer(0,MomentumBuffer,INDICATOR_DATA);
//---- DataWindow 및 하위 창에 표시할 지표 이름
   IndicatorSetString(INDICATOR_SHORTNAME,"Momentum"+"("+string(IntPeriod)+")");
//--- 그리기가 시작되는 막대의 인덱스를 설정
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,IntPeriod-1);
//--- 0.0을 그려지지 않은 빈 값으로 설정
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
//--- 지표 정확도 표시
   IndicatorSetInteger(INDICATOR_DIGITS,2);
  }
//+------------------------------------------------------------------+
//|  모멘텀 지표 계산                                  |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,     // price[] 배열 크기 
                const int prev_calculated, // 이전에 처리한 막대의 수
                const int begin,           // 중요한 데이터가 시작되는 지점 
                const double &price[])     // 처리를 위한 값 배열
  {
//--- 계산을 위한 초기 포지션
   int StartCalcPosition=(IntPeriod-1)+begin;
//---- 계산 데이터가 충분하지 않은 경우
   if(rates_total<StartCalcPosition)
      return(0);  // 0 값을 사용하여 종료 - 지표가 계산되지 않음
//--- 정확한 그리기 시작
   if(begin>0)
      PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,StartCalcPosition+(IntPeriod-1));
//--- 시작 포지션을 정의하는 계산 시작
   int pos=prev_calculated-1;
   if(pos<StartCalcPosition)
      pos=begin+IntPeriod;
//--- 주 계산 루프
   for(int i=pos;i<rates_total && !IsStopped();i++)
      MomentumBuffer[i]=price[i]*100/price[i-IntPeriod];
//--- OnCalculate 실행이 완료되었습니다. 후속 호출에 대해 새 prev_calculated 값을 반환
   return(rates_total);
  }

추가 참조

ArrayGetAsSeries, ArraySetAsSeries, iCustom, 이벤트 처리 기능, 프로그램 작동, 클라이언트 터미널 이벤트, 시계열 및 지표에 액세스