안녕하세요, 트레이더 여러분! 오늘은 MQL5 위자드를 이용해 매매 신호를 생성하는 방법을 알아보겠습니다. 이 도구를 사용하면 메타트레이더 5에서 사용할 수 있는 준비된 전문가 어드바이저(EA)를 쉽게 만들 수 있습니다. 원하는 매매 신호 클래스만 만들면 여러분의 트레이딩 아이디어를 빠르게 확인할 수 있습니다. 클래스 구조와 예시는 MQL5 위자드: 트레이딩 신호 모듈 생성 방법에서 확인할 수 있습니다.
기본적인 아이디어는 다음과 같습니다. 매매 신호 클래스는 CExpertSignal에서 파생됩니다. 이후, LongCondition()와 ShortCondition() 가상 메서드를 여러분의 방법으로 오버라이드 해야 합니다.
러시아어로 된 책 "최고 트레이더의 전략들"에서는 많은 매매 전략을 다루고 있습니다. 여기서는 스톡캐스틱, CCI, MFI, RSI와 같은 오실레이터로 확인된 반전 캔들 패턴에 집중해 보겠습니다.
가장 좋은 방법은 캔들 패턴 형성을 체크하기 위해 CExpertSignal에서 파생된 별도의 클래스를 만드는 것입니다. 캔들 패턴으로 생성된 매매 신호를 확인하기 위해서는 CCandlePattern에서 파생된 클래스를 작성하고, 필요한 기능(예: 오실레이터에 의한 확인)을 추가하면 충분합니다.
이번에는 3 블랙 크로우/3 화이트 솔져 반전 캔들 패턴을 기반으로 한 신호를 다루겠습니다. CCI 지표로 확인된 매매 신호 모듈은 CCandlePattern 클래스를 기반으로 하며, 캔들 패턴으로 매매 신호를 생성하는 간단한 예제를 제공합니다.
1. 3 블랙 크로우 및 3 화이트 솔져 반전 캔들 패턴
1.1. 3 블랙 크로우
3 블랙 크로우는 현재의 상승 추세가 반전될 것임을 예측하는 약세 캔들 패턴입니다. 이 패턴은 세 개의 연속된 긴 바디의 캔들로 구성되며, 각각이 이전 날보다 낮은 가격으로 마감하고, 각 세션의 시가는 이전 캔들의 바디 안에서 이루어집니다.

Fig. 1. 3 블랙 크로우 캔들 패턴
"3 블랙 크로우" 패턴을 인식하는 CheckPatternThreeBlackCrows 메서드는 CCandlePattern 클래스에서 구현되어 있습니다:
//+------------------------------------------------------------------+ //| 3 블랙 크로우 캔들 패턴 확인 | //+------------------------------------------------------------------+ bool CCandlePattern::CheckPatternThreeBlackCrows() { //--- 3 블랙 크로우 if((Open(3) - Close(3) > AvgBody(1)) && (Open(2) - Close(2) > AvgBody(1)) && (Open(1) - Close(1) > AvgBody(1) && (MidPoint(2) < MidPoint(3)) && (MidPoint(1) < MidPoint(2))) return (true); //--- return (false); }
CheckCandlestickPattern(CANDLE_PATTERN_THREE_BLACK_CROWS) 메서드는 "3 블랙 크로우" 캔들 패턴 형성을 확인하는 데 사용됩니다.
1.2. 3 화이트 솔져 캔들 패턴
3 화이트 솔져는 현재의 하락 추세가 반전될 것임을 예측하는 강세 캔들 패턴입니다. 이 패턴은 세 개의 연속된 긴 바디의 캔들로 구성되며, 각각이 이전 날보다 높은 가격으로 마감하고, 각 세션의 시가는 이전 캔들의 바디 안에서 이루어집니다.
이 패턴은 둘째 날의 캔들이 첫날의 범위의 상반부에서 열리면 유효합니다. 둘째 날의 마지막에는 거의 없는 상단 그림자가 남겨져야 하며, 같은 패턴이 셋째 날 반복되어야 합니다.

Fig. 2. 3 화이트 솔져 캔들 패턴
여기에는 "3 화이트 솔져" 패턴 인식을 위한 메서드가 있습니다:
//+------------------------------------------------------------------+ //| 3 화이트 솔져 캔들 패턴 확인 | //+------------------------------------------------------------------+ bool CCandlePattern::CheckPatternThreeWhiteSoldiers() { //--- 3 화이트 솔져 if((Close(3) - Open(3) > AvgBody(1)) && (Close(2) - Open(2) > AvgBody(1)) && (Close(1) - Open(1) > AvgBody(1) && (MidPoint(2) > MidPoint(3)) && (MidPoint(1) > MidPoint(2))) return (true); //--- return (false); }
CheckCandlestickPattern(CANDLE_PATTERN_THREE_WHITE_SOLDIERS) 메서드는 "3 화이트 솔져" 캔들 패턴 형성을 확인하는 데 사용됩니다.
2. CCI 지표로 확인된 매매 신호
롱 또는 숏 포지션을 열기 위한 매매 신호는 CCI 지표로 확인되어야 합니다. CCI의 값은 기준선(-50은 롱 포지션, 50은 숏 포지션)보다 높거나 낮아야 합니다.
개설된 포지션의 마감은 CCI의 값에 따라 달라집니다. 이는 두 가지 경우에 이루어질 수 있습니다:
- CCI 선이 반대 기준선에 도달했을 때 (롱 포지션은 80, 숏 포지션은 -80)
- 반전 신호가 확인되지 않았을 때 (롱 포지션은 -80, 숏 포지션은 80에 도달했을 때)

Fig. 3. 3 블랙 크로우 패턴, CCI 지표로 확인
- int CBC_WS_CCI::LongCondition() - 롱 포지션을 열기 위한 조건을 체크 (결과는 80) 및 숏 포지션을 마감 (결과는 40);
- int CBC_WS_CCI::ShortCondition() - 숏 포지션을 열기 위한 조건을 체크 (결과는 80) 및 롱 포지션을 마감 (결과는 40).
2.1. 롱 포지션 열기/숏 포지션 닫기
"3 블랙 크로우" 패턴이 CCI 지표로 확인되어야 합니다: CCI(1) < -50 (마지막 완료된 바의 CCI 값이 -50보다 작아야 합니다).
숏 포지션은 CCI 지표가 -80 기준선을 위로 교차하거나 80 기준선을 아래로 교차했을 때 닫아야 합니다.
//+------------------------------------------------------------------+ //| 시장 진입 및 퇴출 조건 체크 | //+------------------------------------------------------------------+ int CBC_WS_CCI::LongCondition() { int result=0; //--- idx는 전문가 어드바이저 작업 모드를 결정하는 데 사용될 수 있음 //--- idx=0 - 이 경우 EA가 각 틱에서 거래 조건을 체크함 //--- idx=1 - 이 경우 EA가 뉴스 바에서만 거래 조건을 체크함 int idx = StartIndex(); //--- 롱 포지션을 열기 위한 조건 체크 //--- 3 화이트 솔져 패턴 및 CCI < -50 if(CheckCandlestickPattern(CANDLE_PATTERN_THREE_WHITE_SOLDIERS) && (CCI(1) < -50)) result = 80; //--- 숏 포지션 마감 조건 체크 //--- 과매수/과매도 레벨의 신호선 교차 (하향 -80, 하향 -80) if(((CCI(1) > 80) && (CCI(2) < -80)) || ((CCI(1) < 80) && (CCI(2) > 80))) result = 40; //--- 결과 반환 return(result); }
2.2. 숏 포지션 열기/롱 포지션 닫기
"3 화이트 솔져" 패턴이 CCI 지표로 확인되어야 합니다: CCI(1) > 50 (마지막 완료된 바의 CCI 값이 50보다 커야 합니다).
롱 포지션은 CCI 지표가 -80 또는 80 레벨을 아래로 교차했을 때 닫아야 합니다.
//+------------------------------------------------------------------+ //| 시장 진입 및 퇴출 조건 체크 | //+------------------------------------------------------------------+ int CBC_WS_CCI::ShortCondition() { int result=0; //--- idx는 전문가 어드바이저 작업 모드를 결정하는 데 사용될 수 있음 //--- idx=0 - 이 경우 EA가 각 틱에서 거래 조건을 체크함 //--- idx=1 - 이 경우 EA가 뉴스 바에서만 거래 조건을 체크함 int idx = StartIndex(); //--- 숏 포지션을 열기 위한 조건 체크 //--- 3 블랙 크로우 패턴 및 CCI > 50 if(CheckCandlestickPattern(CANDLE_PATTERN_THREE_BLACK_CROWS) && (CCI(1) > 50)) result = 80; //--- 롱 포지션 마감 조건 체크 //--- 과매수/과매도 레벨의 신호선 교차 (하향 -80, 하향 80) if(((CCI(1) < 80) && (CCI(2) > 80)) || ((CCI(1) < -80) && (CCI(2) > -80))) result = 40; //--- 결과 반환 return(result); }
2.3. MQL5 위자드를 사용한 전문가 어드바이저 생성하기
CBC_WS_CCI 클래스는 표준 라이브러리 클래스에 포함되어 있지 않으므로 이를 사용하려면 acbc_ws_cci.mqh 파일을 다운로드하여 client_terminal_data\folder\MQL5\Include\Expert\Signal\MySignals에 저장해야 합니다. candlepatterns.mqh 파일도 같은 방법으로 해야 합니다. MQL5 위자드에서 사용할 수 있도록 메타에디터를 재시작해야 합니다.
전문가 어드바이저를 생성하기 위해 MQL5 위자드를 실행합니다:

Fig. 4. MQL5 위자드로 전문가 어드바이저 생성
전문가 어드바이저의 이름을 지정해 줍니다:

Fig. 5. 전문가 어드바이저의 일반 속성
그 후 사용할 매매 신호 모듈을 선택해야 합니다.

Fig. 6. 전문가 어드바이저의 신호 속성
이번 경우에는 매매 신호 모듈을 하나만 사용합니다.
"CCI로 확인된 3 블랙 크로우/3 화이트 솔져 기반 신호" 매매 신호 모듈 추가:

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

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

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

Fig. 10. 전문가 어드바이저의 자금 관리 속성
"완료" 버튼을 누르면 생성된 전문가 어드바이저의 코드가 Expert_ABC_WS_CCI.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.16, PeriodCCI=37, MA_period=13)에 대한 백테스팅을 살펴보겠습니다.
전문가 어드바이저 생성 시 고정 볼륨(고정 로트 거래, 0.1)을 사용했으며, 트레일링 스탑 알고리즘은 사용하지 않았습니다 (트레일링 사용 안 함).

Fig. 11. 3 블랙 크로우/3 화이트 솔져 + CCI 기반 전문가 어드바이저의 테스트 결과
최적의 입력 매개변수 세트는 메타트레이더 5 클라이언트 터미널의 전략 테스터를 사용하여 찾을 수 있습니다.
MQL5 위자드로 생성된 전문가 어드바이저의 코드는 expert_abc_ws_cci.mq5로 첨부되어 있습니다.