안녕하세요, 트레이더 여러분! 오늘은 MQL5 위자드를 통해 표준 라이브러리 클래스를 활용하여 거래 신호를 생성하는 방법에 대해 이야기해볼게요. 이 과정을 통해 여러분의 트레이딩 아이디어를 빠르게 검증할 수 있습니다. 필요한 것은 자신만의 거래 신호 클래스를 만드는 것뿐입니다. 클래스 구조와 예제는 MQL5 위자드: 거래 신호 모듈 생성 방법에서 확인할 수 있어요.
기본적인 아이디어는 다음과 같습니다. 거래 신호 클래스는 CExpertSignal에서 파생되며, 여기서 LongCondition()와 ShortCondition() 가상 메서드를 여러분의 메서드로 오버라이드해야 합니다.
러시아어로 된 "최고의 트레이더의 전략"라는 책에서는 다양한 트레이딩 전략이 소개되어 있습니다. 우리는 스톡캐스틱, CCI, MFI, RSI와 같은 오실레이터로 확인된 반전 캔들 패턴에 집중해 보겠습니다.
가장 좋은 방법은 캔들 패턴 형성을 확인하기 위해 CExpertSignal에서 파생된 별도의 클래스를 만드는 것입니다. 캔들 패턴으로 생성된 거래 신호를 확인하기 위해, CCandlePattern에서 파생된 클래스를 작성하고 필요한 기능(예: 오실레이터에 의한 확인)을 추가하면 됩니다.
1. "3흑관" 및 "3백병전" 반전 캔들 패턴
1.1. 3흑관
3흑관은 현재 상승 추세의 반전을 예측하기 위해 사용되는 약세 캔들 패턴입니다. 이 패턴은 이전 날보다 낮게 마감된 세 개의 연속 긴 몸체 캔들로 구성되며, 각 세션의 열기는 이전 캔들의 몸체 안에서 발생합니다.

그림 1. 3흑관 캔들 패턴
"3흑관" 패턴 인식은 CCandlePattern 클래스의 CheckPatternThreeBlackCrows 메서드에서 구현됩니다:
//+------------------------------------------------------------------+ //| 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백병전은 현재 하락 추세의 반전을 예측하기 위해 사용되는 강세 캔들 패턴입니다. 이 패턴은 이전 날보다 높게 마감된 세 개의 연속 긴 몸체 캔들로 구성되며, 각 세션의 열기는 이전 캔들의 몸체 안에서 발생합니다.
패턴은 둘째 날의 캔들이 첫째 날의 범위의 상단 절반에서 열리면 유효합니다. 둘째 날이 끝날 때에는 높은 값 근처에서 마감해야 하며, 위쪽 그림자는 거의 존재하지 않거나 매우 작아야 합니다. 같은 패턴이 셋째 날에도 반복됩니다.

그림 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. 스톡캐스틱 지표로 확인된 거래 신호
롱 포지션 또는 숏 포지션을 열기 위한 거래 신호는 스톡캐스틱 오실레이터로 확인되어야 합니다. 신호 %D 라인은 해당 임계 수준(30 또는 70)보다 커야 하거나 작아야 합니다.
열린 포지션의 마감은 %D 지표의 값에 따라 결정됩니다. 두 가지 경우에 이루어질 수 있습니다:
- %D 라인이 반대 임계 수준(롱 포지션의 경우 80, 숏 포지션의 경우 20)에 도달했을 때
- 역신호가 확인되지 않을 때(%D 라인이 다음 수준에 도달할 때: 롱 포지션의 경우 20, 숏 포지션의 경우 80)

그림 3. 스톡캐스틱 지표로 확인된 3백병전 패턴
입장 및 퇴장 조건 검사는 두 개의 메서드에서 구현됩니다:
- int CBC_WS_Stoch::LongCondition() - 롱 포지션을 열기 위한 조건을 확인합니다(80 반환) 및 숏 포지션을 마감합니다(40 반환);
- int CBC_WS_Stoch::ShortCondition() - 숏 포지션을 열기 위한 조건을 확인합니다(80 반환) 및 롱 포지션을 마감합니다(40 반환).
2.1. 롱 포지션 열기/숏 포지션 마감하기
"3백병전" 패턴 형성은 스톡캐스틱 지표로 확인되어야 합니다: StochSignal(1)<30 (스톡캐스틱 지표의 신호 라인이 마지막으로 완료된 바에서 30보다 작아야 합니다).
신호 라인이 20 또는 80 수준을 상향으로 교차했을 때 숏 포지션을 마감해야 합니다.
//+------------------------------------------------------------------+ //| 시장 진입 및 퇴장 조건 확인하기 | //| 1) 시장 진입 (롱 포지션 열기, 결과=80) | //| 2) 시장 퇴장 (숏 포지션 마감, 결과=40) | //+------------------------------------------------------------------+ int CBC_WS_Stoch::LongCondition() { int result=0; //--- idx는 EA 작업 모드를 결정하는 데 사용될 수 있습니다 //--- idx=0 - 이 경우 EA는 각 틱에서 거래 조건을 검사합니다 //--- idx=1 - 이 경우 EA는 뉴스 바에서만 거래 조건을 검사합니다 int idx =StartIndex(); //--- 롱 포지션을 열기 위한 조건 검사 //--- 3백병전 패턴 형성 및 신호 라인<30 if (CheckCandlestickPattern(CANDLE_PATTERN_THREE_WHITE_SOLDIERS) && (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. 숏 포지션 열기/롱 포지션 마감하기
"3흑관" 패턴 형성은 스톡캐스틱 지표로 확인되어야 합니다: StochSignal(1)>70 (스톡캐스틱 지표의 신호 라인이 마지막으로 완료된 바에서 70보다 커야 합니다).
롱 포지션은 신호 라인이 80 또는 20 수준을 하향으로 교차했을 때 마감해야 합니다.
//+------------------------------------------------------------------+ //| 시장 진입 및 퇴장 조건 확인하기 | //| 1) 시장 진입 (숏 포지션 열기, 결과=80) | //| 2) 시장 퇴장 (롱 포지션 마감, 결과=40) | //+------------------------------------------------------------------+ int CBC_WS_Stoch::ShortCondition() { int result=0; //--- idx는 EA 작업 모드를 결정하는 데 사용될 수 있습니다 //--- idx=0 - 이 경우 EA는 각 틱에서 거래 조건을 검사합니다 //--- idx=1 - 이 경우 EA는 뉴스 바에서만 거래 조건을 검사합니다 int idx =StartIndex(); //--- 숏 포지션을 열기 위한 조건 검사 //--- 3흑관 패턴 형성 및 신호 라인>70 if (CheckCandlestickPattern(CANDLE_PATTERN_THREE_BLACK_CROWS) && (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 위자드로 Expert Advisor 만들기
CBC_WS_Stoch 클래스는 표준 라이브러리 클래스에 포함되어 있지 않으므로, 사용하려면 acbc_ws_stoch.mqh 파일을 다운로드하여 client_terminal_data\folder\MQL5\Include\Expert\Signal\MySignals에 저장해야 합니다. candlepatterns.mqh 파일도 같은 방법으로 처리해야 합니다. MQL5 위자드에서 사용하기 위해 MetaEditor를 재시작하면 됩니다.
Expert Advisor를 만들기 위해 MQL5 위자드를 실행하세요:

그림 4. MQL5 위자드로 Expert Advisor 만들기
Expert Advisor의 이름을 지정합니다:

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

그림 6. Expert Advisor의 신호 속성
이번 경우에는 하나의 거래 신호 모듈만 사용합니다.
"스톡캐스틱으로 확인된 3흑관/3백병전 기반 신호" 모듈을 추가합니다:

그림 7. Expert Advisor의 신호 속성
거래 신호 모듈이 추가되었습니다:

그림 8. Expert Advisor의 신호 속성
원하는 트레일링 속성을 선택할 수 있지만, "트레일링 스톱 미사용"을 선택하겠습니다:

그림 9. Expert Advisor의 트레일링 속성
자금 관리 속성에 대해서는 "고정 거래량으로 거래"를 사용하겠습니다:

그림 10. Expert Advisor의 자금 관리 속성
"완료" 버튼을 누르면, 생성된 Expert Advisor의 코드가 Expert_ABC_WS_Stoch.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는 거래 신호 모듈의