English Русский 中文 Español Deutsch 日本語 Português Français Italiano Türkçe
preview
OBV로 트레이딩 시스템을 설계하는 방법 알아보기

OBV로 트레이딩 시스템을 설계하는 방법 알아보기

MetaTrader 5트레이딩 | 21 11월 2022, 10:23
387 0
Mohamed Abdelmaaboud
Mohamed Abdelmaaboud

소개

이 기사에서는 거래량을 처리하고 우리가 다른 관점을 가지는 데 도움이 되는 새로운 기술 지표에 대해 알아볼 것입니다: 이 흥미로운 주제를 다루기 위해 OBV(잔고 거래량) 지표에 대해 자세히 이야기하고 이 기술 지표를 우리에게 유리하게 사용하는 방법에 대해 알아볼 것입니다. 이 지표에 대해 다룰 주제는 다음과 같습니다:

  1. OBV 정의
  2. OBV 전략
  3. OBV 전략 청사진
  4. OBV 거래 시스템
  5. 결론

OBV 정의를 통해 OBV 지표에 대해 자세히 알아봅니다. OBV 지표가 무엇인지, 어떻게 측정되는지, 어떻게 계산할 수 있는지를 알아보고 계산의 예를 살펴 봅니다. 그 후 우리는 이 지표를 깊이 이해하고 학습하여 올바르게 사용할 수 있는 방법을 익힐 수 있을 것입니다. 우리는 지표의 개념에 기반한 전략을 사용하여 OBV 지표를 사용하는 방법을 배울 것입니다. - 이것은 OBV 전략 주제를 통해 다룰 것입니다. 간단한 전략을 기반으로 이 지표를 사용하는 방법에 대해 알아본 후 이러한 전략을 실행하는 MQL5 코드를 작성하는 데 도움이 되는 전략 청사진을 설계할 것입니다. 이 청사진은 Expert Advisor를 만드는데 도움이 되는 각각의 단계를 검토하는데 도움이 될 것입니다. 전략 청사진을 설계한 후에는 MQL5로 코드를 작성하여 Expert Advisor를 만들고 이를 MetaTrader 5를 사용하여 거래 전략이 정확하게 자동으로 실행되는지 점검할 것입니다.

이 기사에서 우리는 MQL5(MetaQuotes Language)를 사용하여 Expert Advisor를 작성하고 생성 할 것입니다. 그런 다음 이 EA를 MetaTrader 5 트레이딩 플랫폼에서 실행할 것입니다. MetaTrader 5를 설치하는 방법, MetaTrader 5에 내장된 MQL5를 사용하는 방법에 대해 자세히 알고 싶다면 이전 기사 MetaEditor에서 MQL5 코드 작성을 확인하세요. 무엇이든 마스터하는 데 연습을 하는 것은 매우 중요합니다. 배운 내용을 마스터하려면 읽고 배운 것을 직접 적용해 보는 것이 좋습니다.

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

이제 이 기사를 통해 새로운 도구를 배우고 이를 향상된 거래를 위한 우리들의 도구로 만들어 보겠습니다.


OBV 정의

이 부분에서는 OBV(On-balance Volume) 지표에 대해 자세히 알아보겠습니다. 이 지표는 볼륨 지표 중 하나이므로 먼저 볼륨에 대해 이야기하겠습니다. 볼륨은 특정 기간 동안 거래되는 주식 또는 계약의 수입니다. 볼륨이 크다는 것은 상품에 대한 거래가 활발하다는 것을 의미하고, 그 반대의 경우도 마찬가지입니다. 거래량이 적으면 상품이 활발하게 거래되지 않는다는 의미입니다.

볼륨 개념은 커다란 볼륨과 함께 위아래로 움직이는 상품이 있을 경우 상품에 낮은 볼륨이 동반될 때보다 더 강력한 움직임이란 것을 알려 주는 것이므로 중요한 개념입니다. 상승 추세가 있을 때 볼륨은 상승 추세와 함께 움직여야 합니다. 볼륨이 상승 추세에 따라 증가하고 하락 조정에 따라 감소하고 하락 추세가 있을 때 볼륨이 감소하는 것을 확인 할 수 있는 것이 좋습니다. 하락 추세일 경우에도 마찬가지입니다. 하락 추세가 있을 때 하락 추세와 함께 거래량이 증가한다는 것을 알 수 있고 상향 보정시 감소합니다.

볼륨은 또한 돌파가 진짜인지 거짓인지를 확인하는데 도움이 됩니다: 많은 볼륨으로 돌파가 완료되면 이는 이러한 돌파가 계속될 것이라는 신호일 것입니다. 

이러한 추세와 거래량의 관계가 제가 언급한 것과 동일하게 지속된다면 현재 추세에 대한 더욱 강한 확신을 줄 것이고 지속성이 변한다면 이는 약세의 신호가 될 것입니다. 추세가 무엇인지 모르겠다면 이전 기사 트렌드 정의에서 확인 할 수 있습니다.

OBV(On-balance Volume)는 Joseph Granville이 개발했습니다. 양수 및 음수의 볼륨의 흐름을 측정합니다. 이제 계산 방법을 알아보겠습니다. 계산 단계는 다음과 같습니다.

  1. 종가를 확인합니다. - 상승 또는 하락인지 여부.
  2. 이전 OBV 값에 up일의 볼륨을 더합니다.
  3. 이전 OBV 값에서 down 일의 볼륨을 뺍니다.
  4. 오늘의 종가가 어제의 종가와 같으면 오늘의 OBV 값은 어제의 OBV 값과 같습니다.

예를 통해 OBV 지표를 계산해 보겠습니다. 어떤 금융 상품에 대해 다음과 같은 데이터가 있다고 가정합니다:

종가 볼륨
1 54
2 55 10000
3 60 15000
4 65 20000
5 60 10000
6 55 5000
7 60 7000
8 50 7500
9 48.75 8000
10 49 5000
11 48 6000
12 47.75 7500
13 48 9000
14 47.50 10000
15 48 7000
16 47 7500
17 46 6000
18 44 5000
19 45 15000

이전 데이터에서 OBV 지표를 계산하려면:

종가가 이전 종가보다 높은지 낮은지를 판단합니다. 이전 마감일보다 높으면 그 옆에 "양"을 추가하여 오늘이 상승 움직임임을 나타냅니다. 이전 마감일보다 낮으면 그 옆에 "음"을 추가하여 오늘이 하락 움직임임을 나타냅니다.

OBV 계산 1

그런 다음 이전 OBV 값에 양수 일의 볼륨을 더하고 이전 OBV 값에서 음수 일의 볼륨을 뺍니다.

OBV 계산 2

이렇게 OBV 값이 계산되었으며 이는 양수 및 음수의 볼륨의 흐름을 측정하는 곡선으로 나타납니다. 다행히 이 지표를 수동으로 계산할 필요는 없습니다. MetaTrader 5의 내장 지표에서 찾을 수 있습니다. 다음 그림은 차트에 이 지표를 삽입하는 방법을 보여줍니다.

OBV 인서트

지표를 선택하면 다음과 같은 지표 매개변수 창이 열립니다:

OBV 삽입1

1 - 볼륨 유형.

2 - OBV 곡선의 색상.

3 - OBV 곡선의 스타일.

4 - OBV 곡선의 두께.

원하는 매개변수를 설정하고 확인을 클릭하면 지표가 차트에 첨부됩니다:

OBV 첨부


OBV 전략

이번 파트에서는 OBV Indicator의 개념에 입각해 이 지표를 어떻게 사용하는지 알아보겠습니다. 간단한 전략을 살펴보겠습니다. 그러나 이러한 전략이 모든 사람에게 유용한 것은 아닐 수 있다는 것도 아셔야 합니다. 따라서 전략을 사용하기 전에 전략이 얼마나 유용한지를 확인해 보기 위해 전략을 테스트해야 합니다. 여기서 우리는 OBV 지표에 대한 기본적인 내용에 대해 알아보고 작동 방식을 확인해 봅니다.

  • 전략 1: 간단한 OBV 움직임

이 전략에 따르면 현재 OBV 값과 이전 OBV 값을 비교하여 OBV 곡선의 방향을 식별하고 현재 값이 이전 OBV 값보다 큰지, 즉 OBV가 상승하고 있는지를 확인합니다. 반대일 경우도 마찬가지 입니다. 현재 값이 이전 값보다 작으면 OBV가 감소하는 것입니다.

현재 OBV를 더 많은 이전 데이터와 비교하기 위해 필요한 데이터 길이를 변경할 수 있지만 여기서는 지표를 사용하는 방법과 MQL5에서 지표를 코딩하는 방법에 대한 아이디어를 공유합니다. 지표의 최적화는 나중에 여러분의 선호에 따라 할 수 있습니다.

현재 OBV > 이전 OBV --> OBV 상승 중

현재 OBV < 이전 OBV --> OBV 하락 중

  • 전략 2: 단순 OBV 강도

이 전략에 따르면 이전 4개 OBV 값의 평균과 비교하여 현재 OBV 값의 강도를 식별 합니다. 현재 OBV 값이 이전 4개 OBV 값의 평균보다 크면 OBV가 강하고 그 반대의 경우 즉 현재 OBV 값이 이전 4개 OBV 값의 평균보다 작으면 OBV가 약합니다.

평균의 길이를 늘려 현재 데이터와 비교할 수도 있지만 여기서의 목표는 지표를 사용하는 방법에 대해 알아 보는 것입니다. 무엇이든 기본 설정과 테스트 결과에 따라 원하는 대로 조정할 수 있습니다. 

현재 OBV > 이전 4개 OBV 값의 AVG --> OBV가 강함

현재 OBV < 이전 4개 OBV 값의 AVG --> OBV가 약함

  • 전략 3: 단순 OBV - 상승추세

상승 추세 동안에는 추세와 함께 볼륨의 움직임을 보는 것이 좋습니다. 이 경우 OBV는 상방 이동을 하며 증가해야 합니다. 따라서 이 전략을 사용하면 움직임이 강한지 여부를 평가할 수 있습니다. 현재 OBV 값과 이전 값을 비교하고 현재 고점과 이전 고점을 비교합니다. 현재 OBV 값이 이전 OBV 값보다 크고 현재 고가가 이전 고가보다 크면 상승 추세에서 상승 움직임이 강하다는 것입니다.

현재 OBV > 이전 OBV 및 현재 고점 > 이전 고점 --> 상승 추세 중 강한 움직임

  • 전략 4: 단순 OBV - 하락추세

하락추세에서는 추세와 함께 볼륨의 움직이는 것을 보는 것이 좋습니다. OBV는 하방하며 동시에 증가해야 합니다. 이를 통해 움직임이 강한지 아닌지를 알 수 있습니다. 현재 OBV 값과 이전 OBV 값을 비교하고 현재 저점과 이전 저점 사이의 동일한 시간을 비교합니다. 현재 OBV 값이 이전 OBV 값보다 작고 현재 저점이 이전 저점보다 작으면 하락세 동안 하락 움직임이 강합니다.

현재 OBV < 이전 OBV 및 현재 저점 < 이전 저점 --> 하락세 중 강한 움직임


OBV 전략 청사진

이 부분에서는 각 전략과 관련한 청사진을 설계합니다. 여기서는 앞에서 살펴본 각 전략과 관련한 거래 시스템을 설계하는 방법에 대해 단계별로 살펴볼 것입니다. 먼저 현재 OBV 값을 차트에 표시하기 위해 간단한 OBV를 설계해야 합니다. 이에 대한 청사진은 다음과 같습니다:

단순 OBV 청사진

  • 전략 1: 간단한 OBV 움직임:

이 전략에서는 현재 OBV 값과 이전 OBV 값을 기반으로 OBV 곡선의 방향을 알아야 합니다. 따라서 모든 틱에 대해 현재 OBV와 이전 OBV 값을 확인해야 하며 현재 값이 이전 값보다 크면 OBV가 증가하고 있다는 신호가 될 것이고 현재 값이 이전 값보다 작으면 이것은 OBV가 감소하고 있다는 신호가 될 것입니다.

다음은 이 전략과 관련한 단계별 청사진으로 거래 시스템을 설계하는 데 도움이 될 것입니다.

단순 OBV 이동 청사진

  • 전략 2: 단순 OBV 강도:

이 전략에서는 이전 4개 값의 평균과 비교하여 현재 OBV의 강도를 측정합니다. 현재 OBV가 이전 4개 OBV 값의 평균보다 크면 OBV가 강하다는 것이고 그 반대로 현재 OBV가 이전 4개 OBV 값의 평균보다 작으면 OBV가 약하다는 것입니다.

다음은 그와 같은 거래 시스템을 만들기 위한 단계별 청사진입니다.

단순 OBV 강도 청사진

  • 전략 3: 단순 OBV - 상승세:

이 전략에서 우리는 가격의 현재 움직임을 측정하기 위해 볼륨 지표 중 하나인 OBV를 활용해야 합니다. 따라서 상승추세에서는 현재의 OBV 값을 확인하여 이전의 OBV 값과 비교하고 현재 값이 이전 값보다 크면 현재의 고가를 이전의 고가와 비교해야 합니다. 현재 값이 이전 값보다 크면 현재 OBV가 이전 OBV보다 크고 현재 고점이 이전 고점보다 크기 때문에 현재 상승의 움직임이 상승세 동안 강하다는 신호입니다.

다음은 이 전략을 코딩하기 위한 단계별 청사진입니다:

단순 OBV - 상승 추세 청사진

  • 전략 4: 단순 OBV - 하락세:

이 전략에서는 하락추세 동안 현재 OBV 값을 확인하여 이전 OBV 값과 비교하고 현재의 값이 이전 값보다 작으면 현재 저가를 이전 저가와 비교해야 합니다. 현재 값이 이전 값보다 작으면 현재 OBV가 이전 OBV보다 작고 현재 저가의 값이 이전 저가 값보다 작기 때문에 하락세 동안 현재의 하락 움직임이 강하다는 신호입니다.

다음은 이 전략을 코딩하기 위한 단계별 청사진입니다:

단순 OBV - 하락 추세 청사진


OBV 거래 시스템

이 부분에서는 각 전략에 기반하여 프로그래밍과 MQL5를 활용해 만들 수 있는 거래 시스템을 만드는 방법을 배울 것입니다. 프로그래밍을 통해 그 전에는 우리가 수동으로 수행하던 것들을 정확하고 신속하게 실행하고 수행하도록 할 수 있습니다. 프로그래밍을 통해 얻을 수 있는 이점은 이외에도 많습니다.

이제 각 전략을 실행하는 거래 시스템을 만들기 시작합니다. 먼저 현재 OBV 값을 차트에 주석으로 나타내는 간단한 OBV 거래 시스템을 만듭니다.

  • "double" 함수를 사용하여 OBV용 배열을 만들 때 "double"은 소수 부분 값을 나타내는 실수 유형 또는 부동 소수점 유형입니다. 참고로 부동 소수점에는 두 가지 유형이 있으며 double 및 float이 있습니다. "double" 유형은 float 유형의 두 배의 정확도로 숫자를 나타냅니다.
double OBVArray[];
  • true 또는 false를 반환하는 "ArraySetAsSeries" 함수를 사용하여 OBV 배열 정렬:
ArraySetAsSeries(OBVArray,true);

  • OBVDef에 대한 정수 변수를 생성한 후 "iOBV" 함수를 사용하여 OBV를 정의합니다. "iOBV" 함수는 On Balance Volume 지표의 핸들을 반환하며 해당 매개변수는 (기호, 기간, 적용 볼륨) 입니다:
int OBVDef =iOBV(_Symbol, _Period,VOLUME_TICK);
  • 복사된 데이터의 수를 반환하는 "CopyBuffer" 함수를 사용하여 OBVArray를 OBVDef로 채웁니다. 해당 매개변수는 (지표 핸들, 버퍼 번호, 시작 시간, 중지 시간, 버퍼) 입니다:
CopyBuffer(OBVDef,0,0,3,OBVArray);
  • OBVValue에 대한 double 변수를 생성한 후 현재 OBV 값 계산:
double OBVValue=OBVArray[0];
  • 현재 OBV 값으로 차트에 주석을 표시하기 위해 "comment" 함수를 사용하여 주석 생성:
Comment("OBV Value is: ",OBVValue);

다음은 현재 OBV 값과 주석이 표시되도록 하는 이전 거래 시스템의 전체 코드입니다:

//+------------------------------------------------------------------+
//|                                                   Simple OBV.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()
  {
   //creating an array for OBV
   double OBVArray[];
   
   //sorting the array from the current data
   ArraySetAsSeries(OBVArray,true);
   
   //defining OBV
   int OBVDef =iOBV(_Symbol, _Period,VOLUME_TICK);
   
   //defining EA, buffer, sorting in array
   CopyBuffer(OBVDef,0,0,3,OBVArray);
   
   //calculating current OBV value
   double OBVValue=OBVArray[0];
   
   //creating a comment with OBV value
   Comment("OBV Value is: ",OBVValue);  
  }
//+------------------------------------------------------------------+

이 코드를 컴파일하면 다음 그림과 같이 MetaTrader 5 탐색기 창에서 찾을 수 있습니다.

OBV 내비1

실행하려면 파일을 두 번 클릭하거나 차트에 끌어다 놓으면 다음과 같은 창이 나타납니다.

단순 OBV 창

"확인"을 누르면 다음 그림과 같이 차트에 첨부된 Expert Advisor를 찾을 수 있습니다:

단순 OBV 첨부

그런 다음 테스트를 하면 생성된 신호가 다음 예제와 동일하게 나타나는 것을 확인할 수 있습니다:

단순 OBV 테스트 신호

Meta Trader 5에 내장된 On Balance Volume 지표와 동일한 값을 얻으려면 생성된 Expert Advisor를 첨부한 후 이전에 언급한 것과 동일한 On Balance Volume 지표를 삽입하면 됩니다. 그러면 같은 값을 확인할 수 있습니다. 다음은 그 예입니다:

단순 OBV 지표와 동일한 신호

 이제 언급된 각 전략을 위한 거래 시스템을 만들어야 하며 그 방법은 다음과 같습니다.

  • 전략 1: 간단한 OBV 움직임:

이 전략에 따르면 현재 OBV 값과 이전 OBV 값을 비교하고 현재 값이 이전 값보다 큰지 결정해야 합니다. 그러기 위해서는 다음과 같이 표시되는 신호가 필요합니다. 차트에 "OBV가 상승 중입니다"라고 표시된 주석과 현재 OBV 값과 이전 OBV 값. 다음은 이러한 종류의 전략을 만드는 전체 코드입니다:

//+------------------------------------------------------------------+
//|                                          Simple OBV movement.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()
  {
//creating an two arrays for OBV
   double OBVArray1[];
   double OBVArray2[];

//sorting the array from the current data
   ArraySetAsSeries(OBVArray1,true);
   ArraySetAsSeries(OBVArray2,true);

//defining OBV
   int OBVDef =iOBV(_Symbol, _Period,VOLUME_TICK);

//defining EA, buffer, sorting in array
   CopyBuffer(OBVDef,0,0,3,OBVArray1);
   CopyBuffer(OBVDef,0,0,3,OBVArray2);

//getting the value of current and previous OBV
   double OBVCurrentValue=NormalizeDouble(OBVArray1[0],5);
   double OBVPrevValue=NormalizeDouble(OBVArray2[1],5);

//creating conditions of rising and declining OBV based on its values   
   if(OBVCurrentValue>OBVPrevValue)
     {
      Comment("OBV is rising","\n","OBV current is ",OBVCurrentValue,"\n","OBV previous is ",OBVPrevValue);
     }

   if(OBVCurrentValue<OBVPrevValue)
     {
      Comment("OBV is declining","\n","OBV current is ",OBVCurrentValue,"\n","OBV previous is ",OBVPrevValue);
     }

  }
//+------------------------------------------------------------------+
  • 이 코드에서 차이점:
 OBV에 대해 두 개의 배열 생성:
double OBVArray1[];
double OBVArray2[];

현재 데이터에서 이 두 배열을 정렬:

ArraySetAsSeries(OBVArray1,true);
ArraySetAsSeries(OBVArray2,true);

이 두 배열 채우기:

CopyBuffer(OBVDef,0,0,3,OBVArray1);
CopyBuffer(OBVDef,0,0,3,OBVArray2);

"NormalizeDouble" 함수를 사용하여 현재 및 이전 OBV의 값을 가져옵니다. "NormalizeDouble" 함수에 의해 매개변수를 생성한 후 사전 설정된 정확도대로 OBVCurrentValue 및 OBVPrevValue에 대한 double 유형의 변수 값을 반환합니다. "NormalizeDouble"의 매개 변수는 OBVArray이고 digit은 소수점 이하 자릿수인 5가 됩니다:

double OBVCurrentValue=NormalizeDouble(OBVArray1[0],5);
double OBVPrevValue=NormalizeDouble(OBVArray2[1],5);

"if" 함수를 사용하여 OBV 상승 및 하락 조건 설정:

if(OBVCurrentValue>OBVPrevValue)
   {
    Comment("OBV is rising","\n","OBV current is ",OBVCurrentValue,"\n","OBV previous is ",OBVPrevValue);
   }

if(OBVCurrentValue<OBVPrevValue)
   {
    Comment("OBV is declining","\n","OBV current is ",OBVCurrentValue,"\n","OBV previous is ",OBVPrevValue);
   }

컴파일 후 expert는 MetaTrader 5 거래 플랫폼의 탐색기 창의 "Expert Advisors" 폴더 중 다음과 같이 나타납니다.

OBV 탐색2

expert 파일을 두 번 클릭하면 다음과 같은 창이 나타납니다:

단순 OBV 이동 창

"확인"을 누르면 Expert Advisor가 다음과 같이 차트에 첨부됩니다:

단순 OBV 무브먼트 첨부

다음은 이 전략에 따라 생성된 신호를 테스트한 예입니다.

상승 OBV:

단순 OBV 이동 상승 신호

하락 OBV:

단순 OBV 움직임 감소 신호

  • 전략 2: 단순 OBV 강도:

이 전략에 따르면 내가 언급한 것과 같은 두 값을 비교해야 합니다. 현재 OBV 값과 이전 4개 OBV 값의 평균 값을 비교하는 것입니다. 이후 현재 값이 이 평균보다 큰지를 판단합니다. 그럴 경우 "OBV가 강함"을 의미하고 그 반대의 경우도 마찬가지입니다. 현재 값이 평균보다 작으면 "OBV가 약함"을 의미합니다. 다음은 이 전략을 기반으로 하는 거래 시스템을 만드는 전체 코드입니다:

//+------------------------------------------------------------------+
//|                                          Simple OBV Strength.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()
  {
   //creating an six arrays for OBV
   double OBVArray0[];
   double OBVArray1[];
   double OBVArray2[];
   double OBVArray3[];
   double OBVArray4[];
   
   //sorting arrays from the current data
   ArraySetAsSeries(OBVArray0,true);   
   ArraySetAsSeries(OBVArray1,true);
   ArraySetAsSeries(OBVArray2,true);
   ArraySetAsSeries(OBVArray3,true);
   ArraySetAsSeries(OBVArray4,true);
   
   //defining OBV
   int OBVDef =iOBV(_Symbol, _Period,VOLUME_TICK);
   
   //defining EA, buffer, sorting in arrays
   CopyBuffer(OBVDef,0,0,5,OBVArray0);
   CopyBuffer(OBVDef,0,0,5,OBVArray1);
   CopyBuffer(OBVDef,0,0,5,OBVArray2);
   CopyBuffer(OBVDef,0,0,5,OBVArray3);
   CopyBuffer(OBVDef,0,0,5,OBVArray4);
   
   //getting the value of current OBV & previous 5 values
   double OBVCurrentValue=NormalizeDouble(OBVArray0[0],5);         
   double OBVPrevValue1=NormalizeDouble(OBVArray1[1],5);
   double OBVPrevValue2=NormalizeDouble(OBVArray2[2],5);
   double OBVPrevValue3=NormalizeDouble(OBVArray3[3],5);
   double OBVPrevValue4=NormalizeDouble(OBVArray4[4],5);
   
   //calculating average of previous OBV value
   double OBVAVG=((OBVPrevValue1+OBVPrevValue2+OBVPrevValue3+OBVPrevValue4)/4);
   
   if(OBVCurrentValue>OBVAVG)
   {
      Comment("OBV is strong","\n","OBV current is ",OBVCurrentValue,"\n","OBV Average is ",OBVAVG,"\n","Previous four OBV Values: ", 
      "\n", "1= ",OBVPrevValue1,"\n", "2= ",OBVPrevValue2,"\n", "3= ",OBVPrevValue3,"\n", "4= ",OBVPrevValue4);
   }
   
   if(OBVCurrentValue<OBVAVG)
   {
      Comment("OBV is weak","\n","OBV current is ",OBVCurrentValue,"\n","OBV Average is ",OBVAVG,"\n","Previous four OBV Values: ",
      "\n", "1= ",OBVPrevValue1,"\n", "2= ",OBVPrevValue2,"\n", "3= ",OBVPrevValue3,"\n", "4= ",OBVPrevValue4);
   }
   
  }
//+------------------------------------------------------------------+
  • 이 코드에서 차이점:

5개의 OBV 값 배열 생성:

double OBVArray0[];
double OBVArray1[];
double OBVArray2[];
double OBVArray3[];
double OBVArray4[];

현재 데이터에서 생성된 배열 정렬:

ArraySetAsSeries(OBVArray0,true);   
ArraySetAsSeries(OBVArray1,true);
ArraySetAsSeries(OBVArray2,true);
ArraySetAsSeries(OBVArray3,true);
ArraySetAsSeries(OBVArray4,true);

정의된 OBVDef로 배열 채우기:

CopyBuffer(OBVDef,0,0,5,OBVArray0);
CopyBuffer(OBVDef,0,0,5,OBVArray1);
CopyBuffer(OBVDef,0,0,5,OBVArray2);
CopyBuffer(OBVDef,0,0,5,OBVArray3);
CopyBuffer(OBVDef,0,0,5,OBVArray4);

현재 및 4개의 이전 OBV 값 가져오기:

double OBVCurrentValue=NormalizeDouble(OBVArray0[0],5);         
double OBVPrevValue1=NormalizeDouble(OBVArray1[1],5);
double OBVPrevValue2=NormalizeDouble(OBVArray2[2],5);
double OBVPrevValue3=NormalizeDouble(OBVArray3[3],5);
double OBVPrevValue4=NormalizeDouble(OBVArray4[4],5);

OBVAVG double 변수를 생성한 후 이전 4개 OBV 값의 평균 계산:

double OBVAVG=((OBVPrevValue1+OBVPrevValue2+OBVPrevValue3+OBVPrevValue4)/4);

주석과 함께 강한 OBV와 약한 OBV의 조건 설정:

if(OBVCurrentValue>OBVAVG)
{
 Comment("OBV is strong","\n","OBV current is ",OBVCurrentValue,"\n","OBV Average is ",OBVAVG,"\n","Previous four OBV Values: ", 
  "\n", "1= ",OBVPrevValue1,"\n", "2= ",OBVPrevValue2,"\n", "3= ",OBVPrevValue3,"\n", "4= ",OBVPrevValue4);
}
   
if(OBVCurrentValue<OBVAVG)
{
 Comment("OBV is weak","\n","OBV current is ",OBVCurrentValue,"\n","OBV Average is ",OBVAVG,"\n","Previous four OBV Values: ",
  "\n", "1= ",OBVPrevValue1,"\n", "2= ",OBVPrevValue2,"\n", "3= ",OBVPrevValue3,"\n", "4= ",OBVPrevValue4);
}

컴파일 후 탐색기 창에서 다음과 같은 Expert를 찾을수 있습니다.

OBV 탐색3

다음은 MetaTrader 5에서 실행할 파일을 선택한 후 Expert의 창입니다:

단순 OBV 강도 창

"확인"을 누르면 다음 그림과 같이 차트에 Expert Advisor가 첨부됩니다:

단순 OBV 강도 첨부

다음은 신호를 테스트 하는 예입니다:

강한 OBV:

단순 OBV 강도 강한 신호

약한 OBV:

단순 OBV 강도 약한 신호

  • 전략 3: 단순 OBV - 상승세:

이 전략에 따르면 상승추세 동안 우리는 고점 보다 높은 고점을 확인하고 동시 고점 보다 높은 OBV 값을 동시에 확인해야 합니다. 따라서 현재 OBV 값이 이전 OBV 값보다 크고 현재 고가가 이전 고가보다 크면 "상승 추세 중 강한 움직임" 이란 신호가 있는 것이며 우리는 이를 확인해야 합니다. 다음은 이러한 종류의 전략을 만드는 전체 코드입니다:

//+------------------------------------------------------------------+
//|                                         Simple OBV - 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()
  {
   //creating a string variable for signal
   string signal="";
   
   //creating two OBV arrays for OBV
   double OBVArray0[];
   double OBVArray1[];
   
   //creating two price arrays
   MqlRates PriceArray0[];
   MqlRates PriceArray1[];
   
   //sorting OBV arrays from the current data
   ArraySetAsSeries(OBVArray0,true);   
   ArraySetAsSeries(OBVArray1,true);   
   
   //sorting Price arrays from the current data
   ArraySetAsSeries(PriceArray0,true);
   ArraySetAsSeries(PriceArray1,true);     
      
   //fill arrays with price data
   int Data0=CopyRates(_Symbol,_Period,0,3,PriceArray0);
   int Data1=CopyRates(_Symbol,_Period,0,3,PriceArray1);
   
   //defining OBV
   int OBVDef =iOBV(_Symbol, _Period,VOLUME_TICK);

   //defining EA, buffer, sorting in arrays
   CopyBuffer(OBVDef,0,0,3,OBVArray0);
   CopyBuffer(OBVDef,0,0,3,OBVArray1);
            
   //getting the value of current & the previous OBV
   double OBVCurrentValue=NormalizeDouble(OBVArray0[0],5);         
   double OBVPrevValue=NormalizeDouble(OBVArray1[1],5);
    
   //getting the value of current high & the previous high
   double CurrentHighValue=NormalizeDouble(PriceArray0[0].high,5);         
   double PrevHighValue=NormalizeDouble(PriceArray1[1].high,5); 
      
   //strong move signal
   //if OBVCurrentValue>OBVPrevValue && current high> previous high
   if(OBVCurrentValue > OBVPrevValue && PriceArray0[0].high>PriceArray0[1].high)
   {
      signal="Strong move during uptrend";
   }

   //comment with the signal
   Comment("The signal is ",signal,"\n","OBVCurrentValue is :",OBVCurrentValue,
   "\n","OBVPrevValue is :", OBVPrevValue,"\n","Current high is :",CurrentHighValue,"\n","Previous high is :",PrevHighValue);            
  }
//+------------------------------------------------------------------+

이 코드에서 차이점:

할당된 텍스트 문자열을 저장하는 "string" 함수를 사용하여 "signal"에 대한 문자열 변수 생성:

string signal="";

가격, 거래량 및 스프레드에 대한 정보를 저장하는 "MqlRates" 함수를 사용하여 가격에 대한 두 개의 배열 생성하고 "double" 함수를 사용하여 OBV에 대한 두 개의 배열 생성 :

//creating two OBV arrays for OBV
double OBVArray0[];
double OBVArray1[];
   
//creating two price arrays
MqlRates PriceArray0[];
MqlRates PriceArray1[];1[];

현재 데이터에서 이러한 배열 정렬:

//sorting OBV arrays from the current data
ArraySetAsSeries(OBVArray0,true);   
ArraySetAsSeries(OBVArray1,true);   
   
//sorting Price arrays from the current data
ArraySetAsSeries(PriceArray0,true);
ArraySetAsSeries(PriceArray1,true);

각 배열에 대해 Data0 및 Data1에 대한 정수 변수를 생성한 후 "MqlRates" 구조의 히스토리 데이터를 가져오는 "CopyRates" 함수를 사용하여 가격 배열을 가격 데이터로 채웁니다.

int Data0=CopyRates(_Symbol,_Period,0,3,PriceArray0);
int Data1=CopyRates(_Symbol,_Period,0,3,PriceArray1);

OBV를 정의하고 두 개의 OBVArray를 채웁니다:

int OBVDef =iOBV(_Symbol, _Period,VOLUME_TICK);

CopyBuffer(OBVDef,0,0,3,OBVArray0);
CopyBuffer(OBVDef,0,0,3,OBVArray1);

OBV 및 고가 얻기:

//getting the value of current & the previous OBV
double OBVCurrentValue=NormalizeDouble(OBVArray0[0],5);         
double OBVPrevValue=NormalizeDouble(OBVArray1[1],5);
    
//getting the value of current high & the previous high
double CurrentHighValue=NormalizeDouble(PriceArray0[0].high,5);         
double PrevHighValue=NormalizeDouble(PriceArray1[1].high,5); 

"상승 추세 중 강한 움직임" 주석의 조건 설정:

Comment("The signal is ",signal,"\n","OBVCurrentValue is :",OBVCurrentValue,
"\n","OBVPrevValue is :", OBVPrevValue,"\n","Current high is :",CurrentHighValue,"\n","Previous high is :",PrevHighValue); 

코드를 컴파일하면 탐색기 창에서 expert를 찾을 수 있습니다:

OBV 탐색4

MetaTrader 5에서 실행할 파일을 선택하면 다음과 같은 expert 창이 나옵니다:

단순 OBV - 상승 추세 창.

"확인"을 누르면 다음 그림과 같이 차트에 Expert Advisor가 첨부됩니다:

단순 OBV - 상승 추세 첨부

다음은 신호를 테스트 하는 예입니다.

현재 데이터에 대한 신호와 데이터 창:

단순 OBV 상승 추세 신호 현재 데이터 창이 있는 단순 OBV 상승 추세 신호

이전 데이터에 대한 신호와 데이터 창:

상승 추세 신호 단순 OBV - 이전 데이터 창의 상승 추세 신호

  • 전략 4: 단순 OBV - 하락세:

이 전략에 따르면 단순 OBV의 반대가 됩니다. - 이전 저점보다 더 낮은 저점인지와 동시에 OBV의 값도 더 낮은지 확인해야 하기 때문입니다. 따라서 현재 OBV 값이 이전 OBV 값보다 작은지 확인해야 하며 현재 저가가 이전 저가보다 낮으면 "하락 추세 중 강한 움직임"의 신호가 있게 됩니다. 다음은 이러한 종류의 전략을 만드는 전체 코드입니다:


//+------------------------------------------------------------------+
//|                                       Simple OBV - 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()
  {
   //create a string variable for signal
   string signal="";
   
   //creating two OBV arrays
   double OBVArray0[];
   double OBVArray1[];
   
   //creating two price arrays
   MqlRates PriceArray0[];
   MqlRates PriceArray1[];
   
   //sorting OBV arrays from the current data
   ArraySetAsSeries(OBVArray0,true);   
   ArraySetAsSeries(OBVArray1,true);   
   
   //sorting Price arrays from the current data
   ArraySetAsSeries(PriceArray0,true);
   ArraySetAsSeries(PriceArray1,true);     
      
   //fill array with price data
   int Data0=CopyRates(_Symbol,_Period,0,3,PriceArray0);
   int Data1=CopyRates(_Symbol,_Period,0,3,PriceArray1);
   
   //defining OBV
   int OBVDef =iOBV(_Symbol, _Period,VOLUME_TICK);

   //defining EA, buffer, sorting in arrays
   CopyBuffer(OBVDef,0,0,3,OBVArray0);
   CopyBuffer(OBVDef,0,0,3,OBVArray1);
            
   //getting the value of current OBV & the previous value
   double OBVCurrentValue=NormalizeDouble(OBVArray0[0],5);         
   double OBVPrevValue=NormalizeDouble(OBVArray1[1],5);
    
   //getting the value of current OBV & the previous value
   double CurrentLowValue=NormalizeDouble(PriceArray0[0].low,5);         
   double PrevLowValue=NormalizeDouble(PriceArray1[1].low,5); 
       
   //strong move signal
   //if OBVCurrentValue>OBVPrevValue && current low> previous low
   if(OBVCurrentValue < OBVPrevValue && PriceArray0[0].low<PriceArray0[1].low)
   {
      signal="Strong move during downtrend";
   }

   //comment with the signal
   Comment("The signal is ",signal,"\n","OBVCurrentValue is :",OBVCurrentValue,
   "\n","OBVPrevValue is :", OBVPrevValue,"\n","Current low is :",CurrentLowValue,"\n","Previous low is :",PrevLowValue);            
  }
//+------------------------------------------------------------------+
  • 이 코드에서 차이점:

"하락 추세 중 강한 움직임"의 설정 조건 및 주석:

Comment("The signal is ",signal,"\n","OBVCurrentValue is :",OBVCurrentValue,
"\n","OBVPrevValue is :", OBVPrevValue,"\n","Current low is :",CurrentLowValue,"\n","Previous low is :",PrevLowValue); 

이제 컴파일하면 탐색기 창에서 다음과 같이 expert를 찾을 수 있습니다.

OBV 탐색 5

차트에 파일을 끌어다 놓으면 다음과 같은 창이 나타납니다.

단순 OBV - 하락 추세 창

"확인" 버튼을 누르면 다음 그림과 같이 expert가 첨부됩니다.

단순 OBV - 하락 추세 첨부

다음은 테스트에서 생성된 신호의 예입니다.

현재 데이터 창과 신호:

하락 추세 신호 단순 OBV - 현재 데이터 창의 하락 추세 신호

이전 데이터 창과 신호:

하락 추세 신호 단순 OBV - 이전 데이터 창의 하락 추세 신호


결론

이 기사의 결론에서 우리는 거래를 향상시키기 위해 그리고 차트를 다른 관점에서 보기 위해 거래량을 사용하는 새로운 기술 지표에 대해 알아봤습니다. 이 지표는 OBV(On Balance Volume)이며 우리는 OBV 지표가 무엇인지 무엇을 측정하는지에 대해 자세히 배웠고 그 기본의 너머에 무엇이 숨어 있는지 알기 위해 지표를 수동으로 계산할 수 있었습니다. 우리는 또한 기본에 따라 이 지표를 어떻게 사용할 수 있는지 배웠고 유용할 수 있거나 수익성이 있을 수 있는 새로운 아이디어를 실현하는 데 도움이 되는 몇 가지 간단한 전략을 배웠습니다. 이것이 이 기사와 이 시리즈 기사의 주요 목표입니다. 우리는 전략을 실행하는 거래 시스템을 만들기 위해 전략을 코드로 작성하는 데 도움이 되도록 각 전략에 대한 청사진을 설계했습니다. 그 후 MQL5(MetaQuotes Language)로 각 전략에 대한 Expert Advisor를 만들어 MetaTrader 5 거래 플랫폼에서 실행하여 각 전략에 따라 미리 설정된 조건과 규칙대로 신호를 자동으로 정확하게 생생하도록 했습니다.

기술적 분석에서 가장 유익한 점 중 하나는 우리가 사용하는 도구를 통해 금융 상품에 대해 또 다른 관점을 가질 수 있고 특히 둘 이상의 도구 또는 지표를 결합할 수도 있다는 것입니다. 적절한 결정을 명확하게 내릴 수 있도록 금융 상품의 전체 그림을 볼 수 있게 도와주는 몇 가지 도구와 이러한 접근 방식은 신뢰할 수 있는 거래 시스템을 만드는 데 도움이 됩니다. 따라서 더 명확한 통찰력과 더 나은 결과를 얻기 위해 여러 도구를 함께 사용할 수 있도록 연습하고 무엇이든 읽거나 배우는 동안 이러한 접근 방식을 행하십시오.

이 기사와 이 시리즈의 다른 기사는 오로지 교육의 목적으로만 작성되었으며 초보자가 사물의 근본을 배우고 프로그래밍, 특히 MQL5를 통해 우리가 할 수 있는 일과 그것이 우리에게 얼마나 도움이 되는지를 배우도록 하고 이를 통해 우리의 트레이딩을 쉽게 하고 향상시키기 위한 목적으로 작성된 것입니다. 모든 사람을 모두 만족시키는 것은 없습니다. 전략을 사용하기 전에 테스트해야 하며 전략이 유용한지 여부를 확인하기 위해서 무엇이든 테스트하고 검증하는 작업을 계속 수행해야 합니다. 학습과 이해를 심화하기 위해서는 모든 것을 스스로 적용하는 것이 좋습니다.

이 기사가 유용했기를 바라며 이 기사의 주제 또는 거래와 관련한 많은 것을 배웠기를 바랍니다. 이 기사가 유용했고 또 다른 유용한 기사를 읽고 싶으시다면 이 시리즈의 이전 기사를 통해 인기 있는 기술 지표를 기반으로 거래 시스템을 설계하는 방법에 대해 배울 수 있을 것입니다.

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

누적/분배(Accumulation/Distribution (AD))에 기반한 거래 시스템을 설계하는 방법 누적/분배(Accumulation/Distribution (AD))에 기반한 거래 시스템을 설계하는 방법
이 글은 가장 인기 있는 기술 지표를 기반으로 거래 시스템을 설계하는 방법에 대한 시리즈의 새로운 글입니다. 이 글에서는 누적/분배 지표라는 새로운 기술 지표에 대해 배우고 간단한 AD 거래 전략을 기반으로 하여 MQL5 거래 시스템을 설계하는 방법에 대해 알아봅니다.
Expert Advisor 개발 기초부터 (파트 11): 교차 주문 시스템(Cross order system) Expert Advisor 개발 기초부터 (파트 11): 교차 주문 시스템(Cross order system)
이 기사에서는 교차 주문 시스템을 만들 것입니다. 트레이더의 삶을 매우 어렵게 만드는 한 가지 자산이 있습니다. - 바로 선물 계약입니다. 왜 선물이 어렵게 만드는 것일까요?
MQL5에서 행렬 및 벡터 연산 MQL5에서 행렬 및 벡터 연산
효율적인 연산을 위해 수학적인 솔루션과 함께 행렬과 벡터가 MQL5에 도입되었습니다. 새로운 유형은 수학적인 표기법에 가까운 간결하고 이해하기 쉬운 코드를 생성하도록 하는 기본 메서드를 제공합니다. 배열은 광범위한 기능을 제공하지만 행렬이 훨씬 더 효율적인 경우가 많습니다.
Expert Advisor 개발 기초부터 (파트 10): 맞춤형 지표 액세스하기 Expert Advisor 개발 기초부터 (파트 10): 맞춤형 지표 액세스하기
Expert Advisor에서 어떻게 맞춤형 지표에 바로 액세스 할 수 있을까요? 트레이딩 EA는 맞춤형 지표를 사용할 수 있는 경우에 더욱 유용할 수 있습니다; 그렇지 않으면 코드와 명령의 집합일 뿐입니다.