당사 팬 페이지에 가입하십시오
- 조회수:
- 281
- 평가:
- 게시됨:
- 2021.10.22 14:54
-
이 코드를 기반으로 한 로봇이나 지표가 필요하신가요? 프리랜스로 주문하세요 프리랜스로 이동
MQL5 마법사는 Expert Advisors 코드가 자동으로 생성되도록 합니다. MQL5 마법사에서 Expert Advisors 만들기를 참조하세요.
여기에서는 ADX로 확인하고 이동 평균 지표와 가격의 교차를 기반으로 한 전략을 고려할 것입니다. 이 전략을 "ADX로 확인하고 이동 평균 지표와 가격의 교차를 기반으로 한 신호"라고 이름 붙이겠습니다.(EA를 MQL5 마법사로 자동으로 작성할 때).
트레이드 신호:
- 매수: 최근 완성된 바의 종가가 이동평균보다 높고 이동 평균은 현재 바와 최근 완성된 바에서 상향 중일때
- 매도: 최근 완성된 바의 종가가 이동평균보다 낮고 이동 평균은 현재 바와 최근 완성된 바에서 하향 중일때
- 거짓 신호를 구분해 내기 위해 Directional Movement Indexes (DI+ and DI-)를 사용하여 추세의 강도(ADX>ADXmin)와 추세의 방향을 체크합니다.
전략은 CSignalADX_MA 클래스(반드시 terminal_data_folder\MQL5\Include\Expert\Signal\SignalADX-MA.mqh에 있어야 합니다)를 활용하여 생성되었습니다.
그림 1. ADX로 확인하고 가격과 이동평균의 교차에 기반한 거래 신호
거래 신호
트레이딩 전략은 CSignalADX_MA class를 활용하여 생성되었습니다, 가격과 이동 평균의 사용을 용이하게 하기 위해 보호된 메서드가 있습니다:
double PlusADX(int ind) // 바의 DI+ 라인의 값을 반환합니다 double MainADX(int ind) // 바의 메인 라인의 값을 반환합니다 double MinusADX(int ind) // 바의 DI- 라인의 값을 반환합니다 double EMA(int ind) // 바의 이동 평균의 값을 반환합니다 double Close(int ind) // 바의 종가의 값을 반환합니다 double StateADX(int ind) // DI+와 DI- 라인의 차이를 반환합니다 double StateEMA(int ind) // EMA가 증가하면 양수를 반환하고 감소하면 음의 값을 반환합니다 double StateClose(int ind) // 종가와 이동 평균의 차를 반환합니다
1. 매수 포지션 진입
매수 포지션에 진입할 조건:
- StateEMA(0)<0 и StateEMA(1)>0: 이동평균선이 현재 바와 최근에 완성된 바에서 증가
- StateClose(1)>0: 최근에 완성된 바의 종가가 이동 평균선보다 높음;
- MainADX(0)>minimum_ADX: 현재 바의 ADX 값이 지정된 최소값보다 큼(추세가 있는지 여부를 확인하기 위해)
- StateADX(0)>0: 현재 바의 DI+가 DI-보다 큼.
//+------------------------------------------------------------------+ //| 매수 포지션에 진입할 조건을 체크(매수) | //+------------------------------------------------------------------+ bool CSignalADX_MA::CheckOpenLong(double& price,double& sl,double& tp,datetime& expiration) { //--- 조건 1: 이동 평균선이 현재 바와 최근 완성된 바에서 증가 bool Buy_Condition_1=(StateEMA(0)>0 && StateEMA(1)>0); //--- 조건 2: 최근 완성된 바의 종가가 이동 평균보다 큼 bool Buy_Condition_2=(StateClose(1)>0); //--- 조건 3: 현재바의 ADX 값이 지정된 최소 값보다 큼 (추세 시작) bool Buy_Condition_3=(MainADX(0)>m_minimum_ADX); //--- 조건 4: 현재바의 DI+값이 DI-값보다 큼 bool Buy_Condition_4=(StateADX(0)>0); //--- price=0.0; sl =m_symbol.Ask()-m_stop_loss*m_adjusted_point; tp =m_symbol.Ask()+m_take_profit*m_adjusted_point; //--- 모든 조건 체크 return(Buy_Condition_1 && Buy_Condition_2 && Buy_Condition_3 && Buy_Condition_4); }
2. 매수 포지션 청산
매수 포지션을 청산:
- StateEMA(0)<0 и StateEMA(1)<0: 이동평균선이 현재 바와 최근에 완성된 바에서 감소;
- StateClose(1)<0: 최근에 완성된 바의 종가가 이동 편균선보다 낮음;
- MainADX(0)>minimum_ADX: 현재 바의 ADX 값이 지정된 최소값보다 큼(추세가 있는지 여부를 확인하기 위해)
- StateADX(0)<0: 현재 바의 DI-가 DI+보다 큼.
//+------------------------------------------------------------------+ //| 매수 포지션을 청산할 조건을 체크 | //+------------------------------------------------------------------+ bool CSignalADX_MA::CheckCloseLong(double& price) { //--- 조건 1: 이동 평균선이 현재 바와 최근 완성된 바에서 감소 bool Sell_Condition_1=(StateEMA(0)<0 && StateEMA(1)<0); //--- 조건 2: 최근 완성된 바의 종가가 이동 평균보다 낮음 bool Sell_Condition_2=(StateClose(1)<0); //--- 조건 3: 현재바의 ADX 값이 지정된 최소 값보다 큼 (추세 시작) bool Sell_Condition_3=(MainADX(0)>m_minimum_ADX); //--- 조건 4: 현재바의 DI-값이 DI+값보다 큼 bool Sell_Condition_4=(StateADX(0)<0); //--- price=0.0; //--- 모든 조건 체크 return(Sell_Condition_1 && Sell_Condition_2 && Sell_Condition_3 && Sell_Condition_4); }
3. 매도 포지션 진입
매도 포지션에 진입하기 위한 조건들은 매수 포지션을 청산하는 조건과 동일합니다.
//+------------------------------------------------------------------+ //| 매도 포지션에 진입할 조건을 체크(매도) | //+------------------------------------------------------------------+ bool CSignalADX_MA::CheckOpenShort(double& price,double& sl,double& tp,datetime& expiration) { //--- 조건 1: 이동 평균선이 현재 바와 최근 완성된 바에서 감소 bool Sell_Condition_1=(StateEMA(0)<0 && StateEMA(1)<0); //--- 조건 2: 최근 완성된 바의 종가가 이동 평균보다 낮음 bool Sell_Condition_2=(StateClose(1)<0); //--- 조건 3: 현재바의 ADX 값이 지정된 최소 값보다 큼 (추세 시작) bool Sell_Condition_3=(MainADX(0)>m_minimum_ADX); //--- 조건 4: 현재바의 DI-값이 DI+값보다 큼 bool Sell_Condition_4=(StateADX(0)<0); //--- price=0.0; sl =m_symbol.Bid()+m_stop_loss*m_adjusted_point; tp =m_symbol.Bid()-m_take_profit*m_adjusted_point; //--- 모든 조건 체크 return(Sell_Condition_1 && Sell_Condition_2 && Sell_Condition_3 && Sell_Condition_4); }
4. 매도 포지션 청산
매도 포지션을 청산하기 위한 조건들은 매수 포지션에 진입 하는 조건과 동일합니다.
//+------------------------------------------------------------------+ //| 매도 포지션을 청산할 조건을 체크 | //+------------------------------------------------------------------+ bool CSignalADX_MA::CheckCloseShort(double& price) { //--- 조건 1: 이동 평균선이 현재 바와 최근 완성된 바에서 증가 bool Buy_Condition_1=(StateEMA(0)>0 && StateEMA(1)>0); //--- 조건 2: 최근 완성된 바의 종가가 이동 평균보다 높음 bool Buy_Condition_2=(StateClose(1)>0); //--- 조건 3: 현재바의 ADX 값이 지정된 최소 값보다 큼 (추세 시작) bool Buy_Condition_3=(MainADX(0)>m_minimum_ADX); //--- 조건 4: 현재바의 DI+값이 DI-값보다 큼 bool Buy_Condition_4=(StateADX(0)>0); //--- price=0.0; //--- 모든 조건 체크 return(Buy_Condition_1 && Buy_Condition_2 && Buy_Condition_3 && Buy_Condition_4); }
MQL5 마법사를 사용해서 Expert Advisor 생성
전략을 기반으로 거래 로봇을 만들려면 신호 속성을 MQL5 마법사의 "Expert Advisor 만들기" 옵션에서 "ADX로 확인하고 가격과 이동평균의 교차에 기반한 신호"로 선택해야 합니다:
그림 2. MQL5 마법사에서 "MA와의 가격 교차를 기반으로 한 신호"를 선택합니다
다음으로 트레일링 스탐 알고리즘과 자금과 위험 관리 시스템을 지정해야 합니다. Expert Advisor의 코드는 자동으로 생성되며, MetaTrader 5 클라이언트 터미널의 전략 테스터에서 컴파일하고 테스트할 수 있습니다.
테스트 결과
과거 데이터(EURUSD H1, 사용자 지정 기간: 1.1.2010-05.01.2011, PeriodADX=33, MinimumADX=22, PeriodMA=39, StopLoss=400, TakeProfit=900)으로 Expert Advisor를 백테스팅해 보겠습니다.
Expert Advisor를 만들때 우리는 고정된 볼륨 (고정 랏, 0.1), 트레일링 스탑 알고리즘은 사용하지 않는 것으로 (Trailing not used) 하였습니다.
그림 3. ADX로 확인하고 가격과 이동평균의 교차에 기반한 거래 신호에 기반한 Expert Advisor의 백테스팅 결과
첨부: SignalADX-MA.mqh과 CSignalADX_MA 클래스는 반드시 terminal_data_folder\MQL5\Include\Expert\Signal\에 위치해야 합니다.
ma_crossover_adx.mq5는 MQL5 마법사를 사용하여 생성된 Expert Advisor의 코드를 포함하고 있습니다.
MetaQuotes Ltd에서 러시아어로 번역함.
원본 코드: https://www.mql5.com/ru/code/258

세개의 이동 평균에 기반한 거래 신호를 고려해 보겠습니다. 이 전략에 기반한 Expert Advisor 코드는 MQL5 마법사를 사용하여 자동으로 생성될 수 있습니다.

가격이 이동 평균과 교차할 때를 기준으로 한 트레이딩 신호(MQL5 스탠다드 라이브러리의 CSignalMA) 이 전략에 기반한 Expert Advisor 코드는 MQL5 마법사를 사용하여 자동으로 생성될 수 있습니다.

거래 신호는 MACD 지표의 메인 라인(Main line)과 시그널 라인(Signal line)의 교차에 기반한 신호입니다.(CSignalMACD from MQL5 Standard Library) 이 전략에 기반한 Expert Advisor 코드는 MQL5 마법사를 사용하여 자동으로 생성될 수 있습니다.

거래 신호는 두개의 지수 이동 평균의 교차에 기반합니다. 이 전략에 기반한 Expert Advisor 코드는 MQL5 마법사를 사용하여 자동으로 생성될 수 있습니다.