English Русский 中文 Español Deutsch 日本語 Português Français Italiano Türkçe
MQL5에서 인디케이터를 호출하는 방법

MQL5에서 인디케이터를 호출하는 방법

MetaTrader 5 | 1 7월 2021, 10:33
159 0
KlimMalgin
KlimMalgin

소개

MQL5에는 인디케이터를 호출하는 여러 가지 방법이 있으며 대부분 IndicatorCreate() 및 iCustom() 함수를 사용하여 수행됩니다. 또한 이러한 함수는 인디케이터 핸들만 반환하며 인디케이터에 대한 추가 작업은 이를 통해 수행됩니다. 그래서 핸들은 무엇입니까? IndicatorCreate()iCustom() 함수를 처리하는 방법은 무엇입니까? 전문가가 인디케이터 데이터를 어떻게 얻을 수 있을까요? 이 모든 질문은 이 글에서 다룹니다.

소스 파일 만들기

전문가와 함께 시작하기 위해 소스 파일을 만들어 보겠습니다. MetaEditor4에서와 마찬가지로 File-> New 메뉴에서 MQL5 마법사를 호출하여 이 작업을 수행합니다. 첫 번째 단계에서 Expert Advisor를 선택하고 Next를 누릅니다.


두 번째 단계에서는 Expert Adviser의 이름, 작성자 연락처 및 입력 매개 변수를 입력합니다. 어드바이저의 이름 (필수 필드)과 저자만 입력하십시오. 필요한 경우 나중에 프로그램 코드에서 직접 입력 매개 변수를 추가 할 수 있습니다.


마침을 클릭하면 마법사가 다음 소스 코드를 생성합니다.

//+------------------------------------------------------------------+
//|                                                   SampleMQL5.mq5 |
//|                                             Copyright KlimMalgin |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "KlimMalgin"
#property link      ""
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+

소스 파일 구조

전문가의 소스 파일 구조를 간단히 살펴보고 더 나아가 보겠습니다.

프로그램 코드는 헤더로 시작합니다. 파일 이름과 작성자가 포함된 주석입니다. 제목 뒤에는 전문가의 프로그램 속성 (#property)이 나옵니다. 여기에 프로그램 버전과 작성자 이름 및 페이지 링크 (입력한 경우)가 자동으로 표시됩니다. 속성을 설명한 후 입력 매개 변수가 지정되고 (아직 지정하지 않음) 전역 변수가 선언됩니다.

주 mql5-file\에 속성을 설정해야 합니다. 포함된 파일의 모든 속성이 무시됩니다!

다음으로 이벤트를 처리하는 세 가지 기능이 있습니다.

  • OnInit() - 전문가 시작, 문자 변경 또는 전문가가 설정된 기간 변경시 한 번 실행됩니다.
  • OnDeinit(const int reason) - 전문가가 작업을 완료하거나 재초기화할 때도 한 번 실행됩니다. reason 매개 변수에는 초기화 해제 이유 코드가 포함됩니다.
  • OnTick() - 전문가가 첨부된 차트에서 새 틱을 받을 때마다 시작됩니다.

연결 인디케이터

MQL5에서 인디케이터 작업 방식이 변경되었습니다! MQL4에서 특정 막대의 인디케이터 값을 가져 오려면 해당 막대의 인덱스가 iCustom() 함수에 매개 변수로 전달됩니다. 이제 인디케이터의 버퍼 값을 얻지 못했지만 핸들을 얻었습니다. 이 핸들을 사용하면 CopyBuffer()라는 특수 함수를 사용하여 주어진 간격에서 인디케이터 값을 얻을 수 있습니다. 그래서 핸들이란 무엇입니까?

Handle 은 특정 인디케이터와 함께 사용하기 위해 생성된 고유 인디케이터입니다. 정수로 표시되며 int 유형의 변수에 저장됩니다. MQL5:\에서 인디케이터 핸들을 얻는 방법에는 두 가지가 있습니다.

  • 성공하면 인디케이터 핸들을 반환하고 실패하면 -1을 반환하는 IndicatorCreate() 함수를 호출합니다.
  • 기술 지표 함수 중 하나를 호출합니다. 그들의 실행 결과는 비슷합니다.

두 방법 모두 똑같이 유효하며 어떤 방법을 사용할지 결정하는 것은 사용자에게 달려 있습니다. 두 가지 방법을 자세히 살펴보겠습니다.

IndicatorCreate() 함수를 사용하여 인디케이터의 핸들 가져 오기

따라서 IndicatorCreate() 함수를 성공적으로 실행한 결과 인디케이터의 핸들을 얻고 실패할 경우 함수는 -1과 같은 INVALID_HANDLE 값을 반환합니다. 호출된 인디케이터에 매개 변수가 있으면 함수를 호출하기 전에 MqlParam 유형 매개 변수의 배열을 채워야 합니다. 이 배열의 각 요소는 4개의 필드를 포함하는 MqlParam 유형의 구조로 표현됩니다. 이 구조의 첫 번째 필드는 나머지 세 필드 중 지표에 대한 매개 변수로 사용되는 필드를 나타냅니다.

이동 평균 및 ParabolicSAR 인디케이터의 핸들을 만드는 코드를 작성해 보겠습니다. 핸들을 저장할 전역 변수 선언으로 시작하고 인디케이터에 대한 매개 변수를 설정하기 위해 MqlParam 유형의 배열을 선언합니다.

int MA1 = 0,            // Declaring variable to store fast MA handle
    MA2 = 0,            // Declaring variable to store slow MA handle
    SAR = 0;            // Declaring variable to store SAR handle
    
MqlParam params[];      // Array for storing indicators parameters

이 코드는 전문가 속성을 정의한 직후에 배치해야 합니다.

이제 변수가 선언되면 매개 변수 배열을 채우고 IndicatorCreate() 함수를 호출할 수 있습니다. 인디케이터는 각 틱이 아니라 프로그램 시작시 한 번 생성되므로 OnInit() 함수에서 이 작업을 수행하는 것이 좋습니다!

매개 변수 배열을 채우고 첫번째 인디케이터를 호출 해보겠습니다.

int OnInit()
{
//---
   // Setting the params size equal to number of called indicator parameters
   ArrayResize(params,4);

   // Setting the period of fast MA
   params[0].type         =TYPE_INT;
   params[0].integer_value=5;
   // Offset
   params[1].type         =TYPE_INT;
   params[1].integer_value=0;
   // Calculation method: simple averaging
   params[2].type         =TYPE_INT;
   params[2].integer_value=MODE_SMA;
   // Price type for calculation: the Close prices
   params[3].type         =TYPE_INT;
   params[3].integer_value=PRICE_CLOSE;
   
   MA1 = IndicatorCreate(Symbol(), // Symbol used to calculate the indicator
                         0,        // Timeframe. 0 means current
                         IND_MA,   // Indicator type from the ENUM_INDICATOR enumeration
                         4,        // Number of parameters passed in the params array
                         params    // Parameters array
                         );   
//---
return(0);
}

params 배열이 동적 배열로 선언되었으므로 배열의 크기가 대괄호로 설정되지 않았으므로 사용하기 전에 크기를 설정해야 합니다. ArrayResize() 함수를 사용하여 배열로 전송할 매개 변수 수와 동일한 크기를 정의합니다. 이동 평균에는 4개의 매개 변수가 필요합니다.

첫 번째 매개 변수는 MA 기간입니다. 정수로 설정됩니다. 따라서 첫 번째 매개 변수의 type 필드에 TYPE_INT 값을 설정하므로 IndicatorCreate() 함수가 "이해"하므로 해당 값은 integer_value 필드에서 가져와야 합니다. 이동 평균에 대한 모든 매개 변수는 int 유형을 갖기 때문에 그에 따라 설정됩니다.

배열이 채워지면 IndicatorCreate() 함수를 호출 할 수 있습니다. 출력은 MA1 변수에 저장됩니다. 함수를 호출하는 데 어려움이 없어야 하며 5개의 매개 변수만 전달되어야 합니다.

  • 첫 번째는 작업 도구의 이름입니다. Symbol() 함수는 전문가가 실행 중인 현재 도구의 이름을 반환합니다. 
  • 두 번째 매개 변수는 인디케이터 값이 계산되는 시간대를 지정합니다.
  • 세 번째 매개 변수는 호출될 인디케이터 유형을 지정합니다.
  • 네 번째 매개 변수는 params 배열에서 전달할 매개 변수의 수를 지정합니다.
  • 마지막으로 다섯 번째 매개 변수는 인디케이터의 입력 매개 변수 배열입니다.

이걸로 끝이예요! 우리는 빠른 MA 핸들이 있고 느린 MA 및 SAR 인디케이터 핸들을 가져와야 합니다. 결과적으로 OnInit() 함수는 다음과 같습니다.

int OnInit()
  {
//---

   // Setting the params size equal to number of called indicator's parameters
   ArrayResize(params,4);

//*    Calling indicators   *
//***************************
   // Setting the period of fast MA
   params[0].type         =TYPE_INT;
   params[0].integer_value=5;
   // Offset
   params[1].type         =TYPE_INT;
   params[1].integer_value=0;
   // Calculation method: simple averaging
   params[2].type         =TYPE_INT;
   params[2].integer_value=MODE_SMA;
   // Price type for calculation: the Close prices
   params[3].type         =TYPE_INT;
   params[3].integer_value=PRICE_CLOSE;
   
   MA1 = IndicatorCreate(Symbol(), 0, IND_MA, 4, params);
   
   // Setting the period of slow MA
   params[0].type         =TYPE_INT;
   params[0].integer_value=21;
   // Offset   
   params[1].type         =TYPE_INT;
   params[1].integer_value=0;
   // Calculation method: simple averaging
   params[2].type         =TYPE_INT;
   params[2].integer_value=MODE_SMA;
   // Price type for calculation: the Close prices
   params[3].type         =TYPE_INT;
   params[3].integer_value=PRICE_CLOSE;
   
   MA2 = IndicatorCreate(Symbol(), 0, IND_MA, 4, params);
   
   
   // Changing array size to store the SAR indicator parameters
   ArrayResize(params,2);
   // Step
   params[0].type         =TYPE_DOUBLE;
   params[0].double_value = 0.02;
   // Maximum
   params[1].type         =TYPE_DOUBLE;
   params[1].double_value = 0.2;
   
   SAR = IndicatorCreate(Symbol(), 0, IND_SAR, 2, params);
   
//---
   return(0);
  }

느린 MA 핸들을 얻으려면 기간을 5에서 21로만 변경할 수 있습니다. ParabolicSAR이 호출되면 부동 소수점 숫자 (double)가 매개 변수로 전송됩니다. 배열을 채울 때 이를 고려하고 유형 필드에 TYPE_DOUBLE을 입력하고 매개 변수 자체를 double_value 필드에 각각 입력해야 합니다. 또한 SAR에는 두 개의 매개 변수만 필요하므로 ArrayResize()를 사용하여 배열 크기가 2로 변경됩니다.

지금은 IndicatorCreate() 함수가 종료됩니다. 제 생각에는 이러한 지표 호출 방법은 지표와 함께 작동하도록 클래스 라이브러리를 만들 때 객체 지향 접근 방식에서 가장 편리합니다. 이 라이브러리를 사용하면 대규모 프로젝트를 보다 쉽게 ​​처리 할 수 ​​있습니다. 그리고 빠른 전문가를 작성하고 테스트하려면 다음 방법을 사용하는 것이 가장 좋습니다.

기술 지표 기능을 사용하여 처리하기

인디케이터 핸들을 얻을 수 있는 두 번째 방법은 기술 지표 함수 중 하나를 호출하는 것입니다. 이러한 각 기능은 MetaTrader 5와 함께 제공되는 표준 인디케이터 중 하나를 처리하기 위한 것입니다. 그것들은 의도하는 인디케이터에 따라 특정 매개 변수 집합을 가지고 있습니다. 예를 들어 CCI 인디케이터의 경우 iCCI() 함수가 호출되며 다음과 같습니다.

   CCI = iCCI(
              Symbol(),            // symbol name
              PERIOD_CURRENT,      // period
              20,                  // averaging period
              PRICE_CLOSE          // price type or handle
              );

다른 지표의 핸들은 가격 유형 대신 기술 지표 기능의 마지막 매개 변수로 제출할 수 있습니다. 그런 다음 이러한 방식으로 호출되는 지표는 가격 데이터가 아닌 다른 지표의 데이터를 사용하여 계산됩니다.

iCustom() 함수는 사용자 지정 인디케이터를 포함한 모든 인디케이터를 호출 할 수 있기 때문에 다른 기술 인디케이터 함수 중에서 특별한 관심을 불러 일으킵니다. 위와 비슷하지만 iCustom() 함수를 사용하여 코드를 작성해 보겠습니다.

int OnInit()
  {
//---

   MA1 = iCustom(NULL,0,"Custom Moving Average",
                          5,          // Period
                          0,          // Offset
                          MODE_SMA,   // Calculation method
                          PRICE_CLOSE // Calculating on Close prices
                 );

   MA2 = iCustom(NULL,0,"Custom Moving Average",
                          21,         // Period
                          0,          // Offset
                          MODE_SMA,   // Calculation method
                          PRICE_CLOSE // Calculating on Close prices
                 );

   SAR = iCustom(NULL,0,"ParabolicSAR",
                          0.02,        // Step
                          0.2          // Maximum
                 );

//---
   return(0);
  }

전문가 시작시 한 번 처리하는 것이 가장 좋으므로 OnInit() 함수를 호출해 보겠습니다.

iCustom() 함수에는 다음 매개 변수가 포함됩니다.

  1. 지표를 계산하는 데 사용되는 데이터인 작업 도구 이름. NULL - 현재 도구를 의미합니다. NULL 대신 Symbol()을 사용할 수 있지만 큰 차이는 없습니다. Symbol()의 경우 상품명은 iCustom()으로 전달되지만 NULL 인 경우 iCustom()은 금융 상품 자체를 찾습니다.
  2. 차트 기간 기간을 지정하려면 사전 정의된 차트 기간과 0을 사용하여 현재 기간을 참조 할 수 있습니다.
  3. 인디케이터 이름. 인디케이터라는 이름은 컴파일되어야하며 "MQL5\Indicators\"폴더 또는 그 하위 폴더에 있어야 합니다.
  4. 나머지 매개 변수. 이러한 값은 호출된 인디케이터의 입력 매개 변수로 사용되므로 해당 유형과 시퀀스가 ​​서로 일치해야 합니다. 지정되지 않은 경우 기본값이 사용됩니다.

말했듯이 - 이 방법은 작업에 사용한 라이브러리가 없는 경우 인디케이터와 함께 사용하는 것이 더 편리합니다. 이제 핸들이 수신되면 인디케이터 값으로 작업을 시작할 수 있습니다!

지표 데이터 얻기

MQL5에서 인디케이터의 데이터로 작업하는 것의 이점은 이제 우리가 필요한 간격으로만 데이터를 얻을 수 있다는 것입니다. 다른 방법으로 간격을 설정할 수 있습니다.

  • 선택한 막대를 기준으로 지정된 바의 수를 가져옵니다.
  • 선택한 날짜를 기준으로 지정된 수의 막대를 가져옵니다.
  • 인디케이터에서 주어진 시간 간격으로 데이터 가져오기, 즉 시작일과 종료일을 지정합니다.

인디케이터의 날짜를 읽기 위해 CopyBuffer() 함수를 사용합니다. 데이터를 가져 오는 방법은 이 함수로 전송되는 입력 매개 변수에 따라 다릅니다.

인디케이터 데이터(앞에 핸들이 있음)를 배열에 복사하는 코드를 작성해보겠습니다.

void OnTick()
  {
//---

// Dynamic arrays to store indicators values
double _ma1[],
       _ma2[],
       _sar[];

// Setting the indexing in arrays the same as in timeseries, i.e. array element with zero
// index will store the values of the last bar, with 1th index - the last but one, etc.
   ArraySetAsSeries(_ma1, true);
   ArraySetAsSeries(_ma2, true);
   ArraySetAsSeries(_sar, true);

// Using indicators handles, let's copy the values of indicator
// buffers to arrays, specially prepared for this purpose
   if (CopyBuffer(MA1,0,0,20,_ma1) < 0){Print("CopyBufferMA1 error =",GetLastError());}
   if (CopyBuffer(MA2,0,0,20,_ma2) < 0){Print("CopyBufferMA2 error =",GetLastError());}
   if (CopyBuffer(SAR,0,0,20,_sar) < 0){Print("CopyBufferSAR error =",GetLastError());}


//---
  }

이제 모든 작업은 OnTick() 함수에 집중할 것입니다. 각 틱 인디케이터에서 데이터가 변경되고 업데이트되어야 하기 때문입니다.

먼저 인디케이터 버퍼별로 동적 배열을 선언해보겠습니다. 제 생각에는 인디케이터 데이터로 작업하는 것이 더 편리합니다. 만약 배열 인덱싱이 timeseries에서와 같을 경우, 즉 배열 요소 0에는 마지막 막대의 데이터 등이 있습니다. 인덱싱 방법은 ArraySetAsSeries() 함수를 사용하여 설정됩니다.

인덱싱 방법이 설정되면 배열 채우기를 시작할 수 있습니다. 각 인디케이터를 계산하기 위해 다음 매개 변수 세트를 사용하여 CopyBuffer() 함수를 호출합니다.

  1. 원하는 데이터를 처리 표시합니다.
  2. 인디케이터 버퍼 숫자. MA 및 SAR 인디케이터에는 하나의 버퍼가 있으므로 0으로 설정합니다. 버퍼가 두 개 이상인 경우 두 번째는 1 번, 세 번째는 2 번 등이 됩니다.
  3. 계산이 시작되는 초기 막대.
  4. 복사하려는 바의 수입니다.
  5. 데이터가 복사되는 배열</ b0>{/0}입니다.

호출이 성공하면 CopyBuffer() 함수는 복사된 요소의 수를 반환하고 실패하면 -1을 반환합니다. 실패한 경우 오류를 추적해야 하므로 반환된 값이 0보다 작 으면 Print() 함수를 사용하여 전문가 로그에 오류를 기록합니다.

결론

현재 지표에 대한 우리의 작업은 끝이 아닙니다. 이 문서에서는 데이터에 액세스하는 기본 방법만 다룹니다. 편의상 MQL5에서 상당히 좋은 수준으로 구현 된 객체 지향 접근 방식을 사용하는 것이 가장 좋습니다!

MetaQuotes 소프트웨어 사를 통해 러시아어가 번역됨.
원본 기고글: https://www.mql5.com/ru/articles/43

파일 첨부됨 |
samplemql5_en.mq5 (5.13 KB)
MQL5의 드로잉 스타일 MQL5의 드로잉 스타일
MQL4에서는 6가지 드로잉 스타일이, MQL5에서는 18가지 드로잉 스타일이 지원됩니다. 그러니까 MQL5의 드로잉 스타일을 알아 보면 되겠죠? 이번 글에서는 MQL5에서 지원되는 드로잉 스타일에 대해 상세히 알아 보겠습니다. 그리고 인디케이터를 생성해서 드로잉 스타일도 설명하고 플롯도 개선해 보도록 할게요.
Expert Advisor에서 OnTrade() 함수를 이용한 거래 이벤트 처리 Expert Advisor에서 OnTrade() 함수를 이용한 거래 이벤트 처리
MQL5는 다양한 유형의 이벤트 (타이머 이벤트, 거래 이벤트, 맞춤 이벤트 등) 작업을 포함하여 많은 혁신을 제공했습니다. 이벤트 처리 기능을 통해 자동 및 반자동 거래를 위한 완전히 새로운 유형의 프로그램을 만들 수 있습니다. 이 기사에서는 거래 이벤트를 고려하고 거래 이벤트를 처리할 OnTrade() 함수에 대한 코드를 작성합니다.
MQL5로 틱 인디케이터 만들기 MQL5로 틱 인디케이터 만들기
이 글에서는 가격을 틱 차트로 나타내는 틱 인디케이터와 특정 개수의 틱을 이용해 캔들을 그리는 캔들 인디케이터 두 가지의 작성 방법을 다룰 겁니다. 두 인디케이터 모두 가격 정보를 파일로 만들어 인디케이터 재가동 시 저장된 데이터(다른 프로그램에서도 이용 가능)를 이용합니다.
MQL5 for Newbies의 맞춤 인디케이터 MQL5 for Newbies의 맞춤 인디케이터
새로운 주제는 초보자에게 복잡하고 배우기 어려운 것 같습니다. 우리가 알고있는 주제는 우리에게 매우 간단하고 명확해 보입니다. 그러나 우리는 모든 사람이 처음부터 무언가를 심지어 우리의 모국어로 공부해야 한다는 걸 기억하지 못하는 것 같습니다. 자신의 거래 전략을 개발할 수있는 광범위한 가능성을 제공하는 MQL5 프로그래밍 언어도 마찬가지입니다. 기본 개념과 가장 간단한 예를 통해 학습을 시작할 수 있습니다. 기술 인디케이터와 MetaTrader 5 클라이언트 터미널의 상호 작용은 간단한 사용자 지정 인디케이터 SMA의 예에 대한 이 글에서 고려됩니다.