iCustom

이 함수는 지정된 커스텀 지표의 핸들을 반환합니다.

int  iCustom(
   string           symbol,     // 심볼명
   ENUM_TIMEFRAMES  period,     // 주기
   string           name        // folder/custom_indicator_name
   ...                          // 지표 입력 파라미터 목록
   );

Parameters

symbol

[in] 지표를 계산하는 데 사용해야 하는 보안의 기호 이름. NULL 값은 현재 심볼을 의미합니다.

period

[in] 기간의 값은 ENUM_TIMEFRAMES 값 중 하나일 수 있으며, 0은 현재 기간을 의미합니다.

name

[in] 사용자 정의 표시기 이름 앞에 백슬래시 '\'가 표시되면 EX5 표시기 파일은 MQL5 루트 폴더를 기준으로 검색됩니다. 따라서iCustom(Symbol(), Period(), "\FirstIndicator"...) 호출의 경우 표시기는 MQL5\FirstIndicator.ex5로 로드됩니다. 이 경로에서 파일을 찾을 수 없으면 오류 4802(ERR_INDICATOR_CANNOT_CREATE)가 반환됩니다.

경로가 '\'로 시작하지 않는다면, 지표는 다음에서 검색되고 다운로드 됩니다:

  • 먼저 지표 EX5 파일이 호출 프로그램의 EX5 파일이 있는 폴더에서 검색됩니다. 예를 들면, CrossMA.EX5 EA 는 MQL5\Experts\MyExperts 에 위치하고 iCustom 호출 (Symbol(), Period(), "SecondIndicator"...)을 포함합니다. 이러한 경우, 지표는 MQL5\Experts\MyExperts\SecondIndicator.ex5 에서 검색됩니다.
  • 지표가 동일한 디렉토리에서 발견되지 않는다면, MQL5\Indicators 지표 루트 디렉토리를 기준으로 검색이 수행됩니다. 다른 말로 하면, MQL5\Indicators\SecondIndicator.ex5 파일에 대한 검색이 수행됩니다. 지표가 여전히 검색되지 않는다면, 함수는 INVALID_HANDLE을 반환하며 4802 오류 (ERR_INDICATOR_CANNOT_CREATE)가 촉발됩니다.

지표의 경로가 서브디렉토리 안에 세팅되어 있다면 (예를 들면, MyIndicators\ThirdIndicator), 검색은 MQL5\Experts\MyExperts\MyIndicators\ThirdIndicator.ex5 안에 처음에 호출된 프로그램 폴더(the EA is located in MQL5\Experts\MyExperts)에서 수행됩니다. 성공적이지 않다면, MQL5\Indicators\MyIndicators\ThirdIndicator.ex5 파일에 대해 검색을 수행합니다. 이중 역슬래시 '\\' 를 경로에 대한 구분자로 사용하는 것을 잊지마십시오, 예를 들면 다음과 같은 : iCustom(Symbol(), Period(), "MyIndicators\\ThirdIndicator"...)

...

[in]  콤마로 구분된 커스텀 지표의 input-parameters. 매개 변수의 유형과 순서가 일치해야 합니다. 지정된 매개변수가 없는 경우 기본값이 사용됩니다.

반환 값

오류가 INVALID_HANDLE를 반환하는 경우 지정된 기술 지표의 핸들을 반환합니다. 컴퓨터 메모리는 지표 핸들이 전달되는 IndicatorRelease() 함수를 사용하여 더 이상 사용되지 않는 지표에서 해방될 수 있습니다.

참고

커스텀 지표는 (EX5 확장자와 함께) 컴파일되어야 하며 클라이언트 터미널의 MQL5/Indicators 또는 이 하위 디렉토리에 있어야 합니다.

테스트가 필요한 지표는 iCustom() 함수의 호출로부터 자동으로 정의됩니다, 만약 해당하는 매개변수가 상수 문자열을 통해 세팅된다면. 다른 모든 경우에 대해서는 (지표명을 설정하는 매개변수에서의 IndicatorCreate() 함수의 사용 또는 비-상수 문자열의 사용) #property tester_indicator 속성이 요구됩니다:

#property tester_indicator "indicator_name.ex5"

지표에서 첫 호출 형태가 쓰였다면, 커스텀 지표 시작시 "매개 변수" 탭에서 연산할 데이터를 추가로 표시할 수 있습니다. "적용 대상" 매개변수를 명시적으로 선택하지 않은 경우 기본 연산은 "종가" 값을 기반으로 합니다.

지표를 계산할 시계열 선택

mql5-프로그램에서 커스텀 지표를 호출할 때 커스텀 지표의 모든 입력 변수 뒤에 Applied_Price 매개변수 또는 다른 지표의 핸들을 마지막으로 전달해야 합니다.

더보기

프로그램 속성, 시계열 및 지표 액세스,IndicatorCreate(), IndicatorRelease()

예제:

#property indicator_separate_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
//--- 입력 매개변수
input int MA_Period=21;
input int MA_Shift=0;
input ENUM_MA_METHOD MA_Method=MODE_SMA;
//--- 지표 버퍼
double         Label1Buffer[];
//--- 커스텀 Moving Average.mq5 커스텀 지표 핸들
int MA_handle;
//+------------------------------------------------------------------+
//| 커스텀 지표 초기화 함수                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 지표 버퍼 매핑
   SetIndexBuffer(0,Label1Buffer,INDICATOR_DATA);
   ResetLastError();
   MA_handle=iCustom(NULL,0,"Examples\\Custom Moving Average",
                     MA_Period,
                     MA_Shift,
                     MA_Method,
                     PRICE_CLOSE // 종가 사용
                     );
   Print("MA_handle = ",MA_handle,"  error = ",GetLastError());
//---
   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[])
  {
//--- 우리 지표 버퍼에 커스텀 이동 평균 지표의 값을 복사
   int copy=CopyBuffer(MA_handle,0,0,rates_total,Label1Buffer);
   Print("copy = ",copy,"    rates_total = ",rates_total);
//--- 시도가 실패했다면 - 이를 알려주세요
   if(copy<=0)
      Print("커스텀 이동 평균에 실패한 경우 값을 가져오려는 시도");
//--- 다음 호출에 대한 prev_calculated 값 반환
   return(rates_total);
  }
//+------------------------------------------------------------------+