안녕하세요, 트레이더 여러분! 오늘은 MQL5 위자드를 사용해 거래 신호를 쉽게 생성하는 방법에 대해 이야기해볼까 해요. MQL5 위자드는 메타트레이더 5의 클라이언트 터미널과 함께 제공되는 표준 라이브러리 클래스를 기반으로 한 전문가 어드바이저(EA)를 만들 수 있도록 도와줍니다. 여러분의 거래 아이디어를 신속하게 확인할 수 있어요! 자신의 거래 신호 클래스를 생성하는 것만으로도 가능합니다. 이 클래스의 구조와 예시는 MQL5 위자드: 거래 신호 모듈 생성 방법에서 확인할 수 있습니다.
기본적인 아이디어는 다음과 같습니다: 거래 신호 클래스는 CExpertSignal로부터 파생되며, 이후에는 LongCondition()과 ShortCondition() 가상 메서드를 여러분의 메서드로 오버라이드해야 합니다.
러시아어로 된 책 "최고의 트레이더의 전략"에서는 많은 거래 전략이 소개되어 있는 데, 우리는 Stochastic, CCI, MFI 및 RSI와 같은 오실레이터에 의해 확인된 리버설 캔들스틱 패턴에 중점을 두고 이야기할 것입니다.
가장 좋은 방법은 캔들스틱 패턴의 형성을 확인하기 위해 CExpertSignal로부터 파생된 별도의 클래스를 만드는 것입니다. 캔들스틱 패턴으로 생성된 거래 신호를 확인하기 위해서는 CCandlePattern으로부터 파생된 클래스를 작성하고 필요한 기능(예: 오실레이터 확인)을 추가하는 것만으로 충분합니다.
여기서는 Stochastic 지표로 확인된 Bullish Engulfing/Bearish Engulfing 리버설 캔들스틱 패턴을 기반으로 한 신호에 대해 살펴보겠습니다. 거래 신호 모듈은 CCandlePattern 클래스를 기반으로 하며, 캔들스틱 패턴으로 거래 신호를 생성하기 위한 간단한 예시입니다.
1. Bullish Engulfing 및 Bearish Engulfing 리버설 캔들스틱 패턴
1.1. 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); }
CheckCandlestickPattern(CANDLE_PATTERN_BULLISH_ENGULFING) 메서드는 Bullish Engulfing 캔들 패턴의 형성을 확인하는 데 사용됩니다.
1.2. 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); }
CheckCandlestickPattern(CANDLE_PATTERN_BEARISH_ENGULFING) 메서드는 Bearish Engulfing 캔들 패턴의 형성을 확인하는 데 사용됩니다.
2. Stochastic 지표로 확인된 거래 신호
롱 또는 숏 포지션을 열기 위한 거래 신호는 Stochastic 오실레이터로 확인되어야 합니다. %D 라인은 해당하는 기준선(30 또는 70)보다 커야 합니다.
열린 포지션의 종료는 %D 지표의 값에 따라 결정됩니다. 이는 두 가지 경우로 나눌 수 있습니다:
- %D 라인이 반대 기준선(롱 포지션의 경우 80, 숏 포지션의 경우 20)에 도달했을 때
- 반대 신호가 확인되지 않았을 때(%D 라인이 다음 레벨에 도달했을 때: 롱 포지션의 경우 20, 숏 포지션의 경우 80)

Fig. 3. Bullish Engulfing 패턴, Stochastic 지표로 확인됨
입장 및 퇴장 조건 확인은 두 개의 메서드에서 구현됩니다:
- int CBE_BE_Stoch::LongCondition() - 롱 포지션을 열 조건을 체크(결과=80)하고 숏 포지션을 닫는 조건을 체크(결과=40);
- int CBE_BE_Stoch::ShortCondition() - 숏 포지션을 열 조건을 체크(결과=80)하고 롱 포지션을 닫는 조건을 체크(결과=40).
2.1. 롱 포지션 열기/숏 포지션 닫기
Bullish Engulfing 패턴의 형성은 Stochastic 지표로 확인되어야 합니다: StochSignal(1)<30 (마지막 완료된 바의 Stochastic 지표의 신호 라인이 30보다 작아야 함).
숏 포지션은 Stochastic 지표의 신호 라인이 20 또는 80 레벨을 상향 교차했을 때 닫아야 합니다.
//+------------------------------------------------------------------+ //| 시장 진입 및 퇴장 조건 체크 | //| 1) 시장 진입 (롱 포지션 열기, 결과=80) | //| 2) 시장 퇴장 (숏 포지션 닫기, 결과=40) | //+------------------------------------------------------------------+ int CBE_BE_Stoch::LongCondition() { int result=0; //--- idx는 전문가 어드바이저의 작동 모드를 결정하는 데 사용될 수 있음 //--- idx=0 - 이 경우 EA는 각 틱에서 거래 조건을 체크함 //--- idx=1 - 이 경우 EA는 뉴스 바에서만 거래 조건을 체크함 int idx =StartIndex(); //--- 롱 포지션 열기 조건 체크 //--- Bullish Engulfing 패턴 형성 및 신호 라인<30 if (CheckCandlestickPattern(CANDLE_PATTERN_BULLISH_ENGULFING) && (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 Engulfing 패턴의 형성은 Stochastic 지표로 확인되어야 합니다: StochSignal(1)>70 (마지막 완료된 바의 Stochastic 지표의 신호 라인이 70보다 커야 함).
롱 포지션은 Stochastic 지표의 신호 라인이 80 또는 20 레벨을 하향 교차했을 때 닫아야 합니다.
//+------------------------------------------------------------------+ //| 시장 진입 및 퇴장 조건 체크 | //| 1) 시장 진입 (숏 포지션 열기, 결과=80) | //| 2) 시장 퇴장 (롱 포지션 닫기, 결과=40) | //+------------------------------------------------------------------+ int CBE_BE_Stoch::ShortCondition() { int result=0; //--- idx는 전문가 어드바이저의 작동 모드를 결정하는 데 사용될 수 있음 //--- idx=0 - 이 경우 EA는 각 틱에서 거래 조건을 체크함 //--- idx=1 - 이 경우 EA는 뉴스 바에서만 거래 조건을 체크함 int idx =StartIndex(); //--- 숏 포지션 열기 조건 체크 //--- Bearish Engulfing 패턴 형성 및 신호 라인>70 if (CheckCandlestickPattern(CANDLE_PATTERN_BEARISH_ENGULFING) && (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 위자드를 사용한 전문가 어드바이저 생성
CBE_BE_Stoch 클래스는 표준 라이브러리 클래스에 포함되어 있지 않으므로, 사용하려면 acbe_be_stoch.mqh 파일을 다운로드하여 client_terminal_data\folder\MQL5\Include\Expert\Signal\MySignals에 저장해야 합니다. candlepatterns.mqh 파일도 동일하게 처리해야 합니다. 메타에디터를 재시작 후 MQL5 위자드에서 사용할 수 있습니다.
전문가 어드바이저를 만들기 위해 MQL5 위자드를 실행하세요:

Fig. 4. MQL5 위자드를 사용한 전문가 어드바이저 생성
전문가 어드바이저의 이름을 지정해봅시다:

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

Fig. 6. 전문가 어드바이저의 신호 속성
이번 경우에는 하나의 거래 신호 모듈만 사용합니다.
"Stochastic으로 확인된 Bullish Engulfing/Bearish Engulfing 기반의 신호" 거래 신호 모듈 추가:

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

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

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

Fig. 10. 전문가 어드바이저의 자금 관리 속성
"완료" 버튼을 누르면 생성된 전문가 어드바이저의 코드가 Expert_ABE_BE_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. Bullish/Bearish Engulfing + Stochastic 기반 전문가 어드바이저의 테스트 결과
최적의 입력 매개변수 세트는 메타트레이더 5 클라이언트 터미널의 전략 테스터를 사용하여 찾을 수 있습니다.
MQL5 위자드로 생성된 전문가 어드바이저의 코드는 expert_abe_be_stoch.mq5에 첨부되어 있습니다.