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

볼륨으로 거래 시스템을 설계하는 방법 알아보기

MetaTrader 5트레이딩 | 16 1월 2023, 14:26
369 0
Mohamed Abdelmaaboud
Mohamed Abdelmaaboud

소개

이 글은 인기 있는 기술 지표를 기반으로 거래 시스템을 설계하는 방법과 관련한 시리즈의 새로운 글입니다. 여기에 시장에 대한 또 다른 관점에서 통찰력을 제공하는 새로운 중요한 기술 지표가 있습니다 - 볼륨 지표입니다. 다음과 같은 주제를 통해 이 지표에 대해 다루어 봅니다.

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

여기서 우리는 볼륨이 무엇이며 무엇을 측정하는지에 대해 배울 것입니다. 기본 개념을 기반으로 몇 가지 간단한 전략을 공유함으로써 거래에 어떻게 사용할 수 있고 우리에게 어떠한 유용함을 주는지 알아볼 것입니다. 그런 다음 언급된 전략을 기반으로 각 전략에 대한 단계별 청사진을 설계하는 방법을 배울 것입니다. 이 단계는 모든 거래 시스템을 설계하는 데 매우 중요합니다. 그런 다음 볼륨 거래 시스템의 가장 흥미로운 부분을 다루게 될 것입니다. MQL5를 통해 우리가 언급한 모든 것과 통찰력 있는 아이디어를 거래 시스템으로 전환하고 이러한 전략을 기반으로 자동으로 필요한 것들을 생성하는 방법을 배우며 이를 통해 우리는 우리의 거래 여정을 쉽게 하고 개선할 수 있을 것입니다.

우리는 MetaTrader 5 거래 터미널에 내장된 MQL5(MetaQuotes Language)를 사용할 것입니다. MetaTrader 5 거래 터미널를 다운로드 하고 사용 하는 방법에 대해 자세히 알고 싶다면 이전의 기사 메타에디터에서 MQL5 코드 작성이란 글을 읽어보십시오. 또한 학습한 내용을 여러분이 직접 적용해 보는 것은 주제에 대한 이해를 향상하고 심화할 수 있기 때문에 학습에 매우 유용합니다. 연습은 모든 학습 과정에서 매우 중요한 요소입니다.

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

거래에 유용할 수 있는 새로운 도구를 배우기 위해 주제로 넘어가겠습니다.


볼륨 정의

Forex 시장에서 볼륨 지표는 특정 시간 동안의 가격 변동의 수를 말합니다. 예를 들어 계약, 돈, 단위 등에 따른 실제로 거래된 볼륨을 나타냅니다. 볼륨 지표는 수요와 공급을 나타내거나 시장의 유동성을 나타낼 수 있습니다. 따라서 볼륨이 많으면 상승할 경우 수요가 높아지고 하락할 경우 공급이 높아진다는 지표가 됩니다. 볼륨은 추세의 확인이 될 것이기 때문에 매우 유용하다고 할 수 있을 것입니다. 추세에 대해 더 알고 싶다면 이전 기사에서 추세 정의란 주제에서 알아볼 수 있습니다.

볼륨은 트렌드와 같이 움직입니다. 현재 움직임이 강할 것인지 약한지를 확인하는 데 사용되는 매우 유용한 도구입니다. 상승추세 중 볼륨이 위로 움직이면 증가하고 아래로 조정되면 감소하는 것을 볼 수 있습니다. 하락 추세 동안 볼륨은 하락하는 움직임과 함께 증가할 것이며 이는 중요한 신호가 될 것이지만 때때로 볼륨 없이 가격이 하락할 수 있기 때문에 많은 볼륨이 아님에도 이러한 하락 움직임을 발견할 수 있습니다. 즉 하락 추세에서 하락의 움직임으로 많은 볼륨이 반드시 나타나는 것은 아닙니다. 하락추세에서 상승의 조정이 있는 경우 볼륨은 감소할 것입니다.

볼륨은 다이버전스가 있을 때 현재 추세가 약해진다는 것을 알려 줄 수 있습니다. 다이버전스는 볼륨이 가격의 방향을 확인하지 않고 가격의 반대 방향으로 움직이는 것을 의미합니다.

이전에 다이버전스의 계산에 대해 설명한 것과 동일합니다:

외환 시장에서:

볼륨 = 특정 기간 동안의 가격 변동 횟수

주식 시장에서:

볼륨 = 볼륨 * 가격

예: 가격이 $10인 주식의 볼륨이 1000주인 경우. 볼륨은 다음과 같을 것입니다:

볼륨 = 1000 * $10 = $10,000

주식 시장과 달리 Forex 시장은 탈 중앙화 된 시장이란 이유로 인해 차이가 있습니다.

MetaTrader 5에서 볼륨이 나타나므로 수동으로 계산할 필요는 없습니다. 여러분은 사용 가능한 지표 중에서 볼륨을 선택하기만 하면 됩니다:

삽입 --> 지표 --> 볼륨 --> 볼륨

볼륨 삽입

이전 그림의 4단계와 동일한 볼륨 지표를 선택하면 볼륨 지표 창이 열립니다:

볼륨 매개변수

1. 상승 바의 색상.

2. 하락 바의 색상.

3. 적용된 볼륨(Tick 또는 Real).

4. 바 두께. 

매개변수를 결정한 후 차트에 첨부됩니다:

Vol 첨부

녹색은 현재 바가 이전 바보다 크다는 것을 의미하지만 빨간색은 현재 바가 이전 바보다 작다는 것을 의미합니다.


볼륨 전략

이 부분에서는 볼륨 지표가 어떻게 사용될 수 있는지 이해하기 위해 간단한 볼륨 전략을 알아볼 것입니다. 물론 이러한 전략은 최적화가 필요합니다. 여기에서의 주요 목표는 개념에 따라 볼륨 지표가 어떻게 사용될 수 있는지를 이해하고 기본에 따라 거래 시스템을 설계하는 방법을 이해하는 것입니다. 따라서 여러분은 실제 계정에서 사용하기 전에 이러한 전략을 테스트해야 합니다.

  • 전략 1: Vol - Movement:

이 전략에 따라 현재 볼륨 값과 이전 볼륨 값을 비교하고 이를 기반으로 적절한 신호를 결정해야 합니다. 현재가 이전보다 크면 볼륨이 증가한다는 신호입니다. 현재가 이전보다 작으면 볼륨이 감소한다는 신호입니다.

간단히 하면,

현재 볼륨 > 이전 볼륨 --> 볼륨이 증가했습니다.

현재 볼륨 < 이전 볼륨 --> 볼륨이 감소했습니다.

  • 전략 2: Vol - Strength:

이 전략에 따라 현재 볼륨 값과 이전 5개 값의 평균을 비교하여 볼륨 지표의 강도를 결정합니다. 현재 값이 평균 이상이면 볼륨이 강하다는 신호입니다. 현재가 평균 이하이면 볼륨이 약하다는 신호입니다.

요약하면,

현재 > AVG --> 강력한 볼륨

현재 < AVG --> 약한 볼륨

  • 전략 3: Price & Vol - Uptrend:

이 전략에 따르면 상승추세에서 현재 및 이전 고점을 현재 및 이전 볼륨의 값과 비교하여 매수 신호가 있는지 또는 신호가 없는지를 판단합니다. 현재 고점이 전고점보다 높고 현재 볼륨이 이전 볼륨보다 높으면 매수 신호가 되지만 현재 고점이 이전보다 높고 현재 볼륨이 이전 볼륨보다 낮으면 신호가 없는 것입니다.

현재 고가 > 이전 고가 && 현재 볼륨 > 이전 볼륨 --> 상승 추세 동안 매수 신호

  • 전략 4: Price & Vol - Downtrend:

이 전략은 이전 전략과 반대입니다. 하락세 동안 현재 및 이전 저점을 현재 및 이전 볼륨 값과 비교하여 매도 신호가 있는지 또는 없는지 결정합니다. 현재 저점이 전저점보다 낮고 현재 볼륨이 이전 볼륨보다 높으면 매도 신호가 되지만 현재 저점이 이전 저점보다 낮고 현재 볼륨이 이전 볼륨보다 낮으면 신호가 없는 것입니다.

현재 저점 < 이전 저점 && 현재 볼륨 > 이전 볼륨 --> 하락 추세 동안 매도 신호

  • 전략 5: MA & Vol 전략:

이 전략에 따르면 하나는 단기이고 다른 하나는 장기인장기 각각의 이동 평균의 길이와 현재 및 이전 볼륨의 값을 비교하여 매수 또는 매도 신호가 있는지를 결정합니다. 단기 MA가 장기 MA보다 작고 단기 MA가 장기 MA 위로 올라감과 동시에 현재 볼륨이 이전 볼륨보다 높아지면 이는 매수 신호가 됩니다. 단기 MA가 장기 MA보다 작으면 단기 MA가 장기 MA 아래로 내려감과 동시에 현재 볼륨이 이전 볼륨보다 높아지면 이는 매도 신호가 됩니다.

단기 MA < 장기 MA 그리고 단기 MA > 장기 MA && 현재 볼륨 > 이전 볼륨 --> 매수 신호

단기 MA > 장기 MA 그리고 단기 MA < 장기 MA && 현재 볼륨 > 이전 볼륨 --> 매도 신호


볼륨 전략 청사진

이 부분에서는 각각의 전략과 관련한 청사진을 설계할 것입니다. 청사진을 설계하는 이유는 거래 시스템을 만드는 데에 도움이 되도록 우리가 하고자 하는 일을 정리하는 데 도움이 되기 때문입니다. 이 단계는 단계별로 우리가 무엇을 하고자 하는 일을 파악하고 우리의 아이디어를 정리하는 데 매우 중요하고 필수적입니다.

먼저 볼륨 지표의 현재 값을 차트에 주석으로 생성하는 간단한 거래 시스템에 대한 청사진을 만들 것입니다. 우리는 모든 틱에서 볼륨 지표 값을 확인한 다음 차트의 현재 값을 주석으로 반환하는 시스템이 필요합니다. 다음은 그와 같은 거래 시스템을 만들기 위한 단계별 청사진입니다.

간단한 vol 청사진


  • 전략 1: Vol - 움직임:

이 전략에 따르면 우리는 현재 볼륨 지표와 이전 볼륨 지표의 두 값을 비교하여 볼륨의 움직임(증가 또는 감소하는 경우)을 알려주는 신호를 생성하는 간단한 거래 시스템을 만들어야 합니다. 따라서 우리는 매 틱마다 이 두 값을 확인한 다음 현재 볼륨이 이전 볼륨보다 크면 볼륨이 증가하고 있음을 알려주고 현재 볼륨이 이전 볼륨보다 작으면 볼륨이 감소하고 있음을 알려주는 시스템이 필요합니다. 다음은 그와 같은 거래 시스템을 만들기 위한 단계별 청사진입니다.

Vol - 무브먼트 청사진


  • 전략 2: Vol - 강도:

이 전략에 따르면 울가 만들어야 할 시스템은 현재 볼륨 지표 값과 이전 5개 값의 평균 사이의 비교를 통해 볼륨의 강도를 알려주는 신호를 생성하는 시스템입니다. 따라서 시스템이 이 모든 값을 확인하도록 한 다음 매 틱마다 이전 5개 Vol 값의 평균을 계산해야 합니다. 그 후 적절한 시그널이 생성되는데 현재 Vol 값이 평균 볼륨 값보다 크면 강한 볼륨과 현재 볼륨과 볼륨 값의 이전 5개 값과 평균 값이 차트 및 값에 주석으로 표시됩니다. 값은 별도의 줄에 나타날 것입니다. 현재 값이 평균값보다 작을 경우 생성되는 값은 약한 볼륨과 현재 볼륨 값과 이전 5개의 볼륨 값과 평균 값입니다. 이들 값이 각각 별도의 줄에 차트에 주석으로 표시됩니다. 다음은 이와 같은 거래 시스템을 만들기 위한 단계별 청사진입니다:

Vol - Strength 청사진


  • 전략 3: Price & Vol - 상승추세:

이 전략에 따르면 현재 및 이전의 볼륨 지표 값 외에도 현재 및 이전 고점을 틱별로 확인한 후 상승 추세 중 매수 신호를 생성하기 위해 작동하는 간단한 거래 시스템을 만들어야 합니다. 이 전략에 따라 현재 고가가 이전 고가보다 크고 현재 볼륨 값이 이전 값보다 크면 매수 신호, 현재 고가, 이전 고가, 현재 볼륨, 이전 볼륨을 차트에 별도의 줄에 생성해야 합니다. 혹은 현재 고가가 이전 값보다 크고 현재 볼륨 값이 이전 값보다 작으면 매수 신호 없이 이전의 모든 값을 생성해야 합니다. 다음은 이와 같은 거래 시스템을 만들기 위한 단계별 청사진입니다:

Price_Vol - 상승세 청사진

  • 전략 4: Price & Vol - 하락추세:

이 전략은 이전 전략과 반대입니다. 이 전략에 따르면 현재 및 이전의 볼륨 지표 값 외에도 현재 및 이전 저가를 틱별로 확인한 후 하락 추세 중 매도 신호를 생성하기 위해 작동하는 간단한 거래 시스템을 만들어야 합니다. 이 전략에 따라 현재 저가가 이전 저가보다 작고 현재 볼륨 값이 이전 값보다 크면 매도 신호, 현재 저가, 이전 저가, 현재 볼륨, 이전 볼륨을 차트에 별도의 줄에 생성해야 합니다. 혹은 현재 저가가 이전 값보다 작고 현재 볼륨 값이 이전 값보다 작으면 매도 신호 없이 이전의 모든 값을 생성해야 합니다. 그러면 우리는 다음과 같이 이 거래 시스템을 만드는 단계별 청사진을 확인 할 수 있습니다:

Price_Vol - 하락세 청사진


  • 전략 5: MA & Vol 전략:

이 전략에 따르면 우리는 두 개의 이동 평균 사이의 비교를 기반으로 매수 또는 매도 신호가 있는지 결정하기 위해 볼륨과 이동 평균을 매 틱마다 확인할 수 있는 거래 시스템을 만들어야 합니다. 이동 평균 중 하나는 단기이고 다른 하나는 장기입니다. 단기가 장기보다 밑에 있게 된 후 단기가 장기보다 큰 것과 동시에 현재 볼륨 값이 이전 값보다 큰 경우 시스템에서 매수 신호를 생성하는 시스템이 필요합니다. 두 번째 시나리오는 단기가 장기 MA보다 큰 후 단기가 장기 MA보다 작으면서 동시에 현재 볼륨 값이 이전보다 더 큰 경우입니다. 이 경우 매도 신호를 생성하는 시스템이 필요합니다. 다음은 이러한 종류의 전략을 만들기 위한 단계별 청사진입니다:

MA_Vol 청사진


볼륨 거래 시스템

이제 이전의 모든 내용을 거래 시스템에 전달하여 신호가 자동으로 정확하게 생성되도록 하는 방법에 대해 알아볼 차례입니다. 이 기사에서 가장 흥미로운 부분에 도달했습니다. 각 전략에 대한 거래 시스템을 설계할 것이지만 먼저 각 전략의 기반이 될 볼륨의 현재 값을 생성하는 거래 시스템을 설계할 것입니다.

  • "double" 함수를 사용하여 볼륨 배열을 생성합니다.
double VolArray[];
  • Boolean(true 또는 false)을 반환하는 ArraySetAsSeries 함수를 사용하여 배열을 정렬합니다.
ArraySetAsSeries(VolArray,true);
  • VolDef 변수를 생성한 후 iVolume을 사용하여 볼륨을 정의합니다. iVolumes 함수는 볼륨 지표의 핸들을 반환하며 해당 매개변수는 (symbol, period, applied volume)입니다. 현재 심볼에 적용할 수 있도록 (_Symbol)을, 현재 시간 프레임에 적용할 수 있도록 (_period)를 사용했습니다.
int VolDef=iVolumes(_Symbol,_Period,VOLUME_TICK);
  • 볼륨 지표에서 데이터를 가져오기 위해 CopyBuffer 함수를 사용하여 배열을 채웁니다.
CopyBuffer(VolDef,0,0,3,VolArray);
  • VolValue에 대한 변수를 생성한 후 NormalizeDouble 함수를 사용하여 볼륨 값을 계산합니다. NormalizeDouble 함수는 double 유형의 값을 반환합니다.
int VolValue=NormalizeDouble(VolArray[0],5);
  • Comment 함수를 사용하여 볼륨 인디케이터 값에 대한 설명 함수를 생성합니다.
Comment("Volumes Value is: ",VolValue);

다음은 거래 시스템의 전체 코드입니다:

//+------------------------------------------------------------------+
//|                                               Simple Volumes.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 Volume
   double VolArray[];

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

//defining Volume
   int VolDef=iVolumes(_Symbol,_Period,VOLUME_TICK);

//filling the array
   CopyBuffer(VolDef,0,0,3,VolArray);

//calculating current vol value
   int VolValue=NormalizeDouble(VolArray[0],5);

//creating a comment with current vol value
   Comment("Volumes Value is: ",VolValue);
  }
//+------------------------------------------------------------------+

MetaTrader 5에서 실행할 수 있도록 이 코드를 컴파일 하면 탐색기 창에서 찾을 수 있습니다.

 1 내비1

파일을 더블 클릭하거나 차트에 드래그 앤 드롭 하면 다음과 같은 창이 나타납니다:

단순 볼륨 창

그런 다음 차트에 첨부된 EA를 찾습니다:

 단순 볼륨 첨부

다음은 테스팅을 통해 생성된 신호의 예입니다:

단순 vol 신호

  • 전략 1: Vol 이동:

현재 볼륨과 이전 볼륨의 비교를 기반으로 하고 볼륨 지표의 움직임에 따라 차트에 주석을 달아 아려 주는 거래 시스템을 만들기 위해 다음과 같이 코드를 작성합니다:

//+------------------------------------------------------------------+
//|                                               Vol - 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 an array for Volume
   double VolArray[];

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

//defining Volume
   int VolDef=iVolumes(_Symbol,_Period,VOLUME_TICK);

//filling the array
   CopyBuffer(VolDef,0,0,3,VolArray);

//calculating current vol value
   double VolCurrentValue=NormalizeDouble(VolArray[0],5);
   double VolPrevValue=NormalizeDouble(VolArray[1],5);

//Conditions of vol movements
//Volume increasing
   if(VolCurrentValue>VolPrevValue)
     {
      Comment("Volumes increased","\n","Volumes current value is: ",VolCurrentValue,
              "\n","Volumes previous value is: ",VolPrevValue);
     }

//Volume decreasing
   if(VolCurrentValue<VolPrevValue)
     {
      Comment("Volumes decreased","\n","Volumes current value is: ",VolCurrentValue,
              "\n","Volumes previous value is: ",VolPrevValue);
     }
  }
//+------------------------------------------------------------------+

코드의 차이점:

볼륨의 현재 및 이전 값 계산:

   double VolCurrentValue=NormalizeDouble(VolArray[0],5);
   double VolPrevValue=NormalizeDouble(VolArray[1],5);

전략의 조건:

볼륨 지표가 증가하고 있습니다:

   if(VolCurrentValue>VolPrevValue)
     {
      Comment("Volumes increased","\n","Volumes current value is: ",VolCurrentValue,
              "\n","Volumes previous value is: ",VolPrevValue);
     }

볼륨 지표가 감소하고 있습니다:

   if(VolCurrentValue<VolPrevValue)
     {
      Comment("Volumes decreased","\n","Volumes current value is: ",VolCurrentValue,
              "\n","Volumes previous value is: ",VolPrevValue);
     }

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

Vol Nav2

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

Vol - 이동 창

"Algo Trading 허용" 옆에 체크 표시하고 확인을 누르면 프로그램이 차트에 첨부됩니다:

 Vol - 무브먼트 부착

다음은 현재 및 이전 데이터의 데이터 창을 사용하여 Vol - 이동 전략에 따라 생성된 신호의 예입니다:

볼륨 증가:

현재 데이터 창:

 Vol - 움직임 증가 신호 - 전류

이전 데이터 창:

 Vol - 움직임 증가 신호 - 이전

볼륨 감소:

현재 데이터 창:

Vol - 움직임 감소 신호 - 전류

이전 데이터 창:

 Vol - 움직임 증가 신호 - 이전

  • 전략 2: Vol - 강도:

다음은 현재 볼륨 지표 값과 이전 볼륨 지표 값 간을 비교하여 볼륨 지표의 강도에 대한 신호를 자동으로 생성하는 거래 시스템을 만드는 전체 코드입니다:

//+------------------------------------------------------------------+
//|                                               Vol - 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()
  {
//Create an array for Volume
   double VolArray[];

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

//defining Volume
   int VolDef=iVolumes(_Symbol,_Period,VOLUME_TICK);

//filling the array
   CopyBuffer(VolDef,0,0,11,VolArray);

//calculating current vol && 5 previous volume values
   double VolCurrentValue=NormalizeDouble(VolArray[0],5);
   double VolPrevValue1=NormalizeDouble(VolArray[1],5);
   double VolPrevValue2=NormalizeDouble(VolArray[2],5);
   double VolPrevValue3=NormalizeDouble(VolArray[3],5);
   double VolPrevValue4=NormalizeDouble(VolArray[4],5);
   double VolPrevValue5=NormalizeDouble(VolArray[5],5);


//calculating AVG of 5 previous volume values
   double VolAVGVal=((VolPrevValue1+VolPrevValue2+VolPrevValue3+VolPrevValue4+VolPrevValue5)/5);

//conditions of Volume strength based on comparing current to AVG
//strong volume
   if(VolCurrentValue>VolAVGVal)
     {
      Comment("Strong volume","\n","Current volume is : ",VolCurrentValue,"\n",
              "Volume prev 1 is : ",VolPrevValue1,"\n",
              "Volume prev 2 is : ",VolPrevValue2,"\n",
              "Volume prev 3 is : ",VolPrevValue3,"\n",
              "Volume prev 4 is : ",VolPrevValue4,"\n",
              "Volume prev 5 is : ",VolPrevValue5,"\n",
              "AVG volume is : ",VolAVGVal);
     }

//weak volume
   if(VolCurrentValue<VolAVGVal)
     {
      Comment("Weak volume","\n","Current volume is : ",VolCurrentValue,"\n",
              "Volume prev 1 is : ",VolPrevValue1,"\n",
              "Volume prev 2 is : ",VolPrevValue2,"\n",
              "Volume prev 3 is : ",VolPrevValue3,"\n",
              "Volume prev 4 is : ",VolPrevValue4,"\n",
              "Volume prev 5 is : ",VolPrevValue5,"\n",
              "AVG volume is : ",VolAVGVal);
     }
  }
//+------------------------------------------------------------------+

코드의 차이점:

현재 볼륨 지표의 값과 이전 5개의 볼륨 지표의 값을 계산:

   double VolCurrentValue=NormalizeDouble(VolArray[0],5);
   double VolPrevValue1=NormalizeDouble(VolArray[1],5);
   double VolPrevValue2=NormalizeDouble(VolArray[2],5);
   double VolPrevValue3=NormalizeDouble(VolArray[3],5);
   double VolPrevValue4=NormalizeDouble(VolArray[4],5);
   double VolPrevValue5=NormalizeDouble(VolArray[5],5);

 이전 5개 볼륨 지표의 평균 계산:

double VolAVGVal=((VolPrevValue1+VolPrevValue2+VolPrevValue3+VolPrevValue4+VolPrevValue5)/5);

전략의 조건:

강력한 볼륨:

   if(VolCurrentValue>VolAVGVal)
     {
      Comment("Strong volume","\n","Current volume is : ",VolCurrentValue,"\n",
              "Volume prev 1 is : ",VolPrevValue1,"\n",
              "Volume prev 2 is : ",VolPrevValue2,"\n",
              "Volume prev 3 is : ",VolPrevValue3,"\n",
              "Volume prev 4 is : ",VolPrevValue4,"\n",
              "Volume prev 5 is : ",VolPrevValue5,"\n",
              "AVG volume is : ",VolAVGVal);
     }

약한 볼륨:

   if(VolCurrentValue<VolAVGVal)
     {
      Comment("Weak volume","\n","Current volume is : ",VolCurrentValue,"\n",
              "Volume prev 1 is : ",VolPrevValue1,"\n",
              "Volume prev 2 is : ",VolPrevValue2,"\n",
              "Volume prev 3 is : ",VolPrevValue3,"\n",
              "Volume prev 4 is : ",VolPrevValue4,"\n",
              "Volume prev 5 is : ",VolPrevValue5,"\n",
              "AVG volume is : ",VolAVGVal);
     }

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

 Vol Nav3

차트에서 파일을 끌어다 놓으면 EA 창이 열립니다.

 Vol - 강도 창

확인을 클릭하면 EA가 차트에 첨부됩니다.

ATR 강도 첨부

다음은 볼륨 강도를 기반으로 생성된 신호의 예입니다:

강력한 볼륨:

Vol - Strength - 강한 신호

약한 볼륨:

Vol - Strength - 약한 신호

  • 전략 3: Price & Vol - 상승추세:

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

//+------------------------------------------------------------------+
//|                                          Price&Vol - 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 arrays for price & Volume
   MqlRates PriceArray[];
   double VolArray[];

//filling price array with data
   int Data=CopyRates(_Symbol,_Period,0,3,PriceArray);

//sorting arrays from the current data
   ArraySetAsSeries(VolArray,true);

//defining Volume
   int VolDef=iVolumes(_Symbol,_Period,VOLUME_TICK);

//filling the array
   CopyBuffer(VolDef,0,0,3,VolArray);

//calculating the current and previous values of highs and volume
   double CurrentHighValue=NormalizeDouble(PriceArray[2].high,5);
   double PrevHighValue=NormalizeDouble(PriceArray[1].high,5);
   double VolCurrentValue=NormalizeDouble(VolArray[0],5);
   double VolPrevValue=NormalizeDouble(VolArray[1],5);

//Conditions of buy signal
//Buy signal
   if(CurrentHighValue>PrevHighValue&&VolCurrentValue>VolPrevValue)
     {
      Comment("Buy Signal during uptrend",
              "\n","Current high is: ",CurrentHighValue,"\n","Previous high is: ",PrevHighValue,
              "\n","Volume current value is: ",VolCurrentValue,"\n","Volumes previous value is: ",VolPrevValue);
     }

//no signal
   if(CurrentHighValue>PrevHighValue&&VolCurrentValue<VolPrevValue)
     {
      Comment("Current high is: ",CurrentHighValue,"\n","Previous high is: ",PrevHighValue,
              "\n","Volume current value is: ",VolCurrentValue,"\n","Volumes previous value is: ",VolPrevValue);
     }
  }
//+------------------------------------------------------------------+

코드의 차이점:

볼륨 및 가격에 대한 배열을 생성하기 위해 이전과 동일하게 볼륨 배열에 "double" 함수를 사용하고 가격, 볼륨 및 스프레드를 저장하는 가격 배열에 대한 MqlRates를 사용합니다.

   MqlRates PriceArray[];
   double VolArray[];

데이터에 대한 정수 변수를 생성한 후 CopyRates 함수를 사용하여 가격 배열 채우기:

   int Data=CopyRates(_Symbol,_Period,0,3,PriceArray);

현재 및 이전 볼륨 값 계산:

   double CurrentHighValue=NormalizeDouble(PriceArray[2].high,5);
   double PrevHighValue=NormalizeDouble(PriceArray[1].high,5);
   double VolCurrentValue=NormalizeDouble(VolArray[0],5);
   double VolPrevValue=NormalizeDouble(VolArray[1],5);

고가 및 볼륨 값에 따른 전략 조건:

매수 신호:

   if(CurrentHighValue>PrevHighValue&&VolCurrentValue>VolPrevValue)
     {
      Comment("Buy Signal during uptrend",
              "\n","Current high is: ",CurrentHighValue,"\n","Previous high is: ",PrevHighValue,
              "\n","Volume current value is: ",VolCurrentValue,"\n","Volumes previous value is: ",VolPrevValue);
     }

신호 없음:

   if(CurrentHighValue>PrevHighValue&&VolCurrentValue<VolPrevValue)
     {
      Comment("Current high is: ",CurrentHighValue,"\n","Previous high is: ",PrevHighValue,
              "\n","Volume current value is: ",VolCurrentValue,"\n","Volumes previous value is: ",VolPrevValue);
     }

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

Vol Nav4

위의 전략에 따라 신호를 생성하기 위해 이 EA를 실행하려면 파일을 두 번 클릭하여 창을 엽니다:

Price_Vol - 상승 추세 창

확인을 클릭하면 EA가 차트에 첨부됩니다:

Price_Vol - 상승 추세 첨부

다음은 데이터 창을 사용하여 Price and Vol 상승 전략을 기반으로 생성된 신호의 예입니다:

매수 신호:

현재 데이터:

Price_Vol - 상승 추세 매수 - 현재

이전 데이터:

Price_Vol - 상승 추세 매수 - 이전

신호 없음:

현재 데이터:

Price_Vol - 상승 추세 신호 없음 - 현재

이전 데이터:

Price_Vol - 상승 추세 신호 없음 - 이전

  • 전략 4: Price & Vol - 하락추세:

이 전략을 기반으로 거래 시스템을 만드는 전체 코드는 다음과 같습니다:

//+------------------------------------------------------------------+
//|                                        Price&Vol - 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 arrays for price & Volume
   MqlRates PriceArray[];
   double VolArray[];

//filling price array with data
   int Data=CopyRates(_Symbol,_Period,0,3,PriceArray);

//sorting arrays from the current data
   ArraySetAsSeries(VolArray,true);

//defining Volume
   int VolDef=iVolumes(_Symbol,_Period,VOLUME_TICK);

//filling the array
   CopyBuffer(VolDef,0,0,3,VolArray);

//calculating current and previous of lows and volume
   double CurrentLowValue=NormalizeDouble(PriceArray[2].low,5);
   double PrevLowValue=NormalizeDouble(PriceArray[1].low,5);
   double VolCurrentValue=NormalizeDouble(VolArray[0],5);
   double VolPrevValue=NormalizeDouble(VolArray[1],5);

//Conditions of short signal
//short signal
   if(CurrentLowValue<PrevLowValue&&VolCurrentValue>VolPrevValue)
     {
      Comment("Short Signal during downtrend",
              "\n","Current low is: ",CurrentLowValue,"\n","Previous low is: ",PrevLowValue,
              "\n","Volume current value is: ",VolCurrentValue,"\n","Volumes previous value is: ",VolPrevValue);
     }

//no signal
   if(CurrentLowValue<PrevLowValue&&VolCurrentValue<VolPrevValue)
     {
      Comment("Current low is: ",CurrentLowValue,"\n","Previous low is: ",PrevLowValue,
              "\n","Volume current value is: ",VolCurrentValue,"\n","Volumes previous value is: ",VolPrevValue);
     }
  }
//+------------------------------------------------------------------+

코드의 차이점:

Price & Vol - 하락 추세 전략에 따라 생성된 신호의 조건:

매도 신호:

   if(CurrentLowValue<PrevLowValue&&VolCurrentValue>VolPrevValue)
     {
      Comment("Short Signal during downtrend",
              "\n","Current low is: ",CurrentLowValue,"\n","Previous low is: ",PrevLowValue,
              "\n","Volume current value is: ",VolCurrentValue,"\n","Volumes previous value is: ",VolPrevValue);
     }

 신호 없음:

   if(CurrentLowValue<PrevLowValue&&VolCurrentValue<VolPrevValue)
     {
      Comment("Current low is: ",CurrentLowValue,"\n","Previous low is: ",PrevLowValue,
              "\n","Volume current value is: ",VolCurrentValue,"\n","Volumes previous value is: ",VolPrevValue);
     }

이 코드를 컴파일하 후 탐색기에서 EA를 사용할 수 있습니다:

Vol Nav5

파일을 두 번 클릭하면 EA 창이 나타납니다:

Price_Vol - 하락 추세 창

확인을 클릭하면 EA가 차트에 첨부됩니다:

Price_Vol - 하락 추세 첨부

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

매도 신호:

현재 데이터:

Price&Vol - 하락추세 매도 신호 - 현재

이전 데이터:

Price&Vol - 하락추세 매도 신호 - 이전

신호 없음:

현재 데이터:

Price&Vol - 하락추세 신호없음 - 현재

이전 데이터:

Price&Vol - 하락추세 신호 없음 - 이전

  • 전략 5: MA & Vol 전략:

이 전략을 기반으로 아래 코드를 사용하여 거래 시스템을 만들 수 있습니다:

//+------------------------------------------------------------------+
//|                                              MA&Vol Strategy.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 arrays for MA & Volume
   double MAShortArray[],MALongArray[];
   double VolArray[];

//sorting arrays from the current data
   ArraySetAsSeries(MAShortArray,true);
   ArraySetAsSeries(MALongArray,true);
   ArraySetAsSeries(VolArray,true);

//defining MA & Volume
   int MAShortDef = iMA(_Symbol, _Period, 10, 0, MODE_SMA, PRICE_CLOSE);
   int MALongDef = iMA(_Symbol, _Period, 24, 0, MODE_SMA, PRICE_CLOSE);
   int VolDef=iVolumes(_Symbol,_Period,VOLUME_TICK);

//filling arrays
   CopyBuffer(MAShortDef,0,0,3,MAShortArray);
   CopyBuffer(MALongDef,0,0,3,MALongArray);
   CopyBuffer(VolDef,0,0,3,VolArray);

//calculating MA && current volume values
   double MAShortCurrentValue=NormalizeDouble(MAShortArray[0],6);
   double MAShortPrevValue=NormalizeDouble(MAShortArray[1],6);
   double MALongCurrentValue=NormalizeDouble(MALongArray[0],6);
   double MALongPrevValue=NormalizeDouble(MALongArray[1],6);
   double VolCurrentValue=NormalizeDouble(VolArray[0],5);
   double VolPrevValue=NormalizeDouble(VolArray[1],5);

//conditions of buy and short signals
//buy signal
   if(MAShortCurrentValue>MALongCurrentValue&&MAShortPrevValue<MALongPrevValue
      &&VolCurrentValue>VolPrevValue)
     {
      Comment("Buy signal");
     }

//short signal
   if(MAShortCurrentValue<MALongCurrentValue&&MAShortPrevValue>MALongPrevValue
      &&VolCurrentValue>VolPrevValue)
     {
      Comment("Short signal");
     }
  }
//+------------------------------------------------------------------+

코드의 차이점:

단기 이동 평균, 장기 이동 평균 및 볼륨에 대한 배열 생성:

   double MAShortArray[],MALongArray[];
   double VolArray[];

배열 정렬:

   ArraySetAsSeries(MAShortArray,true);
   ArraySetAsSeries(MALongArray,true);
   ArraySetAsSeries(VolArray,true);

이동평균선의 핸들을 반환하는 iMA 함수를 이용하여 단기 MA와 장기 MA를 정의하면 그 파라미터는 (symbol, period, average period, horizontal shift, smoothing type which is the type of the MA, applied price)입니다. 그리고 앞에서 살펴본 것과 동일한 iVolumes 함수로 볼륨을 정의합니다:

   int MAShortDef = iMA(_Symbol, _Period, 10, 0, MODE_SMA, PRICE_CLOSE);
   int MALongDef = iMA(_Symbol, _Period, 24, 0, MODE_SMA, PRICE_CLOSE);
   int VolDef=iVolumes(_Symbol,_Period,VOLUME_TICK);

배열 채우기:

   CopyBuffer(MAShortDef,0,0,3,MAShortArray);
   CopyBuffer(MALongDef,0,0,3,MALongArray);
   CopyBuffer(VolDef,0,0,3,VolArray);

이전 단기 MA, 장기 MA 및 볼륨 값과 현재 단기 MA, 장기 MA 및 볼륨 값 계산:

   double MAShortCurrentValue=NormalizeDouble(MAShortArray[0],6);
   double MAShortPrevValue=NormalizeDouble(MAShortArray[1],6);
   double MALongCurrentValue=NormalizeDouble(MALongArray[0],6);
   double MALongPrevValue=NormalizeDouble(MALongArray[1],6);
   double VolCurrentValue=NormalizeDouble(VolArray[0],5);
   double VolPrevValue=NormalizeDouble(VolArray[1],5);

전략 신호 조건:

매수 신호:

   if(MAShortCurrentValue>MALongCurrentValue&&MAShortPrevValue<MALongPrevValue
      &&VolCurrentValue>VolPrevValue)
     {
      Comment("Buy signal");
     }

매도 신호:

   if(MAShortCurrentValue<MALongCurrentValue&&MAShortPrevValue>MALongPrevValue
      &&VolCurrentValue>VolPrevValue)
     {
      Comment("Short signal");
     }

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

Vol Nav6

EA를 차트에 드래그 앤 드롭하면 EA가 첨부됩니다.

MA_Vol 첨부

다음은 이 전략을 기반으로 생성된 신호의 예입니다:

매수 신호:

MA_Vol 매수 신호

매도 신호:

 MA_Vol 쇼트 시그널

 


결론

제가 이 유용한 기술 지표와 관련한 내용을 잘 다루었기를 바랍니다. 또한 여러분도 볼륨 지표를 적절하게 사용하여 거래를 향상시키는 방법을 배웠기를 바랍니다. 우리는 볼륨 지표가 무엇인지, 무엇을 측정하는지, 어떻게 읽을 수 있는지, 어떻게 사용할 수 있는지 배웠고 볼륨 정의 부분에서 외환과 주식 시장에서 볼륨이 어떻게 다른 의미로 쓰이는지 차이를 구분할 수 있었을 것입니다. 볼륨을 사용하는 간단한 전략도 배웠습니다:

  • Vol - 움직임: 볼륨이 증가하거나 감소하는 경우 볼륨 움직임을 알려줍니다.
  • Vol - 강도: 볼륨 평균과 비교하여 현재 볼륨 움직임의 강도를 알려줍니다.
  • Price and Vol - 상승 추세: 가격의 움직임과 수반되는 볼륨을 기반으로 상승 추세 동안 매수 신호를 얻습니다.
  • Price and Vol - 하락 추세: 가격의 움직임과 수반되는 볼륨을 기반으로 하락 추세 동안 매도 신호를 얻습니다.
  • MA 및 Vol 전략: 이동 평균과 볼륨 간의 교차를 기반으로 매수 및 매도 신호를 얻습니다.

위의 전략은 지표의 기본 개념을 기반으로 필요한 경우 테스트 및 최적화 후에 사용할 수 있습니다. 우리는 볼륨 전략이라는 주제를 통해 이 모든 내용에 대해 알아보았습니다. 볼륨 전략 청사진이라는 주제를 통해 각 전략을 수행하는 거래 시스템을 만들기 위한 아이디어를 정리하는 데 도움이 되는 각 전략의 단계별 청사진을 만드는 방법을 배웠습니다. 그런 다음 이 기사에서 가장 흥미로운 부분, 즉 각 전략에 대해 MQL5로 거래 시스템을 만들고 신호를 자동으로 정확하게 생성하고 MetaTrader 5 거래 터미널에서 사용할 수 있도록 하는 방법을 배웠습니다.

모든 사람에게 만족을 주는 시스템은 없기 때문에 이 시스템이 유용하지 않다고 생각 할 수도 있습니다. 그러므로 실제 계정에서 사용하기 전에 전략을 테스트해야 한다는 것을 다시 한번 명심하십시오. 이 기사가 유용하기를 바랍니다. 또한 기사의 주제 또는 기타 관련 주제와 관련된 새로운 아이디어를 찾길 바랍니다. 또한 이 지표를 다른 기술적 도구들과 결합하여 기사에서 볼륨과 이동 평균을 결합해서 한 방법보다 더 의미 있는 방법을 생각해 볼 수 있습니다. 이는 매우 통찰력 있는 접근 방식입니다. 유사한 기사를 읽으려면 가장 인기 있는 기술 지표를 기반으로 거래 시스템을 설계하는 방법에 대한 시리즈의 다른 기사를 읽어 보시기 바랍니다. 여러분 모두 유용하게 사용하시길 바랍니다.

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

Expert Advisor 개발 기초부터 (파트 13): Time and Trade (II) Expert Advisor 개발 기초부터 (파트 13): Time and Trade (II)
오늘은 시장 분석을 위한 Times & Trade 시스템의 두 번째 부분입니다. 이전 기사 "Times & Trade (I)"에서 우리는 시장에서 실행된 거래에 대해 가능한 가장 빠른 해석을 가능하게 하는 지표를 가질 수 있는 차트 구성 시스템에 대해 알아보았습니다.
데이터 과학 및 머신 러닝(파트 05): 의사 결정 트리 데이터 과학 및 머신 러닝(파트 05): 의사 결정 트리
의사 결정 트리는 인간이 데이터를 분류하기 위해 생각하는 방식을 모방합니다. 트리를 구축하고 트리를 사용하여 데이터를 분류하고 예측하는 방법에 대해 알아보겠습니다. 의사 결정 트리 알고리즘의 주요 목표는 불순물이 있는 데이터를 순수한 것으로 분리하거나 노드에 가깝게 분리하는 것입니다.
Expert Advisor 개발 기초부터 (파트 14): 가격에 볼륨 추가 (II) Expert Advisor 개발 기초부터 (파트 14): 가격에 볼륨 추가 (II)
오늘 우리는 EA에 더 많은 리소스를 추가할 것입니다. 이 흥미로운 기사는 정보를 표시하는 새로운 아이디어와 방법을 제공합니다. 동시에 프로젝트의 사소한 결함을 수정하는 데에도 도움이 될 수 있습니다.
데이터 과학 및 머신 러닝(파트 04): 현재 주식 시장 붕괴 예측 데이터 과학 및 머신 러닝(파트 04): 현재 주식 시장 붕괴 예측
이 기사에서는 로지스틱 모델을 사용하여 미국 경제의 펀더멘털을 기반으로 주식 시장 폭락을 예측하려고 합니다. NETFLIX와 APPLE은 우리가 집중해서 볼 주식입니다. 이전의 2019년과 2020년의 시장 폭락을 통해 우리 모델이 현재의 암울한 상황에서 어떻게 작동하는지를 알아 봅시다.