MQL5 위자드는 여러분이 MetaTrader 5에서 사용할 준비가 된 EA(Expert Advisor)를 쉽게 생성할 수 있도록 도와줍니다. 이 툴을 활용하면 여러분의 트레이드 아이디어를 빠르게 검증할 수 있습니다. 여러분만의 거래 신호 클래스를 만들기만 하면 됩니다. 클래스의 구조와 예제는 MQL5 위자드: 거래 신호 모듈 생성 방법에서 확인하실 수 있습니다.
거래 신호 클래스는 CExpertSignal에서 파생됩니다. 이후에는 LongCondition() 및 ShortCondition() 가상 메소드를 여러분의 메소드로 오버라이드해야 합니다.
러시아어로 된 책 "최고 트레이더의 전략들"에서는 여러 거래 전략을 다루고 있습니다. 본 포스트에서는 스토캐스틱, CCI, MFI, RSI와 같은 오실레이터로 확인된 반전 캔들 패턴에 초점을 맞추겠습니다.
가장 좋은 방법은 캔들 패턴의 형성을 확인하기 위해 CExpertSignal에서 파생된 별도의 클래스를 만드는 것입니다. 캔들 패턴에서 생성된 거래 신호를 확인하기 위해 CCandlePattern에서 파생된 클래스를 작성하고 필요한 기능(예: 오실레이터로 확인)을 추가하면 됩니다.
이번 포스트에서는 MFI(시장 용이 지수) 지표로 확인된 "Bullish Harami" 및 "Bearish Harami" 반전 캔들 패턴을 기반으로 한 신호에 대해 다루겠습니다. 이 거래 신호 모듈은 CCandlePattern 클래스를 기반으로 하며, 캔들 패턴을 사용하여 거래 신호를 생성하는 간단한 예입니다.
1. Bullish Harami 및 Bearish Harami 반전 캔들 패턴
1.1. Bullish Harami
Bullish Harami 반전 패턴은 하락 추세에서 큰 캔들 뒤에 더 작은 캔들이 나타나는 형태로, 작은 캔들의 몸체는 큰 캔들의 몸체 내에 위치합니다. 이 패턴은 하락 추세가 반전될 수 있음을 나타내며, 롱 포지션에 진입하기 좋은 시점임을 알립니다. 두 번째 캔들은 갭 업으로 열립니다.
두 번째(흰색) 캔들이 작을수록 반전 가능성이 높아집니다.

Fig. 1. Bullish Harami 캔들 패턴
Bullish Harami 패턴의 인식은 CCandlePattern 클래스의 CheckPatternBullishHarami() 메소드에서 구현됩니다:
//+------------------------------------------------------------------+ //| Bullish Harami 캔들 패턴의 형성을 확인합니다. | //+------------------------------------------------------------------+ bool CCandlePattern::CheckPatternBullishHarami() { //--- Bullish Harami if((Close(1)>Open(1)) && // 마지막 바가 강세 (흰색) ((Open(2)-Close(2)>AvgBody(1)) && // 이전 캔들은 약세이며 몸체가 평균보다 큼 (긴 검은색) ((Close(1)<Open(2)) && // 강세 캔들의 종가가 약세 캔들의 시가보다 낮음 (Open(1)>Close(2))) && // 강세 캔들의 시가가 약세 캔들의 종가보다 높음 (MidPoint(2)<CloseAvg(2))) // 하락 추세 return(true); //--- return(false); }
CheckCandlestickPattern(CANDLE_PATTERN_BULLISH_HARAMI) 메소드는 Bullish Harami 캔들 패턴의 형성을 확인하는 데 사용됩니다.
1.2. Bearish Harami
Bearish Harami 반전 패턴은 상승 추세에서 큰 캔들 뒤에 더 작은 캔들이 나타나는 형태로, 작은 캔들의 몸체는 큰 캔들의 몸체 내에 위치합니다. 이 패턴은 상승 추세가 반전될 수 있음을 나타내며, 숏 포지션에 진입하기 좋은 시점임을 알립니다. 두 번째 캔들은 갭 다운으로 열립니다.
두 번째(검은색) 캔들이 작을수록 반전 가능성이 높아집니다.

Fig. 2. Bearish Harami 캔들 패턴
Bearish Harami 패턴의 인식은 CCandlePattern 클래스의 CheckPatternBearishHarami() 메소드에서 구현됩니다:
//+------------------------------------------------------------------+ //| Bearish Harami 캔들 패턴의 형성을 확인합니다. | //+------------------------------------------------------------------+ bool CCandlePattern::CheckPatternBearishHarami() { //--- Bearish Harami if((Close(1)<Open(1)) && // 마지막 바가 약세 (검은색) ((Close(2)-Open(2)>AvgBody(1)) && // 이전 캔들은 강세이며 몸체가 평균보다 큼 (긴 흰색) ((Close(1)>Open(2)) && // 약세 캔들의 종가가 강세 캔들의 시가보다 높음 (Open(1)<Close(2))) && // 약세 캔들의 시가가 강세 캔들의 종가보다 낮음 (MidPoint(2)>CloseAvg(2))) // 상승 추세 return(true); //--- return(false); }
CheckCandlestickPattern(CANDLE_PATTERN_BEARISH_HARAMI) 메소드는 Bearish Harami 캔들 패턴의 형성을 확인하는 데 사용됩니다.
2. MFI 지표로 확인된 거래 신호
롱 또는 숏 포지션을 열기 위한 거래 신호는 MFI 지표로 확인되어야 합니다. MFI 지표의 값은 롱 포지션의 경우 40 미만, 숏 포지션의 경우 60 초과여야 합니다.
열린 포지션의 종료는 MFI 지표의 값에 따라 결정됩니다. 이 경우는 두 가지 경우로 나뉩니다:
- MFI가 반대의 기준 수준(롱 포지션의 경우 70, 숏 포지션의 경우 30)에 도달했을 때
- 반전 신호가 확인되지 않았을 때(MFI 지표가 다음 수준에 도달할 때: 롱 포지션의 경우 30, 숏 포지션의 경우 70)

Fig. 3. Bullish Harami 패턴, MFI 지표로 확인됨
- int CBH_BH_MFI::LongCondition() - 롱 포지션 열기 조건 확인 (80 반환) 및 숏 포지션 종료 조건 확인 (40 반환);
- int CBH_BH_MFI::ShortCondition() - 숏 포지션 열기 조건 확인 (80 반환) 및 롱 포지션 종료 조건 확인 (40 반환).
2.1. 롱 포지션 열기/숏 포지션 종료
Bullish Harami 패턴의 형성은 MFI 지표로 확인되어야 합니다. MFI(1) < 40 (마지막 완성 바의 MFI 값은 40 미만이어야 함).
숏 포지션은 MFI 지표가 기준 수준(70 또는 30)을 상향 돌파했을 때 종료해야 합니다.
//+------------------------------------------------------------------+ //| 시장 진입 및 퇴출 조건 확인 | //| 1) 시장 진입 (롱 포지션 열기, result=80) | //| 2) 시장 퇴출 (숏 포지션 종료, result=40) | //+------------------------------------------------------------------+ int CBH_BH_MFI::LongCondition() { int result=0; //--- idx는 EA 작업 모드를 결정하는 데 사용될 수 있습니다 //--- idx=0 - 이 경우 EA는 각 틱에서 거래 조건 확인 //--- idx=1 - 이 경우 EA는 뉴스 바에서만 거래 조건 확인 int idx =StartIndex(); //--- 롱 포지션 열기 조건 확인 //--- Bullish Harami 패턴 형성 및 MFI < 40 if(CheckCandlestickPattern(CANDLE_PATTERN_BULLISH_HARAMI) && (MFI(1)<40)) result=80; //--- 숏 포지션 종료 조건 확인 //--- 과매수/과매도 수준의 신호선 교차 (상향 30, 상향 70) if(((MFI(1)>30) && (MFI(2)<30)) || ((MFI(1)>70) && (MFI(2)<70))) result=40; //--- 결과 반환 return(result); }
2.2. 숏 포지션 열기/롱 포지션 종료
Bearish Harami 패턴의 형성은 MFI 지표로 확인되어야 합니다. MFI(1) > 60 (마지막 완성 바의 MFI 값은 60 초과여야 함).
롱 포지션은 MFI 지표가 기준 수준(70 또는 30)을 상향 돌파했을 때 종료해야 합니다.
//+------------------------------------------------------------------+ //| 시장 진입 및 퇴출 조건 확인 | //| 1) 시장 진입 (숏 포지션 열기, result=80) | //| 2) 시장 퇴출 (롱 포지션 종료, result=40) | //+------------------------------------------------------------------+ int CBH_BH_MFI::ShortCondition() { int result=0; //--- idx는 EA 작업 모드를 결정하는 데 사용될 수 있습니다 //--- idx=0 - 이 경우 EA는 각 틱에서 거래 조건 확인 //--- idx=1 - 이 경우 EA는 뉴스 바에서만 거래 조건 확인 int idx =StartIndex(); //--- 숏 포지션 열기 조건 확인 //--- Bearish Harami 패턴 형성 및 MFI > 60 if(CheckCandlestickPattern(CANDLE_PATTERN_BEARISH_HARAMI) && (MFI(1)>60)) result=80; //--- 롱 포지션 종료 조건 확인 //--- 신호선 교차의 과매수/과매도 수준 (상향 70, 하향 30) if(((MFI(1)>70) && (MFI(2)<70)) || ((MFI(1)<30) && (MFI(2)>30))) result=40; //--- 결과 반환 return(result); }
2.3. MQL5 위자드를 사용한 Expert Advisor 생성하기
CBH_BH_MFI 클래스는 표준 라이브러리 클래스에 포함되어 있지 않으므로 사용하려면 abh_bh_mfi.mqh 파일을 다운로드하여 client_terminal_data\folder\MQL5\Include\Expert\Signal\MySignals에 저장해야 합니다. acandlepatterns.mqh 파일도 동일하게 수행해야 합니다. MetaEditor를 재시작한 후 MQL5 위자드에서 사용할 수 있습니다.
Expert Advisor를 생성하려면 MQL5 위자드를 실행하세요:

Fig. 4. MQL5 위자드를 사용하여 Expert Advisor 생성하기
Expert Advisor의 이름을 정해줍니다:

Fig. 5. Expert Advisor의 일반 속성
다음으로 사용될 거래 신호 모듈을 선택해야 합니다.

Fig. 6. Expert Advisor의 신호 속성
우리의 경우 거래 신호 모듈은 하나만 사용합니다.
"Bullish Harami/Bearish Harami, MFI로 확인된 신호" 거래 신호 모듈 추가:

Fig. 7. Expert Advisor의 신호 속성
거래 신호 모듈 추가됨:

Fig. 8. Expert Advisor의 신호 속성
원하는 트레일링 속성을 선택할 수 있지만, 우리는 "트레일링 스톱 사용 안 함"을 사용할 것입니다:

Fig. 9. Expert Advisor의 트레일링 속성
자금 관리 속성과 관련하여 우리는 "고정 거래량으로 거래"를 사용할 것입니다:

Fig. 10. Expert Advisor의 자금 관리 속성
"완료" 버튼을 눌러 생성된 Expert Advisor의 코드를 받습니다. 이 코드는 Expert_ABH_BH_MFI.mq5로 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을 반환합니다.
메인 모듈의 투표 결과도 "투표" 평균화에 사용됩니다. 우리 경우에는 메인 모듈 + 1 모듈의 거래 신호가 존재하므로 임계값 설정 시 이 사실을 고려해야 합니다. 이로 인해 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=11)로 살펴보겠습니다.
Expert Advisor를 생성할 때 고정 볼륨(고정 로트 거래, 0.1)을 사용하였으며, 트레일링 스톱 알고리즘은 사용되지 않았습니다 (트레일링 사용 안 함).

Fig. 11. Bullish Harami/Bearish Harami + MFI 기반 Expert Advisor 테스트 결과
가장 좋은 입력 매개변수 조합은 전략 테스터를 통해 찾을 수 있습니다.
MQL5 위자드에 의해 생성된 Expert Advisor의 코드는 expert_abh_bh_mfi.mq5에 첨부되어 있습니다.