거래 로봇을 무료로 다운로드 하는 법을 시청해보세요
당사를 Facebook에서 찾아주십시오!
당사 팬 페이지에 가입하십시오
스크립트가 흥미로우신가요?
그렇다면 링크 to it -
하셔서 다른 이들이 평가할 수 있도록 해보세요
스크립트가 마음에 드시나요? MetaTrader 5 터미널에서 시도해보십시오
Experts

MQL5 마법사 - 당일 시간 필터를 적용한 두개의 EMA의 교차에 기반한 신호 - MetaTrader 5용 expert

조회수:
209
평가:
(39)
게시됨:
2021.10.27 14:30
업데이트됨:
2021.11.01 10:28
이 코드를 기반으로 한 로봇이나 지표가 필요하신가요? 프리랜스로 주문하세요 프리랜스로 이동

MQL5 마법사는 Expert Advisors 코드가 자동으로 생성되도록 합니다. MQL5 마법사에서 준비된 Expert Advisors 만들기를 참조하세요.

MQL5 Wizard - 두개의 지수 이동 평균의 교차에 기반한 신호를 MQL5 마법사 - 두개의 지수 이동 평균의 교차에 기반한 신호에서 살펴 보았습니다. 이동 평균은 추세를 파악하는데 도움이 됩니다, 그러나 거짓 신호를 보내는 경우도 있습니다. 그러므로 이 전략을 좀더 잘 운용하기 위해서 시간 필터를 이용하기도 합니다(예를 들어 새로운 포지션은 유럽 시장이 열린 후에 진입하도록 하는 등).

여기서 우리는 당일 시간 필터가 적용된 두개의 지수 이동 평균의 교차에 기반한 전략을 살펴 볼 것입니다.(fast EMA and slow EMA). 전략을 "당일 시간 필터가 적용된 두 EMA의 교차에 기반한 신호"라 부르기로 합니다 (MQL5 마법사로 EA를 자동으로 생성 할때).

거래 신호

  • 매수: Fast EMA가 slow EMA를 상방으로 교차하고 당일 시간 필터를 충족하지 못한 경우.
  • 매도: Fast EMA가 slow EMA를 하방으로 교차하고 당일 시간 필터를 충복핮 못한 경우.

전략은 CSignal2EMA_ITF 클래스에서 만들었습니다.

지정한 시간 프레임에 기반한 필터는 CSignalITF 클래스로 만든 것입니다. 일례로 CSignal2EMA_ITF 클래스를 고려해 볼 수 잇습니다(CSignalITF 클래스 개체를 포함합니다).

거래 시스템은 지정가 예약 주문을 기반으로 하며 가격 수준은 이동 평균 값에 따라 계산되며 ATR 단위(Average True Range)가 사용됩니다.

그림 1. 당일 시간 필터를 적용한 두개의 EMA의 교차에 기반한 거래 신호

그림 1. 당일 시간 필터를 적용한 두개의 EMA의 교차에 기반한 거래 신호

거래 신호

거래 신호는 CSignal2EMA_ITF를 사용해서 생성되었습니다. 지표값의 사용을 용이하게 하기 위해 보호된 메서드가 있습니다:

 double  FastEMA(int ind)      // 바의 fast EMA의 값을 반환
 double  SlowEMA(int ind)      // 바의 slow EMA의 값을 반환
 double  StateFastEMA(int ind) // fast EMA가 증가하거나/감소하는데 따라 양의 값/ 음의 값을 반환
 double  StateSlowEMA(int ind) // slow EMA가 증가하거나/감소하는데 따라 양의 값/ 음의 값을 반환
 double  StateEMA(int ind)     // fast EMA와 slow EMA간의 차이를 반환
 double  ATR(int ind)          // 바의 ATR값을 반환


이 시스템의 기능은 다음과 같습니다: Limit input parameter에 따른 거래. 어떠한 사인을 주는지에 따라 각기 다른 케이스가 있습니다:

  1. Limit>0. 가격이 마켓 가격 보다 유리한 상태에서 이동평균이 돌파되는 거짓 신호에서 관망 후 진입합니다(매매신호에 따라 매수지정가, 매도지정가 주문이 전송됩니다)
  2. Limit<0. 추세에 따라 진입합니다(거래 신호에 따라 바이 스탑 혹은 셀 스탑 주문이 전송됩니다).
  3. Limit=0. 이 경우 market price를 사용합니다.


1. 매수 포지션 진입

매수 포지션에 진입할 조건을 체크합니다: 최근 완성된 바에서 fast와 slow EMA의 차이가 "-" 사인에서 "+" 사인으로 변경되었는지 여부 (StateEMA(1)>0 && StateEMA(2)<0).

Next, CSignalITF 클래스의 iCheckOpenLong() 메서드를 불러 당일 시간 필터를 체크합니다. 만약 트레이딩이 가능하면 최근 완성된 바의 base price level (이동 평균의 값) 과 ATR range의 값을 계산합니다.

Limit input parameter의 표시에 따라 buy pending order를 전송합니다. 주문 가격, 익절, 손절 레벨은 the base price level (ATR 에 따른)로 계산됩니다. 주문 유효 기간은 (바의) Expiration input parameter에 의해 정의됩니다.

//+------------------------------------------------------------------+
//| 매수 포지션에 진입하기 위한 조건을 체크함(매수)                         |
//+------------------------------------------------------------------+
bool CSignal2EMA_ITF::CheckOpenLong(double& price,double& sl,double& tp,datetime& expiration)
  {
   if(!(StateEMA(1)>0 && StateEMA(2)<0))                    return(false);
   if(!m_time_filter.CheckOpenLong(price,sl,tp,expiration)) return(false);
//---
   double ema=SlowEMA(1);
   double atr=ATR(1);
   double spread=m_symbol.Ask()-m_symbol.Bid();
//---
   price=m_symbol.NormalizePrice(ema-m_limit*atr+spread);
   sl   =m_symbol.NormalizePrice(price+m_stop_loss*atr);
   tp   =m_symbol.NormalizePrice(price-m_take_profit*atr);
   expiration+=m_expiration*PeriodSeconds(m_period);
//---
   return(true);
  }

2. 매수 포지션 청산

우리의 경우 매수 포지션을 청산하기 위한 조건을 확인하는 함수는 항상 false를 반환합니다. 즉, 매수 포지션이 이익실현 또는 손절매에 의해 청산될 것이라고 가정합니다. 필요하다면 이 메서드를 사용하여 귀하만의 코드를 작성 해도 됩니다.

//+------------------------------------------------------------------+
//| 매도 포지션을 청산하기 위한 조건을 체크                                |
//+------------------------------------------------------------------+
bool CSignal2EMA_ITF::CheckCloseLong(double& price)
  {
   return(false);
  }


3. 매도 포지션 진입

매도 포지션에 진입할 조건을 체크합니다: 최근 완성된 바에서 fast와 slow EMA의 차이가 "+" 사인에서 "-" 사인으로 변경되었는지 여부 (StateEMA(1)<0 && StateEMA(2)>0).

Next, CSignalITF 클래스의 iCheckOpenLong() 메서드를 불러 당일 시간 필터를 체크합니다. 만약 트레이딩이 가능하면 최근 완성된 바의 base price level (이동 평균의 값) 과 ATR range의 값을 계산합니다.

Limit input parameter의 표시에 따라 지정가 매도 주문(sell pending order)를 전송합니다. 주문 가격, 익절, 손절 레벨은 the base price level (ATR 에 따른)로 계산됩니다. 주문 유효 기간은 (바의) Expiration input parameter에 의해 정의됩니다.

//+------------------------------------------------------------------+
//| 매도 포지션에 진입하기 위한 조건을 체크함(매도)                         |
//+------------------------------------------------------------------+
bool CSignal2EMA_ITF::CheckOpenShort(double& price,double& sl,double& tp,datetime& expiration)
  {
   if(!(StateEMA(1)<0 && StateEMA(2)>0))                     return(false);
   if(!m_time_filter.CheckOpenShort(price,sl,tp,expiration)) return(false);
//---
   double ema=SlowEMA(1);
   double atr=ATR(1);
//---
   price      =m_symbol.NormalizePrice(ema+m_limit*atr);
   sl         =m_symbol.NormalizePrice(price+m_stop_loss*atr);
   tp         =m_symbol.NormalizePrice(price-m_take_profit*atr);
   expiration+=m_expiration*PeriodSeconds(m_period);
//---
   return(true);
  }

4. 매도 포지션 청산

우리의 경우 매수 포지션을 청산하기 위한 조건을 확인하는 함수는 항상 false를 반환합니다. 즉, 매수 포지션이 이익실현 또는 손절매에 의해 청산될 것이라고 가정합니다. 필요하다면 이 메서드를 사용하여 귀하만의 코드를 작성 해도 됩니다.

//+------------------------------------------------------------------+
//| 매도 포지션을 청산하기 위한 조건을 체크                                |
//+------------------------------------------------------------------+
bool CSignal2EMA_ITF::CheckCloseShort(double& price)
  {
   return(false);
  }


5. 지정가 매수 주문의 트레일링 스탑

Expert Advisor는 현재의 이동 평균값과 ATR에 따라 지정가 주문을 트레일링 할 것입니다.

트레이딩 시스템은 거래 신호에 따라 지정가 주문을 전송할 것입니다. 만약 주문 전송이 되면 이동 평균에 따라 지정가 주문을 트레일할 것입니다. 마켓 프라이스가 주문 가격에 다다르면 주문이 실행될 것입니다.
//+--------------------------------------------------------------------+
//| 펜딩 바이 주문을 수정할 조건을 체크                                      |
//+--------------------------------------------------------------------+
bool CSignal2EMA_ITF::CheckTrailingOrderLong(COrderInfo* order,double& price)
  {
//--- check
   if(order==NULL) return(false);
//---
   double ema=SlowEMA(1);
   double atr=ATR(1);
   double spread=m_symbol.Ask()-m_symbol.Bid();
//---
   price=m_symbol.NormalizePrice(ema-m_limit*atr+spread);
//---
   return(true);
  }


6. 셀 펜딩 오더의 트레일링 스탑

Expert Advisor는 현재의 이동 평균값과 ATR에 따라 지정가 주문을 트레일링 할 것입니다.

마켓 프라이스가 주문 가격에 다다르면 주문이 실행될 것입니다.

//+--------------------------------------------------------------------+
//| 펜딩 바이 주문을 수정할 조건 체크                                       |
//+--------------------------------------------------------------------+
bool CSignal2EMA_ITF::CheckTrailingOrderShort(COrderInfo* order,double& price)
  {
//--- check
   if(order==NULL) return(false);
//---
   double ema=SlowEMA(1);
   double atr=ATR(1);
//---
   price=m_symbol.NormalizePrice(ema+m_limit*atr);
//---
   return(true);
  }

MQL5 마법사를 사용해서 Expert Advisor 생성

전략을 기반으로 거래 로봇을 만들려면 신호 속성을 MQL5 마법사의 "Expert Advisor 만들기" 옵션에서" 당일 시간 필터를 적용한 두개의 EMA의 교차에 기반한 신호" 로 선택해야 합니다:

그림 2. MQL5 마법사에서 "당일 시간 필터를 적용한 두개의 EMA의 교차에 기반한 신호"를 선택합니다

그림 2. MQL5 마법사에서 "당일 시간 필터를 적용한 두개의 EMA의 교차에 기반한 신호"를 선택합니다

다음으로 트레일링 스탐 알고리즘과 자금과 위험 관리 시스템을 지정해야 합니다. Expert Advisor의 코드는 자동으로 생성되며, MetaTrader 5 클라이언트 터미널의 전략 테스터에서 컴파일하고 테스트할 수 있습니다.


테스트 결과

과거 데이터(EUenSD H1, 테스팅 기간: 1.1.2010-05.01.2011, PeriodFastEMA=5, PeriodSlowEMA=30, PeriodATR=7, Limit=1.2, StopLoss=5, TakeProfit=8, Expiration=4, GoodMinuteOfHour=-1, BadMinutesOfHour=0, GoodHourOfDay=-1, BadHoursOfDay=0, GoodDayOfWeek=-1, BadDaysOfWeek=0)로 Expert Advisor를 백테스팅해 보겠습니다.

Expert Advisor를 만들때 우리는 고정된 볼륨 (고정 랏, 0.1), 트레일링 스탑 알고리즘은 사용하지 않는 것으로 (Trailing not used) 하였습니다.

그림 3. 당일 시간 필터를 적용하지 않은 두개의 EMA의 교차에 기반한 거래 신호 Expert Advisor의 테스트 결과

그림 3. 당일 시간 필터를 적용하지 않은 두개의 EMA의 교차에 기반한 거래 신호 Expert Advisor의 테스트 결과

당일 시간 필터를 사용하지 않았습니다 그러므로 거짓 신호가 여러번 발생하였습니다. 거래 시간에 따른 거래 결과를 분석하면 거래 신호를 더욱 정확하게 만들 수 있습니다.

분석을 해 보면 6:00 부터 23:59까지 두개의EMA는 많은 거짓 신호를 발생 시킨 것을 확인 할 수 있습니다. 필터의 패러미터를 사용해 당일 타임 필터를 지정 할 수 있습니다.

예를 들어 0:00 부터 5:59까지만 매매 할 수 있도록 지정 할 수 있습니다. 이것은 BadHoursOfDay=16777152=111111111111111111000000b와 같이 하면 됩니다. 다른 모든 거래 시간은 "bad"가 됩니다, 그렇게 하여 6:00 부터 당일 마감까지 매매를 하지 않을수 있게 됩니다.

만약 BadHoursOfDay=16777152로 지정하면 거짓 신호의 상당량을 걸러 낼 것입니다:

그림 4. 당일 시간 필터를 적용한 두개의 EMA의 교차에 기반한 신호를 사용한 Expert Advisor(BadHoursofDay=16777152)의 테스팅 결과

그림 4. 당일 시간 필터를 적용한 두개의 EMA의 교차에 기반한 신호를 사용한 Expert Advisor(BadHoursofDay=16777152)의 테스팅 결과


CSignalITF는 다른 여러가지 시간 필터를 구현할 수 있습니다(시에서 "good"과 "bad" 분을 지정하거나 일에서 시를 지정하거나 주에서 일을 지정하거나).

시간 필터를 사용하면 거래 신호의 정확성을 향상시키고 시장의 다이나믹한 면을 반영할수 있습니다(가령, 거래 가능 시간을 지정하는 등).

첨부: The Signal2EMA-ITF.mqh과 CSignal2EMA_ITF 클래스는 terminal_data_folder\MQL5\Include\Expert\Signal에 위치해야 합니다.

expertt_2ema_itf.mq5는 MQL5는 마법사를 사용하여 생성된 Expert Advisor의 코드를 포함하고 있습니다.


MetaQuotes Ltd에서 러시아어로 번역함.
원본 코드: https://www.mql5.com/ru/code/264

엡벨로프스 엡벨로프스

엔벨로프스 지표는 두 개의 이동 평균으로 구성되며 그 중 하나는 위쪽으로 움직이고 다른 하나는 아래쪽으로 움직입니다. 밴드 마진 shifting의 최적인 상대 수의 선택은 시장 변동성에 따라 결정됩니다: 후자가 높을수록 이동이 더 강합니다.

디트렌디드 프라이스 오실레이터 (DPO) 디트렌디드 프라이스 오실레이터 (DPO)

디트렌디는 오실레이터는 가격에서 트렌드의 영향을 제거합니다 이는 사이클과 과매수/과매도 레벨을 찾는 과정을 간단하게 합니다.

MQL5 마법사 - Alligator 지표 라인의 교차에 기반한 트레이딩 신호 MQL5 마법사 - Alligator 지표 라인의 교차에 기반한 트레이딩 신호

Alligator 기술적 지표의 라인의 교차를 기반으로 하는 거래 신호 이 전략에 기반한 Expert Advisor 코드는 MQL5 마법사를 사용하여 자동으로 생성될 수 있습니다.

MQL5 마법사 - 반전 캔들 스틱 패턴에 기반한 거래 신호 MQL5 마법사 - 반전 캔들 스틱 패턴에 기반한 거래 신호

반전 캔들 스틱 패턴에 기반한 거래 신호를 살펴봅니다. 이 전략에 기반한 Expert Advisor 코드는 MQL5 마법사를 사용하여 자동으로 생성될 수 있습니다.