English Русский 中文 Español Deutsch 日本語 Português Français Italiano Türkçe
preview
Relative Vigor Index로 거래 시스템을 설계하는 방법을 알아보세요

Relative Vigor Index로 거래 시스템을 설계하는 방법을 알아보세요

MetaTrader 5트레이딩 | 26 10월 2023, 09:47
289 0
Mohamed Abdelmaaboud
Mohamed Abdelmaaboud

소개

새로운 기술 도구를 자세히 배워보고 이 도구를 사용하여 간단한 거래 시스템을 설계하는 시리즈의 새로운 기사에 오신 것을 환영합니다. 이번에 알아 볼 지표는 RVI(상대 활력 지수) 지표입니다. 우리는 다음 주제를 통해 이 지표에 대해 알아볼 것입니다.

  1. 상대 활력 지수 정의
  2. 상대 활력 지수 전략
  3. 상대 활력 지수 전략 청사진
  4. 상대 활력 지수 거래 시스템
  5. 결론

우리는 MQL5(MetaQuotes Language 5) IDE를 사용하여 코드를 작성하고 MetaTrader 5 거래 터미널을 사용하여 거래 시스템을 실행할 것입니다. 초보자로서 코딩 실력을 향상시키고 싶다면 스스로 배운 내용을 적용해 보시기를 권합니다. MetaTrader 5 및 MQL5를 다운로드하고 사용하는 방법을 모르는 경우 이전 기사에서MetaEditor에서 MQL5 코드 작성하기란 글을 읽어보세요.

언급된 모든 전략은 교육의 목적으로만 사용되며 최적화가 필요합니다. 이 기사의 주요 목표는 교육의 목적이며 간단한 전략을 통해 그 뒤에 있는 주요 개념을 배우는 것입니다. 따라서 여러분은 실제 계좌에서 사용하기 전에 테스트하여 거래에 유용한지 확인해야 합니다.

면책: 여기의 모든 정보는 정보 제공의 목적으로만 '있는 그대로' 제공되며 거래의 목적이나 조언을 위해 준비된 것이 아닙니다. 여기의 정보는 어떤 종류의 결과도 보장하지 않습니다. 귀하의 거래 계정에서 이들 자료를 사용하기로 한 경우 귀하는 이에 대한 위험을 감수해야 하며 이에 대한 책임은 귀하에게만 있습니다.


상대 활력 지수 정의

이번 주제에서는 RVI(Relative Vigor Index)가 무엇인지 자세히 알아보겠습니다. RVI는 모멘텀 및 오실레이터 기술 지표입니다. 이 지표는 종가를 시가와 비교하여 추세의 강도를 측정합니다. 상승 추세에서는 종가가 시가보다 높게 마감되지만 하락 추세에서는 종가가 시가보다 낮게 마감됩니다. 또한 결과는 단순이동평균을 이용하여 평활화 한 것입니다. 이 RVI 지표는 지표 원래의 특성대로 기간별로 보는 것 보다는 추세 시장에서 더 나은 성과를 보이고 있습니다. RVI의 계산은 스토캐스틱 오실레이터와 유사하지만 RVI는 종가를 시가와 비교하고 스토캐스틱 오실레이터는 특정 기간 동안의 종가를 가격 범위와 비교한다는 차이점이 있습니다. RVI를 수동으로 계산하려면 다음 단계를 통해 할 수 있습니다.

RVI = (CLOSE - OPEN) / (HIGH - LOW)

여기서:

CLOSE = 종가

OPEN = 시가

HIGH = 고가

LOW = 저가

그러나 일반적으로 우리가 사용하는 RVI는 계산 시 서로 다른 구성요소를 갖는 두 개의 선으로 나타나며 이를 계산하는 방법은 다음과 같습니다.

1- 첫 번째 라인 계산:

  • 분자 계산:

MovAverage = (CLOSE-OPEN) + 2 * (CLOSE-1 - OPEN-1) + 2 * (CLOSE-2 - OPEN-2) + (CLOSE-3 - OPEN-3)

여기서:

CLOSE = 현재 종가

CLOSE 1, CLOSE 2, CLOSE 3 = 1, 2, 3기간 전의 종가

OPEN = 현재 시가

OPEN 1, OPEN 2, OPEN 3 = 1, 2, 3기간 전의 시가

  • 분모 계산:

RangeAverage = (HIGH-LOW) + 2 x (HIGH-1 - LOW-1) + 2 x (HIGH-2 - LOW-2) + (HIGH-3 - LOW-3)

여기서:

HIGH = 마지막 최고 가격

HIGH, HIGH 2, HIGH 3 = 1, 2, 3 기간 전의 마지막 최고 가격

LOW = 마지막 최소 가격

LOW 1, LOW 2, LOW 3 = 1, 2, 3 기간 전의 마지막 최소 가격

  • 다음과 같이 평균의 합을 계산합니다:

RVI 평균

2- 두 번째 라인 계산:

RVIsignal = (RVIaverage + 2 * RVIaverage-1 + 2 * RVIaverage-2 + RVIaverage-3)/6

이제 우리는 지표를 수동으로 계산하는 방법을 배우고 지표 뒤에 숨은 주요 개념을 알아보았습니다. 그러나 이러한 계산은 MetaTrader 5 거래 터미널에서 계산되기 때문에 수동으로 할 필요가 없으며 우리는 사용 가능한 지표에서 선택하기만 하면 됩니다. . 지표를 차트에 삽입하는 방법은 다음과 같습니다:

MetaTrader 5 터미널을 여는 동안 --> 삽입 --> 지표 --> 오실레이터 --> 상대 활력 지수

RVI 인서트

Relative Vigor Index를 누르면 다음과 같은 매개변수 창이 표시됩니다.

RVI 매개변수

1- 기간을 결정합니다.

2- RVI 라인의 색상을 결정합니다.

3- RVI 라인의 스타일을 결정합니다.

4- RVI 라인의 두께를 결정합니다.

5- 시그널 라인의 색상을 결정합니다.

6- 시그널 라인의 스타일을 결정합니다.

7- 시그널 라인의 두께를 결정합니다.

모든 매개변수를 결정하면 지표가 다음과 같이 부착되어 있음을 알 수 있습니다.

RVI 부착

이전 차트에서 볼 수 있듯이 RVI 지표가 차트에 첨부되었고 0 레벨을 중심으로 진동하는 두 개의 선이 있는 것을 볼 수 있습니다.


상대 활력 지수 전략

이제 RVI의 기본 개념을 익히고 간단한 전략을 통해 기본 개념을 바탕으로 어떻게 활용하는지 배워보겠습니다. 여기서 다시 확인해야 할 것은 실제 계정에서 사용하기 전에 전략을 테스트하여 그것이 거래에 적합하고 수익성이 있는지 확인해야 한다는 것입니다. 여기서 주요 개념은 교육의 목적으로만 간단한 전략을 공유하는 것이며 최적화가 필요할 수 있다는 것은 당연한 사실입니다.

  • 전략 1: RVI 교차 - 상승 추세:

이 전략을 바탕으로 우리는 특정 조건에 따른 상승 추세에서 매수 및 청산 신호를 얻어야 합니다. RVI 현재 값과 RVI 시그널 라인의 현재 값이 0 레벨보다 크고 동시에 RVI 현재 값이 RVI 시그널 라인의 현재 값보다 큰 경우 이는 매수 신호가 됩니다. 반대로 RVI 현재 값과 RVI 시그널 라인의 현재 값이 0 레벨 미만인 동시에 RVI 현재 값이 RVI 시그널 라인의 현재 값보다 낮은 경우 이는 청산 신호가 됩니다.

간단히 하면,

RVI 값 > 0 및 RVI 시그널 라인의 값 > 0 및 RVI 값 > RVI 시그널 라인의 값 --> 매수

RVI 값 < 0 및 RVI 시그널 라인의 값 < 0 및 RVI 값 < RVI 시그널 라인의 값 --> 청산

  • 전략 2: RVI 교차 - 하락 추세:

이 전략을 바탕으로 매도 및 커버 시그널을 확보해야 하며 앞서 살펴본 RVI 크로스오버 - 상승 추세 전략과 반대되는 시그널을 얻어야 합니다. RVI 현재 값과 RVI 시그널 라인의 현재 값이 0 레벨보다 낮으면서 RVI 현재 값이 RVI 시그널 라인의 현재 값보다 낮은 경우 이는 매도 신호가 됩니다. 반대로 RVI 현재 값과 RVI 신호 현재 값이 0 레벨보다 높은 동시에 RVI 현재 값이 RVI 시그널 라인의 현재 값보다 높을 경우 이는 커버 신호가 됩니다.

간단히 하면,

RVI 값 < 0 및 RVI 시그널 라인 값 < 0 및 RVI 값 < RVI 시그널 라인 값 --> 매도

RVI 값 > 0 및 RVI 시그널 라인 값 > 0 및 RVI 값 > RVI 시그널 라인 값 --> 커버 

  • 전략 3: RVI 및 MA 교차:

이 전략을 바탕으로 우리는 종가가 100일 이동평균보다 높은 동시에 현재 RVI 값이 현재 RVI 시그널 라인의 값보다 클 때 매수 신호를 얻어야 합니다. 다른 시나리오에서는 종가가 100일 이동평균보다 낮고 동시에 현재 RVI 값이 현재 RVI 시그널 라인의 값보다 낮을 때 매도 신호를 얻어야 합니다.

간단히 하면,

종가 >100- 이동평균 및 RVI 값 > RVI 시그널 라인 값 --> 매수

종가 <100- 이동평균 및 RVI 값 < RVI 시그널 라인 값 --> 매도


상대 활력 지수 전략 청사진

살펴본 전략을 통해 RVI를 어떻게 사용할 수 있는지 알아보고 원활한 거래 시스템을 구축하는 데 도움이 되는 각 전략에 대한 단계별 청사진을 작성해 보겠습니다.

  • 전략 1: RVI 교차 - 상승 추세:

이 전략에 따르면 우리는 다음과 같은 값을 지속적으로 확인하여 상승 추세 동안 매수 및 청산 신호를 제공하는 거래 시스템을 만들어야 합니다.

  • 현재 RVI 값
  • 현재 RVI 시그널 라인 값
  • RVI 지표의 0 레벨

현재 RVI 값이 0 레벨보다 크고 현재 RVI 시그널 라인의 값이 0 레벨보다 크고 현재 RVI 값이 현재 RVI 시그널 라인의 값보다 큰 경우 거래 시스템에서 다음 값을 코멘트로 차트에 반환해야 합니다.

  • 매수 신호.
  • 상대 활력 지수 값
  • RVI 시그널 라인의 값

다른 시나리오에서는 현재 RVI 값이 0 레벨보다 낮고 현재 RVI 시그널 라인의 값이 0 레벨보다 낮으며 현재 RVI 값이 현재 RVI 시그널 라인의 값보다 낮은 경우 거래 시스템이 차트에 코멘트로 다음의 값을 반환해야 합니다.

  • 청산 신호
  • 상대 활력 지수 값
  • RVI 시그널 라인의 값

다음은 이 전략의 단계별 청사진입니다.

RVI 크로스오버 - U 청사진

  • 전략 2: RVI 교차 - 하락 추세:

이 전략에 따르면 이전 전략과 동일한 값을 지속적으로 확인하여 하락세 동안 매도 및 커버 신호를 제공할 수 있는 거래 시스템을 만들어야 합니다.

  • 현재 RVI 값
  • 현재 RVI 시그널 라인 값
  • RVI 지표의 0 레벨

그러나 원하는 신호에 따라 조건이 약간 다를 수 있습니다. 현재 RVI 값이 0 레벨보다 낮고 동시에 현재 RVI 시그널 라인의 값이 0 레벨보다 낮으며 RVI 값이 RVI 시그널 라인의 값보다 낮은 경우 거래 시스템에서 다음 값을 차트에 코멘트로 반환해야 합니다.

  • 매도 신호
  • 상대 활력 지수 값
  • RVI 시그널 라인의 값

반면, 현재 RVI 값이 0 레벨보다 높으면 현재 RVI 시그널 값이 0 레벨보다 높은 동시에 RVI 값이 RVI 시그널 라인의 값보다 높으면 차트에 코멘트로 다음과 같은 값을 반환하는 거래 시스템이 필요합니다:

  • 커버
  • 상대 활력 지수 값
  • RVI 시그널 라인의 값

다음은 이 거래 시스템의 청사진입니다:

RVI 크로스오버 - D 청사진

  • 전략 3: RVI & MA 교차

이 전략에 따르면 우리는 다음과 같은 값을 지속적으로 확인하는 거래 시스템을 통해 매수 및 매도 신호를 받을 수 있어야 합니다.

  • 종가
  • 100일 이동평균(MA)
  • 현재 RVI 값
  • 현재 RVI 시그널 라인 값

종가가 100일 MA보다 높고 현재 RVI 값이 현재 RVI 시그널 값보다 높은 경우 거래 시스템에서 차트에 코멘트로 다음 값을 반환해야 합니다.

  • 매수 신호.
  • 종가
  • MA 값
  • 상대 활력 지수 값
  • RVI 시그널 라인의 값

반면 종가가 100일 MA보다 낮고 현재 RVI 값이 현재 RVI 시그널 라인 값보다 낮은 경우 거래 시스템은 차트에 코멘트로 다음의 값을 반환해야 합니다.

  • 매도 신호
  • 종가
  • MA 값
  • 상대 활력 지수 값
  • RVI 시그널 라인의 값

다음은 이 전략의 청사진입니다:

 RVI, MA 크로스오버 청사진

상대 활력 지수 거래 시스템

간단한 전략을 통해 RVI를 사용하는 방법을 배우고 각 전략에 대한 단계별 청사진을 작성해 보면 거래 시스템을 구축하는 데 도움을 줍니다. 이제 언급된 각 전략에 대한 거래 시스템을 만들겠습니다. 먼저 현재 RVI 값을 차트의 코멘트로 반환하는 간단한 거래 시스템을 만들어 보겠습니다. 다음은 이 거래 시스템을 만드는 단계별 코드입니다.

double 함수를 사용하여 RVI 및 RVI 시그널에 대한 두 개의 배열 만들기:

   double rviArray[];
   double rviSignalArray[];

"ArraySetAsSeries" 함수를 사용하여 부울 값인 true 또는 false를 반환하도록 AS_SERIES 플래그를 배열로 설정합니다.

   ArraySetAsSeries(rviArray,true);
   ArraySetAsSeries(rviSignalArray,true);

Relative Vigor Index 지표의 핸들을 반환하는 "iRVI" 함수를 사용하여 RVI를 정의합니다. 매개변수는 다음과 같습니다:

  • 심볼: 심볼의 이름을 결정하기 위해 (_Symbol)을 사용하여 현재 심볼에 적용합니다. 
  • 기간: 사용 가능한 기간을 설정하려면 (_period)을 사용하여 현재 기간에 적용합니다. 
  •  ma_period: 평균할 기간을 설정하려면 (10)을 사용합니다.
int rviDef = iRVI(_Symbol,_Period,10);

"CopyBuffer" 함수를 사용하여 RVI 지표의 버퍼에서 데이터를 가져옵니다. 매개변수는 다음과 같습니다: 

  • Indicator_handle: 사전 정의된 지표 핸들의 (rviDef, rviDef)를 사용합니다.
  • buffer_num: 지표 버퍼의 번호를 결정하기 위해 (0, 1)을 사용합니다.
  • start_pos: 시작 위치를 결정하기 위해 (0, 0)을 사용합니다.
  • count: 복사할 양을 결정하기 위해 (3, 3)을 사용합니다.
  • buffer[]: 복사할 대상 배열을 결정하기 위해 (rviArray, rviSignalArray)를 사용합니다.
   CopyBuffer(rviDef,0,0,3,rviArray);
   CopyBuffer(rviDef,1,0,3,rviSignalArray);

"NormalizeDouble" 함수를 사용하여 RVI 및 RVI 신호의 값을 정의하여 double 유형의 값을 반환합니다. 매개변수는 다음과 같습니다:

  • value: 정규화된 숫자를 결정합니다. (rviArray[0], rviSignalArray[0])을 사용하겠습니다.
  • digits: 소수점 이하 자릿수를 결정합니다. (3)을 사용하겠습니다.
   double rviVal = NormalizeDouble(rviArray[0],3);
   double rviSignalVal = NormalizeDouble(rviSignalArray[0],3);

"comment" 함수를 사용하여 현재 RVI 지표의 값을 차트에 주석으로 반환합니다.

   Comment("Relative Vigor Index Value is ",rviVal,"\n",
           "RVI Signal Value is ",rviSignalVal);

전체 코드는 다음과 같습니다.

//+------------------------------------------------------------------+
//|                                                   Simple RVI.mq5 |
//|                                  Copyright 2022, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
void OnTick()
  {
   double rviArray[];
   double rviSignalArray[];

   ArraySetAsSeries(rviArray,true);
   ArraySetAsSeries(rviSignalArray,true);

   int rviDef = iRVI(_Symbol,_Period,10);

   CopyBuffer(rviDef,0,0,3,rviArray);
   CopyBuffer(rviDef,1,0,3,rviSignalArray);

   double rviVal = NormalizeDouble(rviArray[0],3);
   double rviSignalVal = NormalizeDouble(rviSignalArray[0],3);

   Comment("Relative Vigor Index Value is ",rviVal,"\n",
           "RVI Signal Value is ",rviSignalVal);

  }
//+------------------------------------------------------------------+

이 코드를 컴파일하면 내비게이터 창에서 다음과 같은 EA를 찾을 수 있습니다:

 RVI 네비게이션

EA를 더블클릭하여 트레이딩 터미널에서 실행하면 다음과 같은 EA 창이 나타납니다.

단순 RVI 승리

"알고 거래 허용" 옆을 체크한 후 "확인"을 누르면 다음과 같이 EA가 차트에 첨부된 것을 확인할 수 있습니다.

 단순 RVI 첨부

이제 이 거래 시스템을 기반으로 생성된 신호를 얻을 준비가 되었습니다. 이후 우리는 다음과 같은 신호를 받게 됩니다.

단순 RVI 신호

차트의 왼쪽 상단에서 볼 수 있듯이 현재 RVI 값에 대한 코멘트가 있습니다.

  • 전략 1: RVI 교차 - 상승 추세:

다음은 이 전략을 기반으로 트레이딩 시스템을 만드는 전체 코드입니다:

//+------------------------------------------------------------------+
//|                                      RVI Crossover - Uptrend.mq5 |
//|                                  Copyright 2022, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
void OnTick()
  {
   double rviArray[];
   double rviSignalArray[];

   ArraySetAsSeries(rviArray,true);
   ArraySetAsSeries(rviSignalArray,true);

   int rviDef = iRVI(_Symbol,_Period,10);

   CopyBuffer(rviDef,0,0,3,rviArray);
   CopyBuffer(rviDef,1,0,3,rviSignalArray);

   double rviVal = NormalizeDouble(rviArray[0],3);
   double rviSignalVal = NormalizeDouble(rviSignalArray[0],3);

   if(rviVal>0 && rviSignalVal>0 && rviVal>rviSignalVal)
     {
      Comment("Buy Signal","\n",
              "Relative Vigor Index Value is ",rviVal,"\n",
              "RVI Signal Value is ",rviSignalVal);
     }
   if(rviVal<0 && rviSignalVal<0 && rviVal<rviSignalVal)
     {
      Comment("Close","\n",
              "Relative Vigor Index Value is ",rviVal,"\n",
              "RVI Signal Value is ",rviSignalVal);
     }


  }
//+------------------------------------------------------------------+

이 코드의 차이점.

전략의 조건:

매수 신호의 경우

   if(rviVal>0 && rviSignalVal>0 && rviVal>rviSignalVal)
     {
      Comment("Buy Signal","\n",
              "Relative Vigor Index Value is ",rviVal,"\n",
              "RVI Signal Value is ",rviSignalVal);
     }

청산의 경우

   if(rviVal<0 && rviSignalVal<0 && rviVal<rviSignalVal)
     {
      Comment("Close","\n",
              "Relative Vigor Index Value is ",rviVal,"\n",
              "RVI Signal Value is ",rviSignalVal);
     }

이 코드를 컴파일하여 트레이딩 터미널에 실행하면 다음과 같이 EA가 차트에 첨부된 것을 확인할 수 있습니다.

RVI 크로스오버 - U 부착

그러면 우리는 다음과 같이 이 거래 시스템을 기반으로 원하는 신호를 얻을 수 있습니다.

매수 신호인 경우:

 RVI 크로스오버 - U - 매수 신호

왼쪽 상단의 차트에서 볼 수 있듯이 다음의 값들이 나타난 신호를 수신했습니다.

  • 매수 신호.
  • 상대 활력 지수 값
  • RVI 시그널 값

청산 신호의 경우:

 RVI 크로스오버 - U - 폐쇄 신호

왼쪽 상단의 차트에서 볼 수 있듯이 다음의 값들이 나타난 신호를 수신했습니다.

  • 종가
  • 상대 활력 지수 값
  • RVI 시그널 값

이 신호는 앞서 살펴본 우리의 거래 전략 및 상승 추세 중이란 조건을 기반으로 해서 우리가 예상한 신호와 동일하다는 것이 분명합니다.

  • 전략 2: RVI 교차 - 하락 추세:

다음은 이 거래 전략을 위한 거래 시스템을 생성하는 전체 코드입니다.

//+------------------------------------------------------------------+
//|                                    RVI Crossover - Downtrend.mq5 |
//|                                  Copyright 2022, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
void OnTick()
  {
   double rviArray[];
   double rviSignalArray[];

   ArraySetAsSeries(rviArray,true);
   ArraySetAsSeries(rviSignalArray,true);

   int rviDef = iRVI(_Symbol,_Period,10);

   CopyBuffer(rviDef,0,0,3,rviArray);
   CopyBuffer(rviDef,1,0,3,rviSignalArray);

   double rviVal = NormalizeDouble(rviArray[0],3);
   double rviSignalVal = NormalizeDouble(rviSignalArray[0],3);

   if(rviVal<0 && rviSignalVal<0 && rviVal<rviSignalVal)
     {
      Comment("Short Signal","\n",
              "Relative Vigor Index Value is ",rviVal,"\n",
              "RVI Signal Value is ",rviSignalVal);
     }
   if(rviVal>0 && rviSignalVal>0 && rviVal>rviSignalVal)
     {
      Comment("Cover","\n",
              "Relative Vigor Index Value is ",rviVal,"\n",
              "RVI Signal Value is ",rviSignalVal);
     }
  }
//+------------------------------------------------------------------+  

이 코드의 차이점.

전략의 조건:

매도 신호의 경우

   if(rviVal<0 && rviSignalVal<0 && rviVal<rviSignalVal)
     {
      Comment("Short Signal","\n",
              "Relative Vigor Index Value is ",rviVal,"\n",
              "RVI Signal Value is ",rviSignalVal);
     }

커버의 경우

   if(rviVal>0 && rviSignalVal>0 && rviVal>rviSignalVal)
     {
      Comment("Cover","\n",
              "Relative Vigor Index Value is ",rviVal,"\n",
              "RVI Signal Value is ",rviSignalVal);
     }

이전에 배운 것과 동일하게 이 코드를 컴파일하고 실행해 보면 다음과 같이 Expert가 차트에 첨부되어 있는 것을 볼 수 있습니다.

 RVI 크로스오버 - D 부착

이제 우리는 이 전략과 트레이딩 시스템을 기반으로 신호를 받을 준비가 되었습니다. 다음은 테스트에서 얻은 신호의 예입니다.

매도 신호의 경우:

 RVI 크로스오버 - D - 짧은 시그나

왼쪽 상단의 차트에서 볼 수 있듯이 다음의 값들이 나타난 신호를 수신했습니다.

  • 매도 신호
  • 상대 활력 지수 값
  • RVI 시그널 값 

커버의 경우:

RVI 크로스오버 - D - 커버 시그나

보시다시피 다음과 같은 값들의 신호를 얻었습니다.

  • 커버
  • 상대 활력 지수 값
  • RVI 시그널 값

이렇게 우리는 하락세 동안 신호를 생성하기 위해 RVI 교차 - 하락세 전략을 기반으로 거래 시스템을 만들었습니다.

  • 전략 3: RVI & MA 교차:

다음은 이 거래 전략을 위한 거래 시스템을 생성하는 전체 코드입니다.

//+------------------------------------------------------------------+
//|                                           RVI & MA Crossover.mq5 |
//|                                  Copyright 2022, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
void OnTick()
  {
   MqlRates pArray[];
   double maArray[];
   double rviArray[];
   double rviSignalArray[];

   int Data=CopyRates(_Symbol,_Period,0,1,pArray);
   ArraySetAsSeries(maArray,true);
   ArraySetAsSeries(rviArray,true);
   ArraySetAsSeries(rviSignalArray,true);

   int rviDef = iRVI(_Symbol,_Period,10);
   int maDef = iMA(_Symbol,_Period,100,0,MODE_EMA,PRICE_CLOSE);

   CopyBuffer(rviDef,0,0,3,rviArray);
   CopyBuffer(rviDef,1,0,3,rviSignalArray);
   CopyBuffer(maDef,0,0,3,maArray);

   double rviVal = NormalizeDouble(rviArray[0],3);
   double rviSignalVal = NormalizeDouble(rviSignalArray[0],3);
   double maVal = NormalizeDouble(maArray[0],3);

   if(pArray[0].close>maVal && rviVal>rviSignalVal)
     {
      Comment("Buy Signal","\n",
              "Closing price is ",pArray[0].close,"\n",
              "MA Value is ",maVal,"\n",
              "Relative Vigor Index Value is ",rviVal,"\n",
              "RVI Signal Value is ",rviSignalVal);
     }
   if(pArray[0].close<maVal && rviVal<rviSignalVal)
     {
      Comment("Sell Signal","\n",
              "Closing price is ",pArray[0].close,"\n",
              "MA Value is ",maVal,"\n",
              "Relative Vigor Index Value is ",rviVal,"\n",
              "RVI Signal Value is ",rviSignalVal);
     }


  }
//+------------------------------------------------------------------+

이 코드의 차이점.

4개의 배열 생성(pArray, maArray, rviArray, rviSignalArray) pArray를 제외하고 double 함수를 사용할 것입니다. 그리고 MqlRates 함수를 사용하여 가격, 거래량 및 스프레드에 대한 정보를 저장할 것입니다.

   MqlRates pArray[];
   double maArray[];
   double rviArray[];
   double rviSignalArray[];

"ArraySetAsSeries" 함수를 사용하여 부울 값인 true 또는 false를 반환하도록 AS_SERIES 플래그를 배열로 설정합니다. MqlRates 구조의 히스토리 데이터를 가져오기 위해 "CopyRates" 함수를 사용하여 데이터를 정의합니다. 해당 매개변수는 다음과 같습니다.

  • Symbol_name: 심볼 이름을 결정합니다. 우리는 _Symbol을 사용하여 현재 심볼에 적용합니다.
  • timeframe: 기간을 결정합니다. _Period를 사용하여 현재 기간에 적용합니다.
  • start_pos: 시작 위치를 결정합니다. 우리는 (0)을 사용합니다. 
  • count: 복사할 데이터의 수를 결정합니다. 우리는 (1)을 사용합니다.
  • rates_array[]: 복사할 대상 배열을 결정합니다. 우리는 pArray를 사용합니다.
   int Data=CopyRates(_Symbol,_Period,0,1,pArray);
   ArraySetAsSeries(maArray,true);
   ArraySetAsSeries(rviArray,true);
   ArraySetAsSeries(rviSignalArray,true);

앞서 살펴본 iRVI 함수를 사용하여 RVI를 정의하고 이동 평균 지표의 핸들을 반환하기 위해 iMA 함수를 사용하여 이동 평균을 정의하면 해당 매개변수는 다음과 같습니다.

  • symbol: 기호 이름을 결정합니다. 우리는 (_Symbol)을 사용합니다. 
  • period: 차트 주기의 기간을 결정합니다. 우리는 (_period)을 사용합니다.
  • ma_period: 이동 평균의 기간을 결정합니다. 우리는 100을 사용합니다. 
  • ma_shift: 수평 이동을 결정합니다. 우리는 (0)을 사용합니다. 
  • ma_method: 이동 평균의 유형을 결정합니다. 우리는 지수 MA를 사용합니다. 
  • Apply_price: 가격 유형을 결정합니다. 우리는 종가를 사용합니다. 
   int rviDef = iRVI(_Symbol,_Period,10);
   int maDef = iMA(_Symbol,_Period,100,0,MODE_EMA,PRICE_CLOSE);

"CopyBuffer" 함수를 사용하여 RVI 및 MA 지표의 버퍼에서 데이터를 가져옵니다.

   CopyBuffer(rviDef,0,0,3,rviArray);
   CopyBuffer(rviDef,1,0,3,rviSignalArray);
   CopyBuffer(maDef,0,0,3,maArray);

NormalizeDouble 함수를 사용하여 RVI, RVI 시그널 및 MA 값의 값을 정의합니다.

   double rviVal = NormalizeDouble(rviArray[0],3);
   double rviSignalVal = NormalizeDouble(rviSignalArray[0],3);
   double maVal = NormalizeDouble(maArray[0],3);

전략의 조건.

매수 신호의 경우

   if(pArray[0].close>maVal && rviVal>rviSignalVal)
     {
      Comment("Buy Signal","\n",
              "Closing price is ",pArray[0].close,"\n",
              "MA Value is ",maVal,"\n",
              "Relative Vigor Index Value is ",rviVal,"\n",
              "RVI Signal Value is ",rviSignalVal);
     }

매도 신호의 경우

   if(pArray[0].close<maVal && rviVal<rviSignalVal)
     {
      Comment("Sell Signal","\n",
              "Closing price is ",pArray[0].close,"\n",
              "MA Value is ",maVal,"\n",
              "Relative Vigor Index Value is ",rviVal,"\n",
              "RVI Signal Value is ",rviSignalVal);
     }

이 코드를 컴파일하고 터미널에서 Expert를 실행하면 다음과 같이 Expert가 차트에 첨부되는 것을 확인할 수 있습니다.

 RVI, MA 크로스오버 부착

이제 우리는 테스트에서 다음 예와 같이 이 거래 시스템을 기반으로 생성된 신호를 얻을 수 있습니다.

매수 신호인 경우:

 RVI, MA 크로스오버 - 매수 신호

이전 차트의 왼쪽 상단에서 볼 수 있듯이 다음과 같은 값을 가진 신호가 있습니다.

  • 매수 신호.
  • 종가
  • MA 값
  • 상대 활력 지수 값
  • RVI 시그널 라인의 값

매도 신호인 경우:

RVI, MA 크로스오버 - 매도 신호

다음과 같은 값을 가진 신호를 얻었습니다.

  • 매도 신호
  • 종가
  • MA 값
  • 상대 활력 지수 값
  • RVI 시그널 라인의 값

이제 우리는 언급된 각 전략에 대해 조건에 ​​따라 자동화된 신호를 생성하는 거래 시스템을 만들었습니다.


결론

본 글의 이전 주제를 통해 배운 내용에 이어, 이 지표에 대해 자세히 알아보면서 깊이 이해했다고 가정합니다. RVI 지표의 주요 개념을 이해하기 위해 RVI 지표가 무엇인지, 무엇을 측정하는지, 수동으로 계산하는 방법을 배웠습니다. 우리는 세 가지 간단한 전략을 통해 이 지표를 사용하는 방법을 배웠으며 그 전략은 다음과 같습니다.

  • RVI 교차 - 상승 추세: 상승 추세 동안 매수 및 청산 신호를 생성합니다.
  • RVI 교차 - 하락 추세: 하락 추세 동안 매도 및 커버 신호를 생성합니다.
  • RVI & MA 교차: 특정한 교차를 기반으로 매수 및 매도 신호를 생성합니다.

우리는 언급된 각 전략에 대한 단계별 청사진을 설계하여 이 청사진을 통해 해당 전략에 대한 거래를 원활하고 쉽게 생성하도록 했습니다. 우리는 언급된 각 전략에 대해 MetaTrader 5에서 실행 후 자동 신호를 생성하는 거래 시스템을 만들었습니다.

이 글을 최대한 활용하고 프로그래밍 기술을 개발하기 위해 스스로 배운 내용을 적용해 보시길 바랍니다. 또한 이 기사가 귀하의 거래 결과를 개선하고 기사 주제 또는 관련 주제와 관련된 유용한 통찰력을 얻는 데 도움이 되기를 바랍니다. 유사한 기사를 읽으려면 가장 인기 있는 기술 지표를 기반으로 거래 시스템을 설계하는 방법에 대한 시리즈의 저의 다른 기사를 읽어 보시기 바랍니다.

MetaQuotes 소프트웨어 사를 통해 영어가 번역됨
원본 기고글: https://www.mql5.com/en/articles/11425

어썸 오실레이터로 트레이딩 시스템 설계하는 방법 알아보기 어썸 오실레이터로 트레이딩 시스템 설계하는 방법 알아보기
이번 글에서는 트레이딩에 유용하게 사용될 수 있는 새로운 기술 도구에 대해 알아보겠습니다. 그것은 어썸 오실레이터(AO) 지표입니다. 이 지표로 거래 시스템을 설계하는 방법에 대해 알아볼 것입니다.
MetaTrader VPS 시작하기: 단계별 지침 MetaTrader VPS 시작하기: 단계별 지침
트레이딩 로봇이나 시그널 구독을 사용해 본 사람이라면 누구나 트레이딩 플랫폼에 안정적인 연중무휴 호스팅 서버를 임대해야 한다는 필요성을 알고 있습니다. 저희는 다양한 이유로 메타트레이더 VPS 사용을 권장합니다. MQL5.community 계정을 통해 간단하게 서비스 비용을 결제하고 구독을 관리할 수 있습니다.
Expert Adviso 개발 기초부터(22부): 새로운 주문 시스템(V) Expert Adviso 개발 기초부터(22부): 새로운 주문 시스템(V)
오늘은 새로운 주문 시스템을 계속 개발할 예정입니다. 새로운 시스템을 구현하는 것은 그리 쉬운 일이 아닙니다. 프로세스를 복잡하게 만드는 문제가 종종 발생하기 때문입니다. 이러한 문제가 나타나면 우리는 개발을 멈추고 우리의 개발 방향에 대해 다시 분석해야 합니다.
디마커로 트레이딩 시스템 설계하는 방법 알아보기 디마커로 트레이딩 시스템 설계하는 방법 알아보기
다음은 가장 인기 있는 보조 지표로 트레이딩 시스템을 설계하는 방법에 대한 시리즈의 새 글입니다. 이 글에서는 디마커 지표로 트레이딩 시스템을 만드는 방법을 소개합니다.