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

어썸 오실레이터로 트레이딩 시스템 설계하는 방법 알아보기

MetaTrader 5트레이딩 | 31 10월 2023, 17:35
309 0
Mohamed Abdelmaaboud
Mohamed Abdelmaaboud

소개

이 글은 인기 있는 기술 지표를 기반으로 거래 시스템을 설계하는 방법과 관련한 시리즈의 새로운 글입니다. 이 기사에서는 새로운 기술 도구를 배우게 될 것입니다. 이번에 알아 볼 지표는 어썸 오실레이터 지표입니다. 이 지표가 무엇인지, 무엇을 측정하는지, 간단한 전략을 통해 지표의 이면에 있는 주요 개념을 기반으로 사용하는 방법을 알아보고 언급된 전략을 기반으로 거래 시스템을 만드는 방법을 배우기 위해 지표에 대해 더 자세히 알아볼 것입니다.

이 지표에 대해서는 아래의 주제에서 자세히 다룰 것입니다:

  1. 어썸 오실레이터 정의
  2. 어썸 오실레이터 전략
  3. 어썸 오실레이터 전략 청사진
  4. 어썸 오실레이터 거래 시스템
  5. 결론

MQL 5(MetaQuotes Language 5)를 사용하여 코드를 작성하고 MetaTrader 5 트레이딩 터미널을 사용하여 설계한 트레이딩 시스템을 실행할 것입니다. MQL5는 MetaTrader 5에 내장되어 있습니다. MetaEditor를 사용하는 방법을 알아보려면 이전 글 MetaEditor에서 MQL5 코드 작성하기라는 글을 참조하세요. 코딩 기술을 연습하고 향상시키기 위해서는 배운 내용을 다운로드하여 직접 적용해 보는 것이 좋습니다.

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


어썸 오실레이터 정의

이 주제에서는 어썸 오실레이터(AO) 지표에 대해 자세히 알아보겠습니다. AO는 빌 윌리엄스가 모멘텀을 측정하기 위해 개발한 것으로 매수자 또는 매도자가 가진 힘이나 통제력을 명확히 하는 데 사용할 수 있습니다. 이 모멘텀은 최근 5개 바 또는 캔들의 모멘텀과 더 큰 시간대의 최근 34개 바 또는 캔들의 모멘텀을 비교하여 측정합니다. 즉 최근의 모멘텀과 더 큰 시간대의 모멘텀을 비교합니다. 다른 기술적 지표나 도구로 AO 신호가 확인되면 더 중요하고 의미 있는 신호가 될 것입니다. 따라서 다른 기술 도구와 함께 이 지표를 사용하는 것이 좋습니다. AO를 더 깊이 이해하기 위해 지표를 수동으로 계산하는 방법을 알고 싶다면 다음 단계를 통해 계산할 수 있습니다:

AO는 5주기 단순이동평균과 34주기 단순이동평균의 차이입니다. AO를 계산할 때 median 가격을 사용합니다.

MEDIAN PRICE = (고가 + 저가) / 2 

AO = SMA(MEDIAN PRICE, 5) - SMA(MEDIAN PRICE, 34)

여기서:

MEDIAN PRICE = 상품의 중간 가격

HIGH = 최고 가격

LOW = 최저 가격

AO = 어썸 오실레이터 값

SMA = 단순 이동 평균

요즘에는 다양한 보조지표가 MetaTrader 5에 기본 제공되므로 수동으로 계산할 필요가 없으며 차트에 표시할 보조지표를 거래 터미널에서 선택하기만 하면 됩니다.

다음은 지표를 차트에 삽입하는 방법입니다. MetaTrader 5 트레이딩 터미널을 여는 동안 삽입 탭 --> 보조지표 --> 빌 윌리엄스 --> 어썸 오실레이터를 누릅니다.

AO 인서트

그러면 다음과 같이 AO 지표의 매개 변수를 볼 수 있습니다:

AO 매개변수

여기서:

1 - 업 값의 색상

2 - 히스토그램의 두께

3 - 다운 값의 색상

이러한 매개 변수를 결정하면 다음과 같이 차트에 삽입된 지표를 확인할 수 있습니다:

 AO 표시기 삽입됨

이전 차트에서 볼 수 있듯이 차트 하단에 0을 중심으로 히스토그램 막대가 진동하는 지표가 있는데 이것이 바로 모멘텀의 측정값입니다.


어썸 오실레이터 전략

이번 주제에서는 지표의 주요 개념을 바탕으로 교육 목적인 몇 가지 간단한 전략을 통해 AO 지표를 사용하는 방법을 배웁니다. 여러분은 실제 계좌에서 사용하기 전에 해당 전략을 테스트하여 지표가 유용하고 수익성이 있으며 거래에 적합한지 확인해야 합니다. 살펴보는 전략은 교육을 위한 것이 주된 목적입니다. 그러므로 최적화가 필요합니다. 이 지표를 다른 기술적 지표와 함께 사용하면 더 효과적인 결과를 얻을 수 있습니다. 특히 다른 기술적 지표나 도구를 사용하면 더 다양한 관점에서 더 많은 통찰력을 얻는데 도움이 될 것입니다. 이러한 방법은 기술적 분석의 가장 중요하고 효과적인 기능 중 하나이며 다양한 도구를 사용하여 상품을 다양한 관점에서 보고 평가할 수 있게 됩니다. 이는 좋은 결과를 얻기 위해 적절한 투자 또는 거래 결정을 내리는 데 도움이 될 것입니다. 이 글에서는 보다 효과적인 매수, 매도 신호를 얻기 위해 이동 평균과 결합해 볼 것입니다.

    전략 1: AO 제로 크로스오버

      이 전략에 따라 현재 AO 값과 제로 레벨 사이의 교차를 기준으로 강세 또는 약세 신호를 얻어야 합니다. 현재 AO 값이 0 수준보다 크면 강세 신호가 됩니다. 현재 AO 값이 0 수준보다 낮으면 약세 신호가 됩니다.

      간단히 하면,

      현재 AO > 0 --> 강세

      현재 AO < 0 --> 약세

        전략 2: AO 강도

          이 전략에 따르면 현재 AO의 위치와 마지막 AO 값의 5주기 평균을 기반으로 AO 움직임의 강도에 대한 신호를 얻어야 합니다. 현재 AO 값이 AVG보다 크면 AO 움직임이 강세라는 신호가 됩니다. 현재 AO 값이 AVG보다 낮으면 AO 움직임이 약하다는 신호입니다.

          간단히 하면,

          현재 AO > AVG 5- 기간의 AO --> AO가 강합니다.

          현재 AO < 평균 5주기 AO --> AO가 약합니다.

            전략 3: AO 및 MA 전략

              이 전략에 따르면 종가와 50주기 지수이동평균의 위치 외에도 현재 AO 값의 위치와 제로 레벨을 기준으로 매수 및 매도 신호를 얻어야 합니다. 현재 AO 값이 0 수준보다 크고 동시에 종가가 50주기 EMA보다 크면 매수 신호가 됩니다. 현재 AO 값이 0 수준보다 낮고 동시에 종가가 EMA보다 낮으면 매도 신호가 됩니다.

              간단히 하면,

              현재 AO > 제로 수준 및 종가 > 50주기 EMA --> 매수 신호

              현재 AO < 영점 수준 및 종가 < 50주기 EMA --> 매도 신호

              어썸 오실레이터 전략 청사진

              살펴본 단계별 청사진을 설계하면 아이디어를 정리하게 되며 이는 거래 시스템을 쉽게 만들 수 있도록 도와줍니다.

                전략 1: AO 제로 크로스오버

                  이 전략에 따르면 두 가지 값을 지속적으로 비교하여 강세 또는 약세 신호를 생성할 수 있는 거래 시스템을 만들어야 하며 현재 AO 값과 AO 지표의 제로 레벨을 비교하여 각 값의 위치를 결정하고 시장의 상태를 결정합니다. AO 값이 0 수준보다 크면 트레이딩 시스템에서 차트에 다음 값으로 코멘트를 생성해야 합니다:

                  • 강세
                  • AO 값은 n

                  다른 시나리오에서는 현재 AO 값이 0 수준보다 낮으면 트레이딩 시스템에서 차트에 다음 값으로 코멘트를 반환해야 합니다:

                  • 약세
                  • AO 값은 n

                  다음은 이 거래 시스템의 단계별 설명입니다:

                  알고리즘-트레이딩-시스템-청사진1

                    전략 2: AO 강도

                      이 전략에 따르면 우리는 두 가지 값을 지속적으로 비교하여 현재 AO와 현재 값 이전의 마지막 5개의 AO 값의 평균을 기반으로 AO 움직임의 강도에 대한 신호를 생성하여 어느 것이 더 큰지 결정하는 거래 시스템을 만들어야 합니다. 현재 AO 값이 AVG보다 크면 트레이딩 시스템에서 다음 값(신호 및 이 신호의 원인이 된 값)을 코멘트로 반환해야 합니다:

                      • AO 움직임 강세
                      • AO CurrVal : n
                      • AO FirstVal : n
                      • AO SecondVal : n
                      • AO ThirdVal : n
                      • AO FourthVal : n
                      • AO FifthVal : n
                      • AO AvgVal : n

                      다른 경우 현재 AO가 AVG보다 낮으면 트레이딩 시스템에서 다음 값을 코멘트로 반환해야 합니다:

                      • AO 움직임 약세
                      • AO CurrVal : n
                      • AO FirstVal : n
                      • AO SecondVal : n
                      • AO ThirdVal : n
                      • AO FourthVal : n
                      • AO FifthVal : n
                      • AO AvgVal : n

                      다음은 이 트레이딩 시스템의 단계별 청사진입니다:

                       알고리즘-트레이딩-시스템-청사진11

                        전략 3: AO 및 MA 전략

                          이전 주제에서 배운 전략을 기반으로 네 가지 값을 지속적으로 비교하여 차트에 적절한 매수 및 매도 신호가 있는 코멘트를 반환하는 데 사용하는 트레이딩 시스템을 만들어야 합니다:

                          • 현재 AO
                          • AO 지표의 제로 레벨
                          • 종가
                          • 50 - MA 기간

                          현재 AO가 0 수준보다 크고 종가가 50 기간 MA보다 큰 경우 거래 시스템이 차트에 코멘트로 다음 값을 반환해야 합니다:

                          • 매수
                          • 종가는 n입니다.
                          • AO 값은 n
                          • MA 값은 n

                          다른 시나리오에서는 현재 AO 값이 0 수준보다 낮고 종가가 50 기간 MA보다 낮으면 트레이딩 시스템이 차트에 다음 값을 코멘트로 반환해야 합니다:

                          • 매도
                          • 종가는 n입니다.
                          • AO 값은 n
                          • MA 값은 n

                          다음은 이 트레이딩 시스템의 단계별 청사진입니다:

                          알고리즘-트레이딩-시스템-블루프린트111

                          어썸 오실레이터 거래 시스템

                          이번에는 앞서 살펴본 거래 전략을 수행하는 시스템을 만들어 볼 것입니다. 이 기사에서 가장 흥미로운 부분일 것입니다. 먼저 현재 AO 값을 차트에 코멘트로 나타내어 신호를 생성하는 간단한 거래 시스템을 만들어 다른 거래 시스템의 기반으로 사용할 것입니다.

                          다음은 신호를 주는 거래 시스템을 단계별로 만드는 방법입니다:

                          "double" 함수를 사용하여 aoArray의 배열을 생성합니다:

                          double aoArray[];

                          "ArraySetAsSeries" 함수를 사용하여 참 또는 거짓을 부울 값으로 반환하도록 AS_SERIES 플래그를 aoArray로 설정합니다. 매개변수는 다음과 같습니다:

                          • array[]: aoArray를 사용하겠습니다.
                          • flag: 배열 인덱싱 방향으로 "true"를 사용하겠습니다.
                          ArraySetAsSeries(aoArray,true);

                          "iAO" 함수를 사용하여 어썸 오실레이터 지표의 핸들을 반환하는 방식으로 AO 인디케이터를 정의합니다. 매개변수는 다음과 같습니다:

                          • symbol: 현재 심볼에 적용할 (_Symbol)을 사용합니다.
                          • period: 현재 기간에 적용할 (_period)를 사용합니다.
                          int aoDef = iAO(_Symbol,_Period);

                          "CopyBuffer" 함수를 사용하여 AO 지표의 버퍼에서 데이터를 가져옵니다. 매개변수는 다음과 같습니다: 

                          • indicator_handle: 미리 정의된 지표 핸들의 (aoDef)를 사용합니다.
                          • buffer_num: 인디케이터 버퍼 번호를 결정합니다. (0)을 사용합니다.
                          • start_pos: 시작 위치를 결정합니다. (0)을 사용합니다.
                          • count: 복사할 양을 결정합니다. (3)을 사용합니다.
                          • buffer[]: 복사할 대상 배열을 결정합니다. (aoArray)를 사용합니다.
                          CopyBuffer(aoDef,0,0,3,aoArray);

                          aoVal에 대한 double 변수를 생성하고 "NormalizeDouble"을 사용하여 정규화한 후 AO 값을 정의합니다. "NormalizeDouble"의 매개변수는 다음과 같습니다:

                          • value: 정규화된 수입니다. 우리는 (aoArray[0])을 사용합니다.
                          • digits: 소수점 뒤의 자릿수를 결정합니다. 우리는 (7)을 사용합니다.
                          double aoVal = NormalizeDouble(aoArray[0],7);

                          "Comment" 함수를 사용하여 차트에 현재 AO 값이 포함된 코멘트를 반환합니다.

                          Comment("AO Value is ",aoVal);

                          다음은 이 거래 시스템을 생성하는 전체 코드입니다:

                          //+------------------------------------------------------------------+
                          //|                                                    Simple AO.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 initialization function                                   |
                          //+------------------------------------------------------------------+
                            void OnTick()
                            {
                             double aoArray[];
                             ArraySetAsSeries(aoArray,true);
                             int aoDef = iAO(_Symbol,_Period);
                             CopyBuffer(aoDef,0,0,3,aoArray);
                             double aoVal = NormalizeDouble(aoArray[0],7);
                             Comment("AO Value is ",aoVal);
                            }
                          //+------------------------------------------------------------------+

                          이 코드를 컴파일하고 오류가 없는지 확인하고 다음과 같이 내비게이터 창에서 해당 코드의 EA를 찾을 수 있습니다:

                          간단한 AO 내비게이션

                          이 EA를 원하는 차트에 끌어다 놓으면 다음과 같이 이 EA의 창이 표시됩니다:

                          간단한 AO 승리

                          "알고 거래 허용" 옆에 체크한 후 "확인"을 누르면 아래 그림과 같이 EA가 차트에 첨부되는 것을 볼 수 있습니다.

                          단순 AO 첨부

                          오른쪽 상단의 차트에 EA가 첨부되어 있는 것을 볼 수 있습니다. 이제 우리는 원하는 신호를 수신할 준비가 되었으며 다음과 같은 신호가 수신됩니다:

                          단순 AO 신호

                          이전 차트에서 볼 수 있듯이 왼쪽 상단 모서리에 현재 AO의 원하는 신호가 코멘트로 표시되어 있습니다.

                            전략 1: AO 제로 크로스오버

                              우리는 원하는 신호를 수신하기 위해 이 전략을 기반으로 거래 시스템을 만들 것이며 전체 코드의 다음과 같습니다:

                              //+------------------------------------------------------------------+
                              //|                                            AO Zero 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()
                                {
                                 double aoArray[];
                                 ArraySetAsSeries(aoArray,true);
                                 int aoDef = iAO(_Symbol,_Period);
                                 CopyBuffer(aoDef,0,0,3,aoArray);
                                 double aoVal = NormalizeDouble(aoArray[0],7);
                                 if(aoVal > 0)
                                   {
                                    Comment("Bullish","\n"
                                            "AO Value is ",aoVal);
                                   }
                              
                                 if(aoVal < 0)
                                   {
                                    Comment("Bearish","\n"
                                            "AO Value is ",aoVal);
                                   }
                                }
                              //+------------------------------------------------------------------+

                              이 코드의 차이점.

                              이 전략의 조건,

                              강세인 경우:

                                 if(aoVal > 0)
                                   {
                                    Comment("Bullish","\n"
                                            "AO Value is ",aoVal);
                                   }

                              약세인 경우:

                                 if(aoVal < 0)
                                   {
                                    Comment("Bearish","\n"
                                            "AO Value is ",aoVal);
                                   }

                              이 코드를 컴파일하고 오류가 없는지 확인하고 앞서 언급한 것과 동일하게 차트에 첨부하여 사용할 수 있습니다. 다음과 같이 EA가 첨부됩니다:

                              AO 제로 크로스오버 부착

                              차트에서 볼 수 있듯이 EA가 차트 오른쪽 상단에 첨부되어 있습니다. 이제 원하는 신호를 수신할 준비가 되었습니다.

                              강세 신호의 경우:

                              AO 제로 크로스오버 - 강세 신호

                              이전 차트에서 볼 수 있듯이 왼쪽 상단 모서리에 다음과 같은 값의 코멘트가 있습니다:

                              • 강세
                              • AO 현재 값

                              약세 신호의 경우:

                              AO 제로 크로스오버 - 약세 신호

                              이전 차트에서 볼 수 있듯이 다음과 같은 값을 가진 신호가 코멘트로 나타납니다:

                              • 약세
                              • AO 현재 값

                              이렇게 이 전략을 기반으로 한 강세와 약세의 신호를 얻었습니다.

                                전략 2: AO 강도

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

                                  //+------------------------------------------------------------------+
                                  //|                                                  AO 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()
                                    {
                                     double aoArray[];
                                     ArraySetAsSeries(aoArray,true);
                                     int aoDef = iAO(_Symbol,_Period);
                                     CopyBuffer(aoDef,0,0,6,aoArray);
                                  
                                  
                                     double aoCurrVal = NormalizeDouble(aoArray[0],6);
                                     double aoFifthVal = NormalizeDouble(aoArray[1],6);
                                     double aoFourthVal = NormalizeDouble(aoArray[2],6);
                                     double aoThirdVal = NormalizeDouble(aoArray[3],6);
                                     double aoSecondVal = NormalizeDouble(aoArray[4],6);
                                     double aoFirstVal = NormalizeDouble(aoArray[5],6);
                                  
                                     double aoAvgVal = NormalizeDouble((aoFifthVal+aoFourthVal+aoThirdVal+aoSecondVal+aoFirstVal)/5,6);
                                  
                                     if(aoCurrVal > aoAvgVal)
                                       {
                                        Comment("AO Movement is strong","\n",
                                                "AO CurrVal : ",aoCurrVal,"\n",
                                                "AO FirstVal : ",aoFifthVal,"\n",
                                                "AO SecondVal : ",aoFourthVal,"\n",
                                                "AO ThirdVal : ",aoThirdVal,"\n",
                                                "AO FourthVal : ",aoSecondVal,"\n",
                                                "AO FifthVal : ",aoFirstVal,"\n",
                                                "AO AvgVal : ",aoAvgVal
                                               );
                                       }
                                  
                                     if(aoCurrVal < aoAvgVal)
                                       {
                                        Comment("AO Movement is Weak","\n",
                                                "AO CurrVal : ",aoCurrVal,"\n",
                                                "AO FirstVal : ",aoFifthVal,"\n",
                                                "AO SecondVal : ",aoFourthVal,"\n",
                                                "AO ThirdVal : ",aoThirdVal,"\n",
                                                "AO FourthVal : ",aoSecondVal,"\n",
                                                "AO FifthVal : ",aoFirstVal,"\n",
                                                "AO AvgVal : ",aoAvgVal
                                               );
                                       }
                                  
                                    }
                                  //+------------------------------------------------------------------+

                                  이 코드에서의 차이점:

                                  "NormalizeDouble" 함수를 사용하여 현재 AO 값에서 다음의 값을 다시 5개의 값으로 정의합니다:

                                     double aoCurrVal = NormalizeDouble(aoArray[0],6);
                                     double aoFifthVal = NormalizeDouble(aoArray[1],6);
                                     double aoFourthVal = NormalizeDouble(aoArray[2],6);
                                     double aoThirdVal = NormalizeDouble(aoArray[3],6);
                                     double aoSecondVal = NormalizeDouble(aoArray[4],6);
                                     double aoFirstVal = NormalizeDouble(aoArray[5],6);

                                  5주기 AO의 평균을 정의:

                                  double aoAvgVal = NormalizeDouble((aoFifthVal+aoFourthVal+aoThirdVal+aoSecondVal+aoFirstVal)/5,6);

                                  이 전략의 조건.

                                  AO 움직임이 세지는 경우:

                                     if(aoCurrVal > aoAvgVal)
                                       {
                                        Comment("AO Movement is strong","\n",
                                                "AO CurrVal : ",aoCurrVal,"\n",
                                                "AO FirstVal : ",aoFifthVal,"\n",
                                                "AO SecondVal : ",aoFourthVal,"\n",
                                                "AO ThirdVal : ",aoThirdVal,"\n",
                                                "AO FourthVal : ",aoSecondVal,"\n",
                                                "AO FifthVal : ",aoFirstVal,"\n",
                                                "AO AvgVal : ",aoAvgVal
                                               );
                                       }

                                  AO 움직임이 약해지는 경우:

                                     if(aoCurrVal < aoAvgVal)
                                       {
                                        Comment("AO Movement is Weak","\n",
                                                "AO CurrVal : ",aoCurrVal,"\n",
                                                "AO FirstVal : ",aoFifthVal,"\n",
                                                "AO SecondVal : ",aoFourthVal,"\n",
                                                "AO ThirdVal : ",aoThirdVal,"\n",
                                                "AO FourthVal : ",aoSecondVal,"\n",
                                                "AO FifthVal : ",aoFirstVal,"\n",
                                                "AO AvgVal : ",aoAvgVal
                                               );
                                       }

                                  컴파일 후 오류가 없는지 확인하고 EA를 첨부합니다. 그러면 다음과 같은 내용을 확인할 수 있습니다:

                                  AO 강도 부착

                                  오른쪽 상단 모서리에 있는 차트에 EA가 첨부되어 있는 것을 볼 수 있습니다.

                                  강세의 경우:

                                  AO 강도 - 강한 신호

                                  차트의 왼쪽 상단 모서리에서 우리는 다음과 같은 값의 코멘트를 볼 수 있습니다:

                                  • AO 움직임 강세
                                  • AO CurrVal : n
                                  • AO FirstVal : n
                                  • AO SecondVal : n
                                  • AO ThirdVal : n
                                  • AO FourthVal : n
                                  • AO FifthVal : n
                                  • AO AvgVal : n

                                  약세인 경우:

                                  AO 강도 - 약한 신호

                                  차트의 왼쪽 상단 모서리에서 우리는 다음과 같은 값의 코멘트를 볼 수 있습니다:

                                  • AO 움직임 약세
                                  • AO CurrVal : n
                                  • AO FirstVal : n
                                  • AO SecondVal : n
                                  • AO ThirdVal : n
                                  • AO FourthVal : n
                                  • AO FifthVal : n
                                  • AO AvgVal : n

                                  이제 우리는 이 거래 시스템을 기반으로 우리는 원하는 신호를 얻었습니다.

                                    전략 3: AO 및 MA 전략

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

                                      //+------------------------------------------------------------------+
                                      //|                                             AO & MA 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()
                                        {
                                         MqlRates pArray[];
                                         double aoArray[];
                                         double maArray[];
                                      
                                         int Data=CopyRates(_Symbol,_Period,0,1,pArray);
                                         ArraySetAsSeries(aoArray,true);
                                         ArraySetAsSeries(maArray,true);
                                         
                                         int aoDef = iAO(_Symbol,_Period);
                                         int maDef = iMA(_Symbol,_Period,50,0,MODE_EMA,PRICE_CLOSE);
                                      
                                         CopyBuffer(aoDef,0,0,3,aoArray);
                                         CopyBuffer(maDef,0,0,3,maArray);
                                      
                                         double closingPrice = pArray[0].close;
                                         double aoVal = NormalizeDouble(aoArray[0],7);
                                         double maVal = NormalizeDouble(maArray[0],7);
                                      
                                         if(aoVal > 0 && closingPrice > maVal)
                                           {
                                            Comment("Buy","\n"
                                                    "Closing Price is ",closingPrice,"\n",
                                                    "AO Value is ",aoVal,"\n",
                                                    "MA Value is ",maVal);
                                           }
                                      
                                         if(aoVal < 0 && closingPrice < maVal)
                                           {
                                            Comment("Sell","\n"
                                                    "Closing Price is ",closingPrice,"\n",
                                                    "AO Value is ",aoVal,"\n",
                                                    "MA Value is ",maVal);
                                           }
                                      
                                        }
                                      //+------------------------------------------------------------------+

                                      이 코드의 차이점.

                                      pArray, aoArray, maArray의 세 가지 배열을 생성합니다. 앞서 언급한 것과 동일하게 double 함수를 사용하되, pArray를 제외하고는 가격, 거래량, 스프레드에 대한 정보를 저장하기 위해 MqlRates 함수를 사용할 것입니다.

                                         MqlRates pArray[];
                                         double aoArray[];
                                         double maArray[];

                                      AS_SERIES 플래그를 앞서 구성한 것과 마찬가지로 (aoArray) 및 (maArray) 배열로 설정합니다. "CopyRates" 함수를 사용하여 데이터를 정의하면 MqlRates 구조의 과거 데이터와 해당 매개변수를 가져올 수 있습니다:

                                      • symbol_name: _Symbol을 사용하여 현재 심볼에 적용합니다.
                                      • 차트 주기: 현재 기간에 적용하기 위해 _Period를 사용합니다.
                                      • start_pos: 시작 위치를 결정합니다. (0)을 사용합니다. 
                                      • count: 복사할 데이터 개수를 결정합니다. (1)을 사용합니다.
                                      • rates_array[]: 복사할 대상 배열을 결정합니다. pArray를 사용합니다.
                                         int Data=CopyRates(_Symbol,_Period,0,1,pArray);
                                         ArraySetAsSeries(aoArray,true);
                                         ArraySetAsSeries(maArray,true);

                                      AO, MA 정의하기:

                                      앞서 언급한 것과 동일한 "iOA" 함수를 사용하여 AO를 생성합니다.

                                      MA의 매개변수인 "iMA" 함수를 사용합니다:

                                      • symbol: (_Symbol)을 사용합니다. 
                                      • period: (_period)를 사용합니다.
                                      • ma_period: 이동 평균의 주기를 결정하기 위해 50을 사용합니다. 
                                      • ma_shift: 수평 이동을 결정하기 위해 (0)을 사용합니다. 
                                      • ma_method: 이동 평균의 유형을 결정하기 위해 지수 MA를 사용합니다. 
                                      • applied_price: 사용 가능한 가격 유형을 결정하기 위해 종가를 사용합니다.
                                         int aoDef = iAO(_Symbol,_Period);
                                         int maDef = iMA(_Symbol,_Period,50,0,MODE_EMA,PRICE_CLOSE);

                                      "CopyBuffer" 함수를 사용하여 AO 및 MA 지표의 버퍼에서 데이터를 가져옵니다.

                                         CopyBuffer(aoDef,0,0,3,aoArray);
                                         CopyBuffer(maDef,0,0,3,maArray);

                                      종가, aoArray, maArray 정의.

                                         double closingPrice = pArray[0].close;
                                         double aoVal = NormalizeDouble(aoArray[0],7);
                                         double maVal = NormalizeDouble(maArray[0],7);

                                      전략의 조건.

                                      매수 신호의 경우

                                         if(aoVal > 0 && closingPrice > maVal)
                                           {
                                            Comment("Buy","\n"
                                                    "Closing Price is ",closingPrice,"\n",
                                                    "AO Value is ",aoVal,"\n",
                                                    "MA Value is ",maVal);
                                           }

                                      매도 신호인 경우:

                                         if(aoVal < 0 && closingPrice < maVal)
                                           {
                                            Comment("Sell","\n"
                                                    "Closing Price is ",closingPrice,"\n",
                                                    "AO Value is ",aoVal,"\n",
                                                    "MA Value is ",maVal);
                                           }

                                      이 코드를 컴파일하고 첨부하면 EA가 다음과 같이 첨부된 것을 확인할 수 있습니다:

                                       AO & MA 첨부

                                      이전 차트에서 왼쪽 상단 모서리에 지표가 첨부되어 있는 것을 볼 수 있습니다. 이제 신호를 받을 준비가 되었습니다.

                                      매수 신호인 경우:

                                       AO & MA - 매수 신호

                                      왼쪽 상단 모서리에 다음과 같은 값을 가진 신호가 있는 것을 볼 수 있습니다:

                                      • 매수
                                      • 종가는 n입니다.
                                      • AO 값은 n
                                      • MA 값은 n

                                      매도의 경우:

                                       AO & MA - 매도 신호

                                      이 경우 다음과 같은 신호 값을 볼 수 있습니다:

                                      • 매도
                                      • 종가는 n입니다.
                                      • AO 값은 n
                                      • MA 값은 n


                                      결론

                                      이제 AO가 무엇인지, 무엇을 측정하는지, 어떻게 수동으로 계산할 수 있는지를 알아보고 MetaTrader 5의 내장 지표에서 차트에 삽입하는 방법을 배웠습니다. 이제 여러분은 어썸 오실레이터 지표에 대해 자세히 알게 되었을 것입니다. 또한 우리는 주요 개념을 바탕으로 간단한 전략을 통해 어떻게 활용할 수 있는지도 배웠는데 그 전략은 다음과 같습니다:

                                      • 전략 1: AO 제로 크로스오버 - 제로 교차를 기준으로 강세 또는 약세 신호를 얻습니다.
                                      • 전략 2: AO 강도 - 현재 AO 값의 위치와 최근 5개 AO 값의 평균을 기반으로 AO 움직임의 강도 신호를 얻습니다. 
                                      • 전략 3: AO & MA 전략 - 현재 AO 및 제로 레벨의 포지션과 종가 및 50주기 EMA의 포지션을 기반으로 매수 또는 매도 신호를 받습니다.

                                      그 후 아이디어를 정리한 후 쉽고 효과적으로 거래 시스템을 만들기 위해 언급된 각 전략에 대한 단계별 청사진을 설계했습니다. 그런 다음 언급된 각 전략에 대한 트레이딩 시스템을 만들어 MetaTrader 5 트레이딩 터미널에서 실행한 후 자동으로 신호를 받도록 했습니다.

                                      배운 내용을 스스로 적용해보는 것은 학습 과정에서 매우 중요한 단계이며 이를 통해 여러분은 배운 내용이나 관련 주제에 대해 더 많은 통찰력을 얻을 수 있습니다. 모든 사람에게 적합한 전략은 없으므로 언급 된 전략을 사용하기 전에 테스트하여 거래에 적합한 지 확인해야 한다는 점을 여기서 다시 한번 말씀드립니다.

                                      이 글이 트레이딩에 도움이 되셨기를 바라며 비슷한 글을 읽고 싶으시다면 이 시리즈의 다른 글에서 가장 인기 있는 보조지표를 기반으로 트레이딩 시스템을 설계하는 방법에 대한 글들을 읽어보시기 바랍니다.

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

                                      파일 첨부됨 |
                                      Simple_AO.mq5 (1.01 KB)
                                      AO_Strength.mq5 (2.07 KB)
                                      Expert Adviso 개발 기초부터(22부): 새로운 주문 시스템(V) Expert Adviso 개발 기초부터(22부): 새로운 주문 시스템(V)
                                      오늘은 새로운 주문 시스템을 계속 개발할 예정입니다. 새로운 시스템을 구현하는 것은 그리 쉬운 일이 아닙니다. 프로세스를 복잡하게 만드는 문제가 종종 발생하기 때문입니다. 이러한 문제가 나타나면 우리는 개발을 멈추고 우리의 개발 방향에 대해 다시 분석해야 합니다.
                                      Relative Vigor Index로 거래 시스템을 설계하는 방법을 알아보세요 Relative Vigor Index로 거래 시스템을 설계하는 방법을 알아보세요
                                      가장 인기 있는 기술 지표를 기반으로 거래 시스템을 설계하는 방법에 대한 시리즈의 새로운 기사입니다. 이 글에서는 상대 활력 지수(Relative Vigor Index) 지표를 사용하여 이를 수행하는 방법을 알아봅니다.
                                      모집단 최적화 알고리즘: 물고기 떼 검색(FSS) 모집단 최적화 알고리즘: 물고기 떼 검색(FSS)
                                      물고기 떼 검색(FSS)은 대부분의 물고기(최대 80%)가 친척들로 구성된 집단인 물고기 떼에서 물고기의 행동에서 영감을 얻은 새로운 최적화 알고리즘입니다. 물고기의 떼가 먹이 사냥의 효율성과 포식자로부터 보호하는 데 중요한 역할을 한다는 것은 이미 입증된 사실입니다.
                                      MetaTrader VPS 시작하기: 단계별 지침 MetaTrader VPS 시작하기: 단계별 지침
                                      트레이딩 로봇이나 시그널 구독을 사용해 본 사람이라면 누구나 트레이딩 플랫폼에 안정적인 연중무휴 호스팅 서버를 임대해야 한다는 필요성을 알고 있습니다. 저희는 다양한 이유로 메타트레이더 VPS 사용을 권장합니다. MQL5.community 계정을 통해 간단하게 서비스 비용을 결제하고 구독을 관리할 수 있습니다.