안녕하세요, 여러분! 오늘은 MQL5 위자드를 활용해 표준 라이브러리 클래스를 기반으로 한 자동 매매 시스템, 즉 EA를 만드는 방법에 대해 이야기해보려고 해요. 이 방법은 여러분의 트레이드 아이디어를 빠르게 점검할 수 있도록 도와줍니다. 그럼 시작해볼까요?
먼저, 우리가 만들고자 하는 트레이드 신호 클래스는 CExpertSignal에서 파생됩니다. 여기서 중요한 것은 여러분의 조건에 맞춰 LongCondition()과 ShortCondition() 메서드를 오버라이드(재정의)하는 것입니다.
우리는 여러 트레이딩 전략을 다룬 "최고 트레이더들의 전략"라는 책을 참고할 것이며, 이번 포스트에서는 상대강도지수(RSI)로 확인된 반전 캔들 패턴인 3개의 검은 까마귀와 3개의 흰 병사에 초점을 맞춰볼게요.
1. 3개의 검은 까마귀와 3개의 흰 병사 반전 캔들 패턴
1.1 3개의 검은 까마귀
이 패턴은 현재 상승 추세의 반전을 예측하는 하락 캔들 패턴입니다. 이 패턴은 세 개의 긴 몸체를 가진 캔들로 구성되어 있으며, 각 캔들은 이전 날보다 낮은 가격에 마감되고, 각 세션의 개장은 이전 캔들의 몸체 내에서 이루어집니다.

Fig. 1. 3개의 검은 까마귀 캔들 패턴
"3개의 검은 까마귀" 패턴 인식은 CCandlePattern 클래스의 CheckPatternThreeBlackCrows 메서드로 구현됩니다:
//+------------------------------------------------------------------+ //| 3개의 검은 까마귀 캔들 패턴 확인 | //+------------------------------------------------------------------+ bool CCandlePattern::CheckPatternThreeBlackCrows() { //--- 3 Black Crows 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개의 흰 병사 캔들 패턴
이 패턴은 현재 하락 추세의 반전을 예측하는 상승 캔들 패턴입니다. 세 개의 긴 몸체를 가진 캔들로 구성되며, 각 캔들은 이전 날보다 높은 가격에 마감되고, 각 세션의 개장은 이전 캔들의 몸체 내에서 이루어집니다.
두 번째 날의 캔들은 첫 번째 날의 범위 상반부에서 열려야 하며, 두 번째 날이 끝날 때 근처에서 마감해야 하며, 아주 작은 상단 그림자가 있어야 합니다. 세 번째 날에도 동일한 패턴이 반복됩니다.

Fig. 2. 3개의 흰 병사 캔들 패턴
"3개의 흰 병사" 패턴 인식 메서드는 다음과 같습니다:
//+------------------------------------------------------------------+ //| 3개의 흰 병사 캔들 패턴 확인 | //+------------------------------------------------------------------+ bool CCandlePattern::CheckPatternThreeWhiteSoldiers() { //--- 3 White Soldiers 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. RSI 지표로 확인된 트레이드 신호
롱 포지션 또는 숏 포지션을 열기 위한 트레이드 신호는 RSI 지표로 확인되어야 합니다. RSI의 값은 임계 수준(롱 포지션은 40, 숏 포지션은 60)보다 낮거나 높아야 합니다.
열린 포지션의 마감은 RSI 값에 따라 달라집니다. 두 가지 경우로 나눌 수 있습니다:
- RSI가 반대 임계 수준(롱 포지션은 70, 숏 포지션은 30)에 도달했을 때
- 역 신호가 확인되지 않았을 때 (RSI가 다음 수준에 도달했을 때: 롱 포지션은 30, 숏 포지션은 70)

Fig. 3. 3개의 검은 까마귀 패턴, 확정된 스토캐스틱 지표
- int CML_RSI::LongCondition() - 롱 포지션을 열기 위한 조건을 확인합니다 (80을 반환) 및 숏 포지션을 닫기 위한 조건을 확인합니다 (40을 반환);
- int CML_RSI::ShortCondition() - 숏 포지션을 열기 위한 조건을 확인합니다 (80을 반환) 및 롱 포지션을 닫기 위한 조건을 확인합니다 (40을 반환).
2.1 롱 포지션 열기/숏 포지션 닫기
"3개의 흰 병사" 패턴의 형성은 RSI 지표로 확인해야 합니다: RSI(1)<40 (마지막 완료된 바의 RSI 값은 40 미만이어야 합니다).
숏 포지션은 RSI 지표가 임계 수준 70이나 30을 상향 돌파했을 때 닫아야 합니다.
//+------------------------------------------------------------------+ //| 시장 진입 및 퇴출 조건 확인 | //| 1) 시장 진입 (롱 포지션 열기, 결과=80) | //| 2) 시장 퇴출 (숏 포지션 닫기, 결과=40) | //+------------------------------------------------------------------+ int CBC_WS_RSI::LongCondition() { int result=0; //--- idx는 EA 작업 모드를 결정하는 데 사용됩니다 //--- idx=0 - 이 경우 EA는 각 틱에서 거래 조건을 확인합니다 //--- idx=1 - 이 경우 EA는 뉴스 바에서만 거래 조건을 확인합니다 int idx =StartIndex(); //--- 롱 포지션을 열기 위한 조건 확인 //--- 3개의 흰 병사 패턴 및 RSI<30 if(CheckCandlestickPattern(CANDLE_PATTERN_THREE_WHITE_SOLDIERS) && (RSI(1)<40)) result=80; //--- 숏 포지션을 닫기 위한 조건 확인 //--- 과매도/과매수 수준의 신호선 교차 (상향 30, 상향 70) if(((RSI(1)>30) && (RSI(2)<30)) || ((RSI(1)>70) && (RSI(2)<70))) result=40; //--- 결과 반환 return(result); }
2.2 숏 포지션 열기/롱 포지션 닫기
"3개의 검은 까마귀" 패턴의 형성은 RSI 지표로 확인해야 합니다: RSI(1)>60 (마지막 완료된 바의 RSI 값은 60보다 커야 합니다).
롱 포지션은 RSI 지표가 임계 수준 70이나 30을 하향 돌파했을 때 닫아야 합니다.
//+------------------------------------------------------------------+ //| 시장 진입 및 퇴출 조건 확인 | //| 1) 시장 진입 (숏 포지션 열기, 결과=80) | //| 2) 시장 퇴출 (롱 포지션 닫기, 결과=40) | //+------------------------------------------------------------------+ int CBC_WS_RSI::ShortCondition() { int result=0; //--- idx는 EA 작업 모드를 결정하는 데 사용됩니다 //--- idx=0 - 이 경우 EA는 각 틱에서 거래 조건을 확인합니다 //--- idx=1 - 이 경우 EA는 뉴스 바에서만 거래 조건을 확인합니다 int idx =StartIndex(); //--- 숏 포지션을 열기 위한 조건 확인 //--- 3개의 검은 까마귀 패턴 및 RSI>60 if(CheckCandlestickPattern(CANDLE_PATTERN_THREE_BLACK_CROWS) && (RSI(1)>60)) result=80; //--- 롱 포지션을 닫기 위한 조건 확인 //--- 신호선 교차 (하향 70, 하향 30) if(((RSI(1)<70) && (RSI(2)>70)) || ((RSI(1)<30) && (RSI(2)>30))) result=40; //--- 결과 반환 return(result); }
2.3 MQL5 위자드로 EA 생성하기
CML_RSI 클래스는 표준 라이브러리 클래스에 포함되어 있지 않으므로, 이를 사용하기 위해서는 acml_rsi.mqh 파일을 다운로드하여 client_terminal_data\folder\MQL5\Include\Expert\Signal\MySignals 폴더에 저장해야 합니다. candlepatterns.mqh 파일도 동일하게 처리해야 합니다. MQL5 위자드에서 이를 사용하려면 MetaEditor를 재시작해야 합니다.
EA를 생성하기 위해 MQL5 위자드를 실행하세요:

Fig. 4. MQL5 위자드로 EA 생성하기
EA의 이름을 지정해봅시다:

Fig. 5. EA의 일반 속성
이제 사용하려는 트레이드 신호 모듈을 선택해야 합니다.

Fig. 6. EA의 신호 속성
우리 경우에는 단 하나의 트레이드 신호 모듈만 사용할 것입니다.
"3개의 검은 까마귀/3개의 흰 병사 기반의 신호" 트레이드 신호 모듈 추가:

Fig. 7. EA의 신호 속성
신호 모듈이 추가되었습니다:

Fig. 8. EA의 신호 속성
원하는 트레일링 속성을 선택할 수 있지만, 우리는 "트레일링 스탑 사용하지 않음"을 선택하겠습니다:

Fig. 9. EA의 트레일링 속성
자금 관리 속성에 대해, "고정 거래량으로 거래"를 사용하겠습니다:

Fig. 10. EA의 자금 관리 속성
"완료" 버튼을 누르면, 생성된 EA 코드가 Expert_ABC_WS_RSI.mq5로 저장되어 terminal_data_folder\MQL5\Experts\에 위치하게 됩니다.
생성된 EA의 기본 입력 매개변수는 다음과 같습니다:
//--- 메인 신호 입력 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 위자드로 생성된 EA는 트레이드 신호 모듈의