Relative Vigor Index로 거래 시스템을 설계하는 방법을 알아보세요
Mohamed Abdelmaaboud | 26 10월, 2023
소개
새로운 기술 도구를 자세히 배워보고 이 도구를 사용하여 간단한 거래 시스템을 설계하는 시리즈의 새로운 기사에 오신 것을 환영합니다. 이번에 알아 볼 지표는 RVI(상대 활력 지수) 지표입니다. 우리는 다음 주제를 통해 이 지표에 대해 알아볼 것입니다.
우리는 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 기간 전의 마지막 최소 가격
- 다음과 같이 평균의 합을 계산합니다:
2- 두 번째 라인 계산:
RVIsignal = (RVIaverage + 2 * RVIaverage-1 + 2 * RVIaverage-2 + RVIaverage-3)/6
이제 우리는 지표를 수동으로 계산하는 방법을 배우고 지표 뒤에 숨은 주요 개념을 알아보았습니다. 그러나 이러한 계산은 MetaTrader 5 거래 터미널에서 계산되기 때문에 수동으로 할 필요가 없으며 우리는 사용 가능한 지표에서 선택하기만 하면 됩니다. . 지표를 차트에 삽입하는 방법은 다음과 같습니다:
MetaTrader 5 터미널을 여는 동안 --> 삽입 --> 지표 --> 오실레이터 --> 상대 활력 지수
Relative Vigor Index를 누르면 다음과 같은 매개변수 창이 표시됩니다.
1- 기간을 결정합니다.
2- RVI 라인의 색상을 결정합니다.
3- RVI 라인의 스타일을 결정합니다.
4- RVI 라인의 두께를 결정합니다.
5- 시그널 라인의 색상을 결정합니다.
6- 시그널 라인의 스타일을 결정합니다.
7- 시그널 라인의 두께를 결정합니다.
모든 매개변수를 결정하면 지표가 다음과 같이 부착되어 있음을 알 수 있습니다.
이전 차트에서 볼 수 있듯이 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 시그널 라인의 값
다음은 이 전략의 단계별 청사진입니다.
- 전략 2: RVI 교차 - 하락 추세:
이 전략에 따르면 이전 전략과 동일한 값을 지속적으로 확인하여 하락세 동안 매도 및 커버 신호를 제공할 수 있는 거래 시스템을 만들어야 합니다.
- 현재 RVI 값
- 현재 RVI 시그널 라인 값
- RVI 지표의 0 레벨
그러나 원하는 신호에 따라 조건이 약간 다를 수 있습니다. 현재 RVI 값이 0 레벨보다 낮고 동시에 현재 RVI 시그널 라인의 값이 0 레벨보다 낮으며 RVI 값이 RVI 시그널 라인의 값보다 낮은 경우 거래 시스템에서 다음 값을 차트에 코멘트로 반환해야 합니다.
- 매도 신호
- 상대 활력 지수 값
- RVI 시그널 라인의 값
반면, 현재 RVI 값이 0 레벨보다 높으면 현재 RVI 시그널 값이 0 레벨보다 높은 동시에 RVI 값이 RVI 시그널 라인의 값보다 높으면 차트에 코멘트로 다음과 같은 값을 반환하는 거래 시스템이 필요합니다:
- 커버
- 상대 활력 지수 값
- RVI 시그널 라인의 값
다음은 이 거래 시스템의 청사진입니다:
- 전략 3: RVI & MA 교차
이 전략에 따르면 우리는 다음과 같은 값을 지속적으로 확인하는 거래 시스템을 통해 매수 및 매도 신호를 받을 수 있어야 합니다.
- 종가
- 100일 이동평균(MA)
- 현재 RVI 값
- 현재 RVI 시그널 라인 값
종가가 100일 MA보다 높고 현재 RVI 값이 현재 RVI 시그널 값보다 높은 경우 거래 시스템에서 차트에 코멘트로 다음 값을 반환해야 합니다.
- 매수 신호.
- 종가
- MA 값
- 상대 활력 지수 값
- RVI 시그널 라인의 값
반면 종가가 100일 MA보다 낮고 현재 RVI 값이 현재 RVI 시그널 라인 값보다 낮은 경우 거래 시스템은 차트에 코멘트로 다음의 값을 반환해야 합니다.
- 매도 신호
- 종가
- MA 값
- 상대 활력 지수 값
- RVI 시그널 라인의 값
다음은 이 전략의 청사진입니다:
상대 활력 지수 거래 시스템
간단한 전략을 통해 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를 찾을 수 있습니다:
EA를 더블클릭하여 트레이딩 터미널에서 실행하면 다음과 같은 EA 창이 나타납니다.
"알고 거래 허용" 옆을 체크한 후 "확인"을 누르면 다음과 같이 EA가 차트에 첨부된 것을 확인할 수 있습니다.
이제 이 거래 시스템을 기반으로 생성된 신호를 얻을 준비가 되었습니다. 이후 우리는 다음과 같은 신호를 받게 됩니다.
차트의 왼쪽 상단에서 볼 수 있듯이 현재 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 시그널 값
청산 신호의 경우:
왼쪽 상단의 차트에서 볼 수 있듯이 다음의 값들이 나타난 신호를 수신했습니다.
- 종가
- 상대 활력 지수 값
- 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 시그널 값
커버의 경우:
보시다시피 다음과 같은 값들의 신호를 얻었습니다.
- 커버
- 상대 활력 지수 값
- 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가 차트에 첨부되는 것을 확인할 수 있습니다.
이제 우리는 테스트에서 다음 예와 같이 이 거래 시스템을 기반으로 생성된 신호를 얻을 수 있습니다.
매수 신호인 경우:
이전 차트의 왼쪽 상단에서 볼 수 있듯이 다음과 같은 값을 가진 신호가 있습니다.
- 매수 신호.
- 종가
- MA 값
- 상대 활력 지수 값
- RVI 시그널 라인의 값
매도 신호인 경우:
다음과 같은 값을 가진 신호를 얻었습니다.
- 매도 신호
- 종가
- MA 값
- 상대 활력 지수 값
- RVI 시그널 라인의 값
이제 우리는 언급된 각 전략에 대해 조건에 따라 자동화된 신호를 생성하는 거래 시스템을 만들었습니다.
결론
본 글의 이전 주제를 통해 배운 내용에 이어, 이 지표에 대해 자세히 알아보면서 깊이 이해했다고 가정합니다. RVI 지표의 주요 개념을 이해하기 위해 RVI 지표가 무엇인지, 무엇을 측정하는지, 수동으로 계산하는 방법을 배웠습니다. 우리는 세 가지 간단한 전략을 통해 이 지표를 사용하는 방법을 배웠으며 그 전략은 다음과 같습니다.
- RVI 교차 - 상승 추세: 상승 추세 동안 매수 및 청산 신호를 생성합니다.
- RVI 교차 - 하락 추세: 하락 추세 동안 매도 및 커버 신호를 생성합니다.
- RVI & MA 교차: 특정한 교차를 기반으로 매수 및 매도 신호를 생성합니다.
우리는 언급된 각 전략에 대한 단계별 청사진을 설계하여 이 청사진을 통해 해당 전략에 대한 거래를 원활하고 쉽게 생성하도록 했습니다. 우리는 언급된 각 전략에 대해 MetaTrader 5에서 실행 후 자동 신호를 생성하는 거래 시스템을 만들었습니다.
이 글을 최대한 활용하고 프로그래밍 기술을 개발하기 위해 스스로 배운 내용을 적용해 보시길 바랍니다. 또한 이 기사가 귀하의 거래 결과를 개선하고 기사 주제 또는 관련 주제와 관련된 유용한 통찰력을 얻는 데 도움이 되기를 바랍니다. 유사한 기사를 읽으려면 가장 인기 있는 기술 지표를 기반으로 거래 시스템을 설계하는 방법에 대한 시리즈의 저의 다른 기사를 읽어 보시기 바랍니다.