시스템트레이딩 게시글

MQL5 마법사: ADX로 확인된 이동 평균 가격 교차 신호를 기반으로 한 거래 전략

첨부파일
258.zip (3.23 KB, 다운로드 0회)

MQL5 마법사는 전문가 상담가(이하 EA)의 코드를 자동으로 생성할 수 있게 해줍니다. 더 자세한 내용은 MQL5 마법사에서 준비된 EA 만들기를 참고하세요.

이번 포스트에서는 ADX 지표로 확인된 이동 평균 지표의 가격 교차를 기반으로 한 거래 전략을 살펴보겠습니다. 이 전략은 “ADX로 확인된 이동 평균 가격 교차 신호”라는 이름으로 MQL5 마법사에서 EA를 자동으로 생성할 때 사용됩니다.

거래 신호:

  • 매수: 마지막 완료된 바의 종가가 이동 평균보다 높고, 현재 바와 마지막 완료된 바의 이동 평균이 상승할 때.
  • 매도: 마지막 완료된 바의 종가가 이동 평균보다 낮고, 현재 바와 마지막 완료된 바의 이동 평균이 하락할 때.
  • 거짓 신호를 필터링하기 위해 ADX의 트렌드 강도(ADX>최소 ADX)와 방향성 지표(DI+와 DI-)를 사용해 트렌드 방향을 확인합니다.

이 전략은 CSignalADX_MA 클래스에 구현되어 있으며, 해당 파일은 terminal_data_folder\MQL5\Include\Expert\Signal\SignalADX-MA.mqh에 위치해야 합니다.

이동 평균과 ADX로 확인된 가격 교차 신호

이동 평균과 ADX로 확인된 가격 교차 신호

거래 신호

이 거래 전략은 CSignalADX_MA 클래스에 구현되어 있으며, 지표 및 가격 값에 대한 접근을 간소화하기 위해 몇 가지 보호된 메소드를 가지고 있습니다:

double   PlusADX(int ind)     // DI+ 선의 값 반환
double   MainADX(int ind)     // 메인 선의 값 반환
double   MinusADX(int ind)    // DI- 선의 값 반환
double   EMA(int ind)         // 이동 평균의 값 반환
double   Close(int ind)       // 종가의 값 반환
double   StateADX(int ind)    // DI+와 DI- 선의 차이 반환
double   StateEMA(int ind)    // EMA가 증가하면 양수, 감소하면 음수 반환
double   StateClose(int ind)   // 종가와 이동 평균의 차이 반환
이 구현의 특징은 방향성 지표를 사용하여 트렌드 존재를 추가로 확인하는 것입니다. 이를 통해 거짓 신호를 필터링하고 현재(미완성) 바의 값으로 거래 조건을 확인할 수 있습니다.

1. 롱 포지션 열기

롱 포지션을 열기 위한 조건:

  1. StateEMA(0)<0 및 StateEMA(1)>0: 현재 및 마지막 완료된 바에서 이동 평균이 상승하는 경우;
  2. StateClose(1)>0: 마지막 완료된 바의 종가가 이동 평균보다 높은 경우;
  3. MainADX(0)>최소_ADX: 현재 바의 ADX 값이 지정된 최소값보다 큰 경우;
  4. StateADX(0)>0: 현재 바의 DI+가 DI-보다 큰 경우.
//+------------------------------------------------------------------+
//| 롱 포지션 열기 조건 확인                                    |
//+------------------------------------------------------------------+
bool CSignalADX_MA::CheckOpenLong(double& price,double& sl,double& tp,datetime& expiration)
  {
   //--- 조건 1: 현재 및 마지막 바에서 이동 평균 상승 
   bool Buy_Condition_1=(StateEMA(0)>0 && StateEMA(1)>0);
   //--- 조건 2: 마지막 바의 종가가 이동 평균보다 높음 
   bool Buy_Condition_2=(StateClose(1)>0);
   //--- 조건 3: 현재 바의 ADX 값이 지정된 최소값보다 큼
   bool Buy_Condition_3=(MainADX(0)>m_minimum_ADX);
   //--- 조건 4: 현재 바의 DI+가 DI-보다 큼
   bool Buy_Condition_4=(StateADX(0)>0);
   price=0.0;
   sl   =m_symbol.Ask()-m_stop_loss*m_adjusted_point;
   tp   =m_symbol.Ask()+m_take_profit*m_adjusted_point;
   //--- 모든 조건 확인
   return(Buy_Condition_1 && Buy_Condition_2 && Buy_Condition_3 && Buy_Condition_4);
  }

2. 롱 포지션 닫기

롱 포지션을 닫기 위한 조건:

  1. StateEMA(0)<0 및 StateEMA(1)<0: 현재 및 마지막 바에서 이동 평균이 하락하는 경우;
  2. StateClose(1)<0: 마지막 완료된 바의 종가가 이동 평균보다 낮은 경우;
  3. MainADX(0)>최소_ADX: 현재 바의 ADX 값이 지정된 최소값보다 큰 경우;
  4. StateADX(0)<0: 현재 바의 DI-가 DI+보다 큰 경우.
//+------------------------------------------------------------------+
//| 롱 포지션 닫기 조건 확인                                   |
//+------------------------------------------------------------------+
bool CSignalADX_MA::CheckCloseLong(double& price)
  {
   //--- 조건 1: 현재 및 마지막 바에서 이동 평균 하락 
   bool Sell_Condition_1=(StateEMA(0)<0 && StateEMA(1)<0);
   //--- 조건 2: 마지막 바의 종가가 이동 평균보다 낮음 
   bool Sell_Condition_2=(StateClose(1)<0);
   //--- 조건 3: 현재 바의 ADX 값이 지정된 최소값보다 큼
   bool Sell_Condition_3=(MainADX(0)>m_minimum_ADX);
   //--- 조건 4: 현재 바의 DI-가 DI+보다 큼
   bool Sell_Condition_4=(StateADX(0)<0);
   price=0.0;
   //--- 모든 조건 확인
   return(Sell_Condition_1 && Sell_Condition_2 && Sell_Condition_3 && Sell_Condition_4);
  }

3. 숏 포지션 열기

숏 포지션을 열기 위한 조건은 롱 포지션을 닫기 위한 조건과 동일합니다.

//+------------------------------------------------------------------+
//| 숏 포지션 열기 조건 확인                                   |
//+------------------------------------------------------------------+
bool CSignalADX_MA::CheckOpenShort(double& price,double& sl,double& tp,datetime& expiration)
  {
   //--- 조건 1: 현재 및 마지막 바에서 이동 평균 하락 
   bool Sell_Condition_1=(StateEMA(0)<0 && StateEMA(1)<0);
   //--- 조건 2: 마지막 바의 종가가 이동 평균보다 낮음 
   bool Sell_Condition_2=(StateClose(1)<0);
   //--- 조건 3: 현재 바의 ADX 값이 지정된 최소값보다 큼
   bool Sell_Condition_3=(MainADX(0)>m_minimum_ADX);
   //--- 조건 4: 현재 바의 DI-가 DI+보다 큼
   bool Sell_Condition_4=(StateADX(0)<0);
   price=0.0;
   sl   =m_symbol.Bid()+m_stop_loss*m_adjusted_point;
   tp   =m_symbol.Bid()-m_take_profit*m_adjusted_point;
   //--- 모든 조건 확인
   return(Sell_Condition_1 && Sell_Condition_2 && Sell_Condition_3 && Sell_Condition_4);
  }

4. 숏 포지션 닫기

숏 포지션을 닫기 위한 조건은 롱 포지션을 열기 위한 조건과 동일합니다.

//+------------------------------------------------------------------+
//| 숏 포지션 닫기 조건 확인                                   |
//+------------------------------------------------------------------+
bool CSignalADX_MA::CheckCloseShort(double& price)
  {
   //--- 조건 1: 현재 및 마지막 바에서 이동 평균 상승
   bool Buy_Condition_1=(StateEMA(0)>0 && StateEMA(1)>0);
   //--- 조건 2: 마지막 바의 종가가 이동 평균보다 높음 
   bool Buy_Condition_2=(StateClose(1)>0);
   //--- 조건 3: 현재 바의 ADX 값이 지정된 최소값보다 큼
   bool Buy_Condition_3=(MainADX(0)>m_minimum_ADX);
   //--- 조건 4: 현재 바의 DI+가 DI-보다 큼
   bool Buy_Condition_4=(StateADX(0)>0);
   price=0.0;
   //--- 모든 조건 확인
   return(Buy_Condition_1 && Buy_Condition_2 && Buy_Condition_3 && Buy_Condition_4);
  }

MQL5 마법사로 EA 만들기

해당 전략을 기반으로 거래 로봇을 만들기 위해서는 MQL5 마법사에서 “ADX로 확인된 이동 평균 가격 교차 신호”를 선택해야 합니다:

MQL5 마법사에서 신호 선택

MQL5 마법사에서 “ADX로 확인된 이동 평균 가격 교차 신호” 선택하기

그 다음으로 필요한 트레일링 스톱 알고리즘과 자금 및 리스크 관리 시스템을 지정해야 합니다. EA의 코드는 자동으로 생성되며, 이를 컴파일하여 전략 테스터에서 테스트할 수 있습니다.


테스트 결과

이제 EA의 백테스팅 결과를 살펴보겠습니다 (EURUSD H1, 테스트 기간: 2010년 1월 1일 - 2011년 5월 1일, PeriodADX=33, MinimumADX=22, PeriodMA=39, StopLoss=400, TakeProfit=900).

EA 생성 시 고정 볼륨(고정 로트 거래, 0.1)을 사용하였으며, 트레일링 스톱 알고리즘은 사용하지 않았습니다 (트레일링 미사용).

EA 백테스팅 결과

EA 백테스팅 결과


첨부 파일: CSignalADX_MA.mqh 파일은 terminal_data_folder\MQL5\Include\Expert\Signal\에 위치해야 합니다. ma_crossover_adx.mq5 파일은 MQL5 마법사를 사용하여 생성한 EA의 코드입니다.


연관 포스트

댓글 (0)