시스템트레이딩 게시글

MQL5 위자드로 Bullish Engulfing 및 Bearish Engulfing 신호 생성하기

첨부파일
307.zip (6.49 KB, 다운로드 2회)

안녕하세요, 트레이더 여러분! 오늘은 MQL5 위자드를 사용하여 Bullish Engulfing과 Bearish Engulfing 패턴을 기반으로 한 거래 신호를 생성하는 방법에 대해 알아보겠습니다. 이 과정은 메타트레이더 5에서 매우 유용하게 사용할 수 있으며, 신속하게 거래 아이디어를 검증할 수 있는 좋은 방법입니다.

기본적으로, 거래 신호 클래스는 CExpertSignal을 상속받습니다. 이후에는 LongCondition()ShortCondition() 메소드를 오버라이드하여 여러분만의 조건을 추가하면 됩니다.

여기서 참고할 수 있는 책으로는 "전문가의 전략"이 있습니다. 이 책에서는 여러 거래 전략을 다루고 있으며, 우리는 Stochastic, CCI, MFI, RSI와 같은 오실레이터에 의해 확인된 반전 캔들 패턴에 초점을 맞출 것입니다.

1. Bullish Engulfing 및 Bearish Engulfing 패턴

1.1. Bullish Engulfing

Bullish Engulfing 패턴은 하락세에서 작은 검은 캔들이 큰 흰 캔들에 의해 완전히 덮일 때 형성됩니다. 작은 캔들의 그림자는 짧아야 하며, 이를 통해 큰 캔들이 전날의 캔들을 모두 덮을 수 있습니다.

Bullish Engulfing 패턴

Fig. 1. Bullish Engulfing 패턴

Bullish Engulfing 패턴의 인식은 CheckPatternBullishEngulfing() 메소드에서 구현됩니다.

//+------------------------------------------------------------------+
//| Bullish Engulfing 패턴 확인 |
//+------------------------------------------------------------------+
bool CCandlePattern::CheckPatternBullishEngulfing()
  {
//--- Bullish Engulfing
   if((Open(2)>Close(2))             &&  // 이전 캔들이 하락세
      (Close(1)-Open(1)>AvgBody(1))  &&  // 양봉의 몸통이 평균값보다 큼
      (Close(1)>Open(2))             &&  // 양봉의 종가가 음봉의 시가보다 큼
      (MidOpenClose(2)<CloseAvg(2))  &&  // 하락세
      (Open(1)<Close(2)))                // 양봉의 시가가 음봉의 종가보다 낮음
      return(true);
//---
   return(false);
  }

1.2. Bearish Engulfing

Bearish Engulfing 패턴은 상승세에서 작은 흰 캔들이 큰 검은 캔들에 의해 완전히 덮일 때 형성됩니다. 이 패턴 또한 작은 캔들의 그림자는 짧아야 하며, 큰 캔들이 전날의 캔들을 덮어야 합니다.

Bearish Engulfing 패턴

Fig. 2. Bearish Engulfing 패턴

Bearish Engulfing 패턴의 인식은 CheckPatternBearishEngulfing() 메소드에서 구현됩니다.

//+------------------------------------------------------------------+
//| Bearish Engulfing 패턴 확인 |
//+------------------------------------------------------------------+
bool CCandlePattern::CheckPatternBearishEngulfing()
  {
//--- Bearish Engulfing
   if((Open(2)<Close(2))            &&  // 이전 캔들이 상승세
      (Open(1)-Close(1)>AvgBody(1)) &&  // 음봉의 몸통이 평균값보다 큼
      (Close(1)<Open(2))            &&  // 음봉의 종가가 양봉의 시가보다 낮음
      (MidOpenClose(2)>CloseAvg(2)) &&  // 상승세
      (Open(1)>Close(2)))               // 음봉의 시가가 양봉의 종가보다 높음
      return(true);
//---
   return(false);
  }

2. MFI 지표로 확인된 거래 신호

Bullish Engulfing이나 Bearish Engulfing 패턴으로 생성된 거래 신호는 MFI 지표에 의해 확인되어야 합니다. MFI 값이 40 이하일 때 롱 포지션을 열고, 60 이상일 때 숏 포지션을 엽니다.

포지션 종료는 MFI 지표의 값에 따라 결정됩니다. 다음 두 가지 경우에 종료할 수 있습니다:

  • MFI가 반대의 임계 수준(롱 포지션의 경우 70, 숏 포지션의 경우 30)에 도달했을 때
  • 반전 신호가 확인되지 않았을 때(MFI가 30에 도달할 경우 롱 포지션 종료, 70에 도달할 경우 숏 포지션 종료)

MFI 지표에 의한 Bullish Engulfing 패턴 확인

Fig. 3. MFI 지표에 의한 Bullish Engulfing 패턴 확인

  • int CBE_BE_MFI::LongCondition() - 롱 포지션을 열기 위한 조건 확인(결과: 80), 숏 포지션 종료(결과: 40);
  • int CBE_BE_MFI::ShortCondition() - 숏 포지션을 열기 위한 조건 확인(결과: 80), 롱 포지션 종료(결과: 40).

2.1. 롱 포지션 열기/숏 포지션 닫기

  1. Bullish Engulfing 패턴이 MFI 지표로 확인되어야 합니다: MFI(1)<40 (마지막 완료된 바의 MFI 값이 40보다 작아야 함).

  2. 숏 포지션은 MFI 지표가 임계 수준(70 또는 30)을 상향 돌파했을 때 종료해야 합니다.

//+------------------------------------------------------------------+
//| 시장 진입 및 종료 조건 확인 |
//+------------------------------------------------------------------+
int CBE_BE_MFI::LongCondition()
  {
   int result=0;
   //--- idx는 Expert Advisor 작업 모드를 결정하는 데 사용될 수 있습니다
   int idx   =StartIndex();
   //--- 롱 포지션 열기 위한 조건 확인
   //--- Bullish Engulfing 패턴과 MFI<40
  if(CheckCandlestickPattern(CANDLE_PATTERN_BULLISH_ENGULFING) && (MFI(1)<40))
     result=80;
   //--- 숏 포지션 종료 조건 확인
   //--- 신호선이 과매수/과매도 수준을 교차하는 경우
  if(((MFI(1)>30) && (MFI(2)<30)) || ((MFI(1)>70) && (MFI(2)<70)))
     result=40;
   //--- 결과 반환
   return(result);
  }

2.2. 숏 포지션 열기/롱 포지션 닫기

  1. Bearish Engulfing 패턴이 MFI 지표로 확인되어야 합니다: MFI(1)>60 (마지막 완료된 바의 MFI 값이 60보다 커야 함).

  2. 롱 포지션은 MFI 지표가 임계 수준(70 또는 30)을 상향 돌파했을 때 종료해야 합니다.

//+------------------------------------------------------------------+
//| 시장 진입 및 종료 조건 확인 |
//+------------------------------------------------------------------+
int CBE_BE_MFI::ShortCondition()
  {
   int result=0;
   //--- idx는 Expert Advisor 작업 모드를 결정하는 데 사용될 수 있습니다
   int idx   =StartIndex();
   //--- 숏 포지션 열기 위한 조건 확인
   //--- Bearish Engulfing 패턴과 MFI>60
  if(CheckCandlestickPattern(CANDLE_PATTERN_BEARISH_ENGULFING) && (MFI(1)>60))
     result=80;
   //--- 롱 포지션 종료 조건 확인
   //--- 신호선이 과매수/과매도 수준을 교차하는 경우
   if(((MFI(1)>70) && (MFI(2)<70)) || ((MFI(1)<30) && (MFI(2)>30)))
     result=40;
   //--- 결과 반환
   return(result);
  }

2.3. MQL5 위자드를 활용한 Expert Advisor 생성하기

CBE_BE_MFI 클래스는 표준 라이브러리 클래스에 포함되어 있지 않으므로, 사용하려면 abe_be_mfi.mqh 파일을 다운로드하여 client_terminal_data\MQL5\Include\Expert\Signal\MySignals에 저장해야 합니다. acandlepatterns.mqh 파일도 같은 방법으로 저장해야 합니다. 이후 MetaEditor를 재시작하면 MQL5 위자드에서 사용할 수 있습니다.

Expert Advisor를 생성하려면 MQL5 위자드를 실행하세요:

MQL5 위자드에서 Expert Advisor 생성

Fig. 4. MQL5 위자드에서 Expert Advisor 생성

Expert Advisor의 이름을 지정합니다:

Expert Advisor의 일반 속성

Fig. 5. Expert Advisor의 일반 속성

그 다음, 사용할 거래 신호 모듈을 선택해야 합니다.

Expert Advisor의 신호 속성

Fig. 6. Expert Advisor의 신호 속성

이번 경우에는 거래 신호 모듈을 하나만 사용합니다.
"Bullish Engulfing/Bearish Engulfing에 기반한 신호 (MFI로 확인됨)" 모듈을 추가합니다:

Expert Advisor의 신호 속성

Fig. 7. Expert Advisor의 신호 속성

거래 신호 모듈이 추가되었습니다:

Expert Advisor의 신호 속성

Fig. 8. Expert Advisor의 신호 속성

트레일링 속성을 선택할 수 있지만, 우리는 "트레일링 스탑 미사용"을 선택하겠습니다:

Expert Advisor의 트레일링 속성

Fig. 9. Expert Advisor의 트레일링 속성

자금 관리 속성에 관해서는 "고정 거래량으로 거래"를 사용하겠습니다:

Expert Advisor의 자금 관리 속성

Fig. 10. Expert Advisor의 자금 관리 속성

"완료" 버튼을 누르면 생성된 Expert Advisor의 코드가 생성되어 terminal_data_folder\MQL5\Experts\에 저장됩니다.

생성된 Expert Advisor의 기본 입력 매개변수는 다음과 같습니다:

//--- 주요 신호의 입력값
input int            Signal_ThresholdOpen   =10;     // 포지션 열기 위한 신호 임계값 [0...100]
input int            Signal_ThresholdClose  =10;     // 포지션 종료를 위한 신호 임계값 [0...100]
input double         Signal_PriceLevel      =0.0;    // 거래 실행을 위한 가격 수준
input double         Signal_StopLevel       =50.0;   // 손절매 수준 (포인트 단위)
input double         Signal_TakeLevel       =50.0;   // 이익 실현 수준 (포인트 단위)

이 값은 다음과 같이 변경해야 합니다:

//--- 주요 신호의 입력값
input int            Signal_ThresholdOpen   =40;     // 포지션 열기 위한 신호 임계값 [0...100]
input int            Signal_ThresholdClose  =20;     // 포지션 종료를 위한 신호 임계값 [0...100]
input double         Signal_PriceLevel      =0.0;    // 거래 실행을 위한 가격 수준
input double         Signal_StopLevel       =0.0;    // 손절매 수준 (포인트 단위)
input double         Signal_TakeLevel       =0.0    // 이익 실현 수준 (포인트 단위)

Signal_ThresholdOpen/Signal_ThresholdClose 입력 매개변수는 포지션을 열고 닫기 위한 임계값을 지정할 수 있습니다.

LongCondition()과 ShortCondition() 메소드의 코드에서는 임계값을 고정값으로 설정했습니다:

  • 포지션 열기: 80;
  • 포지션 닫기: 40;

MQL5 위자드로 생성된 Expert Advisor는 거래 신호 모듈의 "투표"를 사용하여 포지션을 열고 닫습니다. 메인 모듈의 투표도 사용되지만, 메인 모듈의 LongCondition()과 ShortCondition() 메소드는 항상 0을 반환합니다.

따라서, ThresholdOpen과 ThresholdClose는 각각 40=(0+80)/2, 20=(0+40)/2로 설정해야 합니다. Signal_StopLevel과 Signal_TakeLevel 입력 매개변수는 0으로 설정되어, 포지션 종료 조건이 참이 될 때까지 기다리게 됩니다.

2.4. 히스토리 백테스팅 결과

Expert Advisor의 히스토리 데이터를 기반으로 한 백테스팅을 진행해 보겠습니다 (EURUSD H1, 테스트 기간: 2010.01.01-2011.03.16, PeriodMFI=37, MA_period=5).

Bullish Engulfing/Bearish Engulfing + MFI 기반 Expert Advisor 테스트 결과

Fig. 11. Bullish Engulfing/Bearish Engulfing + MFI 기반 Expert Advisor 테스트 결과

최적의 입력 매개변수 세트는 전략 테스터를 통해 찾아볼 수 있습니다. MQL5 위자드로 생성된 Expert Advisor의 코드는 expert_abe_be_mfi.mq5에 첨부되어 있습니다.

연관 포스트

댓글 (0)