시스템트레이딩 게시글

MQL5 위자드로 제작하는 올리게이터 신호 기반 EA

첨부파일
267.zip (3.41 KB, 다운로드 0회)

MQL5 위자드는 전문가 어드바이저(EA)를 자동으로 생성할 수 있는 훌륭한 도구입니다. 프로그램을 작성하지 않고도 EA를 만드는 방법에 대해서는 MQL5 위자드: 프로그래밍 없이 전문가 어드바이저 만들기를 참조하세요.

이번 포스팅에서는 B. Williams가 "Trading Chaos"에서 제시한 올리게이터 기술 지표를 기반으로 한 거래 신호에 대해 알아보겠습니다. 이 전략은 올리게이터 기반 신호라고 불리며, MQL5 위자드에서 EA를 자동으로 생성할 때 사용됩니다.

이 시스템은 세 가지 이동 평균(립스, 이빨, 턱선)과 이들 간의 차이를 이용하여 계산된 오실레이터를 기반으로 합니다. 거래 신호는 올리게이터 선들이 교차할 때 생성되며, 이들 선의 순서에 따라 추세가 결정됩니다. 상승 추세의 경우 립스 선이 가장 높고, 그 다음이 이빨 선, 마지막이 턱선입니다. 하락 추세의 경우는 반대입니다.

거래 신호는 다음과 같습니다:

  • 롱 포지션 열기: 올리게이터 선의 교차와 상승 추세에서 선들 간의 거리 증가;
  • 롱 포지션 닫기: 립스 선이 턱선과 교차할 때;
  • 숏 포지션 열기: 올리게이터 선의 교차와 하락 추세에서 선들 간의 거리 증가;
  • 숏 포지션 닫기: 립스 선이 턱선과 하향 교차할 때;

이 전략은 CSignalAlligator 클래스에 구현되어 있습니다.

올리게이터 기술 지표를 기반으로 한 거래 신호

올리게이터 기술 지표를 기반으로 한 거래 신호


거래 신호

이 거래 전략은 CSignalAlligator에 구현되어 있으며, 지표 값에 접근을 간소화하기 위한 몇 가지 보호 메서드를 가지고 있습니다:

double   Jaw(int ind)              // 바의 턱선 값 반환
double   Teeth(int ind)           // 바의 이빨 선 값 반환
double   Lips(int ind)            // 바의 립스 선 값 반환
double   LipsTeethDiff(int ind)   // 립스와 이빨 선의 차이 반환
double   TeethJawDiff(int ind)    // 이빨과 턱선의 차이 반환
double   LipsJawDiff(int ind)     // 립스와 턱선의 차이 반환
bool     CheckCross();             올리게이터 선의 교차 확인


1. 롱 포지션 열기

거래 조건 확인에는 립스, 이빨, 턱선의 이동에 따른 몇 가지 특징이 있습니다.

롱 포지션을 열기 위한 조건:

  • CheckCross를 이용해 교차 여부와 선들 간의 거리 증가를 확인합니다;
  • LipsTeethDiff(-2)>=LipsTeethDiff(-1) 및 LipsTeethDiff(-1)>=LipsTeethDiff(0); 립스와 이빨 선 간의 거리 증가 확인;
  • LipsTeethDiff(0)>=0.0; 립스 선이 이빨 선보다 높음;
  • TeethJawDiff(-2) >=TeethJawDiff(-1) 및 TeethJawDiff(-1) >=TeethJawDiff(0); 이빨과 턱선 간의 거리 증가 확인;
  • TeethJawDiff(0) >=0.0; 이빨 선이 턱선보다 높음.
//+------------------------------------------------------------------+
//| 롱 포지션을 열기 위한 조건 확인            |
//+------------------------------------------------------------------+
bool CSignalAlligator::CheckOpenLong(double& price,double& sl,double& tp,datetime& expiration)
  {
   if(CheckCross()) return(false);
//---
   price=0.0;
   sl   =0.0;
   tp   =0.0;
//---
   if(LipsTeethDiff(-2)>=LipsTeethDiff(-1) && LipsTeethDiff(-1)>=LipsTeethDiff(0) && LipsTeethDiff(0)>=0.0 &&
      TeethJawDiff(-2) >=TeethJawDiff(-1)  && TeethJawDiff(-1) >=TeethJawDiff(0)  && TeethJawDiff(0) >=0.0)
      m_crossed=true;
//---
   return(m_crossed);
  }


2. 롱 포지션 닫기

롱 포지션을 닫기 위한 조건 (선의 이동에 주의):

  • LipsTeethDiff(-1)<0; 다음 바의 립스 선이 이빨 선보다 낮음;
  • LipsTeethDiff(0)>=0; 현재 바의 립스 선이 이빨 선보다 높거나 같음;
  • LipsTeethDiff(1)>0; 이전 바의 립스 선이 이빨 선보다 높음.
//+------------------------------------------------------------------+
//| 숏 포지션을 열기 위한 조건 확인|
//+------------------------------------------------------------------+
bool CSignalAlligator::CheckCloseLong(double& price)
  {
   price=0.0;
//---
   return(LipsTeethDiff(-1)<0 && LipsTeethDiff(0)>=0 && LipsTeethDiff(1)>0);
  }


3. 숏 포지션 열기

숏 포지션을 열기 위한 조건:

  • CheckCross를 이용해 교차 여부와 선들 간의 거리 증가를 확인합니다;
  • LipsTeethDiff(-2)<=LipsTeethDiff(-1) 및 LipsTeethDiff(-1)<=LipsTeethDiff(0); 립스와 이빨 선 간의 거리 증가 확인;
  • LipsTeethDiff(0)<=0.0; 현재 바의 립스 선이 이빨 선보다 낮음;
  • TeethJawDiff(-2)<=TeethJawDiff(-1) 및 TeethJawDiff(-1)<=TeethJawDiff(0); 이빨과 턱선 간의 거리 증가 확인;
  • TeethJawDiff(0) <=0.0; 현재 바의 이빨 선이 턱선보다 낮음;
//+------------------------------------------------------------------+
//| 숏 포지션을 열기 위한 조건 확인|
//+------------------------------------------------------------------+
bool CSignalAlligator::CheckOpenShort(double& price,double& sl,double& tp,datetime& expiration)
  {
   if(CheckCross()) return(false);
//---
   price=0.0;
   sl   =0.0;
   tp   =0.0;
//---
   if(LipsTeethDiff(-2)<=LipsTeethDiff(-1) && LipsTeethDiff(-1)<=LipsTeethDiff(0) && LipsTeethDiff(0)<=0.0 &&
      TeethJawDiff(-2) <=TeethJawDiff(-1)  && TeethJawDiff(-1) <=TeethJawDiff(0)  && TeethJawDiff(0) <=0.0)
      m_crossed=true;
//---
   return(m_crossed);
  }


4. 숏 포지션 닫기

숏 포지션을 닫기 위한 조건:

  • LipsTeethDiff(-1)>0; 다음 바의 립스 선이 이빨 선보다 높음;
  • LipsTeethDiff(0)<=0; 현재 바의 립스 선이 이빨 선보다 낮거나 같음;
  • LipsTeethDiff(1)<0; 이전 바의 립스 선이 이빨 선보다 낮음.
//+------------------------------------------------------------------+
//| 숏 포지션을 닫기 위한 조건 확인|
//+------------------------------------------------------------------+
bool CSignalAlligator::CheckCloseShort(double& price)
  {
   price=0.0;
//---
   return(LipsTeethDiff(-1)>0 && LipsTeethDiff(0)<=0 && LipsTeethDiff(1)<0);
  }

전략을 기반으로 한 전문가 어드바이저 만들기

이 전략을 기반으로 한 트레이딩 로봇을 만들기 위해서는 MQL5 위자드의 "준비된 전문가 어드바이저 생성" 옵션에서 올리게이터 기반 신호를 선택해야 합니다:

MQL5 위자드에서 올리게이터 기반 신호 선택

MQL5 위자드에서 올리게이터 기반 신호 선택

다음으로 필요한 트레일링 스톱 알고리즘과 자금 및 리스크 관리 시스템을 지정해야 합니다. 전문가 어드바이저의 코드는 자동으로 생성되며, 이를 컴파일하고 전략 테스터에서 테스트할 수 있습니다.


테스트 결과

전문가 어드바이저의 백테스팅을 해보겠습니다. (EURUSD H1, 테스트 기간: 2010년 1월 1일~2011년 1월 5일, JawPeriod=13, JawShift=8, TeethPeriod=8, TeethShift=5, LipsPeriod=5, LipsShift=3, MaMethod=2, Applied=5, CrossMeasure=5).

전문가 어드바이저를 만들 때 고정 볼륨(고정 로트 거래, 0.1)을 사용하였으며, 트레일링 스톱 알고리즘은 사용하지 않았습니다 (트레일링 미사용).

올리게이터 지표 기반 전문가 어드바이저의 테스트 결과

올리게이터 지표 기반 전문가 어드바이저의 테스트 결과


거래 필터링을 사용하고 시간에 따라 시장 특성을 고려하면 수익을 늘릴 수 있습니다. CSignalITF 클래스를 사용하면 일중 시간 필터를 추가할 수 있습니다. 최적의 시간은 MetaTrader 5의 전략 테스터를 통해 찾을 수 있습니다. MQL5 위자드 - 두 개의 EMA 교차와 일중 시간 필터 기반 거래 신호에서 예제를 참고하세요.


첨부파일: SignalAlligator.mqh 파일은 terminal_data_folder\MQL5\Include\Expert\Signal 폴더에 위치해야 합니다.

expert_alligator.mq5 파일은 MQL5 위자드로 생성된 전문가 어드바이저의 코드를 포함하고 있습니다.


연관 포스트

댓글 (0)