English Русский 中文 Español Deutsch 日本語 Português Français Italiano Türkçe
MQL5 표준 라이브러리 확장 및 코드 재사용

MQL5 표준 라이브러리 확장 및 코드 재사용

MetaTrader 5 | 3 9월 2021, 11:04
75 0
laplacianlab
[삭제]

소개

MQL5 표준 라이브러리는 개발자로서의 삶을 더 쉽게 만들어주는 바로 사용할 수 있는 클래스 세트로 구성된 객체 지향 프레임워크입니다. 그럼에도 불구하고 전 세계 모든 개발자의 요구 사항을 모두 구현하는 것은 아니므로 사용자 정의 항목이 더 필요하다고 느끼면 한 단계 더 나아가 확장할 수 있습니다. 이 글은 MetaQuotes의 Zig-Zag 기술 지표를 표준 라이브러리에 통합하는 방법을 안내합니다. 우리는 우리의 목표를 달성하기 위해 MetaQuotes의 디자인 철학에 영감을 받을 것입니다.

간단히 말해서 MQL5 API는 코드 재사용, 안정성, 유연성 및 손쉬운 유지 관리의 이점을 누릴 수 있도록 고안되었습니다. 이것이 이론이 말하는 바이지만, 이 모든 것을 넘어서 MQL5를 계속 발전시키고 다중 통화 Experts Advisors와 같은 보다 정교한 것들을 개발할 계획이라면 먼저 표준 라이브러리 방식으로 코딩할 수 있어야 합니다. 그래야 당신의 앱이 성공적인 삶을 보장할테니까요.

EA와 지표가 점점 더 복잡해짐에 따라 프레임워크 개발과 관련된 개념을 마스터하는 것이 더 필요합니다. 실생활의 예로, 내 프로젝트의 기반을 처음부터 강화해야 할 필요성을 지시하는 복잡한 다중 통화 EA를 개발하는 것이 개인적 필요입니다.

그림 1. 정다면체는 완벽한 개체입니다. 그들은 견고한 개념에 앱을 구축하는 접근 방식을 잘 보여줍니다.

그림 1. 정다면체는 완벽한 개체입니다. 견고한 개념을 바탕으로 앱을 구축하는 접근 방식을 잘 보여줍니다.

1. 지그재그 다운로드

먼저 MetaTrader 5 터미널에서 코드 베이스에서 사용할 수 있는 MetaQuotes의 지그재그 지표를 다운로드합니다. 그러면 Indicators\zigzag.mq5Indicators\zigzag.ex5 파일이 생성됩니다.

그림 2. MetaTrader 5 터미널에서 MetaQuotes의 ZigZag 다운로드를 시작합니다.

그림 2. MetaTrader 5 터미널
에서 MetaQuotes의 ZigZag 다운로드를 시작합니다.

지표의 입력 매개변수, 전역 변수 및 OnInit() 핸들러를 포함하는 Indicators\zigzag.mq5 줄을 여기에 첨부합니다. 전체 파일에 298줄의 코드가 있기 때문에 이 부분만 넣었습니다. 이것은 단순히 편의와 아래에서 설명하는 더 큰 그림의 이해를 위한 것입니다.

//+------------------------------------------------------------------+
//|                                                       ZigZag.mq5 |
//|                        Copyright 2009, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_plots   1
//---- plot Zigzag
#property indicator_label1  "Zigzag"
#property indicator_type1   DRAW_SECTION
#property indicator_color1  Red
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input int      ExtDepth=12;
input int      ExtDeviation=5;
input int      ExtBackstep=3;
//--- indicator buffers
double         ZigzagBuffer[];      // main buffer
double         HighMapBuffer[];     // highs
double         LowMapBuffer[];      // lows
int            level=3;             // recounting depth
double         deviation;           // deviation in points
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ZigzagBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,HighMapBuffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(2,LowMapBuffer,INDICATOR_CALCULATIONS);

//--- set short name and digits   
   PlotIndexSetString(0,PLOT_LABEL,"ZigZag("+(string)ExtDepth+","+(string)ExtDeviation+","+(string)ExtBackstep+")");
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//--- set empty value
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
//--- to use in cycle
   deviation=ExtDeviation*_Point;
//---
   return(INIT_SUCCEEDED);
  }


2. 빠른 하향식 개요

이제 하향식 접근 방식을 사용하여 MQL5 표준 라이브러리에 통합하려는 새로운 객체 지향 지그재그 지표를 생각해 보겠습니다. 즉, 먼저 전체 시스템을 살펴본 다음 시스템의 작은 부분을 분석해야 합니다. 그렇다면 더 큰 그림을 보기 위해 두 개의 더미 EA를 코딩하지 않는 이유는 무엇입니까? 객체 지향 버전과 함께 절차적 스타일의 Expert Advisor를 작성해 보겠습니다.


2.1. 상자에서 나온 지그재그

중급 MQL5 개발자는 아마도 다음과 같이 EA에서 ZigZag 지표를 사용할 것입니다.

//+----------------------------------------------------------------------+
//|                                            ExpertOriginalZigZag.mq5  |
//|                   Copyright © 2013, Laplacianlab - Jordi Bassagañas  | 
//+----------------------------------------------------------------------+
//--- EA properties
#property copyright     "Copyright © 2013, Laplacianlab - Jordi Bassagañas"
#property link          "https://www.mql5.com/ko/articles"
#property version       "1.00"
#property description   "This dummy Expert Advisor is just for showing how to use the original MetaQuotes' ZigZag indicator."
//--- EA inputs
input ENUM_TIMEFRAMES   EAPeriod=PERIOD_H1;
input string            CurrencyPair="EURUSD";
//--- global variables
int      zigZagHandle;
double   zigZagBuffer[];
double   zigZagHigh[];
double   zigZagLow[];
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   zigZagHandle=iCustom(CurrencyPair,EAPeriod,"zigzag",12,5,3);
   ArraySetAsSeries(zigZagBuffer,true);
   ArraySetAsSeries(zigZagHigh,true);
   ArraySetAsSeries(zigZagLow,true);  
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   IndicatorRelease(zigZagHandle);
   ArrayFree(zigZagBuffer);
   ArrayFree(zigZagHigh);
   ArrayFree(zigZagLow);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   //--- refresh data   
   if(CopyBuffer(zigZagHandle,0,0,2,zigZagBuffer)<0)
   {
      Print("Can't copy ZigZag buffer 0!");
      return;
   }
   if(CopyBuffer(zigZagHandle,1,0,2,zigZagHigh)<0)
   {
      Print("Can't copy ZigZag buffer 1!");
      return;
   }
   if(CopyBuffer(zigZagHandle,2,0,2,zigZagLow)<0)
   {
      Print("Can't copy ZigZag buffer 2!");
      return;
   }
   //--- print values
   if(zigZagBuffer[0]!=0) Print("zigZagBuffer[0]: ", zigZagBuffer[0]);
   if(zigZagHigh[0]!=0) Print("zigZagHigh[0]: ", zigZagHigh[0]);
   if(zigZagLow[0]!=0) Print("zigZagLow[0]: ", zigZagLow[0]);
  }
//+------------------------------------------------------------------+


2.2. 표준 라이브러리에 통합된 지그재그

반면에 고급 MQL5 개발자는 이미 표준 라이브러리 지표와 마찬가지로 다음과 같이 ZigZag 지표로 작업하기를 원할 것입니다.

//+----------------------------------------------------------------------+
//|                                                  ExpertOOZigZag.mq5  |
//|                   Copyright © 2013, Laplacianlab - Jordi Bassagañas  | 
//+----------------------------------------------------------------------+
#include <..\Include\Indicators\Custom\Trend.mqh>
//--- EA properties
#property copyright     "Copyright © 2013, Laplacianlab - Jordi Bassagañas"
#property link          "https://www.mql5.com/ko/articles"
#property version       "1.00"
#property description   "This dummy Expert Advisor is just for showing how to use the object-oriented version of MetaQuotes' ZigZag indicator."
//--- EA inputs
input ENUM_TIMEFRAMES   EAPeriod=PERIOD_H1;
input string            CurrencyPair="EURUSD";
//--- global variables
CiZigZag *ciZigZag;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   ciZigZag=new CiZigZag;
   ciZigZag.Create(CurrencyPair,EAPeriod,12,5,3);
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   delete(ciZigZag);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {   
   //--- refresh data
   ciZigZag.Refresh();
   //--- print values
   if(ciZigZag.ZigZag(0)!=0) Print("OO ZigZag buffer: ", ciZigZag.ZigZag(0));
   if(ciZigZag.High(0)!=0) Print("OO ZigZag high: ", ciZigZag.High(0));
   if(ciZigZag.Low(0)!=0) Print("OO ZigZag low: ",ciZigZag.Low(0));
  }
//+------------------------------------------------------------------+


2.3. 결론

두 번째 솔루션은 객체 지향이기 때문에 더 좋습니다. 개체지향 클래스가 개발되면 절차적 대응물과 함께 작업하는 것보다 지그재그의 객체 지향 기능과 상호 작용하는 것이 훨씬 쉽다는 것을 관찰하는 것이 직관적입니다. 그러나 객체 지향 라이브러리로 작업할 때 얻을 수 있는 이점을 간단히 상기해 보겠습니다.

  • OOP를 사용하면 문제를 쉽게 모델링할 수 있습니다.
  • OOP를 사용하면 코드를 쉽게 재사용할 수 있으므로 비용, 안정성, 유연성 및 유지 관리에 이점이 있습니다.
  • 이 패러다임은 ADT(추상 데이터 유형) 생성을 가능하게 합니다. ADT는 모든 프로그래밍 언어에 존재하는 데이터 유형의 전통적인 개념을 추상화한 것입니다.

그림 3. 정이십면체 견고한 개념을 바탕으로 앱을 구축하는 것은 디자인을 제시간에 유지하는 품질 보증입니다.

그림 3. 정이십면체 견고한 개념을 바탕으로 앱을 구축하는 것은 디자인을 제시간에 유지하는 품질 보증입니다.


3. 새로운 OO ZigZag를 MQL5 표준 라이브러리에 통합

이 글의 도입부에서 말했듯이, 우리는 이전에 다운로드한 ZigZag를 래핑하기 위한 새로운 클래스 세트를 구축하기 위해 MetaQuotes의 객체 지향 스타일에서 영감을 얻었습니다. 이것은 쉽습니다. Include\Indicators 내부의 파일을 살펴보고 MQL5 표준 라이브러리 이면에 있는 몇 가지 아이디어를 연구하고 이해하기만 하면 됩니다. MetaQuotes의 Trend.mqh 내부에 있는 내용을 보면 ADX, 볼린저 밴드, SAR, 이동 평균 등 일부 기술 지표를 나타내는 클래스로 가득 차 있다는 것을 곧 깨닫게 될 것입니다. 이 모든 클래스는 CIndicator에서 상속됩니다. 따라서 이 계획을 구현해 보겠습니다. 그건 그렇고, MQL5의 클래스 CiCustom에서 새로운 OO 지표를 확장하는 것은 이 연습을 구현하는 또 다른 대안이 되었을 것입니다.

먼저 새 폴더 Include\Indicators\Custom을 만들고 바로 뒤에 새 파일 Include\Indicators\Custom\Trend.mqh를 만들어 거기에 코딩하겠습니다. MetaQuotes가 Include\Indicators\Trend.mqh에서 수행하는 것처럼 자체 기술 지표. 다음은 이미 구현된 확장 파일 Include\Indicators\Custom\Trend.mqh입니다. 나는 그것을 코딩하는 데 필요한 몇 가지 기술적 측면에 대해 아래에서 논의할 것입니다.

//+------------------------------------------------------------------+
//|                              Include\Indicators\Custom\Trend.mqh |
//|                  Copyright 2013, Laplacianlab - Jordi Bassagañas |
//|                     https://www.mql5.com/en/users/laplacianlab |
//+------------------------------------------------------------------+
#include <..\Include\Indicators\Indicator.mqh>
//+------------------------------------------------------------------+
//| Class CiZigZag.                                                  |
//| Purpose: Class of the "ZigZag" indicator.                        |
//|          Derives from class CIndicator.                          |
//+------------------------------------------------------------------+
class CiZigZag : public CIndicator
  {
protected:
   int               m_depth;
   int               m_deviation;
   int               m_backstep;

public:
                     CiZigZag(void);
                    ~CiZigZag(void);
   //--- methods of access to protected data
   int               Depth(void)          const { return(m_depth);      }
   int               Deviation(void)      const { return(m_deviation);  }
   int               Backstep(void)       const { return(m_backstep);   }
   //--- method of creation
   bool              Create(const string symbol,const ENUM_TIMEFRAMES period,
                            const int depth,const int deviation_create,const int backstep);
   //--- methods of access to indicator data
   double            ZigZag(const int index) const;
   double            High(const int index) const;
   double            Low(const int index) const;
   //--- method of identifying
   virtual int       Type(void) const { return(IND_CUSTOM); }

protected:
   //--- methods of tuning
   virtual bool      Initialize(const string symbol,const ENUM_TIMEFRAMES period,const int num_params,const MqlParam &params[]);
   bool              Initialize(const string symbol,const ENUM_TIMEFRAMES period,
                                const int depth,const int deviation_init,const int backstep);
  };
//+------------------------------------------------------------------+
//| Constructor                                                      |
//+------------------------------------------------------------------+
CiZigZag::CiZigZag(void) : m_depth(-1),
                         m_deviation(-1),
                         m_backstep(-1)
  {
  }
//+------------------------------------------------------------------+
//| Destructor                                                       |
//+------------------------------------------------------------------+
CiZigZag::~CiZigZag(void)
  {
  }
//+------------------------------------------------------------------+
//| Create indicator "Zig Zag"                                       |
//+------------------------------------------------------------------+
bool CiZigZag::Create(const string symbol,const ENUM_TIMEFRAMES period,
                      const int depth,const int deviation_create,const int backstep)
  {
//--- check history
   if(!SetSymbolPeriod(symbol,period))
      return(false);
//--- create
   m_handle=iCustom(symbol,period,"zigzag",depth,deviation_create,backstep);
//--- check result
   if(m_handle==INVALID_HANDLE)
      return(false);
//--- indicator successfully created
   if(!Initialize(symbol,period,depth,deviation_create,backstep))
     {
      //--- initialization failed
      IndicatorRelease(m_handle);
      m_handle=INVALID_HANDLE;
      return(false);
     }
//--- ok
   return(true);
  }
//+------------------------------------------------------------------+
//| Initialize the indicator with universal parameters               |
//+------------------------------------------------------------------+
bool CiZigZag::Initialize(const string symbol,const ENUM_TIMEFRAMES period,const int num_params,const MqlParam &params[])
  {
   return(Initialize(symbol,period,(int)params[0].integer_value,(int)params[1].integer_value,(int)params[2].integer_value));
  }
//+------------------------------------------------------------------+
//| Initialize indicator with the special parameters                 |
//+------------------------------------------------------------------+
bool CiZigZag::Initialize(const string symbol,const ENUM_TIMEFRAMES period,
                        const int depth,const int deviation_init,const int backstep)
  {
   if(CreateBuffers(symbol,period,3))
     {
      //--- string of status of drawing
      m_name  ="ZigZag";
      m_status="("+symbol+","+PeriodDescription()+","+
               IntegerToString(depth)+","+IntegerToString(deviation_init)+","+
               IntegerToString(backstep)+") H="+IntegerToString(m_handle);
      //--- save settings
      m_depth=depth;
      m_deviation=deviation_init;
      m_backstep=backstep;       
      //--- create buffers
      ((CIndicatorBuffer*)At(0)).Name("ZIGZAG");
      ((CIndicatorBuffer*)At(1)).Name("HIGH");
      ((CIndicatorBuffer*)At(2)).Name("LOW");
      //--- ok
      return(true);
     }
//--- error
   return(false);
  }
//+------------------------------------------------------------------+
//| Access to ZigZag buffer of "Zig Zag"                             |
//+------------------------------------------------------------------+
double CiZigZag::ZigZag(const int index) const
  {
   CIndicatorBuffer *buffer=At(0);
//--- check
   if(buffer==NULL)
      return(EMPTY_VALUE);
//---
   return(buffer.At(index));
  }
//+------------------------------------------------------------------+
//| Access to High buffer of "Zig Zag"                               |
//+------------------------------------------------------------------+
double CiZigZag::High(const int index) const
  {
   CIndicatorBuffer *buffer=At(1);
//--- check
   if(buffer==NULL)
      return(EMPTY_VALUE);
//---
   return(buffer.At(index));
  }
//+------------------------------------------------------------------+
//| Access to Low buffer of "Zig Zag"                                |
//+------------------------------------------------------------------+
double CiZigZag::Low(const int index) const
  {
   CIndicatorBuffer *buffer=At(2);
//--- check
   if(buffer==NULL)
      return(EMPTY_VALUE);
//---
   return(buffer.At(index));
  }
//+------------------------------------------------------------------+


3.1. 객체 지향 캡슐화

개체지향 캡슐화는 개체의 데이터 멤버가 개체에 대해 정의된 작업에 의해서만 수정될 수 있음을 의미하는 좋은 프로그래밍 방법입니다. MetaQuotes의 Trend.mqh에 정의된 모든 클래스가 이 아이디어를 구현하므로 우리도 똑같이 하고 있습니다.

한편으로는 CiZigZag의 특정 보호 속성이 있습니다.

protected:
   int               m_depth;
   int               m_deviation;
   int               m_backstep;

그 후, 위에 정의된 보호 속성 CiZigZag 유형의 지정된 개체 외부에서 액세스하기 위한 CiZigZag의 공개 인터페이스가 있습니다.

public:
   //--- methods of access to protected data
   int               Depth(void)          const { return(m_depth);      }
   int               Deviation(void)      const { return(m_deviation);  }
   int               Backstep(void)       const { return(m_backstep);   }

이것은 개체를 격리하기 위한 보안 조치입니다. 이 캡슐화는 개체 데이터에 액세스할 수 없는 사람이나 무언가에 의해 수행된 임의 수정으로부터 보호합니다.


3.2. ZigZag의 데이터에 접근하기

이 글의 첫 번째 섹션에서 볼 수 있듯이 zigzag.mq5라는 소스 코드 파일은 세 개의 버퍼를 생성합니다.

//--- indicator buffers mapping
   SetIndexBuffer(0,ZigzagBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,HighMapBuffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(2,LowMapBuffer,INDICATOR_CALCULATIONS);

객체 지향 캡슐화를 통해 CiZigZag의 메소드 ZigZag(const int index), High(const int index)Low( const int index) 초기화 에서 이전에 생성된 지표 버퍼를 반환합니다. 객체 지향 래퍼 CIndicatorBuffer가 MQL5의 클래스 Include\Indicators\Indicator.mqh에 정의되어 있다는 점에 유의하는 것이 중요합니다. CIindicatorBuffer는 이 세 가지 방법의 핵심입니다. 우리는 이미 MQL5 API에 빠져 있습니다!

다음은 CiZigZag의 High 버퍼에 액세스하는 코드입니다.

//+------------------------------------------------------------------+
//| Access to High buffer of "Zig Zag"                               |
//+------------------------------------------------------------------+
double CiZigZag::High(const int index) const
  {
   CIndicatorBuffer *buffer=At(1);
//--- check
   if(buffer==NULL)
      return(EMPTY_VALUE);
//---
   return(buffer.At(index));
  }


3.3.
다형성, 오버로딩 및 가상 함수

이전 섹션에서 객체 지향 프로그래밍의 가장 중요한 기능 중 하나인 캡슐화에 대해 간략하게 논의했습니다. 음, Include\Indicators\Indicator.mqh와 파일 Include\Indicators\Custom\Trend.mqh에 포함된 클래스는 OOP 패러다임의 또 다른 두 가지 측면인 다형성 그리고 메소드 및 오버로딩을 다룹니다.

다형성은 동일한 인터페이스를 통해 다양한 에 액세스할 수 있는 기능을 가지고 있습니다. 이렇게 하면 지정된 식별자가 위치한 컨텍스트에 따라 여러 형식을 취할 수 있습니다. 다형성을 구현하려면 상속 메커니즘이 필요합니다. 반면에 메소드 오버로딩은 동일한 이름을 공유하지만 매개변수 선언이 다른 여러 메소드를 생성할 수 있는 또 다른 OOP 기능입니다.

이것은 매우 짧은 소개입니다. 이 글에서는 이러한 주제에 대해 논의할 공간이 충분하지 않으므로 해당 주제에 대해 자세히 알아보는 것은 여러분에게 남겨진 연습 문제입니다. MQL5 섹션 다형성과부하를 읽어보세요. 어쨌든 우리는 표준 라이브러리가 모든 OOP 기능을 구현하는 것을 볼 수 있습니다. 따라서 우리가 그것들을 더 잘 알수록 우리의 요구에 맞게 API를 더 잘 확장할 수 있습니다.

이 모든 말과 함께 주목해야 할 것이 하나 더 있습니다. MQL5는 가상 함수라는 메커니즘으로 다형성을 구현합니다. 다시 한 번 MQL5 섹션 가상 기능을 읽고 작동 방식을 이해하십시오.

이것이 CiZigZag의 초기화 방법을 다음과 같이 코딩하는 이유입니다.

//+------------------------------------------------------------------+
//| Initialize the indicator with universal parameters               |
//+------------------------------------------------------------------+
bool CiZigZag::Initialize(const string symbol,const ENUM_TIMEFRAMES period,const int num_params,const MqlParam &params[])
  {
   return(Initialize(symbol,period,(int)params[0].integer_value,(int)params[1].integer_value,(int)params[2].integer_value));
  }
//+------------------------------------------------------------------+
//| Initialize indicator with the special parameters                 |
//+------------------------------------------------------------------+
bool CiZigZag::Initialize(const string symbol,const ENUM_TIMEFRAMES period,
                        const int depth,const int deviation_init,const int backstep)
  {
   if(CreateBuffers(symbol,period,3))
     {
      //--- string of status of drawing
      m_name  ="ZigZag";
      m_status="("+symbol+","+PeriodDescription()+","+
               IntegerToString(depth)+","+IntegerToString(deviation_init)+","+
               IntegerToString(backstep)+") H="+IntegerToString(m_handle);
      //--- save settings
      m_depth=depth;
      m_deviation=deviation_init;
      m_backstep=backstep;       
      //--- create buffers
      ((CIndicatorBuffer*)At(0)).Name("ZIGZAG");
      ((CIndicatorBuffer*)At(1)).Name("HIGH");
      ((CIndicatorBuffer*)At(2)).Name("LOW");
      //--- ok
      return(true);
     }
//--- error
   return(false);
  }

4. 표준 라이브러리에서 이미 사용 가능한 새로운 OO ZigZag 테스트

물론, OO 개발에서 귀하가 개발한 확장을 사용하기 전에 먼저 예상대로 작동하는지 확인해야 합니다. 새 사용자 지정 구성 요소에 대해 포괄적인 테스트 집합을 실행하는 것이 좋습니다. 그러나 단순화 문제에 대해 이제 우리는 CiZigZag의 세 가지 주요 방법을 마주하게 됩니다. 즉, ZigZag(const int index), 높음(const int index)낮음(const int index)이 이에 해당합니다.

모든 EA의 틱에 이 세 가지 방법으로 계산된 값을 프린트한 다음 더미 절차 EA인 ExpertOriginalZigZag.ex5에서 생성된 출력을 더미 객체 지향 EA인 ExpertOOZigZag.ex5에 의해 생성된 출력과 비교할 것입니다. 얻은 두 출력이 모두 같을 때마다 새 확장이 정상이라는 결론을 내릴 수 있으며 MQL5 API에 통합된 OO ZigZag를 사용할 수 있습니다.

그림 4. ExpertOriginalZigZag.ex5에서 생성된 출력과 ExpertOOZigZag.ex5에서 생성된 출력을 비교하고 있습니다.

그림 4. ExpertOriginalZigZag.ex5에서 생성된 출력과 ExpertOOZigZag.ex5에서 생성된 출력을 비교하고 있습니다.

따라서 다음 매개변수가 설정된 전략 테스터에서 이 글의 시작 부분에 제시된 두 개의 EA인 ExpertOriginalZigZag.ex5ExpertOOZigZag.ex5를 모두 실행합니다.

  • 기호: EURUSD, H1
  • 날짜: 사용자 지정 기간, 2013.08.01~2013.08.15
  • 실행: 일반, 1분 OHLC
  • 보증금: 10000 USD, 1:100
  • 최적화: 없음

두 로봇 모두 동일한 결과를 프린트하므로 CiZigZag가 잘 구현되어 지금부터 개발에 사용할 수 있다는 결론을 내렸습니다.

ExpertOriginalZigZag.ex5에 의해 생성된 로그:

DE      0       18:45:39        ExpertOriginalZigZag (EURUSD,H1)        2013.08.01 08:50:40   zigZagBuffer[0]: 1.32657
ML      0       18:45:39        ExpertOriginalZigZag (EURUSD,H1)        2013.08.01 08:50:40   zigZagLow[0]: 1.32657
FL      0       18:45:39        ExpertOriginalZigZag (EURUSD,H1)        2013.08.01 08:50:59   zigZagBuffer[0]: 1.32657
GE      0       18:45:39        ExpertOriginalZigZag (EURUSD,H1)        2013.08.01 08:50:59   zigZagLow[0]: 1.32657
KS      0       18:45:39        ExpertOriginalZigZag (EURUSD,H1)        2013.08.01 08:51:00   zigZagBuffer[0]: 1.32657
FR      0       18:45:39        ExpertOriginalZigZag (EURUSD,H1)        2013.08.01 08:51:00   zigZagLow[0]: 1.32657
GK      0       18:45:39        ExpertOriginalZigZag (EURUSD,H1)        2013.08.01 08:51:20   zigZagBuffer[0]: 1.32653
RJ      0       18:45:39        ExpertOriginalZigZag (EURUSD,H1)        2013.08.01 08:51:20   zigZagLow[0]: 1.32653
OR      0       18:45:39        ExpertOriginalZigZag (EURUSD,H1)        2013.08.01 08:51:40   zigZagBuffer[0]: 1.32653
FS      0       18:45:39        ExpertOriginalZigZag (EURUSD,H1)        2013.08.01 08:51:40   zigZagLow[0]: 1.32653
QJ      0       18:45:39        ExpertOriginalZigZag (EURUSD,H1)        2013.08.01 08:51:59   zigZagBuffer[0]: 1.32653
PH      0       18:45:39        ExpertOriginalZigZag (EURUSD,H1)        2013.08.01 08:51:59   zigZagLow[0]: 1.32653
JQ      0       18:45:39        ExpertOriginalZigZag (EURUSD,H1)        2013.08.01 08:52:00   zigZagBuffer[0]: 1.32653
KP      0       18:45:39        ExpertOriginalZigZag (EURUSD,H1)        2013.08.01 08:52:00   zigZagLow[0]: 1.32653
RH      0       18:45:39        ExpertOriginalZigZag (EURUSD,H1)        2013.08.01 08:52:20   zigZagBuffer[0]: 1.32653
GI      0       18:45:39        ExpertOriginalZigZag (EURUSD,H1)        2013.08.01 08:52:20   zigZagLow[0]: 1.32653
GP      0       18:45:39        ExpertOriginalZigZag (EURUSD,H1)        2013.08.01 08:52:40   zigZagBuffer[0]: 1.32614
// More data here!..

ExpertOOZigZag.ex5에 의해 생성된 로그:

RP      0       18:48:02        ExpertOOZigZag (EURUSD,H1)      2013.08.01 08:50:40   OO ZigZag buffer(0): 1.32657
HQ      0       18:48:02        ExpertOOZigZag (EURUSD,H1)      2013.08.01 08:50:40   OO ZigZag low(0): 1.32657
DI      0       18:48:02        ExpertOOZigZag (EURUSD,H1)      2013.08.01 08:50:59   OO ZigZag buffer(0): 1.32657
RH      0       18:48:02        ExpertOOZigZag (EURUSD,H1)      2013.08.01 08:50:59   OO ZigZag low(0): 1.32657
QR      0       18:48:02        ExpertOOZigZag (EURUSD,H1)      2013.08.01 08:51:00   OO ZigZag buffer(0): 1.32657
GS      0       18:48:02        ExpertOOZigZag (EURUSD,H1)      2013.08.01 08:51:00   OO ZigZag low(0): 1.32657
IK      0       18:48:02        ExpertOOZigZag (EURUSD,H1)      2013.08.01 08:51:20   OO ZigZag buffer(0): 1.32653
GJ      0       18:48:02        ExpertOOZigZag (EURUSD,H1)      2013.08.01 08:51:20   OO ZigZag low(0): 1.32653
EL      0       18:48:02        ExpertOOZigZag (EURUSD,H1)      2013.08.01 08:51:40   OO ZigZag buffer(0): 1.32653
OD      0       18:48:02        ExpertOOZigZag (EURUSD,H1)      2013.08.01 08:51:40   OO ZigZag low(0): 1.32653
OE      0       18:48:02        ExpertOOZigZag (EURUSD,H1)      2013.08.01 08:51:59   OO ZigZag buffer(0): 1.32653
IO      0       18:48:02        ExpertOOZigZag (EURUSD,H1)      2013.08.01 08:51:59   OO ZigZag low(0): 1.32653
DN      0       18:48:02        ExpertOOZigZag (EURUSD,H1)      2013.08.01 08:52:00   OO ZigZag buffer(0): 1.32653
RF      0       18:48:02        ExpertOOZigZag (EURUSD,H1)      2013.08.01 08:52:00   OO ZigZag low(0): 1.32653
PP      0       18:48:02        ExpertOOZigZag (EURUSD,H1)      2013.08.01 08:52:20   OO ZigZag buffer(0): 1.32653
RQ      0       18:48:02        ExpertOOZigZag (EURUSD,H1)      2013.08.01 08:52:20   OO ZigZag low(0): 1.32653
MI      0       18:48:02        ExpertOOZigZag (EURUSD,H1)      2013.08.01 08:52:40   OO ZigZag buffer(0): 1.32614
// More data here!..

결론

MQL5 표준 라이브러리는 개발자로서의 삶을 더 쉽게 만들어줍니다. 그럼에도 불구하고 전 세계 모든 개발자의 요구 사항을 모두 구현할 수는 없으므로 사용자 지정 항목을 만들어야 하는 지점이 항상 있습니다. EA와 지표가 점점 더 복잡해짐에 따라 프레임워크 개발과 관련된 개념을 마스터하는 것이 더 필요합니다. MQL5 표준 라이브러리를 확장하는 것은 애플리케이션의 성공적인 수명을 보장하는 품질 보증입니다.

Code Base에서 먼저 ZigZag 지표를 다운로드하여 코드 재사용을 활용했습니다. MetaTrader 5 터미널에서 사용할 수 있게 되면 새로운 객체 지향 ZigZag 지표를 생각하기 시작하기 위해 하향식 접근 방식을 취했습니다. 우리는 전체 시스템을 전반적으로 살펴본 다음 계속 분석했습니다. 개발의 첫 번째 단계에서 우리는 절차적 스타일의 ZigZag 지표를 사용하는 더미 EA를 객체 지향 대응물과 비교했습니다.

우리는 MetaQuotes의 설계 철학에 따라 설계된 객체 지향 클래스로 ZigZag 지표를 래핑했으며, 표준 라이브러리 구축에도 동일하게 적용되었습니다. 그리고 마지막으로 우리는 이미 MQL5 API에 통합된 새로운 CiZigZag 래퍼가 잘 구현되었다는 결론을 내리는 몇 가지 간단한 테스트를 실행합니다.


MetaQuotes 소프트웨어 사를 통해 영어가 번역됨
원본 기고글: https://www.mql5.com/en/articles/741

파일 첨부됨 |
expertoozigzag.mq5 (2.03 KB)
trend.mqh (6.34 KB)
zigzag.mq5 (9.34 KB)
MQL5 Coobook: 지정된 기준에 따라 Expert Advisor의 최적화 결과 저장 MQL5 Coobook: 지정된 기준에 따라 Expert Advisor의 최적화 결과 저장
MQL5 프로그래밍에 대한 글 시리즈를 계속합니다. 이번에는 Expert Advisor 매개변수 최적화 중에 각 최적화 패스의 결과를 얻는 방법을 살펴보겠습니다. 구현은 외부 매개변수에 지정된 조건이 충족되면 해당 통과 값이 파일에 기록되도록 수행됩니다. 테스트 값 외에도 그러한 결과를 가져온 매개변수도 저장합니다.
기술 지표 및 디지털 필터 기술 지표 및 디지털 필터
이 글에서 기술 지표는 디지털 필터로 취급됩니다. 디지털 필터의 작동 원리와 기본 특성을 설명합니다. 또한 MetaTrader 5 터미널에서 필터 커널을 수신하고 "스펙트럼 분석기 구축" 글에서 제안한 기성 스펙트럼 분석기와 통합하는 몇 가지 실용적인 방법을 고려합니다. 일반적인 디지털 필터의 펄스 및 스펙트럼 특성을 예로 사용합니다.
MQL5 Coobook: MetaTrader 5 거래 이벤트에 대한 소리 알림 MQL5 Coobook: MetaTrader 5 거래 이벤트에 대한 소리 알림
이 글에서는 Expert Advisor의 파일에 사운드 파일을 포함하여 거래 이벤트에 사운드 알림을 추가하는 것과 같은 문제를 고려할 것입니다. 파일이 포함된다는 사실은 사운드 파일이 Expert Advisor 내부에 위치한다는 것을 의미합니다. 따라서 Expert Advisor의 컴파일된 버전(*.ex5)을 다른 사용자에게 제공할 때 사운드 파일도 제공하고 저장해야 하는 위치를 설명할 필요가 없습니다.
선형 거래 시스템을 강화하세요 선형 거래 시스템을 강화하세요
오늘의 글에서는 중급 MQL5 프로그래머가 소위 지수 기법을 쉽게 구현하여 선형 거래 시스템(고정 랏)에서 더 많은 이익을 얻을 수 있는 방법을 보여줍니다. 이는 그 결과 주식 곡선 성장이 포물선의 형태를 취하는 기하학적 또는 지수적이기 때문입니다. 특히, Ralph Vince가 개발한 고정 분수 위치 크기 조정의 실용적인 MQL5 변형을 구현합니다.