English Русский 中文 Español Deutsch 日本語 Português Français Italiano Türkçe
다양한 이동 평균 시스템을 설계하는 방법

다양한 이동 평균 시스템을 설계하는 방법

MetaTrader 5트레이딩 | 18 5월 2022, 15:01
477 0
Mohamed Abdelmaaboud
Mohamed Abdelmaaboud

소개

트레이딩과 관련한 경험이 어떻든 간에 "추세는 여러분의 친구이다"라는 말을 명심해야 합니다. 만약 여러분이 그런 말을 들어 보지 못했다면 그것이 의미하는 것은 우리 각자가 다른 유형의 시장 추세나 가격의 움직임의 추세를 가지고 있다는 것을 의미합니다.

  • 상승 추세: 가격이 더 높은 저점과 더 높은 고점을 만들 때 볼 수 있습니다.
  • 하락 추세: 가격이 상승 추세의 반대일 때입니다 더 낮은 고점과 더 낮은 저점을 만들 때 볼 수 있습니다.
  • 횡보: 상승 추세 또는 하락 추세를 제외한 모든 이동입니다.

그리고 다음의 수치들은 상승 추세와 하락 추세를 꺾은선형 차트로 표시할 수 있으며 이들을 제외한 모든 움직임은 횡보입니다.

상승추세

하락 추세

이제 추세를 파악했습니다. 그런데 추세가 왜 나의 친구일까요?

우리는 여기에서 추세, 즉 상승 추세와 하락 추세에 대해 이야기할 것입니다. 그것들은 상방이나 하방으로의 명확한 움직임을 가지고 있습니다. 우리는 어느 한 시장 참가자의 컨트롤을 볼 수 있습니다. 상승 추세 동안은 매도세에 관계 없이 매수자가 가격을 올리기 위해 가격을 밀어붙이는 컨트롤러임을 알 수 있습니다. 여기에서 우리는 이 시장을 강세장이라고 부릅니다. 그리고 그 반대의 경우도 마찬가지입니다. 하락추세에서 우리는 매도자가 가격을 아래로 밀어붙일 때 컨트롤러가 되는 것을 볼 수 있습니다. 우리는 이 시장을 베어 마켓이라고 부릅니다.

그러나 어떤 경우에는 우리가 윕소스 또는 속임수 이탈이라고 부르는 현상을 보게 되기도 합니다. 그리고 이러한 속임수 이탈은 우리의 거래 결과에 해를 끼칠 수 있습니다. 어떻게 그럴까요? 우리는 여기에서 그것들이 미치는 영향을 살펴 보게 될 것입니다. 먼저 윕소스나 속임수 이탈이 무엇인지 식별해 보겠습니다.

속임수 이탈은 우리가 매매 결정을 내리도록 하는 신호를 주고는 결정을 내린 후에 시장이 그 결정에 반대 방향으로 가는 것입니다. 이러한 종류의 결정은 우리의 거래 결과에 해를 끼칠 것입니다. 이러한 속임수 이탈 또는 윕소들은 여러가지 전략을 통해 필터링하여 줄일 수 있습니다. 우리를 위한 최고의 전략 중 하나는 이동 평균을 사용하는 것입니다. 이동 평균 전략을 사용할 수 있는 방법과 이를 위한 알고리즘 거래 시스템을 설계하고 쉽고 정확하고 쉽고 체계적으로 사용하는 방법을 배우는 것이 이 글의 주요 주제입니다.

이 글에서는 다음의 토픽을 살펴보겠습니다.

면책: 이 글의 모든 내용은 교육의 목적으로만 작성된 것입니다. 이외의 다른 목적은 없습니다. 따라서 이 글의 내용에 따라 행동을 하는 것은 본인의 책임입니다. 이 글의 내용이 어떠한 결과도 보장하지 않으므로 책임은 본인에게 있습니다. 이 글에서 다루는 주요 목표는 교육의 목적이므로 모든 전략은 더 나은 결과를 가져오기 위해 사전 테스트 및 최적화가 필요할 수 있습니다.

모든 코드는 MQL5로 작성되며 MT5에서 테스트됩니다.

이 기사의 주제인 이동 평균 자체만으로도 신호를 필터링하는 데 사용할 수 있는 많은 전략이 있습니다. 따라서 이 기사의 목적은 이동 평균 전략을 알아보고 알고리즘 거래 시스템을 설계하여 트레이딩 전략을 개발할 수 있는 방법을 공유하는 것입니다. 이렇게 "다양한 이동 평균 시스템을 설계하는 방법"이라는 주제를 여러분과 공유하게 되어 매우 기쁩니다...


이동 평균 정의


이동 평균은 기술적 분석을 할 때 일반적으로 사용되는 지표이며 특정 기간 동안의 가격의 평균을 제공하기 위해 계산됩니다. 즉 가격 데이터를 평활화해서 단기 움직임의 무작위성 또는 변동을 완화하는 데 도움이 됩니다.

이동 평균에는 여러가지의 유형이 있으며 이들 간의 차이점은 서로 다른 계산 방식과 관련이 있습니다. 이에 대해서는 다음 주제에서 자세히 다루도록 할 것입니다. 이동 평균은 계산 방식에 따라 여러가지 유형이 있고 그에 따른 차이점을 가지게 됩니다.

이동 평균은 가격을 기반으로 계산되므로 추세 추종 지표입니다. 따라서 가격이 특정 추세로 움직이게 되면 이동 평균도 동일한 추세를 따릅니다.

이동평균선은 가격을 따라 이동하는 후행지표로 가격으로 계산되기 때문에 가격이 먼저 움직여야 합니다. 즉 먼저 가격 데이터가 있어야 하고 그런 다음 이러한 가격 데이터를 계산하여 이동 평균 데이터를 얻게 되는 것입니다.

우리는 이러한 이동 평균의 특성에 따라 이동 평균을 이해할 수 있는 것입니다.

  • 이동 평균은 평균을 제공합니다.
  • 이동 평균은 추세 시장에서 더 잘 작동합니다.
  • 이동 평균은 추세가 있는지 확인하거나 추세를 식별하는 데 도움이 됩니다.
  • 이동 평균은 가격에서 노이즈나 무작위적인 움직임을 제거합니다.
  • 이동 평균은 윕소스나 속임수 이탈을 피하는 데 도움이 될 것입니다. 왜냐하면 그것들이 제거될 것이기 때문입니다.
  • 그리고 더 많은 이점들....

이동 평균의 타입


이동 평균은 여러가지의 유형이 있으며 가장 일반적으로 사용되는 유형은 다음과 같습니다.

  • 단순 이동 평균.
  • 가중 이동 평균.
  • 지수 이동 평균.

이들 사이의 주요 차이점은 이전에 언급한 것과 같이 사용하는 계산 방식이 서로 다르다는 사실입니다.

이제 이들 이동 평균을 식별하고 이들 간의 차이점을 살펴보겠습니다. 또한 이러한 이동 평균을 MQL5에서 어떻게 사용할 수 있는지에 대해서 그리고 특정한 종류의 이동 평균을 사용하려는 경우 어떻게 호출할 수 있는지에 대해서 알아보겠습니다.

단순 이동 평균:

이동 평균의 가장 단순한 형태 또는 유형이며 일반적으로 SMA라고 줄여 표현합니다.

특정 기간 동안 지정한 값의 조합의 산술 평균을 취하여 계산됩니다. 또는 일련의 가격을 더한 다음 해당 조합의 가격의 수로 나눕니다.

SMA

예: 거래일이 5일이고 이 5일 동안의 종가는 다음과 같습니다.

  • Day1 = 10
  • Day2 = 15
  • Day3 = 20
  • Day4 = 30
  • Day5 = 35

이 5일 동안 SMA를 얻으려면 다음과 같이 계산됩니다:


SMA 예

가중 이동 평균

가중 이동 평균(Weighted Moving Average, WMA)은 폭 넓게 사용되며 특정 기간 동안의 가격에 대한 평균을 나타내지만 최근의 데이터에 더 많은 가중치를 부여한다는 것이 차이입니다. 만약 10거래일로 계산을 하면 10거래일 전체에 대해 가중치를 주는 것이 아니라 최근의 데이터에 더 많은 가중치를 부여합니다.

다음 공식과 같이 계산할 수 있습니다:

WMA


예:

만약 5거래일이 있고 이 5일 동안의 종가가 다음과 같다면:

  • Day1 = 10
  • Day2 = 15
  • Day3 = 20
  • Day4 = 30
  • Day5 = 35

이 5일 동안 WMA를 얻으면 다음과 같이 계산됩니다:

WMA 예


WMA 예1


지수 이동 평균

일반적으로 EMA로 표현하기도 하는데 이는 지수 이동 평균을 말합니다. 지수 이동 평균은 가격에 대한 평균을 나타내는데 여기에서의 차이점은 MA에서 사용된 기간 이전의 기간을 버리지 않는다는 것입니다. 즉 10 MA를 계산해야 하는 경우 해당 10 거래일 이전의 기간도 고려한다는 것입니다.

다음과 같이 계산할 수 있습니다:

먼저 "K"는 지수를 참조하여 구간의 가중치를 계산하고 "n"은 구간 수를 나타냅니다.

EMA

그러면

EMA

예:

만약 5거래일이 있고 이 5일 동안의 종가가 다음과 같다면:

  • Day1 = 10
  • Day2 = 15
  • Day3 = 20
  • Day4 = 30
  • Day5 = 35
  • Day6 = 40

이 5일 동안의 EMA를 얻으려면 다음과 같이 계산됩니다:

EMA 예


EMA 예

여기에서 어제의 EMA는 Day6에 처음으로 EMA를 계산하므로 5일(22)의 SMA를 사용합니다.


이제 이동 평균이 무엇인지와 이동 평균의 유형을 알아 보았습니다. 이제 이 글에서 가장 흥미로운 부분을 살펴보겠습니다. 우리는 이동 평균 전략과 이를 위한 알고리즘 거래 시스템을 설계하는 방법에 대해 이야기할 것입니다.


전략 1: 하나의 이동 평균 교차

여기서는 단순 이동 평균을 이용할 것입니다. 그러나 여러분은 코드 작성시 여러분이 원하는 이동 평균의 유형 어느 것이나 사용할 수 있습니다.

전략에 따르면 가격과 SMA는 매 틱마다 확인합니다:

  • 가격 > SMA: 매수 신호가 되며 이 신호가 차트에 코멘트로 표시되어야 합니다.
  • 가격 < SMA: 매도 신호가 될 것이며 이 신호가 차트에 코멘트로 표시되어야 합니다.
  • 이외 경우에는 아무 것도 하지 않습니다.

다음 스크린샷은 우리가 만들려는 단순 이동 평균 청사진 하나를 보여줍니다:

1MA 청사진


다음은 이 전략을 만들 코드입니다:

//+------------------------------------------------------------------+
//|                                            One SMA 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"
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   //create an array for price
   double myMovingAverageArray1[];
   
   //define Ask, Bid
   double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
   double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);
   
   //define the properties of  MAs - simple MA 24
   int movingAverage1 = iMA(_Symbol, _Period, 24, 0, MODE_SMA, PRICE_CLOSE);
   
   //sort the price arrays current candle
   ArraySetAsSeries(myMovingAverageArray1,true);
   
   //Defined MA - one line - currentcandle, 3 candles - store result
   CopyBuffer(movingAverage1,0,0,3,myMovingAverageArray1);
   
   //Check if we have a buy entry signal
   if (
      (Ask>myMovingAverageArray1[0])
      )
         {
         Comment("BUY");
         }
    
   //check if we have a sell entry signal      
   if (
      (Bid<myMovingAverageArray1[0])
      )
         {
         Comment("SELL");
         }          
  }
//+------------------------------------------------------------------+

다음 스크린샷은 코드를 실행한 후 생성된 신호를 보여줍니다.

1MA - 매수 신호

1MA - 매도 신호

전략 2: 두개의 이동 평균 교차

이 전략에서는 두 개의 단순 이동 평균을 사용합니다. 기간이 짧은 단순 이동 평균이 24이고 긴것이 50입니다.

이 전략에 따르면 매 틱마다 두 개의 단순 이동 평균을 확인해야 합니다.

  • 24 SMA > 50 SMA: 신호는 매수가 될 것이며 이 신호가 차트에 코멘트로 나타나야 합니다.
  • 24 SMA < 50 SMA: 신호는 매도가 될 것이고 이 신호가 차트에 코멘트로 표시되어야 합니다.
  • 이외 경우에는 아무 것도 하지 않습니다.

다음 스크린샷은 우리가 만들려는 두개의 단순 이동 평균 청사진을 보여줍니다:

2MA 청사진


다음은 이 전략을 만들 코드입니다:

//+------------------------------------------------------------------+
//|                                            Two SMA 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"
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   //create an array for several prices
   double myMovingAverageArray1[], myMovingAverageArray2[];
   
   //define the properties of  MAs - simple MA, 1st 24 / 2nd 50
   int movingAverage1 = iMA(_Symbol, _Period, 24, 0, MODE_SMA, PRICE_CLOSE);
   int movingAverage2 = iMA(_Symbol,_Period,50,0,MODE_SMA,PRICE_CLOSE);
   
   //sort the price arrays 1, 2 from current candle
   ArraySetAsSeries(myMovingAverageArray1,true);
   ArraySetAsSeries(myMovingAverageArray2,true);
   
   //Defined MA1, MA2 - one line - currentcandle, 3 candles - store result
   CopyBuffer(movingAverage1,0,0,3,myMovingAverageArray1);
   CopyBuffer(movingAverage2,0,0,3,myMovingAverageArray2);
   
   //Check if we have a buy entry signal
   if (
      (myMovingAverageArray1[0]>myMovingAverageArray2[0])
   && (myMovingAverageArray1[1]<myMovingAverageArray2[1])
      )
         {
         Comment("BUY");
         }
    
   //check if we have a sell entry signal      
   if (
      (myMovingAverageArray1[0]<myMovingAverageArray2[0])
   && (myMovingAverageArray1[1]>myMovingAverageArray2[1])
      )
         {
         Comment("SELL");
         }          
  }
//+------------------------------------------------------------------+

다음 스크린샷은 코드를 실행한 후 생성된 신호를 보여줍니다.

2MA - 매수 신호


2MA - 매도 신호


전략 3: 세개의 이동 평균 교차

이 전략에서는 세 가지 단순 이동 평균을 사용합니다. 짧은 단순 이동 평균의 기간은 10이고 긴 기간은 48이며 그 사이의 기간은 24입니다.

이 전략에 따르면 매 틱마다 세 가지 단순 이동 평균을 확인해야 합니다.

  • 10 SMA > 24 SMA, 10 SMA > 48 SMA 및 24 SMA > 48 SMA: 신호는 매수이며 차트에 코멘트로 나타나야 합니다.
  • 10 SMA < 24 SMA, 10 SMA < 48 SMA 및 24 SMA < 48 SMA: 신호는 매도이며 차트에 코멘트로 나타나야 합니다.
  • 이외 경우에는 아무 것도 하지 않습니다.

다음 스크린샷은 우리가 만들려는 세 가지 단순 이동 평균 청사진을 보여줍니다.

3MA 청사진


다음은 이 전략을 만들 코드입니다:

//+------------------------------------------------------------------+
//|                                          Three SMA 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"
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   //create an array for several prices
   double myMovingAverageArray1[], myMovingAverageArray2[],myMovingAverageArray3[];
   
   //define the properties of  MAs - simple MA, 1st 10 / 2nd 24, 3rd 48
   int movingAverage1 = iMA(_Symbol, _Period, 10, 0, MODE_SMA, PRICE_CLOSE);
   int movingAverage2 = iMA(_Symbol,_Period,24,0,MODE_SMA,PRICE_CLOSE);
   int movingAverage3 = iMA(_Symbol,_Period,48,0,MODE_SMA,PRICE_CLOSE);
   
   //sort the price arrays 1, 2, 3 from current candle
   ArraySetAsSeries(myMovingAverageArray1,true);
   ArraySetAsSeries(myMovingAverageArray2,true);
   ArraySetAsSeries(myMovingAverageArray3,true);
   
   //Defined MA1, MA2, MA3 - one line - currentcandle, 3 candles - store result
   CopyBuffer(movingAverage1,0,0,3,myMovingAverageArray1);
   CopyBuffer(movingAverage2,0,0,3,myMovingAverageArray2);
   CopyBuffer(movingAverage3,0,0,3,myMovingAverageArray3);
   
   //Check if we have a buy entry signal
   if (
      (myMovingAverageArray1[0]>myMovingAverageArray2[0])
   && (myMovingAverageArray1[1]<myMovingAverageArray2[1])
   && (myMovingAverageArray1[0]>myMovingAverageArray3[0])
   && (myMovingAverageArray1[1]<myMovingAverageArray3[1])
   && (myMovingAverageArray2[0]>myMovingAverageArray3[0])
   && (myMovingAverageArray2[1]<myMovingAverageArray3[1])
      )
         {
         Comment("BUY");
         }
    
   //check if we have a sell entry signal      
   if (
      (myMovingAverageArray1[0]<myMovingAverageArray2[0])
   && (myMovingAverageArray1[1]>myMovingAverageArray2[1])
   && (myMovingAverageArray1[0]<myMovingAverageArray3[0])
   && (myMovingAverageArray1[1]>myMovingAverageArray3[1])
   && (myMovingAverageArray2[0]<myMovingAverageArray3[0])
   && (myMovingAverageArray2[1]>myMovingAverageArray3[1])
      )
         {
         Comment("SELL");
         }          
  }
//+------------------------------------------------------------------+

다음 스크린샷은 코드를 실행한 후 생성된 신호를 보여줍니다.

3MA - 매수 신호


3MA - 매도 신호


결론

이 글에서 저는 세 가지의 전략을 공유하여 가장 일반적으로 사용되는 중요한 지표 중 하나인 이동 평균에 대해 다루었습니다. 저는 또한 우리가 이 지표들을 어떻게 사용할 수 있는지 그리고 그것들 각각을 기반으로 하는 알고리즘 거래 시스템을 어떻게 설계할 수 있는지 보여주려고 노력했습니다. 이러한 전략은 사전 테스트 및 최적화 이후에 정확하고 효과적으로 사용할 수 있습니다.



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

리눅스에서 MetaTrader 4 구동하기 리눅스에서 MetaTrader 4 구동하기
이 기사에서는 Linux 버전 중 널리 사용되는 Ubuntu와 Debian에서 MetaTrader 4를 설치하는 방법을 알아봅니다. 이들 시스템은 서버 하드웨어와 트레이더의 개인용 컴퓨터로 널리 사용됩니다.
Fix PriceAction 손절매 혹은 Fixed RSI(스마트 스탑로스) Fix PriceAction 손절매 혹은 Fixed RSI(스마트 스탑로스)
손절매는 거래에서 자금 관리와 관련된 중요한 도구입니다. 손절매와 이익실현과 랏 크기를 효과적으로 사용하면 트레이더는 더 일관되면서도 전반적으로도 더 많은 수익을 얻을 수 있습니다. 손절매는 훌륭한 도구이지만 사용할 때 직면하게 되는 문제들이 있습니다. 가장 중요한 것은 손절매 사냥입니다. 이 기사에서는 거래에서 손절매 사냥을 줄이는 방법과 전통적인 손절매 사용법을 비교하고 이를 통해 수익성을 결정하는 방법을 살펴봅니다.
Bollinger Bands 기반의 트레이딩 시스템 설계 방법에 대해 알아보기 Bollinger Bands 기반의 트레이딩 시스템 설계 방법에 대해 알아보기
이 기사에서는 트레이딩 세계에서 가장 인기 있는 지표 중 하나인 볼린저 밴드에 대해 알아보겠습니다. 우리는 기술적 분석을 고려하면서 볼린저 밴드 지표를 기반으로 하는 알고리즘 트레이딩 시스템을 설계하는 방법에 대해 알아 볼 것입니다.
Expert Advisor 처음부터 개발하기 Expert Advisor 처음부터 개발하기
이 기사에서는 최소한의 프로그래밍을 통해 트레이딩 로봇을 개발하는 방법에 대해 알아봅니다. 물론 MetaTrader 5는 트레이딩과 관련한 높은 수준의 제어를 제공합니다. 그러나 수동으로 주문하는 것은 경험이 적은 사용자에게는 상당히 어렵고 위험할 수 있습니다.