안녕하세요, 트레이더 여러분! 오늘은 MQL5 위자드를 사용하여 Bullish Harami 및 Bearish Harami 캔들 패턴을 기반으로 하는 거래 신호를 생성하는 방법에 대해 알아보겠습니다.
MQL5 위자드는 메타트레이더 5에서 제공하는 표준 라이브러리 클래스를 활용하여 즉석에서 전문가 어드바이저(EA)를 만들 수 있게 해줍니다. 거래 아이디어를 빠르게 확인할 수 있도록 거래 신호 클래스를 만들면 됩니다. 이 클래스의 구조와 예제는 MQL5 위자드: 거래 신호 모듈 만들기에서 확인하실 수 있습니다.
기본적인 아이디어는 거래 신호 클래스가 CExpertSignal로부터 파생되고, 이 클래스를 기반으로 LongCondition()와 ShortCondition() 메소드를 오버라이드하여 본인만의 메소드를 작성하는 것입니다.
우리는 Stochastic 인디케이터로 확인된 Bullish Harami와 Bearish Harami 반전 캔들 패턴을 기반으로 한 신호를 생성할 것입니다. 거래 신호 모듈은 CCandlePattern 클래스를 기반으로 하며, 캔들 패턴을 이용한 거래 신호 생성을 위한 간단한 예제입니다.
1. Bullish Harami와 Bearish Harami 반전 캔들 패턴
1.1. Bullish Harami
Bullish Harami 패턴은 하락 추세에서 대형 캔들이 나타난 후 그 몸통이 대형 캔들의 몸통 범위 안에 있는 작은 캔들이 형성될 때 발생합니다. 이 패턴은 하락 추세가 반전될 수 있음을 나타내며, 매수 포지션에 진입하기 좋은 시점임을 신호합니다. 두 번째 캔들은 갭 업으로 시작됩니다.
작은 두 번째(흰색) 캔들이 작을수록 반전 가능성이 높아집니다.

Fig. 1. Bullish Harami 캔들 패턴
Bullish Harami 패턴의 인식은 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 패턴의 인식은 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. Stochastic 지표로 확인된 거래 신호
매수 또는 매도 포지션을 열기 위한 거래 신호는 Stochastic 오실레이터로 확인해야 합니다. %D 라인은 해당 기준 레벨(30 또는 70)보다 커야/작아야 합니다.
열린 포지션의 종료는 %D 지표의 값에 따라 결정됩니다. 이는 두 가지 경우에서 수행될 수 있습니다:
- %D 라인이 반대 기준 레벨(매수 포지션의 경우 80, 매도 포지션의 경우 20)에 도달했을 때
- 반전 신호가 확인되지 않았을 때(%D 라인이 다음 레벨: 매수 포지션의 경우 20, 매도 포지션의 경우 80에 도달했을 때)

Figure 3. Stochastic 지표로 확인된 Bearish Harami 패턴
거래 조건의 진입 및 종료 확인은 두 개의 메소드에서 구현됩니다:
- int CBH_BH_Stoch::LongCondition() - 매수 포지션을 열기 위한 조건을 확인하고(결과=80), 매도 포지션을 종료합니다(결과=40);
- int CBH_BH_Stoch::ShortCondition() - 매도 포지션을 열기 위한 조건을 확인하고(결과=80), 매수 포지션을 종료합니다(결과=40).
2.1. 매수 포지션 열기 / 매도 포지션 종료
Bullish Harami 패턴의 형성은 Stochastic 지표로 확인해야 합니다: StochSignal(1)<30 (마지막 완료된 바의 Stochastic 지표의 신호선 값은 30 미만이어야 합니다).
Stochastic 지표의 신호선이 20 또는 80 레벨을 위로 교차했을 때 매도 포지션을 종료해야 합니다.
//+------------------------------------------------------------------+ //| 시장 진입 및 종료 조건 확인 | //| 1) 시장 진입 (매수 포지션 열기, 결과=80) | //| 2) 시장 종료 (매도 포지션 종료, 결과=40) | //+------------------------------------------------------------------+ int CBH_BH_Stoch::LongCondition() { int result=0; //--- idx는 전문가 어드바이저의 작업 모드를 결정하는 데 사용될 수 있습니다 int idx =StartIndex(); //--- 매수 포지션 열기 조건 확인 //--- Bullish Harami 패턴 형성과 신호선<30 if (CheckCandlestickPattern(CANDLE_PATTERN_BULLISH_HARAMI) && (StochSignal(1)<30)) result=80; //--- 매도 포지션 종료 조건 확인 //--- 신호선이 과매도/과매수 레벨을 교차했을 때 (아래로 20, 위로 80) if((((StochSignal(1)>20) && (StochSignal(2)<20)) || ((StochSignal(1)>80) && (StochSignal(2)<80)))) result=40; //--- 결과 반환 return(result); }
2.2. 매도 포지션 열기 / 매수 포지션 종료
Bearish Harami 패턴의 형성은 Stochastic 지표로 확인해야 합니다: StochSignal(1)>70 (마지막 완료된 바의 Stochastic 지표의 신호선 값은 70보다 커야 합니다).
Stochastic 지표의 신호선이 80 또는 20 레벨을 아래로 교차했을 때 매수 포지션을 종료해야 합니다.
//+------------------------------------------------------------------+ //| 시장 진입 및 종료 조건 확인 | //| 1) 시장 진입 (매도 포지션 열기, 결과=80) | //| 2) 시장 종료 (매수 포지션 종료, 결과=40) | //+------------------------------------------------------------------+ int CBH_BH_Stoch::ShortCondition() { int result=0; //--- idx는 전문가 어드바이저의 작업 모드를 결정하는 데 사용될 수 있습니다 int idx =StartIndex(); //--- 매도 포지션 열기 조건 확인 //--- Bearish Harami 패턴 형성과 신호선>70 if (CheckCandlestickPattern(CANDLE_PATTERN_BEARISH_HARAMI) && (StochSignal(1)>70)) result=80; //--- 매수 포지션 종료 조건 확인 //--- 신호선이 과매도/과매수 레벨을 교차했을 때 (아래로 80, 위로 20) if((((StochSignal(1)<80) && (StochSignal(2)>80)) || ((StochSignal(1)<20) && (StochSignal(2)>20)))) result=40; //--- 결과 반환 return(result); }
2.3. MQL5 위자드를 사용한 전문가 어드바이저 생성하기
CBH_BH_Stoch 클래스는 표준 라이브러리 클래스에 포함되어 있지 않으므로, 사용하기 위해서는 acbh_bh_stoch.mqh 파일을 다운로드하고 client_terminal_data\MQL5\Include\Expert\Signal\MySignals에 저장해야 합니다. 같은 방식으로 candlepatterns.mqh 파일도 저장합니다. 이후 MetaEditor를 재시작하면 MQL5 위자드에서 사용할 수 있습니다.
전문가 어드바이저를 만들려면 MQL5 위자드를 실행합니다:

Fig. 4. MQL5 위자드를 활용한 전문가 어드바이저 생성
전문가 어드바이저의 이름을 지정합니다:

Fig. 5. 전문가 어드바이저의 일반 속성
그 다음, 사용될 거래 신호 모듈을 선택해야 합니다.

Fig. 6. 전문가 어드바이저의 신호 속성
이번 경우, 우리는 단일 거래 신호 모듈만 사용합니다.
Bullish Harami/Bearish Harami에 기반한 신호 모듈 추가:

Fig. 7. 전문가 어드바이저의 신호 속성
거래 신호 모듈이 추가되었습니다:

Fig. 8. 전문가 어드바이저의 신호 속성
원하는 트레일링 속성을 선택할 수 있지만, 우리는 "트레일링 스탑 사용 안 함"을 사용할 것입니다:

Fig. 9. 전문가 어드바이저의 트레일링 속성
자금 관리 속성에 대해서는 "고정 거래량으로 거래"를 사용할 것입니다:

Fig. 10. 전문가 어드바이저의 자금 관리 속성
"완료" 버튼을 누르면 생성된 전문가 어드바이저의 코드가 Expert_ABH_BH_Stoch.mq5로 저장됩니다. 이 파일은 terminal_data_folder\MQL5\Experts\에 위치합니다.
생성된 전문가 어드바이저의 기본 입력 매개변수는 다음과 같습니다:
//--- 주요 신호의 입력 매개변수 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 위자드에 의해 생성된 전문가 어드바이저는 거래 신호 모듈의 "투표"를 사용하여 포지션을 열고 닫습니다. 메인 모듈의 투표 결과도 사용되지만, 그 LongCondition() 및 ShortCondition() 메소드는 항상 0을 반환합니다.
메인 모듈의 투표 결과는 "투표" 평균화에 사용됩니다. 이번 경우에는 메인 모듈 + 1개의 거래 신호 모듈이므로, 임계값 설정 시 이 사실을 고려해야 합니다. 이로 인해 ThresholdOpen과 ThresholdClose는 각각 40=(0+80)/2와 20=(0+40)/2로 설정해야 합니다.
Signal_StopLevel 및 Signal_TakeLevel 입력 매개변수의 값은 0으로 설정되어 있으므로, 포지션의 종료는 종료 조건이 참일 때만 수행됩니다.
2.4. 역사적 백테스팅 결과
이번에는 전문가 어드바이저의 역사적 데이터(EURUSD H1, 테스트 기간: 2010.01.01-2011.03.04, PeriodK=47, PeriodD=9, PeriodSlow=13, MA_period=5)를 이용한 백테스팅 결과를 살펴보겠습니다.
전문가 어드바이저 생성 시 고정 볼륨(고정 로트 거래, 0.1)을 사용하였고, 트레일링 스탑 알고리즘은 사용하지 않았습니다(트레일링 사용 안 함).

Fig. 11. 전문가 어드바이저 테스트 결과
최적의 입력 매개변수 세트는 전략 테스터를 통해 찾을 수 있습니다. MQL5 위자드로 생성된 전문가 어드바이저의 코드는 expert_abh_bh_stoch.mq5 파일에 첨부되어 있습니다.