English Русский 中文 Español Deutsch 日本語 Português Français Italiano Türkçe
MQL5 마법사: 위험 및 자금 관리 모듈을 만드는 방법

MQL5 마법사: 위험 및 자금 관리 모듈을 만드는 방법

MetaTrader 5트레이딩 시스템 | 4 8월 2021, 16:53
53 0
MetaQuotes
MetaQuotes

소개

MetaTrader 5 는 다양한 거래 아이디어를 빠르게 확인할 수 있는 강력한 도구를 제공합니다. 이것은 준비된 거래 전략을 기반으로 MQL5 마법사를 사용하는 Expert Advisors의 생성입니다.

MQL5 마법사로 생성된 Expert Advisor는 4개의 기본 요소(4개의 기본 클래스)를 기반으로 합니다.

그림 1. CExpert 기본 클래스의 구조

그림 1. CExpert 기본 클래스의 구조

  1. CExpert 클래스(또는 그 하위 클래스)는 Expert Advisor의 주요 "엔진"입니다. CExpert의 인스턴스에는 CExpertSignal, CExpertMoneyCExpertTrailing(또는 해당 하위 클래스)의 각 클래스 사본이 하나씩 포함됩니다.
  2. CExpertSignal은 거래 신호 생성기의 기초입니다. CExpert에 포함된 CExpertSignal 파생 클래스의 인스턴스는 Expert Advisor에게 시장 진입 가능성, 진입 수준 및 보호 주문 배치에 대한 정보를 제공합니다. 내장 알고리즘을 기반으로 말이죠. Expert Advisor는 시장 진입 여부를 결정합니다. CExpertSignal 클래스 및 작업에 대한 자세한 내용은 "MQL5 마법사: 거래 신호 모듈을 만드는 방법" 문서에 설명되어 있습니다.
  3. CExpertMoney 클래스는 위험 및 자금 관리 메커니즘의 기초입니다. CExpert에 포함된 CExpertMoney 파생 클래스의 인스턴스는 내장된 알고리즘을 기반으로 포지션을 개설하고 보류 중인 주문을 할 수 있는 볼륨에 대한 정보를 Expert Advisor에 제공합니다. Expert Advisor가 볼륨에 대한 결정을 내립니다.
  4. CExpertTrailing 클래스는 오픈 포지션 지원 메커니즘의 기초입니다. CExpert에 포함된 CExpertTrailing 파생 클래스의 인스턴스는 기본 제공 알고리즘을 기반으로 위치의 보호 명령을 수정할 가능성에 대한 정보를 EA에 제공합니다. Expert Advisor가 주문 수정에 대한 결정을 내립니다. CExpertTrailing 클래스 및 작업에 대한 자세한 내용은 별도의 문서에서 설명합니다.

또한 CExpert 클래스의 멤버는 다음 클래스의 인스턴스입니다.

  • CExpertTrade (거래용)
  • CIndicators(EA 작업과 관련된 지표 및 시계열 제어용).
  • CSymbolInfo(기기에 대한 정보 얻기용)
  • CAAccountInfo(거래 계정 상태에 대한 정보를 얻기 위해)
  • CPositionInfo (포지션에 대한 정보를 얻기 위해)
  • CORderInfo(대기 중인 주문에 대한 정보를 얻기 위해)

이하 "전문가"란 CExpert 또는 그 하위 클래스의 인스턴스를 의미합니다.

CExpert 및 작업에 대한 자세한 내용은 별도의 문서에서 설명합니다.


1. 기본 클래스 CExpertMoney

위에서 언급했듯이 CExpertMoney 클래스는 위험 및 자금 관리 메커니즘의 기초입니다. "외부 세계"와의 통신을 위해 CExpertMoney 클래스에는 공용 가상 메소드 집합이 있습니다.

초기화

 기술

가상 초기화

클래스 인스턴스의 초기화는 EA의 데이터와 모듈 데이터의 동기화를 제공합니다.

퍼센트

"위험 비율" 매개변수 값 설정

가상 검증 설정

설정된 매개변수 검증

가상 초기 지표

위험 및 자금 관리 메커니즘의 운영에 필요한 모든 지표 및 시계열 생성 및 초기화

포지션 오픈/턴/클로즈 필요성 확인 방법

 

가상 CheckOpenLong

롱 포지션을 열기 위한 거래량 결정

가상 CheckOpenShort

숏 포지션을 열기 위한 볼륨 결정

가상 CheckReverse

위치 반전을 위한 볼륨 결정

가상 CheckClose

포지션 청산의 필요성 판단


방법 설명


1.1. 초기화 방법

1.1.1 초기화

Init() 메소드는 클래스 인스턴스가 전문가에게 추가된 직후 자동으로 호출됩니다. 메소드 재정의가 필요하지 않습니다.

virtual bool Init(CSymbolInfo* symbol, ENUM_TIMEFRAMES period, double adjusted_point);

1.1.2 퍼센트

Percent() 메소드는 적절한 매개변수를 구성하기 위해 호출됩니다. 그 값은 0.0에서 100.0까지일 수 있습니다. 기본값은 100.0입니다. 메소드 재정의가 필요하지 않습니다.

void Percent(double percent);

1.1.3 검증 설정

ValidationSettings() 메소드는 모든 매개변수가 설정된 후 전문가로부터 바로 호출됩니다. 추가 설정 매개변수가 있는 경우 메소드를 재정의해야 합니다.

virtual bool ValidationSettings();

재정의된 메소드는 모든 옵션이 유효한 경우(사용 가능한 경우) true를 반환해야 합니다. 매개변수 중 하나 이상이 올바르지 않으면 false를 리턴해야 합니다(추가 작업 불가능). 재정의된 메소드는 결과 확인과 함께 기본 클래스 메소드를 호출해야 합니다.

CExpertMoney 기본 클래스에는 Percent 매개 변수가 있으므로 매개 변수 유효성 검사를 수행한 기본 클래스 메소드는 값이 허용 범위 내에 있으면 true를 반환하고 그렇지 않으면 false를 반환합니다.

1.1.4 초기 지표

InitIndicators() 메소드는 필요한 모든 지표 및 시계열의 생성 및 초기화를 구현합니다. 모든 매개변수가 설정되고 그 정확성이 성공적으로 검증된 후 전문가로부터 호출됩니다. 위험 및 자금 관리 메커니즘이 하나 이상의 지표 또는 시계열을 사용하는 경우 이 방법을 재정의해야 합니다.

virtual bool InitIndicators(CIndicators* indicators);

지표 및/또는 시계열은 표준 라이브러리의 적절한 클래스를 통해 사용해야 합니다. 모든 지표 및/또는 시계열의 포인터는 전문가의 지표 컬렉션에 추가되어야 합니다(매개변수로 전달되는 포인터).

재정의된 메소드는 지표 및/또는 시계열을 사용한 모든 조작이 성공한 경우 true를 반환해야 합니다(사용하기에 적합함). 지표 및/또는 시계열을 사용하여 하나 이상의 작업이 실패한 경우 메소드는 false를 반환해야 합니다(추가 작업은 불가능함).

기본 클래스 CExpertMoney는 지표 또는 시계열을 사용하지 않으므로 기본 클래스 메소드는 작업을 수행하지 않고 항상 true를 반환합니다.

1.2. 위치의 볼륨을 결정하는 방법

1.2.1 CheckOpenLong

CheckOpenLong() 메소드는 롱 포지션을 열기 위한 볼륨을 계산합니다. 롱 포지션을 열기 위한 볼륨을 결정하기 위해 전문가가 명령을 내리게 됩니다. 기본 클래스에서 구현된 알고리즘과 다른 알고리즘을 사용하여 롱 포지션 개시 거래량을 계산할 것으로 예상되는 경우 이 메소드를 재정의해야 합니다.

\virtual double CheckOpenLong(double price, double sl);

이 방법은 롱 포지션을 열기 위한 거래량을 계산하는 알고리즘을 구현해야 합니다. 메소드는 계산된 볼륨을 반환해야 합니다.

CExpertMoney 기본 클래스에는 실제로 롱 포지션을 열기 위한 볼륨을 계산하는 내장 알고리즘이 없습니다. 기본 클래스 메소드는 항상 금융 상품에 대해 가능한 최소 볼륨을 반환합니다.

1.2.2 CheckOpenShort

CheckOpenShort() 메소드는 매도 포지션을 열기 위한 볼륨을 계산합니다. 숏 포지션을 열기 위한 볼륨을 결정하기 위해 전문가가 명령을 내리게 됩니다. 기본 클래스에서 구현된 알고리즘과 다른 알고리즘을 사용하여 매도 포지션 개시 거래량을 계산할 것으로 예상되는 경우 이 메소드를 재정의해야 합니다. 

virtual double CheckOpenShort(double price, double sl);

이 방법은 매도 포지션을 열기 위한 거래량을 계산하는 알고리즘을 구현해야 합니다. 메소드는 계산된 볼륨을 반환해야 합니다.

CExpertMoney 기본 클래스에는 매도 포지션을 열기 위한 볼륨을 계산하기 위한 내장 알고리즘이 없습니다. 기본 클래스 메소드는 항상 금융 상품에 대해 가능한 최소 볼륨을 반환합니다.

1.2.3 CheckReverse

CheckReverse() 메소드는 포지션을 반전시키기 위한 볼륨을 계산합니다. 포지션 반전을 위한 거래량을 결정하기 위해 전문가가 명령을 내리게 됩니다. 기본 클래스에서 구현된 것과 다른 알고리즘을 사용하여 위치 반전 볼륨을 계산하려는 경우(예: 이중 볼륨을 사용한 반전) 메소드를 재정의해야 합니다. 

virtual double CheckReverse(CPositionInfo* position, double sl);

이 방법은 포지션을 반전시키기 위해 볼륨을 계산하는 알고리즘을 구현해야 하며 이에 대한 정보는 position 포인터로 얻을 수 있습니다. 메소드는 위치 반전에 대해 계산된 볼륨을 반환해야 합니다.

CExpertMoney 기본 클래스에는 위치 반전을 위한 볼륨 계산을 위한 다음과 같은 알고리즘이 있습니다. 결과는 가능한 가장 작은 볼륨으로 반대 포지션이 되도록 포지션을 반전시키는 것입니다.

1.2.4 CheckClose

CheckClose() 메소드는 포지션 청산이 필요한지 여부를 확인합니다(자금 관리 및 위험 관리 측면에서). 포지션을 청산해야 하는지 여부를 결정하기 위해 전문가가 명령을 내리게 됩니다. 기본 클래스에서 구현된 것과 다른 알고리즘(예: 부분 폐쇄)을 사용하여 포지션을 닫을 것으로 예상되는 경우 메소드를 재정의해야 합니다. 

virtual double CheckClose(CPositionInfo* position);

메소드는 포지션을 닫을 필요성을 정의하기 위한 알고리즘을 구현해야 하며, 위치 포인터에 의해 정보를 얻을 수 있습니다. 이 메소드는 포지션 청산을 위해 계산된 볼륨을 반환해야 합니다.

CExpertMoney에는 포지션 청산이 필요한지 여부를 결정하는 다음 알고리즘이 있습니다. 기본 클래스 메소드는 현재 포지션 손실이 보증금의 지정된 비율보다 큰 경우 포지션을 완전히 청산하도록 제안합니다. .


2. 자금 및 위험 관리 메커니즘 만들기

이제 CExpertMoney 기본 클래스의 구조를 검토한 후 고유한 위험 및 자금 관리 메커니즘을 만들 수 있습니다. 이하, 위험 및 자금 관리 메커니즘을 "money-manager"라고 합니다.

위에서 언급한 바와 같이 CExpertMoney 클래스는 공개 가상 "로프"의 집합입니다. 이 방법을 사용하면 전문가가 어떤 방향으로 진입하는 시장 규모에 대한 money-manager의 의견을 알 수 있습니다. .

따라서 우리의 주요 목표는 CExpertMoney 클래스에서 파생된 money-manager의 자체 클래스를 만들고 적절한 가상 메소드를 재정의하여 필요한 알고리즘을 구현하는 것입니다.

두 번째 문제(덜 중요하지 않음)는 MQL5 마법사에 클래스를 "보이게" 만드는 것입니다. 하지만, 먼저.

2.1. 거래 신호 생성기 클래스 생성

시작합시다.

먼저 mqh 확장자를 가진 포함 파일을 생성합니다(예: 동일한 MQL5 마법사 사용).

파일 메뉴에서 "만들기"를 선택하고(또는 Ctrl+N 키 조합을 누름) 포함된 파일의 생성을 나타냅니다.

그림 2. MQL5 마법사를 사용하여 포함 파일 만들기

그림 2. MQL5 마법사를 사용하여 포함 파일 만들기

파일이 money-manager로서 MQL5 Wizard에 의해 "탐지"되려면 Include\Expert 폴더에 생성되어야 합니다.

표준 라이브러리에서 휴지통을 제거하지 않으려면 MQL5 마법사에서 다음 매개변수를 지정하여 SampleMoney.mqh 파일을 생성하는 자체 폴더 Include\Expert\Money\MyMoneys를 생성합니다.

그림 3. 포함 파일의 위치 설정

그림 3. 포함 파일의 위치 설정

MQL5 Wizard 작업의 결과로 다음과 같은 패턴이 나타납니다.

//+------------------------------------------------------------------+
//|                                                  SampleMoney.mqh |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
//+------------------------------------------------------------------+
//| defines                                                          |
//+------------------------------------------------------------------+
// #define MacrosHello   "Hello, world!"
// #define MacrosYear    2010
//+------------------------------------------------------------------+
//| DLL imports                                                      |
//+------------------------------------------------------------------+
// #import "user32.dll"
//   int      SendMessageA(int hWnd,int Msg,int wParam,int lParam);
// #import "my_expert.dll"
//   int      ExpertRecalculate(int wParam,int lParam);
// #import
//+------------------------------------------------------------------+
//| EX5 imports                                                      |
//+------------------------------------------------------------------+
// #import "stdlib.ex5"
//   string ErrorDescription(int error_code);
// #import
//+------------------------------------------------------------------+

다음은 "수동" 작업일 뿐입니다. 불필요한 부분을 제거하고 필요한 것을 추가하십시오 - 빈 클래스 설명과 함께 표준 라이브러리의 포함 파일 ExpertMoney.mqh.

//+------------------------------------------------------------------+
//|                                                  SampleMoney.mqh |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
//+------------------------------------------------------------------+
//| Include files                                                    |
//+------------------------------------------------------------------+
#include <Expert\ExpertMoney.mqh>
//+------------------------------------------------------------------+
//| Class CSampleMoney.                                              |
//| Purpose: Class for risk and money management.                    |
//|             It is derived from the CExpertMoney class.           |
//+------------------------------------------------------------------+
class CSampleMoney : public CExpertMoney
  {
  };
//+------------------------------------------------------------------+

이제 알고리즘을 선택해야 합니다.

자금 관리의 기초로 우리는 다음 알고리즘을 사용합니다. "정상적인" 조건에서 고정된 미리 결정된 거래량을 사용하는 것이 제안됩니다. 그러나 이전 포지션이 손실로 마감된 경우 두 배의 거래량으로 포지션을 여는 것이 좋습니다.

이것을 우리 파일에 반영하십시오.

//+------------------------------------------------------------------+
//|                                                  SampleMoney.mqh |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
//+------------------------------------------------------------------+
//| Include files                                                    |
//+------------------------------------------------------------------+
#include <Expert\ExpertMoney.mqh>
//+------------------------------------------------------------------+
//| Class CSampleMoney.                                              |
//| Purpose: Class for risk and money management                     |
//|             doubling the volume after a loss deal.               |
//|             It is derived from the CExpertMoney class.           |
//+------------------------------------------------------------------+
class CSampleMoney : public CExpertMoney
  {
  };
//+------------------------------------------------------------------+

우리의 돈 관리자에 대한 설정 목록을 정의하십시오. 실제로 목록이 없을 것입니다. 모든 설정은 "정상적인" 조건에서 거래량을 결정하는 단일 매개변수에 포함됩니다.

매개변수는 클래스의 보호된 데이터 멤버에 저장됩니다. 매개변수에 대한 액세스는 적절한 공개 방법을 통해 구현됩니다. 클래스 생성자에서 매개변수는 기본값으로 초기화됩니다. 매개변수를 확인하기 위해 기본 클래스의 설명에 따라 가상 메소드 ValidationSettings를 재정의해 보겠습니다.

다음 변경 사항을 파일에 포함시켜봅시다:

//+------------------------------------------------------------------+
//|                                                  SampleMoney.mqh |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
//+------------------------------------------------------------------+
//| Include files                                                    |
//+------------------------------------------------------------------+
#include <Expert\ExpertMoney.mqh>
//+------------------------------------------------------------------+
//| Class CSampleMoney.                                              |
//| Purpose: Class for risk and money management                     |
//|             doubling the volume after a loss deal.               |
//|             It is derived from the CExpertMoney class.           |
//+------------------------------------------------------------------+
class CSampleMoney : public CExpertMoney
  {
protected:
   //--- setup parameters
   double            m_lots;   // deal volume for "normal" conditions

public:
                     CSampleMoney();
   //--- methods to set the parameters
   void              Lots(double lots) { m_lots=lots; }
  };
//+------------------------------------------------------------------+
//| Constructor CSampleMoney.                                        |
//| INPUT:  no.                                                      |
//| OUTPUT: no.                                                      |
//| REMARK: no.                                                      |
//+------------------------------------------------------------------+
void CSampleMoney::CSampleMoney()
  {
//--- setting the default values
   m_lots=0.1;
  }
//+------------------------------------------------------------------+

이와 별도로 ValidationSettings() 메소드를 구현하는 방법을 살펴보겠습니다. 요점은 기본 클래스에 이미 확인이 필요한 구성 매개변수가 하나 있다는 것입니다.

따라서 재정의된 ValidationSettings() 메소드에서 실행 결과를 확인하면서 기본 클래스의 ValidationSettings()를 호출해야 합니다.

ValidationSettings() 메소드 구현:

//+------------------------------------------------------------------+
//| Validation of the setup parameters.                              |
//| INPUT:  no.                                                      |
//| OUTPUT: true if the settings are correct, otherwise false.       |
//| REMARK: no.                                                      |
//+------------------------------------------------------------------+
bool CSampleMoney::ValidationSettings()
  {
//--- Call the base class method
   if(!CExpertMoney::ValidationSettings()) return(false);
//--- Validation of parameters
   if(m_lots<m_symbol.LotsMin() || m_lots>m_symbol.LotsMax())
     {
      printf(__FUNCTION__+": the deal volume must be in the range %f to %f",m_symbol.LotsMin(),m_symbol.LotsMax());
      return(false);
     }
   if(MathAbs(m_lots/m_symbol.LotsStep()-MathRound(m_lots/m_symbol.LotsStep()))>1.0E-10)
     {
      printf(__FUNCTION__+": the volume of the deal must be multiple of %f",m_symbol.LotsStep());
      return(false);
     }
//--- Successful completion
   return(true);
  }

설정이 완료되었습니다. 이제 money-manager의 작업을 진행해 보겠습니다. 우리는 이전 거래의 손실 여부를 결정하고 필요한 경우 거래량을 정의하는 방법이 필요합니다. 클래스 설명에서 선언합니다.

class CSampleMoney : public CExpertMoney
  {
protected:
   //--- Setup parameters
   double            m_lots;  // deal volume for "normal" conditions

public:
                    CSampleMoney();
   //--- Methods to set parameters
   void             Lots(double lots) { m_lots=lots; }
   //--- Methods to validate parameters
   virtual bool      ValidationSettings();

protected:
   double            CheckPrevLoss();
  };

방법의 구현:

//+------------------------------------------------------------------+
//| Defines whether the prev. deal was losing.                       |
//| INPUT:  no.                                                      |
//| OUTPUT: volume of the prev. deal if it's losing, otherwise 0.0   |
//| REMARK: no.                                                      |
//+------------------------------------------------------------------+
double CSampleMoney::CheckPrevLoss()
  {
   double lot=0.0;
//--- Request the history of deals and orders
   HistorySelect(0,TimeCurrent());
//--- variables
   int       deals=HistoryDealsTotal();  // Total number of deals in the history
   CDealInfo deal;
//--- Find the previous deal
   for(int i=deals-1;i>=0;i--)
     {
      if(!deal.SelectByIndex(i))
        {
         printf(__FUNCTION__+": Error of deal selection by index");
         break;
        }
      //--- Check the symbol
      if(deal.Symbol()!=m_symbol.Name()) continue;
      //--- Check the profit
      if(deal.Profit()<0.0) lot=deal.Volume();
      break;
     }
//--- Return the volume
   return(lot);
  }

알고리즘을 다시 자세히 살펴보겠습니다(이미 자세히 설명되어 있지만).

미묘한 차이 없이, 우리의 money-manager는 이전 거래에서 손실이 발생하면 거래 규모를 늘릴 것을 제안할 것입니다. 이전 거래에서 손실이 없었다면 특정 매개변수로 정의되는 고정 거래량으로 포지션을 개설할 것을 제안할 것입니다.

이를 위해 가상 메소드 CheckOpenLongCheckOpenShort를 재정의하여 해당 기능으로 채웁니다.

클래스 설명:

//+------------------------------------------------------------------+
//| Class CSampleMoney.                                              |
//| Purpose: Class for risk and money management                     |
//|             doubling the volume after a loss deal.               |
//|             It is derived from the CExpertMoney class.           |
//+------------------------------------------------------------------+
class CSampleMoney : public CExpertMoney
  {
protected:
   //--- Setup parameters
   double            m_lots;  // Deal volume for "normal" conditions

public:
                    CSampleMoney();
   //--- Methods to set the parameters
   void             Lots(double lots) { m_lots=lots; }
   //--- Methods to validate the parameters
   virtual bool      ValidationSettings();
   //--- Methods to define the volume
   virtual double    CheckOpenLong(double price,double sl);
   virtual double    CheckOpenShort(double price,double sl);

protected:
   double            CheckPrevLoss();
  };

CheckOpenLong과 CheckOpenShort의 구현은 거의 동일합니다. 두 방법 모두 이전에 구현된 CheckPrevLoss 메소드를 호출하여 볼륨을 늘릴 필요성을 결정합니다.

다음으로 우리는 거래량을 무한정 늘릴 수 없다는 점을 고려해야 합니다. 포지션 볼륨에는 두 가지 제한 사항이 있습니다.

  1. 서버 설정에서 구체화 되어있는 기호에 대한 거래의 최대 볼륨(SYMBOL_VOLUME_MAX).
  2. 보증금에 필요한 무료 자금의 가용성.

메소드 구현 CheckOpenLong 및 CheckOpenShort:

//+------------------------------------------------------------------+
//| Defining the volume to open a long position.                     |
//| INPUT:  no.                                                      |
//| OUTPUT: lot-if successful, 0.0 otherwise.                        |
//| REMARK: not.                                                     |
//+------------------------------------------------------------------+
double CSampleMoney::CheckOpenLong(double price,double sl)
  {
   if(m_symbol==NULL) return(0.0);
//--- Select the lot size
   double lot=2*CheckPrevLoss();
   if(lot==0.0) lot=m_lots;
//--- Check the limits
   double maxvol=m_symbol.LotsMax();
   if(lot>maxvol) lot=maxvol;
//--- Check the margin requirements
   if(price==0.0) price=m_symbol.Ask();
   maxvol=m_account.MaxLotCheck(m_symbol.Name(),ORDER_TYPE_BUY,price,m_percent);
   if(lot>maxvol) lot=maxvol;
//--- Return the trade volume
   return(lot);
  }
//+------------------------------------------------------------------+
//| Defining the volume to open a short position.                    |
//| INPUT:  no.                                                      |
//| OUTPUT: lot-if successful, 0.0 otherwise.                        |
//| REMARK: no.                                                      |
//+------------------------------------------------------------------+
double CSampleMoney::CheckOpenShort(double price,double sl)
  {
   if(m_symbol==NULL) return(0.0);
//--- Select the lot size
   double lot=2*CheckPrevLoss();
   if(lot==0.0) lot=m_lots;
//--- Check the limits
   double maxvol=m_symbol.LotsMax();
   if(lot>maxvol) lot=maxvol;
//--- Check the margin requirements
   if(price==0.0) price=m_symbol.Bid();
   maxvol=m_account.MaxLotCheck(m_symbol.Name(),ORDER_TYPE_SELL,price,m_percent);
   if(lot>maxvol) lot=maxvol;
//--- Return the trade volume
   return(lot);
  }

그래서 우리는 첫 번째 문제를 해결했습니다. 위의 코드는 우리의 주 작업을 만족시키는 money-manager 클래스의 "소스 코드"입니다.


2.2. MQL5 마법사에 대해 생성된 money-manager 클래스에 대한 설명 작성

이제 두 번째 문제를 해결합니다. 우리의 money-manager는 MQL5 마법사의 거래 전략 생성기에 의해 "인식"되어야 합니다.

첫 번째 필수 조건을 완료했습니다. MQL5 마법사가 "찾을" 위치에 파일을 배치했습니다. 하지만 이것만으로는 충분하지 않습니다. MQL5 마법사는 파일을 "찾아야" 할 뿐만 아니라 "인식"해야 합니다. 이렇게 하려면 MQL5 마법사의 원본 텍스트에 클래스 설명자를 추가해야 합니다.

클래스 설명자는 특정 규칙에 따라 구성된 주석 블록입니다.

이러한 규칙을 고려해봅시다.

1. 주석 블록은 다음 줄로 시작해야 합니다.

// wizard description start
//+------------------------------------------------------------------+
//| Description of the class                                         |

2. 다음 줄은 "//| Title=<Text> |" 형식의 텍스트 설명자(신호를 선택할 때 MQL5 마법사에서 볼 수 있음)입니다. 텍스트가 한 줄에 비해 너무 크면 그 뒤에 한 줄을 더 추가할 수 있습니다(그러나 그 이상은 아님). 

우리의 경우 다음을 얻습니다.

//| Title=Trade with a doubling of lot after a loss                  |

3. 그런 다음 "//| Type=<Type> |" 형식으로 지정된 클래스 유형의 줄이 나옵니다. <Type> 필드에는 Money 값이 있어야 합니다(money-managers 외에도 MQL5 마법사는 다른 유형의 클래스를 알고 있습니다).

쓰다:

//| Type=Money                                                       |

4. "//| Name=<Name> |" 형식의 다음 줄 신호의 짧은 이름입니다(전문가의 전역 변수 이름을 생성하기 위해 MQL5 마법사에서 사용됨).

우리는 다음을 얻습니다.

//| Name=Sample                                                      |

5. 클래스의 이름은 설명의 중요한 요소입니다. "//| Class=<ClassNameа> |" 형식의 줄에서 <ClassName> 매개변수는 클래스 이름과 일치해야 합니다.

//| Class=CSampleMoney                                               |

6. 이 줄은 작성하지 않았지만 반드시 있어야 합니다(언어 참조 섹션에 대한 링크임).

//| Page=                                                            |

7. 또한 신호 설정 매개변수에 대한 설명이 있습니다.

이것은 행의 집합입니다(행의 수는 매개변수의 수와 같습니다).

각 줄의 형식은 "//| Parameter=<NameOfMethod>,<TypeOfParameter>,<DefaultValue> |"입니다.

다음은 매개변수 세트입니다.

//| Parameter=Lots,double,0.1                                        |
//| Parameter=Percent,double,100.0                                   |

8. 주석 블록은 다음 줄로 끝나야 합니다.

//+------------------------------------------------------------------+
// wizard description end

2-7 2-7번 항목에 대한 설명이 더 필요합니다. 클래스 설명자의 섹션에는 키워드(제목, 유형, 이름, 클래스, 페이지, 매개변수)가 포함됩니다. 유감스럽게도 MQL5 마법사는 가능한 모든 문자 조합을 클래스 설명의 일부로 해석할 수 없습니다.

따라서 불필요한 오류를 방지하려면 다음과 같이 작성하십시오.
[슬래시][슬래시][세로줄][공백]<키워드>[등호]<설명>;

<설명>은 키워드 제목에 대해서만 공백을 포함할 수 있습니다. 1항과 8항은 "있는 그대로" 복사해야 합니다.

클래스 설명자(첫 번째 줄)는 20번째 줄까지 파일에서 찾아야 합니다.

소스 코드에 디스크립터를 추가해 보겠습니다.

//+------------------------------------------------------------------+
//|                                                  SampleMoney.mqh |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
//+------------------------------------------------------------------+
//| Include files                                                    |
//+------------------------------------------------------------------+
#include <Expert\ExpertMoney.mqh>
#include <Trade\DealInfo.mqh>
// wizard description start
//+------------------------------------------------------------------+
//| Description of the class                                         |
//| Title=Trading with lot doubling after a loss                     |
//| Type=Money                                                       |
//| Name=Sample                                                      |
//| Class=CSampleMoney                                               |
//| Page=                                                            |
//| Parameter=Lots,double,0.1                                        |
//| Parameter=Percent,double,100.0                                   |
//+------------------------------------------------------------------+
// wizard description end
//+------------------------------------------------------------------+
//| Class CSampleMoney.                                              |
//| Purpose: Class for risk and money management                     |
//|             doubling the volume after a loss deal.               |
//|             It is derived from the CExpertMoney class.           |
//+------------------------------------------------------------------+
class CSampleMoney : public CExpertMoney
  {
protected:
   //--- Setup parameters
   double            m_lots;  // Deal volume for "normal" conditions

public:
                     CSampleMoney();
   //--- Methods to set the parameters
   void              Lots(double lots) { m_lots=lots; }
   //--- Methods to validate the parameters
   virtual bool      ValidationSettings();
   //--- Methods to define the volume
   virtual double    CheckOpenLong(double price,double sl);
   virtual double    CheckOpenShort(double price,double sl);

protected:
   double            CheckPrevLoss();
  };
//+------------------------------------------------------------------+
//| Constructor CSampleMoney.                                        |
//| INPUT:  no.                                                      |
//| OUTPUT: no.                                                      |
//| REMARK: no.                                                      |
//+------------------------------------------------------------------+
void CSampleMoney::CSampleMoney()
  {
//--- Setting default values
   m_lots=0.1;
  }
//+------------------------------------------------------------------+
//| Validation of the setup parameters.                              |
//| INPUT:  no.                                                      |
//| OUTPUT: true if the settings are correct, otherwise false.       |
//| REMARK: no.                                                      |
//+------------------------------------------------------------------+
bool CSampleMoney::ValidationSettings()
  {
//--- Call the base class method
   if(!CExpertMoney::ValidationSettings()) return(false);
//--- Validating the parameters
   if(m_lots<m_symbol.LotsMin() || m_lots>m_symbol.LotsMax())
     {
      printf(__FUNCTION__+": The deal volume must be in the range %f to %f",m_symbol.LotsMin(),m_symbol.LotsMax());
      return(false);
     }
   if(MathAbs(m_lots/m_symbol.LotsStep()-MathRound(m_lots/m_symbol.LotsStep()))>1.0E-10)
     {
      printf(__FUNCTION__+": The deal volume must be multiple of  %f",m_symbol.LotsStep());
      return(false);
     }
//--- Successful completion
   return(true);
  }
//+------------------------------------------------------------------+
//| Defining the volume to open a long position.                     |
//| INPUT:  no.                                                      |
//| OUTPUT: lot-if successful, 0.0 otherwise.                        |
//| REMARK: no.                                                      |
//+------------------------------------------------------------------+
double CSampleMoney::CheckOpenLong(double price,double sl)
  {
   if(m_symbol==NULL) return(0.0);
//--- Select the lot size
   double lot=2*CheckPrevLoss();
   if(lot==0.0) lot=m_lots;
//--- Check the limits
   double maxvol=m_symbol.LotsMax();
   if(lot>maxvol) lot=maxvol;
//--- Check the margin requirements
   if(price==0.0) price=m_symbol.Ask();
   maxvol=m_account.MaxLotCheck(m_symbol.Name(),ORDER_TYPE_BUY,price,m_percent);
   if(lot>maxvol) lot=maxvol;
//--- Return the trade volume
   return(lot);
  }
//+------------------------------------------------------------------+
//|Defining the volume to open a short position.                     |
//| INPUT:  no.                                                      |
//| OUTPUT: lot-if successful, 0.0 otherwise.                        |
//| REMARK: no.                                                      |
//+------------------------------------------------------------------+
double CSampleMoney::CheckOpenShort(double price,double sl)
  {
   if(m_symbol==NULL) return(0.0);
//--- Select the lot size
   double lot=2*CheckPrevLoss();
   if(lot==0.0) lot=m_lots;
//--- Check the limits
   double maxvol=m_symbol.LotsMax();
   if(lot>maxvol) lot=maxvol;
//--- Check the margin requirements
   if(price==0.0) price=m_symbol.Bid();
   maxvol=m_account.MaxLotCheck(m_symbol.Name(),ORDER_TYPE_SELL,price,m_percent);
   if(lot>maxvol) lot=maxvol;
//--- Return the trade volume
   return(lot);
  }
//+------------------------------------------------------------------+
//| Defines whether the prev. deal was losing.                       |
//| INPUT:  no.                                                      |
//| OUTPUT: Volume of the prev. deal if it's losing, otherwise 0.0   |
//| REMARK: no.                                                      |
//+------------------------------------------------------------------+
double CSampleMoney::CheckPrevLoss()
  {
   double lot=0.0;
//--- Request the history of deals and orders
   HistorySelect(0,TimeCurrent());
//--- variables
   int       deals=HistoryDealsTotal();  // Total number of deals in the history
   CDealInfo deal;
//--- Find the previous deal
   for(int i=deals-1;i>=0;i--)
     {
      if(!deal.SelectByIndex(i))
        {
         printf(__FUNCTION__+": Error of deal selection by index");
         break;
        }
      //--- Check the symbol
      if(deal.Symbol()!=m_symbol.Name()) continue;
      //---Check the profit
      if(deal.Profit()<0.0) lot=deal.Volume();
      break;
     }
//--- Return the volume
   return(lot);
  }
//+------------------------------------------------------------------+

그게 다야. money-manager를 사용할 준비가 되었습니다.

MQL5 마법사의 거래 전략 생성기가 money-manager를 사용할 수 있도록 하려면 MetaEditor를 다시 시작해야 합니다(MQL5 마법사는 부팅 시에만 Include\Expert 폴더를 검색합니다. ).

MetaEditor를 다시 시작한 후 생성된 money-manager 모듈을 MQL5 마법사에서 사용할 수 있습니다.

그림 5. MQL5 마법사에서 생성된 money-manager

그림 5. MQL5 마법사에서 생성된 money-manager

이제 money-manager 매개변수 설명 섹션에 지정된 입력 매개변수를 사용할 수 있습니다.

그림 6. MQL5 Wizard에서 생성된 money-manager의 입력 매개변수

그림 6. MQL5 Wizard에서 생성된 money-manager의 입력 매개변수

구현된 거래 전략의 입력 매개변수의 최상의 값은 MetaTrader 5 터미널의 Strategy Tester를 사용하여 찾을 수 있습니다.

그림 7은 이 자금 관리 시스템(EURUSD H1, 테스트 기간: 01.01.2010-05.01.2011)에 따라 거래되는 Expert Advisor의 테스트 결과를 보여줍니다.

그림 7. 손실 후 두 배의 자금 관리 모듈로 전략의 내역에 대한 테스트 결과

그림 7. 손실 후 두 배의 자금 관리 모듈로 전략의 내역에 대한 테스트 결과

Expert Advisor를 생성할 때 "MQL5 마법사: 거래 신호 모듈을 만드는 방법" 글에 구현된 거래 신호 모듈을 사용했습니다. Expert Advisor의 매개변수: (PeriodMA=12, ShiftMA=0, MethodMA=MODE_EMA, AppliedMA=PRICE_CLOSE, Limit=-70, StopLoss=145, TakeProfit=430, Expiration=10, Lot=0.1, Percent=100).


결론

MQL5 마법사의 거래 전략 생성기는 거래 아이디어 테스트를 크게 단순화합니다. 생성된 전문가의 코드는 표준 라이브러리의 거래 전략 클래스를 기반으로 하며, 이는 거래 신호 클래스, 자금 및 위험 관리 클래스 및 포지션 지원 클래스의 특정 구현을 생성하는 데 사용됩니다. 

이 문서에서는 맞춤형 위험 및 자금 관리 모듈을 개발하고 MQL5 마법사에서 활성화하는 방법을 설명합니다. 예를 들어 우리는 거래량의 크기가 이전 거래의 결과에 따라 결정되는 자금 관리 알고리즘을 고려했습니다. MQL5 Wizard용으로 생성된 클래스의 설명 구조 및 형식에 대해서도 설명합니다.

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

파일 첨부됨 |
samplemoney.mqh (7.15 KB)
MQL5 마법사: 미결 포지션의 후행 모듈을 만드는 방법 MQL5 마법사: 미결 포지션의 후행 모듈을 만드는 방법
거래 전략 생성기 MQL5 Wizard는 거래 아이디어 테스트를 크게 단순화합니다. 이 글에서는 거래 시 가격이 포지션 방향으로 이동할 때 손절매 수준을 무손실 영역으로 이동하여 오픈 포지션을 관리하는 MQL5 Wizard 자신의 클래스를 작성하고 거래 전략 생성기에 연결하여 이익 감소 드로다운을 보호할 수 있는 방법에 대해 설명합니다. 또한 MQL5 마법사에 대해 생성된 클래스 설명의 구조 및 형식에 대해서도 알려줍니다.
MQL5의 전자 테이블 MQL5의 전자 테이블
이 문서에서는 1차원에 서로 다른 유형의 데이터가 포함된 동적 2차원 배열의 클래스를 설명합니다. 데이터를 테이블 형태로 저장하는 것은 서로 다른 유형의 바인딩된 정보로 배열, 저장 및 작동의 광범위한 문제를 해결하는 데 편리합니다. 테이블 작업 기능을 구현한 클래스의 소스 코드는 글에 첨부되어 있습니다.
MetaTrader 5의 다중 통화 모드 구현 MetaTrader 5의 다중 통화 모드 구현
오랫동안 다중 통화 분석 및 다중 통화 거래는 많은 사람들의 관심을 불러일으켜왔습니다. 완전한 다중 통화 체제를 구현할 수 있는 기회는 MetaTrader 5 및 MQL5 프로그래밍 언어의 공개 릴리스에서만 가능했습니다. 이 글에서는 여러 기호에 대해 들어오는 모든 틱을 분석하고 처리하는 방법을 제안합니다. 예를 들어 USDx 달러 인덱스의 다중 통화 RSI 지표를 살펴보겠습니다.
MQL5 마법사: 신호 거래 모듈을 만드는 방법 MQL5 마법사: 신호 거래 모듈을 만드는 방법
이 글에서는 MQL5 마법사에 대해 생성된 클래스의 설명 형식 뿐 아니라, 가격과 이동 평균의 교차에 대한 신호 구현으로 자신만의 거래 신호 클래스를 작성하는 방법과 MQL5 마법사의 거래 전략 생성기에 포함하는 방법과 구조 뿐에 대해 설명합니다.