English Русский 中文 Español Deutsch 日本語 Português Français Italiano Türkçe
MQL5 for Newbies의 맞춤 인디케이터

MQL5 for Newbies의 맞춤 인디케이터

MetaTrader 5 | 1 7월 2021, 10:32
142 0
Nikolay Kositsin
Nikolay Kositsin

소개

모든 지적 주제(수학, 음악 또는 프로그래밍에 관계없이)에 대한 깊은 이해의 기초는 기본에 대한 연구입니다. 꽤 어린 나이에 비슷한 연구가 시작되면 좋기 때문에 기초에 대한 이해가 훨씬 쉽고 지식이 구체적이고 포괄적입니다.

불행히도 대부분의 사람들은 중년에 금융 및 주식 시장을 연구하기 시작하므로 연구가 쉽지 않습니다. 이 글에서는 MQL5를 이해하고 MetaTrader 5 클라이언트 터미널에 대한 사용자 지정 지표를 작성하는 데 있어 이러한 초기 장벽을 극복하도록 노력할 것입니다.

간단한 예로 SMA 인디케이터

무언가를 공부하는 가장 효과적이고 합리적인 방법은 실제 문제에 대한 솔루션을 찾는 것입니다. 커스텀 인디케이터를 고려 중이므로 MQL5에서 인디케이터 작동의 기본을 설명하는 코드가 포함 된 간단한 인디케이터에 대한 연구부터 시작하겠습니다.

예를 들어, 가장 유명한 기술적 분석 인디케이터인 SMA (Simple Moving Average)를 살펴 보겠습니다. 계산은 간단합니다.

SMA = SUM (종료 (i), MAPeriod) / MAPeriod

어디:

  • SUM — 값의 합계.
  • 종가 (i) — i 번째 막대의 종가.
  • MAPeriod — 평균까지 바의 수 (평균 기간).

다음은 이 인디케이터의 코드입니다.

//+------------------------------------------------------------------+
//|                                                          SMA.mq5 |
//|                        Copyright 2009, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
#property indicator_type1   DRAW_LINE
#property indicator_color1  Red
  
input int MAPeriod = 13;
input int MAShift = 0; 
  
double ExtLineBuffer[]; 
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+  
void OnInit()
  {
   SetIndexBuffer(0, ExtLineBuffer, INDICATOR_DATA);
   PlotIndexSetInteger(0, PLOT_SHIFT, MAShift);
   PlotIndexSetInteger(0, PLOT_DRAW_BEGIN, MAPeriod - 1);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[])
  {
   if (rates_total < MAPeriod - 1)
    return(0);
    
   int first, bar, iii;
   double Sum, SMA;
   
   if (prev_calculated == 0)
    first = MAPeriod - 1 + begin;
   else first = prev_calculated - 1;

   for(bar = first; bar < rates_total; bar++)
    {
     Sum = 0.0;
     for(iii = 0; iii < MAPeriod; iii++)
      Sum += price[bar - iii];
     
     SMA = Sum / MAPeriod;
      
     ExtLineBuffer[bar] = SMA;
    }
     
   return(rates_total);
  }
//+------------------------------------------------------------------+

다음은 MetaTrader 5 클라이언트 터미널에서의 작업 결과입니다.

먼저 코드의 각 문자열의 목적과 이 프로그램 코드와 클라이언트 터미널 간의 상호 작용이라는 두 가지를 고려해야 합니다.

주석 사용하기

인디케이터 코드를 언뜻 보면 다음과 같은 물건이 눈에 들어옵니다.

//+------------------------------------------------------------------+
//|                                                          SMA.mq5 |
//|                        Copyright 2009, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+  
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+

코드와 직접 관련이 없으며 주석일 뿐이며 코드 가독성을 위해 설계되었으며 이 코드의 일부 부분에 대한 특정 의미 내용을 표시한다는 점에 유의해야 합니다. 물론 추가 단순화를 위해 손상없이 코드에서 제거 할 수 있지만 코드는 이해에 있어 간결한 간결성을 잃게 됩니다. 이 경우에는 항상 한 쌍의 "//"문자로 시작하고 개행 문자로 끝나는 한 줄 주석을 처리합니다.

주석에서 작성자는 얼마 후 이 코드를 이해하는 데 필요한 모든 것을 작성할 수 있습니다. 우리의 경우 주석 처리 된 문자열의 첫 번째 부분에는 인디케이터의 이름과 작성자에 대한 정보가 있으며, 주석의 두 번째와 세 번째 부분은 함수 OnInit() 및 OnCalculate()를 분할합니다. 마지막 줄은 단순히 프로그램 코드를 닫습니다.

SMA 코드 구조

보시다시피 인디케이터의 전체 코드는 세 부분으로 나눌 수 있습니다.

1. 글로벌 레벨에서 대괄호없이 작성된 코드는 처음 두 주석 사이에 있습니다.
2. OnInit() 함수에 대한 설명.

3. OnCalculate() 함수에 대한 설명입니다.

프로그래밍에서 함수의 의미는 수학에서보다 훨씬 넓다는 점에 유의해야 합니다. 예를 들어, 프로그래밍 언어에서 수학 함수는 항상 일부 입력 매개 변수를 수신하고 계산 된 값을 반환합니다. 또한 MQL5의 함수는 일부 차트 작업, 거래 작업, 파일 작업 등을 수행 할 수 있습니다.

실제로 MQL5로 작성된 모든 인디케이터에는 항상 최소한의 사용자 작성 부분 집합이 있으며, 그 내용은 개별적이고 생성된 인디케이터의 기능에 따라 다릅니다.

이러한 구성 요소 외에도 최소한의 함수 집합에는 다른 MQL5 함수인 OnDeInit()에 대한 설명이 포함될 수 있습니다.

//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+  
void OnDeinit(const int reason)
  {

  }

우리의 경우에는 필요하지 않으므로 여기에 없습니다.

SMA와 MetaTrader 클라이언트 터미널 간의 상호 작용

이제 SMA.mq5가 열린 상태에서 MetaEditor에서 "Compile"키를 눌러 얻은 컴파일 된 SMA.ex5 파일의 작업을 살펴 ​​보겠습니다. 확장자가 .mq5 인 텍스트 파일은 텍스트 형식의 소스 코드일 뿐이며 클라이언트 터미널에서 사용하려면 먼저 컴파일 해야 합니다.

이 인디케이터를 내비게이터 창에서 차트에 첨부하면 MetaTrader가 지표의 첫 번째 부분의 코드를 실행합니다. 그 후 이 함수의 단일 실행을 위해 OnInit() 함수를 호출하고, 새로운 틱마다 (새 따옴표 도착 후) OnCalculate() 함수를 호출하여 이 함수의 코드를 실행합니다. 인디케이터에 IF OnDeInit()가 있는 경우 MetaTrader는 차트에서 인디케이터를 분리 한 후 또는 기간이 변경된 후 이 함수를 한 번 호출합니다.

인디케이터의 모든 부분의 의미와 목적은 이 설명 이후에 분명합니다. 글로벌 수준의 코드 첫 부분에는 인디케이터 시작 후 한 번 실행되는 간단한 연산자가 있습니다. 또한 인디케이터의 모든 블록에서 "표시"되고 인디케이터가 차트에 있는 동안 해당 값을 기억하는 변수 선언이 있습니다.

한 번 실행되는 상수와 함수는 OnCalculate() 함수의 블록에 배치하는 것이 비효율적이므로 OnInit() 함수 내에 있어야 합니다. 각 막대에 대한 값을 계산할 수 있는 인디케이터 계산 코드는 OnCalculate() 함수에 배치해야 합니다.

인디케이터를 제거한 후 차트에서 쓸모없는 쓰레기 (있는 경우)를 삭제하는 절차는 OnDeInit()에 넣어야 합니다. 예를 들어 지표에 의해 생성된 그래픽 개체를 삭제하는 데 필요합니다.

이러한 설명이 끝나면 위에서 고려한 지표의 코드를 자세히 살펴볼 준비가 되었습니다.

SMA 인디케이터의 프로그램 코드

첫 번째 코드 줄 그룹은 #property 연산자로 시작하여 인디케이터 설정의 추가 매개 변수를 지정할 수 있습니다. 가능한 프로그램 속성의 전체 목록은 MQL5 문서에서 찾을 수 있습니다. 필요한 경우 인디케이터의 추가 속성을 작성할 수 있습니다. 우리의 경우 5 줄의 코드가 있고 각 줄의 목적은 주석에 설명되어 있습니다.

//---- the indicator will be plotted in the main window
#property indicator_chart_window
//---- one buffer will be used for the calculations and plot of the indicator
#property indicator_buffers 1
//---- only one graphic plot is used 
#property indicator_plots   1
//---- the indicator should be plotted as a line
#property indicator_type1   DRAW_LINE
//---- the color of the indicator's line is red 
#property indicator_color1  Red 

줄 끝에 세미콜론 ( ";")이 없습니다. 그 이유는 다음과 같습니다. 사실, 우리의 경우 상수 정의이지만 다른 방식으로 표시됩니다.

우리의 단순 이동 평균은 사용자가 변경할 수있는 2개의 매개 변수만 있습니다. 시간 축을 따라 인디케이터의 평균 기간과 수평 이동 (막대 단위)입니다. 이 두 매개 변수는 두 개의 추가 코드 행에서 선언되었으므로 인디케이터의 입력 변수로 선언되어야 합니다.

//---- indicator input parameters
input int MAPeriod = 13; //averaging period
nput int MAShift = 0; //horizontal shift (in bars)

이러한 입력 매개 변수의 선언 후에 주석이 있으며 이러한 주석은 인디케이터의 "속성"창에 입력 매개 변수의 이름으로 표시됩니다.


우리의 경우 이러한 이름은 인디케이터의 변수 이름보다 훨씬 더 명확합니다. 따라서 이러한 설명은 간단해야 합니다.

그리고 대괄호가 없는 마지막 코드 줄은 동적 배열 ExtLineBuffer[]의 선언입니다.

//---- the declaration of the dynamic array
//that will be used further as an indicator's buffer
double ExtLineBuffer[];  

여러 가지 이유로 전역 변수로 선언되었습니다.

먼저 이 배열은 인디케이터 버퍼로 변환되어야 하며 OnInit() 함수의 블록에 구현되어 있습니다. 둘째, 인디케이터 버퍼 자체는 OnCalculate() 함수 내에서 사용됩니다. 셋째, 이 배열은 차트에 곡선으로 표시되는 지표의 값을 저장합니다. 사실 글로벌 변수로 선언되어 인디케이터의 모든 블록에서 사용할 수 있으며 인디케이터가 차트에서 분리될 때까지 항상 값을 저장합니다.

OnInit() 함수의 내용은 단 3 명의 운영자가 제공하며, MetaTrader 클라이언트 터미널에 내장된 함수입니다.

첫 번째 함수의 호출은 0 번째 인디케이터 버퍼를 1차원 동적 배열 ExtLineBuffer[]로 할당합니다. 입력 매개 변수 값이 다른 다른 함수를 두 번 호출하면 가격 축을 따라 인디케이터를 이동할 수 있으며 MAPeriod 번호로 막대에서 플로팅을 지정할 수 있습니다.

void OnInit()
  {
//----+
//---- assign the dynamic array ExtLineBuffer with 0th indicator's buffer
   SetIndexBuffer(0,ExtLineBuffer,INDICATOR_DATA);
//---- set plot shift along the horizontal axis by MAShift bars
   PlotIndexSetInteger(0,PLOT_SHIFT,MAShift);
//---- set plot begin from the bar with number MAPeriod
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,MAPeriod);
//----+
  }

PlotIndexSetInteger() 함수의 마지막 호출은 MAPeriod (OnCalculate() 함수의 매개 변수 begin을 통해)와 같은 값을 다른 인디케이터에 전달합니다. 이것이 우리 지표의 값에 적용이 된다면 말이죠. 논리는 간단합니다. 첫 번째 MaPeriod-1 막대에서 평균 할 것이 없기 때문에 이 인디케이터의 플로팅이 쓸모가 없습니다. 그러나 다른 지표의 계산 원점을 이동하려면 이 값을 전달해야 합니다.

사용자 지정 인디케이터에 사용되며 인디케이터의 이 블록에 있을 수있는 내장 함수의 전체 목록이 아닙니다. 자세한 내용은 MQL5 문서를 참조하세요.

마지막으로 OnCalculate() 함수의 코드를 살펴 보겠습니다. 이 함수는 MetaTrader 클라이언트 터미널에 의해 호출되기 때문에 OnInit() 함수와 같은 사용자 정의 호출이 없습니다. 이러한 이유로 함수의 입력 매개 변수는 상수로 선언됩니다.

int OnCalculate(
                const int rates_total,    // number of available bars in history at the current tick
                const int prev_calculated,// number of bars, calculated at previous tick
                const int begin,          // index of the first bar
                const double &price[]     // price array for the calculation
                )

이러한 입력 매개 변수는 변경할 수 없으며 이 함수의 코드에서 나중에 사용할 수 있도록 해당 값이 클라이언트 터미널에 의해 전달됩니다. OnCalculate의 입력 변수는 MQL5 문서에 설명되어 있습니다. OnCalculate() 함수는 return(rates_total) 함수를 사용하여 클라이언트 터미널에 대한 값을 반환합니다. 클라이언트 터미널은 OnCalculate() 실행 후 현재 틱의 이 값을 수신하고 반환된 값을 다른 매개 변수 prev_calculated에 전달합니다. 따라서 항상 막대 인덱스의 범위를 결정하고 이전 틱 이후에 나타난 지표의 새 값에 대해서만 한 번에 계산을 수행 할 수 있습니다.

MetaTrader 클라이언트 터미널에서 순서 막대는 왼쪽에서 오른쪽으로 수행되므로 차트에 표시된 아주 오래된 막대 (왼쪽)는 인덱스 0, 다음 인덱스는 1 등입니다. ExtLineBuffer[] 버퍼의 요소는 순서가 동일합니다.

인디케이터의 OnCalculate 함수 내부의 간단한 코드 구조는 보편적이며 많은 기술적 분석 지표에서 일반적입니다. 자, 자세히 살펴 보겠습니다. OnCalcualte() 함수의 liogic은 다음과 같습니다.

1. 계산에 필요한 막대가 있는지 확인합니다.
2. 지역 변수 선언.
3. 계산을 위한 시작 막대의 색인을 가져옵니다.
4. 지표 계산의 주요 루프
5. return() 연산자를 사용하여 rates_total의 값을 클라이언트 터미널에 반환합니다.

첫 번째 용어는 분명하다고 생각합니다. 예를 들어, 이동 평균의 평균 기간이 200이고 클라이언트 단말기에 100개의 바만 있는 경우 계산에 충분한 바가 없으므로 계산을 수행 할 필요가 없습니다. 따라서 return 연산자를 사용하여 클라이언트 터미널에 0을 반환해야 합니다.

//---- check for the presence of bars, sufficient for the calculation
   if(rates_total<MAPeriod-1+begin)
      return(0);

인디케이터는 계산을 위해 최소한의 바의 수를 가질 수있는 다른 지표의 데이터에 적용될 수 있습니다. 이 사실을 고려하려면 상수 begin을 사용해야 합니다. 자세한 내용은 한 인디케이터를 다른 인디케이터에 적용 문서를 참조하세요.

이 블록에서 선언된 지역 변수는 OnCalculate() 함수 내부의 중간 계산에만 필요합니다. 이러한 변수는 함수 호출 후 컴퓨터 RAM에서 해제됩니다.

//---- declaration of local variables 
   int first,bar,iii;
   double Sum,SMA;

메인 루프 (변수 first)의 시작 인덱스에 주의할 필요가 있습니다. 함수를 처음 호출 할 때 (prev_calculated 매개 변수 값으로 결정할 수 있음) 모든 막대에 대한 인디케이터 값 계산을 수행해야 합니다. 클라이언트 터미널의 모든 추가 틱에 대해 새 막대가 나타난 경우에만 계산을 수행해야 합니다. 3개의 코드 라인으로 수행됩니다.

//---- calculation of starting index first of the main loop
   if(prev_calculated==0) // check for the first start of the indicator
      first=MAPeriod-1+begin; // start index for all the bars
   else first=prev_calculated-1; // start index for the new bars

인디케이터 재 계산의 메인 루프 연산자의 변수 변경 범위는 이미 논의되었습니다.

//---- main loop of the calculation
   for(bar=first;bar<rates_total;bar++)

메인 루프의 바 처리는 오름차순 (bar++), 즉 왼쪽에서 오른쪽으로 자연스럽게 오른쪽으로 수행됩니다. 인디케이터에서는 다른 방식(역순)으로 구현할 수 있습니다. 지표에서 오름차순을 사용하는 것이 좋습니다. 메인 루프의 변수 이름은 "bar"이지만 많은 프로그래머는 "i"라는 이름을 선호합니다. 코드를 더 명확하고 읽기 쉽게 만들기 때문에 "바"를 사용하는 것을 선호합니다.

메인 루프에서 구현된 평균화 알고리즘은 간단합니다.

     {
      Sum=0.0;
       //---- summation loop for the current bar averaging
      for(iii=0;iii<MAPeriod;iii++)
         Sum+=price[bar-iii]; // Sum = Sum + price[bar - iii]; // eqaual to 
      
      //---- calculate averaged value
      SMA=Sum/MAPeriod;

      //---- set the element of the indicator buffer with the value of SMA we have calculated
      ExtLineBuffer[bar]=SMA;
     }

두 번째 루프에서는 해당 기간의 이전 막대에서 가격의 누적 합계를 수행하고 이를 이 평균 기간으로 나눕니다. 결과적으로 우리는 SMA의 최종 가치를 갖게 됩니다.

메인 루프가 끝나면 OnCalculate 함수는 변수 rates_total에서 사용 가능한 바의 수를 반환합니다. OnCalculate() 함수의 다음 호출에서 이 값은 클라이언트 터미널에서 prev_calculated 변수로 전달됩니다. 1만큼 감소된 이 값은 메인 루프의 시작 인덱스로 사용됩니다.

다음은 각 코드 행에 대한 자세한 설명과 함께 인디케이터의 전체 소스 코드입니다.

//+------------------------------------------------------------------+
//|                                                          SMA.mq5 |
//|                        Copyright 2009, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
//---- the indicator will be plotted in the main window
#property indicator_chart_window
//---- one buffer will be used for the calculations and plot of the indicator
#property indicator_buffers 1
//---- only one graphic plot is used 
#property indicator_plots   1
//---- the indicator should be plotted as a line
#property indicator_type1   DRAW_LINE
//---- the color of the indicator's line is red 
#property indicator_color1  Red 

//---- indicator input parameters
input int MAPeriod = 13; //Averaging period
input int MAShift = 0; //Horizontal shift (in bars)

//---- the declaration of the dynamic array
//that will be used further as an indicator's buffer
double ExtLineBuffer[]; 
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+  
void OnInit()
  {
//----+
//---- assign the dynamic array ExtLineBuffer with 0th indicator's buffer
   SetIndexBuffer(0,ExtLineBuffer,INDICATOR_DATA);
//---- set plot shift along the horizontal axis by MAShift bars
   PlotIndexSetInteger(0,PLOT_SHIFT,MAShift);
//---- set plot begin from the bar with number MAPeriod
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,MAPeriod);  
//----+
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(
                const int rates_total,    // number of available bars in history at the current tick
                const int prev_calculated,// number of bars, calculated at previous tick
                const int begin,          // index of the first bar
                const double &price[]     // price array for the calculation
                )
  {
//----+   
   //---- check for the presence of bars, sufficient for the calculation
   if (rates_total < MAPeriod - 1 + begin)
    return(0);
   
   //---- declaration of local variables 
   int first, bar, iii;
   double Sum, SMA;
   
   //---- calculation of starting index first of the main loop
   if(prev_calculated==0) // check for the first start of the indicator
      first=MAPeriod-1+begin; // start index for all the bars
   else first=prev_calculated-1; // start index for the new bars

   //---- main loop of the calculation
   for(bar = first; bar < rates_total; bar++)
    {    
      Sum=0.0;
      //---- summation loop for the current bar averaging
      for(iii=0;iii<MAPeriod;iii++)
         Sum+=price[bar-iii]; // It's equal to: Sum = Sum + price[bar - iii];
         
      //---- calculate averaged value
      SMA=Sum/MAPeriod;

      //---- set the element of the indicator buffer with the value of SMA we have calculated
      ExtLineBuffer[bar]=SMA;
    }
//----+     
   return(rates_total);
  }
//+------------------------------------------------------------------+

이 형식의 코드는 이해하고 읽기가 훨씬 쉽습니다.

코드 이해를 단순화하는 데 사용할 수있는 또 다른 기능을 간략하게 설명하고 싶습니다. 공백과 빈 줄을 사용하여 명확하게 할 수 있습니다.

결론

이것이 바로 커스텀 인디케이터 코드와 MetaTrader 클라이언트 터미널 간의 상호 작용에 관한 것입니다. 물론 주제는 우리가 고려한 것보다 훨씬 더 광범위합니다. 이 글 의 목적은 초보자가 기본 사항을 이해하도록 돕는 것이므로 자세한 내용은 문서를 참조하십시오.

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

파일 첨부됨 |
sma.mq5 (1.78 KB)
sma_.mq5 (3.32 KB)
Expert Advisor에서 OnTrade() 함수를 이용한 거래 이벤트 처리 Expert Advisor에서 OnTrade() 함수를 이용한 거래 이벤트 처리
MQL5는 다양한 유형의 이벤트 (타이머 이벤트, 거래 이벤트, 맞춤 이벤트 등) 작업을 포함하여 많은 혁신을 제공했습니다. 이벤트 처리 기능을 통해 자동 및 반자동 거래를 위한 완전히 새로운 유형의 프로그램을 만들 수 있습니다. 이 기사에서는 거래 이벤트를 고려하고 거래 이벤트를 처리할 OnTrade() 함수에 대한 코드를 작성합니다.
MQL5에서 객체 포인터 사용 MQL5에서 객체 포인터 사용
기본적으로 MQL5의 모든 오브젝트는 참조로 전달되지만 오브젝트 포인터를 사용할 가능성이 있습니다. 그러나 객체가 초기화되지 않을 수 있으므로 포인터 검사를 수행해야 합니다. 이 경우 MQL5 프로그램은 심각한 오류로 종료되고 언로드됩니다. 자동으로 생성된 객체는 이러한 오류를 일으키지 않으므로 이 점에서 매우 안전합니다. 이 글에서는 개체 참조와 개체 포인터의 차이점을 이해하고 포인터를 사용하는 보안 코드를 작성하는 방법을 고려합니다.
MQL5에서 인디케이터를 호출하는 방법 MQL5에서 인디케이터를 호출하는 방법
새로운 버전의 MQL 프로그래밍 언어를 사용할 수 있게 됨에 따라 지표 처리 방식이 변경되었을 뿐만 아니라 지표를 만드는 새로운 방법도 있습니다. 또한 인디케이터 버퍼로 작업 할 수 있는 추가적인 유연성이 있습니다. 이제 원하는 인덱싱 방향을 지정하고 원하는 만큼의 인디케이터 값을 얻을 수 있습니다. 이 문서에서는 인디케이터를 호출하고 인디케이터의 버퍼에서 데이터를 검색하는 기본 방법을 설명합니다.
MQL5 소개: 간단한 전문가 자문 및 사용자 지정 지표 작성 방법 MQL5 소개: 간단한 전문가 자문 및 사용자 지정 지표 작성 방법
MetaTrader 5 클라이언트 터미널에 포함된 MQL5(MetaQuotes Programming Language 5)는 MQL4에 비해 많은 새로운 가능성과 더 높은 성능을 가지고 있다. 이 글은 당신이 이 새로운 프로그래밍 언어에 익숙해지도록 도와줄 것이다. 이 문서에는 전문가 자문 및 사용자 지정 지표 작성 방법의 간단한 예가 나와 있습니다. 저희는 또한 이러한 예를 이해하는 데 필요한 MQL5 언어의 몇 가지 세부 사항을 고려할 것이다.