English Русский 中文 Español Deutsch 日本語 Português Français Italiano Türkçe
자동 거래 챔피언십 2010을 위한 Expert Advisor를 신속하게 만드는 방법을 알아보십시오.

자동 거래 챔피언십 2010을 위한 Expert Advisor를 신속하게 만드는 방법을 알아보십시오.

MetaTrader 5 | 5 7월 2021, 16:15
64 0
Andrey Kornishkin
Andrey Kornishkin

소개

Automated Trading Championship 2010에 참여할 expert를 개발하기 위해, 무역 로봇의 시제품 글에서 준비된 expert advisor 템플릿을 사용해 보겠습니다. 기본 클래스, 기능, 템플릿이 이미 개발되었기 때문에 초보 MQL5 프로그래머도 이 작업을 수행할 수 있습니다. 거래 아이디어를 구현하기 위한 최소한의 코드만으로도 충분합니다.  

준비해야 할 내용은 다음과 같습니다.
  • 전략 선택
  • Expert Advisor 쓰기
  • 테스트
  • 전략 테스터 최적화
  • 전략의 최적화
  • 다른 간격으로 테스트

1. 전략 선택

트렌드를 이용한 거래는 범위 내에서 거래하는 것보다 수익성이 더 높으며, 하루 중의 수준에서 바운스는 채널 경계의 붕괴보다 더 자주 발생합니다.

이러한 가정을 바탕으로 채널 경계 (봉투)에서 바운스에 대한 현재 추세를 향한 포지션을 열 것입니다. 포지션 청산 신호 또는 손절매 또는 이익 실현 수준에 도달 할 때 포지션을 청산 할 것입니다.

  추세 신호로 일일 차트에서 MACD 성장 또는 하락을 사용하고 시간 시간대에 채널 경계에서 바운스로 거래 할 것입니다.  

그림 1. EURUSD 일일 차트의 MACD 표시

그림 1. EURUSD 일일 차트의 MACD 표시

MACD 인디케이터가 2개의 바에서 연속적으로 증가하면 이것이 매수 신호입니다. 연속적으로 두 개의 바에서 감소하면 이것이 매도 신호입니다.

그림 2. Envelopes Boundaries에서 가격 반등

그림 2. Envelopes Boundaries에서 가격 반등


2. Expert Advisor 쓰기 

2.1. 포함된 모듈

전문가는 ExpertAdvisor.mqh 모듈의 ExpertAdvisor 클래스를 사용합니다.

#include <ExpertAdvisor.mqh>

2.2. 입력 변수

input int    SL        =  50; // Stop Loss distance
input int    TP        = 100; // Take Profit distance
input int    TS        =  50; // Trailing Stop distance
input int    FastEMA   =  15; // Fast EMA
input int    SlowEMA   =  26; // Slow EMA
input int    MACD_SMA  =   1; // MACD signal line
input int    EnvelPer  =  20; // Envelopes period
input double EnvelDev  = 0.4; // Envelopes deviation
input double Risk      = 0.1; // Risk

2.3. CExpertAdvisor에서 상속된 클래스 만들기

class CMyEA : public CExpertAdvisor
  {
protected:
   double            m_risk;          // size of risk
   int               m_sl;            // Stop Loss
   int               m_tp;            // Take Profit
   int               m_ts;            // Trailing Stop
   int               m_pFastEMA;      // Fast EMA
   int               m_pSlowEMA;      // Slow EMA
   int               m_pMACD_SMA;     // MACD signal line
   int               m_EnvelPer;      // Envelopes period
   double            m_EnvelDev;      // Envelopes deviation
   int               m_hmacd;         // MACD indicator handle
   int               m_henvel;        // Envelopes indicator handle
public:
   void              CMyEA();
   void             ~CMyEA();
   virtual bool      Init(string smb,ENUM_TIMEFRAMES tf); // initialization
   virtual bool      Main();                              // main function
   virtual void      OpenPosition(long dir);              // open position on signal
   virtual void      ClosePosition(long dir);             // close position on signal
   virtual long      CheckSignal(bool bEntry);            // check signal
  };
//------------------------------------------------------------------
2.4. 인디케이터 삭제
//------------------------------------------------------------------    
void CMyEA::~CMyEA()
  {
   IndicatorRelease(m_hmacd);  // delete MACD indicator
   IndicatorRelease(m_henvel); // delete Envelopes indicator
  }
//------------------------------------------------------------------    
2.5. 변수 초기화
//------------------------------------------------------------------    Init
bool CMyEA::Init(string smb,ENUM_TIMEFRAMES tf)
  {
   if(!CExpertAdvisor::Init(0,smb,tf)) return(false);    // initialize parent class
   // copy parameters
    m_risk=Risk; 
   m_tp=TP; 
   m_sl=SL; 
   m_ts=TS;
   m_pFastEMA=FastEMA; 
   m_pSlowEMA=SlowEMA; 
   m_pMACD_SMA=MACD_SMA;
   m_EnvelPer = EnvelPer;
   m_EnvelDev = EnvelDev;
   m_hmacd=iMACD(m_smb,PERIOD_D1,m_pFastEMA,m_pSlowEMA,m_pMACD_SMA,PRICE_CLOSE);      // create MACD indicator
   m_henvel=iEnvelopes(m_smb,PERIOD_H1,m_EnvelPer,0,MODE_SMA,PRICE_CLOSE,m_EnvelDev); // create Envelopes indicator
   if(m_hmacd==INVALID_HANDLE ||m_henvel==INVALID_HANDLE ) return(false);             // if there is an error, then exit
   m_bInit=true; 
   return(true);                                                                      // trade allowed
  } 

2.6. 무역 기능

//------------------------------------------------------------------    CheckSignal
long CMyEA::CheckSignal(bool bEntry)
  {
   double macd[4],   // Array of MACD indicator values
         env1[3],    // Array of Envelopes' upper border values
         env2[3];    // Array of Bollinger Bands' lower border values
   MqlRates rt[3];   // Array of price values of last 3 bars
   
   if(CopyRates(m_smb,m_tf,0,3,rt)!=3) // Copy price values of last 3 bars to array
     {
       Print("CopyRates ",m_smb," history is not loaded"); 
        return(WRONG_VALUE);
     }
   // Copy indicator values to array
   if(CopyBuffer(m_hmacd,0,0,4,macd)<4 || CopyBuffer(m_henvel,0,0,2,env1)<2 ||CopyBuffer(m_henvel,1,0,2,env2)<2)
     { 
        Print("CopyBuffer - no data"); 
       return(WRONG_VALUE);
     }
   // Buy if MACD is growing and if there is a bounce from the Evelopes' lower border
   if(rt[1].open<env2[1] && rt[1].close>env2[1] && macd[1]<macd[2] &&  macd[2]<macd[3])
      return(bEntry ? ORDER_TYPE_BUY:ORDER_TYPE_SELL); // condition for buy
   // Sell if MACD is dwindling and if there is a bounce from the Evelopes' upper border
   if(rt[1].open>env1[1] && rt[2].close<env1[1]&& macd[1]>macd[2] &&  macd[2]>macd[3])
      return(bEntry ? ORDER_TYPE_SELL:ORDER_TYPE_BUY); // condition for sell

   return(WRONG_VALUE); // if there is no signal
  }

CMyEA ea; // class instance

따라서 코드를 작성한 후 결과 전문가를 Strategy Tester에 보냅니다.


3. 테스트 

EURUSD의 "작년"기간에 대한 Strategy Tester에서 다음 차트를 얻습니다.

그림 3. 초기 매개 변수로 거래 시스템 테스트 결과

그림 3. 초기 매개 변수로 거래 시스템 테스트 결과

결과가 인상적이지 않으니 손절매 및 이익 실현 수준을 최적화 해보겠습니다.


4. 전략 테스터 최적화

50 단계에서 10-500 간격으로 손절매와 이익 실현 매개 변수를 최적화합니다.

최상의 결과: 손절매 = 160, 이익 실현 = 310. 손절매와 이익 실현 최적화 후 우리는 이전 36%와 $1522.97의 순이익에 대해 67%의 수익성 있는 거래를 받았습니다. 따라서 간단한 조작으로 시스템을 손익분기점으로 업그레이드하고 수익도 올렸습니다.

그림 4. 최적화 된 손절매 및 이익 실현으로 트레이딩 시스템 테스트 결과

그림 4. 최적화 된 손절매 및 이익 실현으로 트레이딩 시스템 테스트 결과

다음으로 Envelopes 기간과 편차를 최적화 해보겠습니다.

Envelopes Period는 4 단계에서 10에서 40으로, 편차는 0.1에서 0.1에서 1로 변경됩니다.

최상의 최적화 결과는 다음과 같습니다. Envelopes Period = 22, Envelopes deviation = 0.3. 지금도 순이익 $14418.92와 수익성 있는 거래의 79 %가 있습니다.

그림 5. 최적화된 Envelopes Period 및 편차로 거래 시스템 테스트 결과

그림 5. 최적화 된 Envelopes Period 및 편차로 거래 시스템 테스트 결과

위험을 0.8로 늘리면 순이익은 $77330.95입니다.

그림 6. 최적화된 리스크로 거래 시스템을 테스트한 결과

그림 6. 최적화된 리스크로 거래 시스템을 테스트한 결과

 

5. 전략의 최적화

전략 최적화는 다음 단계로 구성될 수 있습니다.

  • 추세 인디케이터 변경
  • 다른 봉투 선택
  • 다른 기간 선택
  • 거래 조건 변경

5.1. 추세 인디케이터 변경

MQL5에서 추세를 찾는 몇 가지 방법 기사에서 볼 수 있듯이 최고의 추세 인디케이터는 이동 평균과 이동 평균의 "팬"입니다.

MACD 인디케이터를 단순 이동 평균으로 대체 해보겠습니다. 전문가의 코드는 첨부된 Macena.mq5 파일에서 찾을 수 있습니다.

5.2. 다른 Envelope 선택

Envelopes 이외에도 원하는대로 다른 Envelope를 선택할 수 있습니다. 예를 들어 가격 채널 (Price Channel), 풀린저 밴드 (Bollinger Bands) 또는 이동 평균을 기반으로 하는 Envelope입니다.

MA 및 볼린저 밴드를 사용하는 전문가의 예는 첨부된 Maboll.mq5 파일에서 찾을 수 있습니다.

5.3. 다른 시간대 선택

기간을 더 크게 또는 더 작게 변경해보겠습니다. 더 큰 시간 프레임으로 - H4를 더 작은 - M15로 취한 다음 시스템을 테스트하고 최적화하십시오.

이렇게 하려면 코드에서 한 줄만 바꿉니다.

m_henvel=iEnvelopes(m_smb,PERIOD_H1,m_EnvelPer,0,MODE_SMA,PRICE_CLOSE,m_EnvelDev);  // create Envelopes indicator

H4 기간의 경우:

m_henvel=iEnvelopes(m_smb,PERIOD_H4,m_EnvelPer,0,MODE_SMA,PRICE_CLOSE,m_EnvelDev);  // create Envelopes indicator 

M15 기간: 

m_henvel=iEnvelopes(m_smb,PERIOD_M15,m_EnvelPer,0,MODE_SMA,PRICE_CLOSE,m_EnvelDev);  // create Envelopes indicator

5.4. 거래 조건 변경

실험으로 무역 조건도 바꿔봅시다.  

  1. 시스템을 되돌릴 수 있도록 하십시오. Envelope의 하단 경계에서 바운스로 매수하고 Envelopes의 상단 경계에서 바운스로 판매합니다.
  2. 요일 추세를 따르지 않고 시스템을 확인하십시오. 거래 블록에 다음 코드를 삽입하면 됩니다.
    //------------------------------------------------------------------ CheckSignal
    long CMyEA::CheckSignal(bool bEntry)
      {
       double env1[3],   // Array of Envelopes' upper border values
             env2[3];    // Array of Bollinger Bands' lower border values
       MqlRates rt[3];   // Array of price values of last 3 bars
    
       if(CopyRates(m_smb,m_tf,0,3,rt)!=3) // Copy price values of last 3 bars to array
         {
          Print("CopyRates ",m_smb," history is not loaded");
          return(WRONG_VALUE);
         }
    // Copy indicator values to array
       if(CopyBuffer(m_henvel,0,0,2,env1)<2 || CopyBuffer(m_henvel,1,0,2,env2)<2)
         {
          Print("CopyBuffer - no data");
          return(WRONG_VALUE);
         }
    // Buy if there is a bounce from the Evelopes' lower border
       if(rt[1].open<env2[1] && rt[1].close>env2[1])
          return(bEntry ? ORDER_TYPE_BUY:ORDER_TYPE_SELL); // condition for buy
    // Sell if there is a bounce from the Evelopes' upper border
       if(rt[1].open>env1[1] && rt[2].close<env1[1])
          return(bEntry ? ORDER_TYPE_SELL:ORDER_TYPE_BUY); // condition for sell
    
       return(WRONG_VALUE); // if there is no signal
      }
    
    CMyEA ea; // class instance
    //------------------------------------------------------------------    OnInit
    

     3. 가격이 크게 떨어지지 않고 돌아서서 올라갔을 때 숏 포지션을 청산하겠습니다.

     4. 가격이 크게 오르지 않고 돌아섰다가 하락했을 때 매수 포지션을 청산하겠습니다.

거래 전략을 최적화하기 위해 다른 많은 방법을 발명 할 수 있으며, 그중 일부는 해당 문헌에 설명되어 있습니다.

추가 연구는 귀하에게 달려 있습니다.


6. 다른 간격으로 테스트

1개월 단위로 동일한 시간 간격으로 Expert Advisor를 테스트하십시오. 작년을 테스트 기간으로 합시다. 기간 - 3 개월.

테스트 간격
이익, USD
수익성 있는 거래
 1.01.2010 - 30.03.2010
7239.50 76.92%
 1.02.2010 - 30.04.2010 -6577.50 0%
 1.03.2010 - 30.05.2010 -8378.50 50%
 1.04.2010 - 30.06.2010 -6608.00 0%
 1.05.2010 - 30.07.2010  41599.50 80%
  1.06.2010 - 30.08.2010  69835.50  85%
요약: 이러한 공격적인 자금 관리에 Expert Advisor를 사용하는 것은 바람직하지 않습니다. 위험을 줄이십시오.


결론

간략한 결론: 이 템플릿을 기반으로 최소한의 시간과 노력으로 거래 아이디어를 매우 빠르게 구현할 수 있습니다.

시스템 매개 변수와 거래 기준의 최적화도 문제가 되지 않습니다.

보다 안정적인 거래 시스템을 만들려면 더 긴 시간 간격으로 모든 매개 변수를 최적화하는 것이 바람직합니다.

사용된 소스 목록:
  1. MQL5의 20 개의 무역 신호 글.
  2. 무역 로봇 프로토 타입 글.
  3. MQL5에서 추세를 감지하는 여러 방법 글.
  4. 인기있는 거래 시스템 및 거래 로봇 최적화의 연금술에 기반한 Expert Advisors 글.
  5. Expert Advisor의 제한 및 검증 글.
  6. MQL5 객체 지향 프로그래밍 접근 방식을 사용하여 Expert Advisor 작성글.
  7. Expert Advisor의 자금 관리 기능글.   

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

파일 첨부됨 |
mabol.mq5 (6.65 KB)
macena.mq5 (6.94 KB)
maena.mq5 (6.58 KB)
오류 찾기 및 로깅 오류 찾기 및 로깅
MetaEditor 5에는 디버깅 기능이 있습니다. 그러나 MQL5 프로그램을 작성할 때 종종 개별 값이 아니라 테스트 및 온라인 작업 중에 나타나는 모든 메시지를 표시하려고 합니다. 로그 파일 내용이 큰 경우 필요한 메시지의 빠르고 쉬운 검색을 자동화하는 것이 분명합니다. 이 기사에서는 MQL5 프로그램에서 오류를 찾는 방법과 로깅 방법을 고려할 것입니다. 또한 파일 로그인을 단순화하고 로그를 편안하게 볼 수 있는 간단한 프로그램인 LogMon을 알게 될 것입니다.
Expert Advisor 작업 중 균형 곡선의 기울기 조절 Expert Advisor 작업 중 균형 곡선의 기울기 조절
무역 시스템에 대한 규칙을 찾고 Expert Advisor에서 프로그래밍하는 것은 작업의 절반입니다. 어쨋든 거래 결과가 누적되므로 Expert Advisor의 운영을 수정해야 합니다. 이 기사에서는 균형 곡선의 기울기를 측정하는 피드백을 생성하여 Expert Advisor의 성능을 향상시킬 수있는 접근 방식 중 하나를 설명합니다.
Simulink: Expert Advisor 개발자를 위한 가이드 Simulink: Expert Advisor 개발자를 위한 가이드
저는 전문 프로그래머가 아닙니다. 따라서 거래 시스템 개발 작업을 할 때 "단순한 것에서 복잡한 것으로가는 것"의 원칙이 가장 중요합니다. 나에게 정확히 무엇이 간단합니까? 우선 그것은 시스템을 만드는 과정과 그 작업의 논리를 시각화하는 것입니다. 또한 최소한의 수기 코드입니다. 이 기사에서는 Matlab 패키지를 기반으로 거래 시스템을 만들고 테스트한 다음 MetaTrader 5에 대한 Expert Advisor를 작성하려고 합니다. MetaTrader 5의 과거 데이터는 테스트 프로세스에 사용됩니다.
Expert Advisor 작성시 MQL5 Standard Trade Class 라이브러리 사용 Expert Advisor 작성시 MQL5 Standard Trade Class 라이브러리 사용
`이 글에서는 거래를 하기 전에 포지션 청산 및 수정, 주문 보류 및 삭제 및 마진 확인을 구현하는 Expert Advisors를 작성하는 데 MQL5 표준 라이브러리 거래 클래스의 주요 함수를 사용하는 방법을 설명합니다. 또한 트레이드 클래스를 사용하여 주문 및 거래 세부 정보를 얻는 방법을 시연했습니다.