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로 확인된 가격 교차 신호
거래 신호
이 거래 전략은 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. 롱 포지션 열기
롱 포지션을 열기 위한 조건:
- StateEMA(0)<0 및 StateEMA(1)>0: 현재 및 마지막 완료된 바에서 이동 평균이 상승하는 경우;
- StateClose(1)>0: 마지막 완료된 바의 종가가 이동 평균보다 높은 경우;
- MainADX(0)>최소_ADX: 현재 바의 ADX 값이 지정된 최소값보다 큰 경우;
- 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. 롱 포지션 닫기
롱 포지션을 닫기 위한 조건:
- StateEMA(0)<0 및 StateEMA(1)<0: 현재 및 마지막 바에서 이동 평균이 하락하는 경우;
- StateClose(1)<0: 마지막 완료된 바의 종가가 이동 평균보다 낮은 경우;
- MainADX(0)>최소_ADX: 현재 바의 ADX 값이 지정된 최소값보다 큰 경우;
- 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 마법사에서 “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 백테스팅 결과
첨부 파일: CSignalADX_MA.mqh 파일은 terminal_data_folder\MQL5\Include\Expert\Signal\에 위치해야 합니다. ma_crossover_adx.mq5 파일은 MQL5 마법사를 사용하여 생성한 EA의 코드입니다.