English Русский 中文 Español Deutsch 日本語 Português Français Italiano Türkçe
preview
누적/분배(Accumulation/Distribution (AD))에 기반한 거래 시스템을 설계하는 방법

누적/분배(Accumulation/Distribution (AD))에 기반한 거래 시스템을 설계하는 방법

MetaTrader 5트레이딩 | 25 11월 2022, 09:38
350 0
Mohamed Abdelmaaboud
Mohamed Abdelmaaboud

소개

우리의 기사 시리즈는 가장 인기 있는 기술 지표에 대해 자세히 배우고 간단한 전략의 형태로 적용하는 것에 관한 글입니다. 이러한 전략을 위한 거래 시스템은 MQL5를 사용하여 MetaTrader 5 거래 플랫폼에서 이러한 거래 시스템을 실행하도록 설계되었습니다. 이 글에서 우리는 거래와 관련한 또 다른 관점을 보여줄 수 있는 새로운 기술적 거래량 기반 지표인 누적/분포(AD)에 대해 배울 것입니다. 다음의 주제를 통해 이 지표를 다룹니다.

  1. AD 정의
  2. AD 전략
  3. AD 전략 청사진
  4. AD 트레이딩 시스템
  5. 결론

먼저 이 새로운 기술 지표와 이 지표가 측정하는 대상에 대해 자세히 알아보고 지표를 사용하는 방법을 알아보고 지표를 수동으로 계산하는 방법을 학습하여 지표의 주요 개념을 파악하도록 할 것입니다. 그런 다음 이를 기반으로 거래 시스템을 설계할 것입니다. 지표의 개념을 더 잘 이해하기 위해 이 계산을 예제에 적용할 것입니다. AD 지표의 기본에 대해 자세히 학습한 후 간단한 전략에서 어떻게 활용하는지 알아보겠습니다. 그런 다음 살펴본 각 전략에 대한 청사진을 설계하여 해당 전략을 위한 거래 시스템을 설계하고 만드는 활용할 것입니다. 언급된 모든 간단한 전략에 대한 모든 청사진을 설계한 후에 MetaTrader 5 거래 플랫폼에서 실행할 수 있는 거래 시스템을 만들기 위해 MQL5 코드를 작성하는 방법을 배울 것입니다. 이 기사의 가장 흥미로운 부분일 것입니다.

이렇게 AD 지표를 사용하는 법에 대해 자세히 다루도록 하겠습니다. 이후 우리는 언급된 간단한 전략을 실행하는 거래 시스템을 만들 것입니다. 이 글의 주요 목적은 (이 시리즈의 다른 글과 마찬가지로) 초보 프로그래머들이 가장 인기 있는 지표를 기반으로 거래 시스템을 코딩하거나 설계하는 것을 돕는 것입니다. 여기서 배운 내용을 직접 코딩해 보면 더 깊이 있는 이해가 가능할 것입니다. 우리는 MetaQuotes Language(MQL5)를 사용하여 MetaTrader 5에 내장된 MetaEditor에서 코드를 작성할 것입니다. MetaTrader 5를 설치하는 방법이나 MetaEditor를 사용하는 방법을 알고 싶다면 이전 기사 MetaEditor 에서 MQL5 코드 작성하기를 읽어 보시기 바랍니다.

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

이제 트레이딩과 MQL5에 대해 알아보기 위한 여정을 도울 이 글의 주제를 살펴보겠습니다.

AD 정의

여기에서는 누적/분포(AD) 지표에 대해 자세히 알아보고 그것이 무엇인지, 무엇을 측정하는지, 어떻게 계산할 수 있는지, 그리고 그 뒤에 어떤 개념이 있는지에 대해 정의할 것입니다. AD 라인 지표는 Marc Chaikin이 개발했습니다. 이는 거래량이 계산에 사용됨을 의미하는 거래량 기반 지표이며 상품의 거래에 들어오고 나가는 누적된 자금의 흐름을 측정하므로 일반적으로 트레이딩에서 중요한 거래량과 관련한 통찰력을 제공합니다. 또한 추세를 확인하거나 반전을 경고하기 위해 거래량을 사용하기도 합니다. 추세와 추세의 유형 및 식별 방법에 대해 더 알고 싶다면 이전 기사 추세 정의의 하위 섹션을 읽어보십시오.

모든 누적 지표와 마찬가지로 AD 라인은 각 기간의 자금 흐름 볼륨에 대한 누적 합계입니다. 이 사실은 지표를 계산해 보면 매우 분명해집니다. 다음 단계를 통해 AD 라인을 계산하는 방법을 살펴보겠습니다.

AD 라인을 계산하기 위한 세 단계가 있습니다.

  1. 자금 흐름 승수 계산 = ((종가-저가)-(고가-종가))/(고가-저가)
  2. 자금 흐름 거래량 계산 = 자금 흐름 승수 * 기간 거래량
  3. AD 라인 = 이전 AD 라인 값 + 현재 자금 흐름 거래량

이제 종목에 대해 다음과 같은 데이터가 있는 경우 AD 라인을 계산하기 위해 각 단계를 적용하는 예를 살펴봅니다.

날짜 고가 저가 종가 거래량
1 55 53 54 12000
2 56 54 55 10000
3 61 59 60 15000
4 67 64 65 20000
5 63 58 60 10000
6 58 52 55 5000
7 64 58 60 7000
8 52 47 50 7500
9 52 48 48 8000
10 50 48 49 5000
11 49 47 48 6000
12 48 47 47 7500
13 50 46 48 9000
14 52 45 47 10000
15 55 46 49 7000
16 53 45 47 7500
17 51 43 46 6000
18 50 42 44 5000
19 50 43 45 15000

이제 제공된 데이터를 기반으로 AD 라인을 계산해야 합니다. 계산은 다음과 같습니다.

먼저 자금 흐름 승수 = ((종가-저가)-(고가-종가))/(고가-저가)를 계산하면 아래와 같습니다.

광고계산

둘째, 자금 흐름 거래량 = 자금 흐름 승수 * 기간 거래량을 계산하면 아래와 같습니다.

광고계산1

셋째, AD 라인 = 이전 AD 라인 값 + 현재 자금 흐름량을 계산하면 아래와 같습니다.

AD calc2

이렇게 AD 라인을 수동으로 계산했습니다. 언제나 수동으로 해야 할 필요는 없습니다. 그러나 AD 지표의 개념을 이해하기 위해 직접 해봤습니다. 현재 AD 지표를 보려면 MetaTrader 5 터미널에서 선택하기만 하면 됩니다.

먼저 MetaTrader 5를 열고 삽입 탭 --> 지표 --> 거래량 --> 누적/분배(Accumulation/Distribution)를 클릭합니다.

광고 삽입

지표를 선택하면 AD 지표 매개변수를 입력하는 다음과 같은 창이 열립니다.

광고 삽입 창

1. 거래량 유형: 틱 또는 실제.

2. AD 라인 색상.

3. AD 라인 유형.

4. AD 라인 두께.

사용할 값을 결정하고 확인을 누르면 다음 그림과 같이 표시됩니다.

AD 첨부

이제 AD 지표를 사용하는 방법을 알아 볼 차례입니다.


AD 전략

이 섹션에서는 간단한 전략을 통해 우리의 트레이딩을 향상시키기 위한 AD 지표의 사용법을 배울 것입니다. 여러분의 거래에 도움이 될 수 있는 더 많은 새로운 아이디어를 얻을 수 있기를 바랍니다.

여기서 살펴보는 전략은 추후 최적화가 필요합니다. 여기에서 주요 목적은 AD 지표의 기본 개념과 MQL5를 통해 거래 시스템을 만드는 방법을 이해하는 데 도움이 될 수 있는 간단한 전략을 공유하는 것입니다. 따라서 최적화 또는 수정할 경우 실제 계정에서 사용하기 전에 모든 전략을 테스트해야 합니다. 또한 사용 가능한 기간의 길이를 중요도에 따라 적용하거나 귀하의 거래에 적합하도록 편집할 수 있습니다.

이제 AD 지표로 사용할 수 있는 간단한 전략을 살펴보겠습니다.

  • 전략 1: 단순 AD 이동:

이 전략에 따르면 AD 라인의 움직임(상승 또는 하락)을 알아야 합니다. 현재 AD 값과 이전 AD 값을 간단하게 비교합니다. 현재 AD 값이 이전 값보다 크면 AD 라인이 상승하고 그 반대의 경우도 마찬가지입니다. 현재 값이 이전 값보다 작으면 AD 라인이 감소하게 됩니다.

간단히 말해서 다음과 같이 정리 할 수 있습니다.

현재 AD > 이전 AD --> AD 라인 상승 중

현재 AD < 이전 AD --> AD 라인이 감소 중

  • 전략 2: 단순 AD 강도:

이 전략에 따르면 현재 AD 라인의 움직임이 강한지 약한지를 파악해야 합니다. 이는 현재 AD 값과 마지막 10개의 AD 값의 최대 또는 최소 값을 단순 비교하여 할 수 있습니다. 현재 값이 이전 10 AD 값의 최대 값보다 크면 현재 AD 값이 강하고 그 반대의 경우도 마찬가지입니다. 현재 값이 이전 10개의 AD 값의 최소값보다 작으면 현재 AD 값이 약합니다.

간단히 말해서 다음과 같을 것입니다:

현재 AD > 이전 10 AD 값의 최대값 --> AD 현재 값이 강함

현재 AD < 이전 10 AD 값의 최소값 --> AD 현재 값이 약함

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

이 전략에 따르면 우리는 상승 추세 중 현재의 상승 움직임이 강한지 또는 단순한 형태의 약세 다이버전스가 있는지를 파악해야 합니다. 약세 다이버전스는 단순히 가격이 새로운 고점을 생성하지만 지표는 하락하며 이러한 움직임을 확인하지 않는 경우입니다. 약세 다이버전스는 단순한 방법으로는 AD의 마지막 두 연속 값과 고가의 마지막 두 연속 값을 비교하여 찾을 수 있습니다. 그러나 좀더 결정력을 높이기 위해 검사 기간을 바꿀 수 있습니다. 거래량이 추세와 함께 진행된다는 개념을 알 필요가 있습니다: 상승 추세 동안 거래량은 상방의 움직임에 따라 증가하고 조정의 경우 감소합니다.

현재 AD 값을 이전 값과 비교하고 현재 고가와 이전 고가를 비교합니다. 현재 AD 값이 이전 AD 값보다 크고 현재 고가가 이전 고보다 크면 상승 추세 중에 강한 상승의 움직임이 있다는 것입니다. 또는 현재 AD 값이 이전 AD 값보다 작고 현재 고가가 이전 고가보다 크면 약세 다이버전스가 있는 것입니다.

간단히 말해서 다음과 같을 것입니다:

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

현재 AD < 이전 AD 및 현재 고점 > 이전 고점 --> 약세 다이버전스

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

이 전략은 단순 AD - 상승 추세 전략의 반대가 됩니다. 하락 추세 중 현재의 하방의 움직임이 강한지 또는 단순한 형태의 강세로의 다이버전스가 있는지 알아야 합니다. 강세 다이버전스는 가격이 새로운 저점을 생성하는 것을 보았지만 지표가 이 움직임을 확인하지 않고 더 높게 움직일 때 우리는 AD 지표의 마지막 두 연속 값과 저가의 마지막 두 연속 값을 비교하여 이를 확인할 수 있습니다. 현재 AD 값이 이전 AD 값보다 작고 현재 저가가 이전 저가보다 작으면 하락 추세 중에 강한 하방의 움직임이 있다는 것입니다. 또는 현재 AD 값이 이전 AD 값보다 크고 현재 저점이 이전 저점보다 작으면 강세 다이버전스가 있는 것입니다.

다음과 같이 간단합니다:

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

현재 AD > 이전 AD 및 현재 저점 < 이전 저점 --> 강세 다이버전스 


AD 전략 청사진

이제 거래 시스템을 만들기 위한 단계를 구성할 때입니다. 이 부분에서는 거래 시스템을 원활하게 구축하는 데 도움이 되도록 각 전략에 대한 단계별 청사진을 만들 것입니다. 저는 이 단계가 거래 시스템을 만드는 과정에서 매우 중요하다고 생각합니다. 그러므로 우리는 우리가 해야 할 작업이 어떠한 것인지를 더 잘 알기 위해 각 전략에 대한 청사진을 설계할 것입니다. 청사진은 다음과 같을 것입니다.

먼저 전략의 기반이 되는 것으로 차트에 AD의 현재 값을 나타내는 간단한 전략에 대한 청사진을 설계해야 합니다. 우리는 이것을 단순 AD라고 부르고 여기서 하는 일은 차트에 현재 AD의 값을 주석으로 표시하는 것뿐입니다. 다음은 이를 위한 청사진입니다.

단순 광고 청사진 

이제 앞서 언급된 각 전략에 대한 청사진을 설계해야 합니다.

  • 전략 1: 단순 AD 이동:

거래 시스템은 매 틱마다 현재 AD와 이전 AD 이 두 값을 지속적으로 확인하고 현재 값이 이전 값보다 큰지 판단합니다. 상승하는 AD 라인, AD 현재 값 및 AD 이전 값을 차트에 나타내야 합니다. 각 값은 각각의 라인에 있습니다. 반면에 현재 값이 이전 값보다 작으면 감소하는 AD 라인, AD 현재 값 및 AD 이전 값을 차트에 나타내야 합니다. 각 값은 각각의 라인에 있으며 다음은 이러한 거래 시스템을 만들기 위한 청사진입니다:

단순 AD 이동 청사진

  • 전략 2: 단순 AD 강도:

이 전략에 따르면 우리가 설계해야 할 거래 시스템은 3개의 값에 대해 매 틱마다 연속적으로 확인하는 시스템입니다. 여기서 3개의 값은 현재 AD 값, 마지막 10개의 AD 값의 최대값 및 마지막 10개의 AD 값의 최소값입니다. 현재 AD 값이 최대값보다 크면 시스템에서 적절한 알림과 함께 AD 현재 값, AD Max 값 및 AD Min 값을 반환해야 합니다. 각 값은 별도의 라인에 설정됩니다. 현재 AD 값이 최소값 미만이면 시스템에서 적절한 알림과 함께 AD 현재 값, AD Max 값 및 AD Min 값을 반환해야 합니다. 각 값은 별도의 라인에 설정됩니다.

이를 위한 청사진은 다음과 같습니다:

단순 AD 강도 청사진

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

여기에서 만들어야 할 시스템은 현재 AD, 이전 AD, 현재 고가, 이전 고가의 4가지 값을 상승 추세 동안 매 틱마다 확인하는 시스템입니다. 시스템에서 현재 AD가 이전 AD보다 크고 현재 고가가 이전 고가보다 큰지 여부를 결정해야 합니다. 우리는 상승 추세, AD 현재, AD 이전, 현재 고점 및 이전 고점 동안 차트에 강력한 상승 움직임임을 나타내는 시스템이 필요합니다. 각 값은 별도의 라인에 설정됩니다. 플래그를 지정해야 하는 또 다른 경우는 현재 AD가 이전 AD보다 작고 현재 고가가 이전 고가보다 큰 경우입니다. 약세 다이버전스, AD 현재, AD 이전, 현재 및 이전 고가 및 각 값을 별도의 라인에 반환하는 시스템이 필요합니다.

다음은 이 거래 시스템을 만들기 위한 청사진입니다:

단순 광고 상승 추세 청사진

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

여기에서 만들어야 할 시스템은 현재 AD, 이전 AD, 현재 저가, 이전 저가의 4가지 값을 상승 추세 동안 매 틱마다 확인하는 시스템입니다. 그런 다음 현재 AD가 이전 AD보다 작은지, 현재 저가가 이전 저가보다 작은지 여부를 결정하는 시스템이 필요합니다. 하락 추세동안 AD 현재, AD 이전, 현재 저가 및 이전 저가와 강한 하락의 움직임 각각의 값을 별도의 라인으로 차트에 나타내는 시스템이 필요합니다. 플래그를 지정해야 하는 또 다른 경우는 현재 AD가 이전 AD보다 크고 현재 저가가 이전 저가보다 작은 경우입니다. 강세 다이버전스, AD 현재, AD 이전, 현재 및 이전 저가 및 각 값을 별도의 라인에 나타내 주는 시스템이 필요합니다.

다음은 이 거래 시스템을 만들기 위한 청사진입니다:

단순 광고 하락 추세 청사진


AD 전략 거래 시스템

이 흥미로운 섹션에서는 우리가 해야 할 작업에 대해 이해하고 거래 시스템을 설계한 후 만드는 방법을 배웁니다. 우리는 전략의 기반이 될 AD의 현재 값만 반환하는 간단한 AD 시스템을 만드는 것부터 시작합니다. 코딩하는 방법은 다음과 같습니다:

  • 소수 부분의 값을 나타내기 위해 "double" 함수를 사용하여 AD의 배열을 생성합니다.
double ADArray[];
  • ArraySetAsSeries 함수를 사용하여 현재 데이터에서 배열을 정렬합니다.
ArraySetAsSeries(ADArray,true);
  • ADDef의 정수 변수를 생성한 후 iAD 함수를 사용하여 AD를 정의합니다. iAD 함수는 누적/분포 지표의 핸들을 반환하며 해당 매개 변수는 (symbol, period and applied volume)입니다.
int ADDef=iAD(_Symbol,_Period,VOLUME_TICK);
  • CopyBuffer 함수를 사용하여 ADArray를 채우면 복사된 데이터의 수와 해당 매개변수(indicator handle, buffer num, start time, stop time and buffer)가 반환됩니다.
CopyBuffer(ADDef,0,0,3,ADArray);
  • ADValue에 대한 정수 변수를 생성한 후 double형 값을 반환하는 NormalizeDouble 함수를 사용하여 AD 현재 값을 계산합니다. 
int ADValue=NormalizeDouble(ADArray[0],5);
  • 주석 기능을 사용하여 차트에 주석을 나타냅니다.
Comment("AD Value is: ",ADValue);

다음은 단순 AD의 전체 코드입니다:

//+------------------------------------------------------------------+
//|                                                    Simple AD.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 an array for AD
   double ADArray[];
   
   //sorting the array from the current data
   ArraySetAsSeries(ADArray,true);
   
   //defining AD
   int ADDef=iAD(_Symbol,_Period,VOLUME_TICK);
   
   //filling the ADArray with ADDef
   CopyBuffer(ADDef,0,0,3,ADArray);
   
   //calculating current AD value
   int ADValue=NormalizeDouble(ADArray[0],5);
   
   //creating a comment with AD value
   Comment("AD Value is: ",ADValue);  
  }
//+------------------------------------------------------------------+

이 코드를 컴파일하면 우리의 Expert Advisors는 Navigator 창의 Expert Advisors 폴더에 나타납니다:

광고 탐색

차트에 EA를 드래그 앤 드롭하여 실행할 수 있습니다. 그러면 다음과 같은 창이 나타납니다:

단순 AD 창

확인을 클릭하면 EA는 아래와 같이 차트에 첨부됩니다:

Simple AD 첨부

다음은 테스트를 할 경우 이 EA에 따라 생성된 주석의 예입니다:

단순 AD 테스트 신호

EA가 MetaTrader 5에 내장된 지표와 동일한 값을 생성하는지를 확인해야 하는 경우 지표를 삽입하고 EA도 같이 첨부할 수 있습니다. 그러면 그것들이 동일하다는 것을 확인할 수 있습니다:

Simple AD - 동일한 신호

  • 전략 1: 단순 AD 이동:

다음은 이 전략을 실행하고 원하는 신호를 생성할 수 있는 EA를 생성하는 전체 코드입니다:

//+------------------------------------------------------------------+
//|                                           Simple AD 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()
  {
   //create array for AD
   double ADArray[];
   
   //sorting array from the current data
   ArraySetAsSeries(ADArray,true);
   
   //defining AD
   int ADDef=iAD(_Symbol,_Period,VOLUME_TICK);
   
   //filling the ADArray with ADDef
   CopyBuffer(ADDef,0,0,3,ADArray);
   
   //calculating current AD and previous values
   int ADCurrrentValue=NormalizeDouble(ADArray[0],5);
   int ADPrevValue=NormalizeDouble(ADArray[1],5);
   
   //Comparing two values and giving signal
   //Rising AD
   if(ADCurrrentValue>ADPrevValue)
   {
      Comment("AD line is rising","\n","AD current value is: ",ADCurrrentValue,
      "\n","AD previous value is: ",ADPrevValue);
   }
   
   //Declining AD
   if(ADCurrrentValue<ADPrevValue)
   {
      Comment("AD line is declining","\n","AD current value is: ",ADCurrrentValue,
      "\n","AD previous value is: ",ADPrevValue);
   }  
  }
//+------------------------------------------------------------------+

이전의 코드는 기본이 되는 코드와 다르며 다음과 같은 차이점이 있습니다:

  • 현재 및 이전 AD의 두개의 값 계산:
int ADCurrrentValue=NormalizeDouble(ADArray[0],5);
int ADPrevValue=NormalizeDouble(ADArray[1],5);
  • 이 전략에 따라 조건 및 주석 설정:
    • 상승 AD 라인:
if(ADCurrrentValue>ADPrevValue)
{
 Comment("AD line is rising","\n","AD current value is: ",ADCurrrentValue,
 "\n","AD previous value is: ",ADPrevValue);
}
    • 하락 AD 라인:
if(ADCurrrentValue<ADPrevValue)
{
 Comment("AD line is declining","\n","AD current value is: ",ADCurrrentValue,
 "\n","AD previous value is: ",ADPrevValue);
} 

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

AD 탐색 2

더블클릭하면 아래와 같은 창이 나옵니다:

단순 AD 이동 창

확인을 누르면 파일이 차트에 첨부됩니다:

심플 AD 무브먼트 첨부

다음은 현재 및 이전 데이터를 표시하는 창과 생성된 신호의 예입니다.

상승 AD 라인,

현재의 데이터: 

단순 AD 이동 - 상승 AD - 현재 

이전 데이터:

단순 AD 이동 - 상승 AD - 이전

하락 AD

현재 데이터:

단순 AD 이동 - 하락 AD - 현재

이전 데이터:

 단순 AD 이동 - 감소 AD - 이전

  • 전략 2: 단순 AD 강도:

다음은 거래 전략을 실행하기 위해 EA를 생성하는 전체 코드입니다:

//+------------------------------------------------------------------+
//|                                           Simple AD strength.mq5 |
//|                                  Copyright 2022, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
void OnTick()
  {
   //Create array for AD
   double ADArray[];
   
   //sorting the array from the current data
   ArraySetAsSeries(ADArray,true);
  
   //defining AD
   int ADDef=iAD(_Symbol,_Period,VOLUME_TICK);
   
   //filling the ADArray with ADDef
   CopyBuffer(ADDef,0,0,10,ADArray);
 
   //calculating current AD and previous values
   int ADCurrrentValue=NormalizeDouble(ADArray[0],5);
  
   //Defining Max and Min values from the last 10 AD values
   int ADMax =ArrayMaximum(ADArray,1,10);
   int ADMin =ArrayMinimum(ADArray,1,10);
   
   //Calculating Max and Min values
   int ADMaxValue=ADArray[ADMax];
   int ADMinValue=ADArray[ADMin];

   //Comparing two values and giving signal
   //AD current is strong
   if(ADCurrrentValue>ADMaxValue)
   {
      Comment("AD Current value is strong","\n","AD current value is: ,",ADCurrrentValue,
   "\n","AD Max is: ",ADMaxValue,"\n","AD Min is: ",ADMinValue);
   }
   
   //AD current is weak
   if(ADCurrrentValue<ADMinValue)
   {
      Comment("AD Current value is weak","\n","AD current value is: ,",ADCurrrentValue,
   "\n","AD Max is: ",ADMaxValue,"\n","AD Min is: ",ADMinValue);
   }
  }
//+------------------------------------------------------------------+

이전 코드의 경우 전략 및 EA가 수행해야 하는 작업등이 많이 다릅니다. 다음은 이러한 차이점에 대한 설명입니다:

  • ADMaxValue 및 ADMinValue의 정수 변수를 생성한 후 ArrayMaximum 및 ArrayMinimum 함수를 사용하여 AD 최대값과 최소값을 정의. ArrayMaximum은 배열 시리즈와 가장 큰 요소를 검색하여 찾아낸 요소의 인덱스를 반환하고 이때 매개변수는 숫자 배열, 시작할 인덱스 및 검색할 요소의 수입니다. ArrayMinimum은 ArrayMaximum과 동일하지만 가장 작은 요소를 검색합니다.
int ADMax =ArrayMaximum(ADArray,1,10);
int ADMin =ArrayMinimum(ADArray,1,10);
  • 정수 변수를 생성한 후 ADMaxValue 및 ADMinValue 계산:
int ADMaxValue=ADArray[ADMax];
int ADMinValue=ADArray[ADMin];
  • 전략의 조건을 설정하고 각 조건에 따른 주석 표시
    • 강한 AD 값:
if(ADCurrrentValue>ADMaxValue)
{
 Comment("AD Current value is strong","\n","AD current value is: ,",ADCurrrentValue,
 "\n","AD Max is: ",ADMaxValue,"\n","AD Min is: ",ADMinValue);
}
    • 약한 AD 값:
if(ADCurrrentValue<ADMinValue)
{
 Comment("AD Current value is weak","\n","AD current value is: ,",ADCurrrentValue,
 "\n","AD Max is: ",ADMaxValue,"\n","AD Min is: ",ADMinValue);
}

이 코드를 컴파일하 후 네비게이터에서 EA를 사용할 수 있습니다:

AD 탐색 3

 

차트에 끌어다 놓으면 다음과 같은 창이 나타납니다:

단순 AD 강도 창

확인을 누르면 파일이 차트에 첨부됩니다:

단순 AD 강도 첨부

다음은 생성된 신호를 테스트한 예입니다:

강력한 AD:

단순 AD 강도 신호 - 강

약한 AD:

단순 AD 강도 신호 - 약함

  • 전략 3: 단순 AD 상승 추세:

다음은 이 전략을 실행하는 거래 시스템을 만드는 전체 코드입니다.

//+------------------------------------------------------------------+
//|                                          Simple AD - 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()
  {
   //Create two arrays for AD and price
   double ADArray[];
   MqlRates PriceArray[];
   
   //sorting the two arrays
   ArraySetAsSeries(ADArray,true);
   int Data=CopyRates(_Symbol,_Period,0,3,PriceArray);
   
   //defining AD
   int ADDef=iAD(_Symbol,_Period,VOLUME_TICK);
   
   //filling the ADArray with ADDef
   CopyBuffer(ADDef,0,0,3,ADArray);
   
   //calculating current AD and previous values
   int ADCurrrentValue=NormalizeDouble(ADArray[0],5);
   int ADPrevValue=NormalizeDouble(ADArray[1],5);
   
   //calculating current and previous highs
   double CurrentHighValue=NormalizeDouble(PriceArray[2].high,5);         
   double PrevHighValue=NormalizeDouble(PriceArray[1].high,5); 
   
   //Comparing two values and giving signal
   //Strong Up move
   if(ADCurrrentValue > ADPrevValue && CurrentHighValue>PrevHighValue)
   {
      Comment("Strong Up Move During The Uptrend","\n","AD current value is: ",ADCurrrentValue,
      "\n","AD previous value is: ",ADPrevValue,
      "\n","Current high value is: ",CurrentHighValue,
      "\n","Previous high value is: ",PrevHighValue);    
   }   
   
   //in case of divergence
   if(ADCurrrentValue < ADPrevValue && CurrentHighValue>PrevHighValue)
   {
      Comment("Bearish Divergence","\n","AD current value is: ",ADCurrrentValue,
      "\n","AD previous value is: ",ADPrevValue,
      "\n","Current low value is: ",CurrentHighValue,
      "\n","Previous low value is: ",PrevHighValue);      
   }   
  }
//+------------------------------------------------------------------+

이 코드에서의 차이점:

  • 두 개의 배열 생성: 하나는 'double' 함수를 사용한 AD용이고 다른 하나는 가격에 대한 정보를 저장하는 MqlRates 함수를 사용한 가격을 위한 것입니다.
double ADArray[];
MqlRates PriceArray[];
  • 하나는 ArraySetAsSeries 함수를 사용한 AD용이고 다른 하나는 데이터에 대한 정수 변수를 생성한 후 MqlRates 구조의 과거 데이터를 가져오기 위해 CopyRates 함수를 사용한 가격용으로 이렇게 두 개의 배열을 정렬합니다.
ArraySetAsSeries(ADArray,true);
int Data=CopyRates(_Symbol,_Period,0,3,PriceArray);
  • AD 정의, AD 배열 채우기:
int ADDef=iAD(_Symbol,_Period,VOLUME_TICK);

CopyBuffer(ADDef,0,0,3,ADArray);
  • 현재 AD, 이전 AD, 현재 고가 및 이전 고가 계산:
int ADCurrrentValue=NormalizeDouble(ADArray[0],5);
int ADPrevValue=NormalizeDouble(ADArray[1],5);

double CurrentHighValue=NormalizeDouble(PriceArray[2].high,5);         
double PrevHighValue=NormalizeDouble(PriceArray[1].high,5); 
  • 전략 조건 및 원하는 주석 설정:
    • 강력한 상승 움직임:
if(ADCurrrentValue > ADPrevValue && CurrentHighValue>PrevHighValue)
{
 Comment("Strong Up Move During The Uptrend","\n","AD current value is: ",ADCurrrentValue,
 "\n","AD previous value is: ",ADPrevValue,
 "\n","Current high value is: ",CurrentHighValue,
 "\n","Previous high value is: ",PrevHighValue);    
} 
    • 약세 다이버전스:
if(ADCurrrentValue < ADPrevValue && CurrentHighValue>PrevHighValue)
{
 Comment("Bearish Divergence","\n","AD current value is: ",ADCurrrentValue,
 "\n","AD previous value is: ",ADPrevValue,
 "\n","Current low value is: ",CurrentHighValue,
 "\n","Previous low value is: ",PrevHighValue);      
} 

EA는 이 코드를 컴파일한 후 Navigator 창의 Expert Advisors 폴더에서 찾을 수 있습니다.

AD 탐색 4

두 번 클릭하여 실행하면 창이 나타납니다:

단순 광고 상승 추세 창

확인을 클릭하여 차트에 첨부합니다:

Simple AD 상승 추세 첨부

다음은 현재 및 이전 값의 데이터 창과 생성된 신호의 예입니다:

강력한 상승 움직임,

현재 데이터:

 단순 AD 상승 추세 - 강한 상승 움직임 신호 - 현재

이전 데이터:

단순 AD 상승 추세 - 강한 상승 움직임 신호 - 이전

약세 다이버전스,

현재 데이터:

단순 AD 상승 추세 - 하락 신호 - 현재

이전 데이터:

단순 AD 상승 추세 - 약세 신호 - 이전

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

다음은 이 전략을 실행하는 거래 시스템을 만드는 전체 코드입니다.

//+------------------------------------------------------------------+
//|                                        Simple AD - 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()
  {
   //creating a string variable for signal
   string signal="";
   
   //Create two arrays for AD and price
   double ADArray[];
   MqlRates PriceArray[];
   
   //sorting the two arrays
   ArraySetAsSeries(ADArray,true);
   int Data=CopyRates(_Symbol,_Period,0,3,PriceArray);
   
   //defining AD
   int ADDef=iAD(_Symbol,_Period,VOLUME_TICK);
   
   //filling the ADArray with ADDef
   CopyBuffer(ADDef,0,0,3,ADArray);
   
   //calculating current AD and previous values
   int ADCurrrentValue=NormalizeDouble(ADArray[0],5);
   int ADPrevValue=NormalizeDouble(ADArray[1],5);
   
   double CurrentLowValue=NormalizeDouble(PriceArray[2].low,5);         
   double PrevLowValue=NormalizeDouble(PriceArray[1].low,5); 
   
   //Comparing two values and giving signal
   //Strong down move
   if(ADCurrrentValue < ADPrevValue && CurrentLowValue<PrevLowValue)
   {
      Comment("Strong Down Move During The Downtrend","\n","AD current value is: ",ADCurrrentValue,
      "\n","AD previous value is: ",ADPrevValue,
      "\n","Current low value is: ",CurrentLowValue,
      "\n","Previous low value is: ",PrevLowValue);      
   }
   
   //in case of divergence
   if(ADCurrrentValue > ADPrevValue && CurrentLowValue<PrevLowValue)
   {
      Comment("Bullish Divergence","\n","AD current value is: ",ADCurrrentValue,
      "\n","AD previous value is: ",ADPrevValue,
      "\n","Current low value is: ",CurrentLowValue,
      "\n","Previous low value is: ",PrevLowValue);      
   }  
  }
//+------------------------------------------------------------------+

이 코드에서의 차이점은 동일합니다.

  • 이 전략의 조건 및 이 전략에 따라 요구되는 주석:
    • 강력한 하락 움직임:
if(ADCurrrentValue < ADPrevValue && CurrentLowValue<PrevLowValue)
{
 Comment("Strong Down Move During The Downtrend","\n","AD current value is: ",ADCurrrentValue,
 "\n","AD previous value is: ",ADPrevValue,
 "\n","Current low value is: ",CurrentLowValue,
 "\n","Previous low value is: ",PrevLowValue);      
}
    • 강세 다이버전스:
if(ADCurrrentValue > ADPrevValue && CurrentLowValue<PrevLowValue)
{
 Comment("Bullish Divergence","\n","AD current value is: ",ADCurrrentValue,
 "\n","AD previous value is: ",ADPrevValue,
 "\n","Current low value is: ",CurrentLowValue,
 "\n","Previous low value is: ",PrevLowValue);      
} 

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

 AD 탐색 5

차트에 끌어다 놓으면 다음과 같은 창이 나타납니다:

단순 AD 하락 추세 창

확인을 클릭하여 차트에 EA를 첨부합니다:

단순 AD 하락 추세 첨부

다음은 이 전략에 따라 현재 및 이전 값의 데이터 창과 생성된 신호의 예입니다.

강력한 하락 움직임,

현재 데이터:

단순 AD 하락 추세 - 강한 하락 움직임 신호 - 현재

이전 데이터:

단순 AD 하락 추세 - 강한 하락 움직임 신호 - 이전

강세 다이버전스,

현재 데이터:

단순 AD 하락세 - 강세 다이버전스 신호 - 현재

이전 데이터:

단순 AD 하락 추세 - 강세 다이버전스 신호 - 이전\


결론

이번 글에서는 거래량 지표 중 하나인 누적/분포(AD) 지표에 대해 다루었습니다. 우리는 AD 지표가 무엇인지, 무엇을 측정하는지 그리고 그 이면의 개념을 알아보기 위해 수동으로 계산하는 방법을 배웠습니다. 간단한 전략을 통해 AD 지표를 사용하는 방법에 대해 알아보았습니다. 이러한 전략은: 단순 AD 이동, 단순 AD 강도, 단순 AD - 상승 추세 및 단순 AD - 하락 추세입니다. 그런 다음 각 전략을 수행하는 거래 시스템을 만들기 위해 각 전략에 대한 청사진을 설계했습니다. 그 후 MetaTrader 5 거래 플랫폼을 통해 MQL5로 전략 별로 작동하는 EA를 생성하여 거래 시스템을 구현하는 방법을 배웠고 각 전략에 대해 생성된 신호의 예를 보았습니다. 터미널을 사용하면 이러한 전략을 자동화하여 신호를 생성할 수 있습니다. 이것은 훌륭한 기능입니다. 컴퓨터가 우리를 위해 거래하거나 혹은 최소한 거래에 방해되는 감정을 포함하지 않고 거래 결정을 향상시키는 데 도움이 되는 명확하고 정확하며 빠른 통찰력을 제공하기 때문입니다.

모든 사람에게 다 맞는 것은 아니며 최적화가 필요합니다. 실제 계정에서 전략을 사용하기 전에 모든 전략을 테스트해야 한다는 점을 다시 한번 말씀드리고자 합니다. 더 나은 결과를 얻으십시오. 이 기사와 이 시리즈의 또 다른 기사의 주요 목표는 가장 인기 있는 기술 지표와 관려하여 MQL5를 사용해 간단한 전략을 코딩하는 방법을 배우는 것입니다. 연습은 모든 학습 과정에서 중요합니다. 습득한 지식을 적용하고 스스로 코딩을 해 보시기 바랍니다.

이 기사가 주제 또는 관련 주제와 관련하여 유용하고 통찰력이 있기를 바랍니다. 유사한 기사를 더 읽고 싶다면 이 시리즈의 이전 기사를 보고 인기 있는 기술 지표를 기반으로 하는 간단한 거래 시스템을 설계하는 방법을 배울 수 있습니다.

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

MQL5에서 행렬 및 벡터 연산 MQL5에서 행렬 및 벡터 연산
효율적인 연산을 위해 수학적인 솔루션과 함께 행렬과 벡터가 MQL5에 도입되었습니다. 새로운 유형은 수학적인 표기법에 가까운 간결하고 이해하기 쉬운 코드를 생성하도록 하는 기본 메서드를 제공합니다. 배열은 광범위한 기능을 제공하지만 행렬이 훨씬 더 효율적인 경우가 많습니다.
OBV로 트레이딩 시스템을 설계하는 방법 알아보기 OBV로 트레이딩 시스템을 설계하는 방법 알아보기
이 기사는 인기있는 지표 중 일부를 기반으로 거래 시스템을 설계하는 방법에 대해 초보자들에게 설명하는 시리즈에서 계속되는 새로운 기사입니다. OBV(On Balance Volume)라는 새로운 지표를 배우고 이를 어떻게 사용하고 이를 기반으로 하는 거래 시스템을 어떻게 설계하는지 알아보겠습니다.
Expert Advisor 개발 기초부터 (파트 12): 시간과 거래(I) Expert Advisor 개발 기초부터 (파트 12): 시간과 거래(I)
오늘은 주문의 흐름을 알아보기 위해 Times & Trade를 만들 것입니다. 이는 우리가 앞으로 구축할 시스템의 첫 번째 부분입니다. 다음 글에서는 추가적인 내용을 더해 시스템을 완성하도록 하겠습니다. 이 새로운 기능을 구현하려면 Expert Advisor 코드에 몇 가지의 새로운 항목을 추가해야 합니다.
Expert Advisor 개발 기초부터 (파트 11): 교차 주문 시스템(Cross order system) Expert Advisor 개발 기초부터 (파트 11): 교차 주문 시스템(Cross order system)
이 기사에서는 교차 주문 시스템을 만들 것입니다. 트레이더의 삶을 매우 어렵게 만드는 한 가지 자산이 있습니다. - 바로 선물 계약입니다. 왜 선물이 어렵게 만드는 것일까요?