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

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

MetaTrader 5트레이딩 | 25 9월 2024, 14:57
39 0
Mohamed Abdelmaaboud
Mohamed Abdelmaaboud

소개

    가장 인기 있는 보조지표를 기반으로 트레이딩 시스템을 설계하는 방법을 배우는 시리즈의 새로운 글에 오신 것을 환영합니다. 이번 글에서는 MQL5 프로그래밍 언어로 트레이딩 시스템을 만드는 방법에 대해 알아봅니다. 이 기사에서는 이러한 인기 지표 중 하나인 게이터 오실레이터에 대해 자세히 알아보고 그 정의, 사용 방법은 물론 MetaTrader5에서 사용할 수 있는 트레이딩 시스템을 만들어 트레이딩에 도움을 주거나 더 나은 결과를 얻기 위해 사용할 수 있는 새로운 트레이딩 방식에 눈을 뜨는 방법에 대해 알아볼 것입니다. 

      다음과 같은 주제를 통해 우리는 이 지표를 최대한 많이 다룰 예정입니다:

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

      전략을 테스트하기 위해 우리는 MetaTrader 5 트레이딩 터미널을 사용하고 MetaTrader 5에 내장된 MetaQuotes language (MQL5) 프로그래밍 언어로 거래 시스템을 구축할 것입니다. MetaTrader 5와 MQL5의 IDE를 다운로드하고 사용하는 방법을 모르는 경우 이전 글 MetaEditor에서 MQL5 코드 작성하기 항목을 읽어 보면 더 자세히 알아볼 수 있습니다.

      모든 사람에게 모두 적합한 것은 없기 때문에 여러분은 여기서 살펴보는 전략을 사용하기 전에 테스트하여 유용하고 수익성이 있는지 확인해야 하며 여기서의 주요 목표는 지표의 주요 개념과 기반을 배우는 교육용이며 프로그래밍 기술을 향상시키고 싶다면 여러분 스스로 이 기사의 코드와 다른 코드를 직접 작성해 볼 필요가 있다는 것입니다.

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


      게이터 오실레이터 정의

      이 부분에서 우리는 게이터 오실레이터 지표를 더 자세히 파악하여 그 이면에 숨겨진 주요 개념을 이해하고 인식하고 적절하고 효과적으로 사용하는 방법을 알아볼 것입니다. 게이터 오실레이터 지표는 빌 윌리엄스가 만든 것으로 거래 진입 또는 청산 타이밍을 알려주는 것 외에도 시장이 추세인지 추세라면 이 추세가 얼마나 지속될 수 있는지를 파악하는 데 도움을 주기 위해 만들어졌습니다. 트레이딩에서 이 두 가지가 매우 중요하다는 것은 우리 모두가 알고 있는 사실입니다. 게이터 오실레이터는 엘리게이터 지표를 기반으로 하며 엘리게이터 지표에 대한 자세한 내용은 이전 글 엘리게이터로 트레이딩 시스템 설계하기에서 확인할 수 있습니다.

      게이터 지표의 계산은 앨리게이터 지표의 균형선이 얼마나 수렴하고 발산하는지를 보여주는 것과 동일합니다. 다음은 게이터 지표 계산에 대한 설명입니다:

      • 1단계: median 가격을 계산해야 합니다:

      Median Price = (High + Low) /2

      • 2단계: 앨리게이터의 턱, 이빨, 입술을 계산해야 합니다:
      앨리게이터 턱 = SMMA (Median Price, 13,8)
      앨리게이터 이빨 = SMMA(Median Price, 8, 5)
      앨리게이터 입술 = SMMA(Median Price, 5, 3)
      • 여기서:

      Median Price: 가격의 유형입니다.

      High: 가장 높은 가격 값입니다.

      Low: 가장 낮은 가격 값입니다.

      SMMA: 평활 이동 평균은 이동평균의 일종으로 데이터, 기간, 시프트가 존재하는 경우 이를 평활화 하는 방법입니다. 데이터의 한 종류인 median 값에서 평활화된 이동 평균인 SMMA(중위 가격, 13, 5)를 평활화 기간 13, 미래로의 이동은 5라고 가정하면 SMMA는 13이 됩니다. 

      악어 턱: 악어 지표의 파란색 선입니다.

      악어 이빨: 악어 지표의 빨간색 선입니다.

      악어 입술: 악어 지표의 녹색 선입니다.

      앞의 계산으로 게이터 오실레이터 지표가 생성되지만 MetaTrader 5에 이미 내장되어 있으므로 우리는 수동으로 계산할 필요가 없습니다. 우리는 사용 가능한 다른 보조지표 중에서 선택하여 다음과 같이 차트에 삽입하기만 하면 됩니다.

      MetaTrader 5를 여는 동안 삽입 탭 --> 보조지표 --> 빌 윌리엄스 --> 게이터 오실레이터를 선택합니다.

      게이터 삽입

      게이터 오실레이터를 선택하면 다음과 같은 게이터 매개변수 창이 나타납니다:

      게이터 매개변수

      이전 그림에서 원하는 지표 설정을 결정하기 위한 게이터 오실레이터 지표의 매개변수는 다음과 같습니다:

      1. 턱의 기간을 결정합니다.
      2. 턱의 수평 이동을 결정합니다.
      3. 치아의 기간을 결정합니다.
      4. 치아의 수평 이동을 결정합니다.
      5. 입술의 기간을 결정합니다.
      6. 입술의 수평 이동을 결정합니다.
      7. 선호하는 평균 방법을 결정합니다.
      8. 게이터 계산에 사용할 가격 유형을 결정합니다.
      9. 게이터 업 값의 색상을 결정합니다.
      10. 게이터 다운 값의 색상을 결정합니다.
      11. 게이터 바의 두께를 결정합니다.  

      게이터 오실레이터 지표의 모든 기본 매개변수를 결정하면 차트 하단에 다음과 같이 지표가 차트에 첨부되어 있는 것을 확인할 수 있습니다:

      게이터 부착

      이전 차트에서 볼 수 있듯이 게이터 오실레이터의 위아래에 값이 0보다 높고 0보다 낮은 값을 가진 지표가 있는 것을 알 수 있습니다. 또한 각 바와 이전 바 간의 관계에 따라 녹색 및 빨간색 바가 표시됩니다. 현재 바가 이전 바보다 크면 현재 바가 녹색으로 표시되고 반대로 현재 바가 이전 바보다 작으면 현재 바가 빨간색으로 표시됩니다. 


      게이터 오실레이터 전략

      이 주제에서는 게이터 오실레이터 지표를 사용할 수 있는 몇 가지 간단한 전략을 학습의 목적으로 공유하겠습니다. 여러분은 이 전략을 실제 계정에 사용하기 전에 테스트하여 유용한지 확인해야 합니다.

        전략 1: 게이터 상태 전략:

          이 전략에 따라 지표의 바를 기준으로 게이터의 상태를 식별해야 합니다. 이에 따라 게이터 상태는 네 가지가 됩니다. 두 바가 모두 빨간색이면 게이터의 상태는 잠잠한 모드입니다. 두 바가 모두 녹색이면 섭취 단계입니다. 빨간색 다음에 두 바가 모두 녹색이면 각성 단계입니다. 녹색 다음에 두 바가 모두 빨간색이면 포만 단계입니다.

          간단합니다,

          두 바 모두 빨간색 ==> 잠잠한 단계

          두 바 모두 녹색 ==> 먹기 단계

          두 바가 모두 빨간색 이후 녹색 ==> 각성 단계

          두 바가 모두 녹색 이후 빨간색 ==> 포만 단계

            전략 2: 게이터 신호:

              이 전략에 따르면 우리는 게이터 지표를 기반으로 신호를 얻어야 합니다. 게이터가 각성 단계에 있다면 좋은 진입 신호를 찾았다고 해석됩니다. 게이터 지표가 섭취 단계에 있으면 현재 위치를 유지한다는 신호로 받아들여야 합니다. 게이터 지표가 포만 단계에 있다면 좋은 청산 자리를 찾아야 합니다. 게이터 상태가 다른 것이라면 아무 신호도 없는 것입니다.

              간단히 하면,

              게이터 지표 = 각성 단계 ==> 좋은 진입 찾기.

              게이터 지표 = 섭취 단계 ==> 현재 위치 유지.

              게이터 지표 = 포만 단계 ==> 좋은 청산 찾기.

              게이터 지표 상태가 = 다른 것 ==> 아무것도 하지 않습니다.

                전략 3: 게이터와 MA:

                  이 전략에 따르면 우리는 게이터 신호와 이동평균 신호를 결합할 것입니다. 녹색 바가 두 개 있고 종가가 이동 평균값보다 높으면 좋은 매수 포지션 신호이며 반대로 게이터 지표에 빨간색 바가 두 개 있고 종가가 이동 평균값보다 낮으면 좋은 매도 포지션 신호가 됩니다. 아니면 아무것도 하지 않아도 됩니다.

                  간단히 하면,

                  두개의 녹색 바와 종가 > 이동 평균 ==> 좋은 매수 포지션 포착

                  두 개의 빨간색 바와 종가 < 이동 평균값 ==> 좋은 매도 포지션 포착

                  기타 ==> 아무것도 하지 않음


                  게이터 오실레이터 청사진

                  이 부분에서 우리는 살펴본 모든 전략에 대한 단계별 청사진을 작성하여 트레이딩 시스템을 효과적이고 쉽게 만들 수 있도록 해 보겠습니다. 이 단계는 중요한 단계를 잊어버리고 작업을 반복하는 것을 피할 수 있게 해주기 때문에 이 단계를 거치는 것이 시간이 걸리더라도 결국 많은 시간을 절약할 수 있게 해주므로 저는 이 단계가 트레이딩 시스템 개발에 매우 중요하고 필수적이라고 생각합니다. 우리는 아이디어를 명확한 단계로 정리하여 컴퓨터로 하여금 컴퓨터가 우리를 위해 무엇을 해야 하는지를 이해시키도록 할 것입니다.

                    전략 1: 게이터 상태 식별자:  

                      이 전략의 개념에 따라 우리는 expert advisor를 만들고 틱마다 자동으로 현재 상승, 현재 상승의 이전 두 개, 현재 하락, 현재 하락의 이전 두 개 등 게이터 지표의 일부 값을 확인하는 데 사용할 것입니다. 이 확인 후 EA는 각 값의 위치를 결정하고 다음의 비교를 수행해야 합니다. 첫 번째는 현재와 이전 게이터의 값을 비교하여 어느 것이 다른 것보다 큰지 결정하는 것입니다. 두 번째는 현재와 이전 게이터의 값을 비교하여 어느 것이 다른 것보다 큰지를 결정하는 것입니다. 이 비교의 결과는 게이터 상태를 식별하여 얻어지는 신호가 될 것입니다.

                      현재 상승 값이 이전 값보다 작고 현재 하락 값이 이전 값보다 큰 경우 EA 또는 트레이딩 시스템이 차트에 코멘트로 수면 단계라는 신호를 반환해야 합니다. 또 다른 경우 현재 상승 값이 이전 값보다 크고 동시에 현재 하락 값이 이전 값보다 작은 경우 거래 시스템은 코멘트로 섭취 단계의 신호를 반환해야 합니다. 세 번째 경우 첫 번째 이전 상승 값이 두 번째 이전 하락 값보다 작고 첫 번째 이전 하락 값이 두 번째 이전 하락 값보다 크며 동시에 현재 상승 값이 첫 번째 이전보다 크고 현재 하락 값이 첫 번째 이전보다 작은 경우 거래 시스템에서는 각성 단계 신호를 차트에 코멘트로 반환해야 합니다. 네 번째 이자 마지막 상태에서 첫 번째 이전 상승 값이 두 번째 이전 하락 값보다 크고 첫 번째 이전 하락 값이 두 번째 이전 하락 값보다 작고 동시에 현재 상승 값이 첫 번째 이전 상승 값보다 작고 현재 하락 값이 첫 번째 이전보다 큰 경우 거래 시스템이 차트에 포만 단계라는 신호를 코멘트를 반환해야 합니다.

                      다음은 이 트레이딩 시스템의 청사진을 보여주는 간단한 그래프입니다:

                      게이터 상태 식별자 블루프린트


                        전략 2: 게이터 신호:

                          이 트레이딩 전략의 주요 아이디어는 진입, 청산 또는 현재 포지션 유지의 좋은 타이밍에 대한 신호를 반환하는 트레이딩 시스템이 만들어져야 합니다. 이를 위해 트레이딩 시스템은 게이터 상태를 기반으로 한 신호를 얻기 위해 현재 상승과 이전 상승 두 개, 현재 하락과 이전 하락 두 개의 값을 지속적으로 확인해야 합니다.

                          거래 시스템이 반환해야 하는 첫 번째 신호는 다음과 같습니다. 게이터 값을 확인하고 첫 번째 이전 상승 값이 두 번째 이전 하락 값보다 작고, 동시에 현재 상승 값이 첫 번째 이전 하락 값보다 크고, 현재 하락 값이 첫 번째 이전 하락 값보다 작아 각성 단계가 있음을 확인한 후 차트에 코멘트로 (좋은 진입 시점)라는 신호가 표시되도록 해야 합니다.

                          트레이딩 시스템에서 우리가 받아야 하는 두 번째 신호는 시스템이 게이터 값을 확인하고 현재 상승 값이 이전 첫 번째 값보다 크고 현재 하락 값이 이전 첫 번째 값보다 작아 섭취 단계에 있음을 확인한 후 차트에 코멘트로 (현재 포지션 유지)를 표시하는 것입니다.

                          우리가 이 트레이딩 시스템에서 얻을 수 있는 세 번째 신호는 게이터 값을 확인하고 첫 번째 이전 상승 값이 두 번째 이전 하락 값보다 크고 첫 번째 이전 하락 값이 두 번째 이전 상승 값보다 커서 포만 단계가 있음을 확인한 후 차트에 코멘트로 (좋은 출구 찾기)를 표시하도록 하는 것입니다.

                          트레이딩 시스템에서 마지막으로 필요한 것은 앞의 세 가지 신호에서 언급한 것 외에는 아무것도 하지 않는 것입니다. 다음은 이러한 거래 시스템의 청사진입니다:

                          게이터 신호 청사진



                            전략 3: 게이터와 MA:

                              트레이딩 전략에 따르면 전략 섹션에서 배운 것과 같이 우리는 게이터 지표, 종가, 이동평균을 기준으로 매수 또는 매도 포지션을 찾을 수 있는 좋은 시점을 얻어야 하는데 다음은 컴퓨터가 이를 수행하도록 하는 방법에 대한 설명입니다.

                              트레이딩 시스템이 반환해야 하는 첫 번째 신호는 (좋은 매수 포지션 찾기)로 게이터 값을 확인하고 현재 상승이 이전 첫 번째 상승보다 크고 이전 첫 번째 상승이 이전 두 번째 상승보다 크며 동시에 현재 하락이 이전 첫 번째 하락보다 작고 이전 첫 번째 하락이 이전 두 번째 하락보다 작다는 것을 발견하면 이제 녹색 바가 두 개가 된다는 뜻입니다. 그러면 종가가 이동 평균값보다 커집니다.

                              두 번째 신호는 (좋은 매도 포지션 찾기)로 게이터를 확인하고 현재 상승이 이전 첫 번째 상승보다 작고 이전 첫 번째 상승이 이전 두 번째 상승보다 작고 동시에 현재 하락 값이 이전 첫 번째 하락보다 크고 이전 첫 번째 하락이 이전 두 번째 하락보다 크다는 것을 발견하면 빨간색 바가 두 개 있다는 의미입니다. 그러면 종가가 이동 평균보다 작아집니다.

                              세 번째는 다른 상환에 대해서는 아무것도 반환하지 않는 거래 시스템이 필요합니다. 다음은 이러한 거래 시스템의 청사진입니다:

                              게이터와 MA 전략 청사진


                              게이터 오실레이터 거래 시스템

                              이제 우리는 살펴본 모든 전략을 수행하는 거래 시스템을 만들기 위해 이 글에서 가장 흥미로운 주제에 도달했습니다. 이 트레이딩 시스템은 우리가 효과적으로 거래하는 데 도움이 되는 전략의 기반으로 사용될 것입니다.

                              "단순 게이터 오실레이터 시스템"은 게이터 인디케이터의 현재 상승 값과 하락 값을 차트에 코멘트로 반환하기 위해 만들어졌습니다. 이 거래 시스템을 만드는 단계는 다음과 같습니다:

                              분수 값을 반환하는 실수 유형 중 하나인 double 함수를 사용하여 upGator와 downGator의 배열을 만듭니다.

                                 double upGatorArray[];
                                 double downGatorArray[];

                              "ArraySetAsSeries" 함수를 사용하여 이러한 배열의 데이터를 정렬합니다. 매개변수:

                                 ArraySetAsSeries(upGatorArray,true);
                                 ArraySetAsSeries(downGatorArray,true);

                              gatorDef에 대한 정수 변수를 생성하고 "iGator" 함수를 사용하여 게이터 오실레이터를 정의합니다. 지표 핸들 그 매개 변수를 반환합니다:

                              • symbol: 심볼 이름을 결정하기 위해 현재 심볼에 적용될 _SYMBOL을 사용합니다. 
                              • period: 기간을 결정하기 위해 현재 기간에 적용될 _PERIOD를 사용합니다.
                              • jaw_period: 원하는 턱 계산 기간을 결정하기 위해 (13)을 사용합니다. 
                              • jaw_shift: 필요한 경우 턱의 수평 이동을 결정합니다. (8)을 사용하겠습니다.
                              • teeth_period: 치아 계산 기간을 결정합니다. (8)을 사용하겠습니다.
                              • teeth_shift: 필요한 경우 치아의 수평 이동을 결정합니다. (5)를 사용하겠습니다.
                              • lips_period: 입술의 계산 기간을 결정합니다. (5)를 사용하겠습니다.
                              • lips_shift: 필요한 경우 입술의 수평 이동을 결정합니다.  (3)을 사용하겠습니다.
                              • ma_method: 이동 평균 유형 유형을 결정합니다. (MODE_SMMA)를 사용합니다.
                              • applied_price: 계산에 적용되는 가격 유형을 결정합니다. (PRICE_MEDIAN)을 사용합니다.
                              int gatorDef=iGator(_Symbol,_Period,13,8,8,5,5,3,MODE_SMMA,PRICE_MEDIAN);

                              upGatorArray와 downGatorArray 모두에 "CopyBuffer" 함수를 사용하여 데이터를 정의하고 결과를 저장합니다. 매개변수:

                              • indicator_handle: 지표 핸들을 결정하기 위해 (gatorDef)를 사용합니다.
                              • buffer_num: 지표 버퍼 번호를 결정하기 위해 (upGator의 경우 0), (downGator의 경우 2)를 사용합니다.
                              • start_pos: 시작 위치를 결정하기 위해 (0)을 결정합니다.
                              • count: 복사할 양을 결정합니다. 우리는 (3)을 사용합니다.
                              • buffer[]: 복사할 대상 배열을 결정하기 위해 (upGatorArray, downGatorArray)를 사용합니다.
                                 CopyBuffer(gatorDef,0,0,3,upGatorArray);
                                 CopyBuffer(gatorDef,2,0,3,downGatorArray);

                              더블 변수를 생성한 후 upGator와 downGator의 값을 가져옵니다. 그런 다음 반올림을 위해 (NormalizeDouble) 함수를 사용합니다.

                              • value: 현재 값으로 upGatorArray[0]을 사용하겠습니다.
                              • digits: 소수점 뒤의 숫자는 (6)을 사용합니다.
                                 double gatorUpValue=NormalizeDouble(upGatorArray[0],6);
                                 double gatorDownValue=NormalizeDouble(downGatorArray[0],6);

                              (코멘트) 함수를 사용하여 현재 upGator 및 downGator의 값을 표시합니다.

                                 Comment("gatorUpValue = ",gatorUpValue,"\n",
                                         "gatorDownValue = ",gatorDownValue);

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

                              //+------------------------------------------------------------------+
                              //|                               Simple Gator Oscillator System.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 upGatorArray[];
                                 double downGatorArray[];
                                 ArraySetAsSeries(upGatorArray,true);
                                 ArraySetAsSeries(downGatorArray,true);
                                 int gatorDef=iGator(_Symbol,_Period,13,8,8,5,5,3,MODE_SMMA,PRICE_MEDIAN);
                                 CopyBuffer(gatorDef,0,0,3,upGatorArray);
                                 CopyBuffer(gatorDef,2,0,3,downGatorArray);
                                 double gatorUpValue=NormalizeDouble(upGatorArray[0],6);
                                 double gatorDownValue=NormalizeDouble(downGatorArray[0],6);
                                 Comment("gatorUpValue = ",gatorUpValue,"\n",
                                         "gatorDownValue = ",gatorDownValue);
                                }
                              //+------------------------------------------------------------------+

                              이전 코드 줄을 작성한 후 컴파일하고 오류가 없는지 확인한 다음 다음과 같이 MetaTrader 5 트레이딩 터미널의 Expert Advisors 폴더 아래 내비게이터 창에서 이 EA를 찾을 수 있습니다:

                               Gator Nav

                              원하는 차트에 EA를 끌어다 놓으면 다음과 같이 이 EA의 창이 나타납니다:

                              단순 게이터 오실레이터 시스템 윈

                              (알고 트레이딩 허용) 옆에 체크 표시를 하고 (확인)을 누르면 다음과 같이 차트에 EA가 첨부되어 있는 것을 확인할 수 있습니다:

                               단순 게이터 오실레이터 시스템 부착

                              이제 다음 예제에서 테스트한 내용 대로 우리는 트레이딩 시스템의 신호를 받을 준비가 되었습니다:

                              단순 게이터 오실레이터 시스템 신호


                                전략 1: 게이터 상태 식별자:

                                  이 전략을 기반으로 전체 코드 블록을 생성하는 방법은 다음과 같습니다:

                                  //+------------------------------------------------------------------+
                                  //|                                      Gator Status Identifier.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 upGatorArray[];
                                     double downGatorArray[];
                                     ArraySetAsSeries(upGatorArray,true);
                                     ArraySetAsSeries(downGatorArray,true);
                                     int gatorDef=iGator(_Symbol,_Period,13,8,8,5,5,3,MODE_SMMA,PRICE_MEDIAN);
                                     CopyBuffer(gatorDef,0,0,5,upGatorArray);
                                     CopyBuffer(gatorDef,2,0,5,downGatorArray);
                                     double gatorUpValue=NormalizeDouble(upGatorArray[0],6);
                                     double gatorUpPreValue1=NormalizeDouble(upGatorArray[1],6);
                                     double gatorUpPreValue2=NormalizeDouble(upGatorArray[2],6);
                                     double gatorDownValue=NormalizeDouble(downGatorArray[0],6);
                                     double gatorDownPreValue1=NormalizeDouble(downGatorArray[1],6);
                                     double gatorDownPreValue2=NormalizeDouble(downGatorArray[2],6);
                                     if(gatorUpValue<gatorUpPreValue1&&gatorDownValue>gatorDownPreValue1)
                                       {
                                        Comment("Sleeping Phase");
                                       }
                                     else
                                        if(gatorUpValue>gatorUpPreValue1&&gatorDownValue<gatorDownPreValue1)
                                          {
                                           Comment("Eating Phase");
                                          }
                                     if(gatorUpPreValue1<gatorUpPreValue2&&gatorDownPreValue1>gatorDownPreValue2&&
                                        gatorUpValue>gatorUpPreValue1&&gatorDownValue<gatorDownPreValue1)
                                       {
                                        Comment("Awakening Phase");
                                       }
                                     else
                                        if(
                                           gatorUpPreValue1>gatorUpPreValue2&&gatorDownPreValue1<gatorDownPreValue2&&
                                           gatorUpValue<gatorUpPreValue1&&gatorDownValue>gatorDownPreValue1)
                                          {
                                           Comment("Sated Phase");
                                          }
                                    }
                                  //+------------------------------------------------------------------+
                                  

                                  이 코드에서의 차이점:

                                  upGator의 마지막 세 값 정의 및 가져오기

                                     double gatorUpValue=NormalizeDouble(upGatorArray[0],6);
                                     double gatorUpPreValue1=NormalizeDouble(upGatorArray[1],6);
                                     double gatorUpPreValue2=NormalizeDouble(upGatorArray[2],6);

                                  downGator의 마지막 세 값 정의 및 가져오기

                                     double gatorDownValue=NormalizeDouble(downGatorArray[0],6);
                                     double gatorDownPreValue1=NormalizeDouble(downGatorArray[1],6);
                                     double gatorDownPreValue2=NormalizeDouble(downGatorArray[2],6);

                                  전략의 조건:

                                  수면 단계의 경우,

                                     if(gatorUpValue<gatorUpPreValue1&&gatorDownValue>gatorDownPreValue1)
                                       {
                                        Comment("Sleeping Phase");
                                       }

                                  섭취 단계의 경우,

                                     else
                                        if(gatorUpValue>gatorUpPreValue1&&gatorDownValue<gatorDownPreValue1)
                                          {
                                           Comment("Eating Phase");
                                          }

                                  각성 단계의 경우,

                                     if(gatorUpPreValue1<gatorUpPreValue2&&gatorDownPreValue1>gatorDownPreValue2&&
                                        gatorUpValue>gatorUpPreValue1&&gatorDownValue<gatorDownPreValue1)
                                       {
                                        Comment("Awakening Phase");
                                       }

                                  포만 단계의 경우

                                     else
                                        if(
                                           gatorUpPreValue1>gatorUpPreValue2&&gatorDownPreValue1<gatorDownPreValue2&&
                                           gatorUpValue<gatorUpPreValue1&&gatorDownValue>gatorDownPreValue1)
                                          {
                                           Comment("Sated Phase");
                                          }

                                  이 코드를 오류 없이 컴파일하고 EA를 실행하면 다음과 같이 차트에 첨부된 것을 확인할 수 있습니다:

                                   게이터 상태 식별자 첨부

                                  이전 차트의 오른쪽 상단 모서리에서 볼 수 있듯이 게이터 상태 식별자 EA가 차트에 첨부되어 있습니다.

                                  우리는 이 전략에 기반한 신호를 다음과 같은 테스트를 통해 찾을 수 있습니다:

                                  수면 신호의 경우:

                                   게이터 상태 식별자 절전 신호

                                  왼쪽 상단에 이 전략에 기반한 수면 단계의 신호가 있습니다.

                                  섭취 단계의 경우:

                                   게이터 상태 식별자 먹이 신호

                                  우리는 왼쪽 상단에서 이 전략에 따라 섭취 단계의 신호가 있음을 알 수 있습니다.

                                  각성 단계의 경우:

                                  게이터 상태 식별자 각성 신호

                                  이전 차트에서 볼 수 있듯이 게이터 상태 식별자 전략에 기반한 각성 단계 신호가 있습니다.

                                  포만 단계의 경우

                                  게이터 상태 식별자 포만 신호

                                  이전 그림에서 볼 수 있듯이 왼쪽 상단 모서리에 포만 단계가 있습니다.


                                    전략 2: 게이터 신호 전략:

                                      다음은 이 전략을 기반으로 트레이딩 시스템을 만드는 전체 코드입니다.

                                      //+------------------------------------------------------------------+
                                      //|                                                Gator signals.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 upGatorArray[];
                                         double downGatorArray[];
                                         ArraySetAsSeries(upGatorArray,true);
                                         ArraySetAsSeries(downGatorArray,true);
                                         int gatorDef=iGator(_Symbol,_Period,13,8,8,5,5,3,MODE_SMMA,PRICE_MEDIAN);
                                         CopyBuffer(gatorDef,0,0,3,upGatorArray);
                                         CopyBuffer(gatorDef,2,0,3,downGatorArray);
                                         double gatorUpValue=NormalizeDouble(upGatorArray[0],6);
                                         double gatorUpPreValue1=NormalizeDouble(upGatorArray[1],6);
                                         double gatorUpPreValue2=NormalizeDouble(upGatorArray[2],6);
                                         double gatorDownValue=NormalizeDouble(downGatorArray[0],6);
                                         double gatorDownPreValue1=NormalizeDouble(downGatorArray[1],6);
                                         double gatorDownPreValue2=NormalizeDouble(downGatorArray[2],6);
                                         bool awakeningPhase = gatorUpPreValue1<gatorUpPreValue2&&gatorDownPreValue1>gatorDownPreValue2&&
                                                               gatorUpValue>gatorUpPreValue1&&gatorDownValue<gatorDownPreValue1;
                                         bool eatingPhase = gatorUpValue>gatorUpPreValue1&&gatorDownValue<gatorDownPreValue1;
                                         bool satedPhase = gatorUpPreValue1>gatorUpPreValue2&&gatorDownPreValue1<gatorDownPreValue2&&
                                                           gatorUpValue<gatorUpPreValue1&&gatorDownValue>gatorDownPreValue1;
                                         if(awakeningPhase)
                                           {
                                            Comment("Find a good entry");
                                           }
                                         else
                                            if(eatingPhase)
                                              {
                                               Comment("Hold current position");
                                              }
                                            else
                                               if(satedPhase)
                                                 {
                                                  Comment("Find a good exit");
                                                 }
                                               else
                                                  Comment("");
                                        }
                                      //+------------------------------------------------------------------+

                                      이 전략의 차이점:

                                      다음 세 단계(각성 단계, 먹기 단계, 포만감 단계)에 대한 부울 변수를 생성합니다;

                                         bool awakeningPhase = gatorUpPreValue1<gatorUpPreValue2&&gatorDownPreValue1>gatorDownPreValue2&&
                                                               gatorUpValue>gatorUpPreValue1&&gatorDownValue<gatorDownPreValue1;
                                         bool eatingPhase = gatorUpValue>gatorUpPreValue1&&gatorDownValue<gatorDownPreValue1;
                                         bool satedPhase = gatorUpPreValue1>gatorUpPreValue2&&gatorDownPreValue1<gatorDownPreValue2&&
                                                           gatorUpValue<gatorUpPreValue1&&gatorDownValue>gatorDownPreValue1;

                                      전략의 조건:

                                      각성 단계의 경우

                                         if(awakeningPhase)
                                           {
                                            Comment("Find a good entry");
                                           }

                                      섭취 단계의 경우

                                         else
                                            if(eatingPhase)
                                              {
                                               Comment("Hold current position");
                                              }

                                      포만 단계의 경우

                                            else
                                               if(satedPhase)
                                                 {
                                                  Comment("Find a good exit");
                                                 }

                                      기타

                                               else
                                                  Comment("");

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

                                      게이터 신호 부착

                                      오른쪽 상단에서 볼 수 있듯이 게이터 신호의 EA가 차트에 첨부되어 있습니다.

                                      이제 우리는 이 전략의 신호를 받을 준비가 되었으며 다음은 테스트를 해서 얻은 예시입니다:

                                      각성 단계의 경우;

                                      게이터 신호 진입 신호

                                      이전 차트에서 볼 수 있듯이 왼쪽 상단 모서리에 '좋은 진입 찾기' 신호가 있습니다.

                                      섭취 단계의 경우

                                       게이터 신호 홀드 신호

                                      이전 그림에서 볼 수 있듯이 왼쪽 상단 모서리에 '현재 위치 유지' 신호가 있습니다.

                                      포만 단계의 경우

                                       게이터 청산 신호

                                      이전 테스트의 예시 차트에서 볼 수 있듯이 왼쪽 상단 모서리에 '좋은 청산 찾기' 신호가 있습니다.


                                      전략 3: 게이터와 MA 전략:

                                      다음은 이 전략을 기반으로 트레이딩 시스템을 만들기 위한 전체 코드입니다.

                                      //+------------------------------------------------------------------+
                                      //|                                       Gator with 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()
                                        {
                                         double upGatorArray[];
                                         double downGatorArray[];
                                         MqlRates pArray[];
                                         double maArray[];
                                         ArraySetAsSeries(upGatorArray,true);
                                         ArraySetAsSeries(downGatorArray,true);
                                         ArraySetAsSeries(maArray,true);
                                         int gatorDef=iGator(_Symbol,_Period,13,8,8,5,5,3,MODE_SMMA,PRICE_MEDIAN);
                                         int maDef=iMA(_Symbol,_Period,13,0,MODE_EMA,PRICE_CLOSE);
                                         int data=CopyRates(_Symbol,_Period,0,13,pArray);
                                         CopyBuffer(gatorDef,0,0,3,upGatorArray);
                                         CopyBuffer(gatorDef,2,0,3,downGatorArray);
                                         CopyBuffer(maDef,0,0,3,maArray);
                                         double gatorUpValue=NormalizeDouble(upGatorArray[0],6);
                                         double gatorUpPreValue1=NormalizeDouble(upGatorArray[1],6);
                                         double gatorUpPreValue2=NormalizeDouble(upGatorArray[2],6);
                                         double gatorDownValue=NormalizeDouble(downGatorArray[0],6);
                                         double gatorDownPreValue1=NormalizeDouble(downGatorArray[1],6);
                                         double gatorDownPreValue2=NormalizeDouble(downGatorArray[2],6);
                                         double maValue=NormalizeDouble(maArray[0],5);
                                         double closingPrice=pArray[0].close;
                                         bool douleGreen = gatorUpValue>gatorUpPreValue1&&gatorUpPreValue1>gatorUpPreValue2&&
                                                           gatorDownValue<gatorDownPreValue1&&gatorDownPreValue1<gatorDownPreValue2;
                                         bool douleRed = gatorUpValue<gatorUpPreValue1&&gatorUpPreValue1<gatorUpPreValue2&&
                                                         gatorDownValue>gatorDownPreValue1&&gatorDownPreValue1>gatorDownPreValue2;  
                                         if(douleGreen&&closingPrice>maValue)
                                           {
                                            Comment("Find a good buy position");
                                           }
                                         else
                                            if(douleRed&&closingPrice<maValue)
                                              {
                                               Comment("Find a good sell position");
                                              }
                                            else
                                               Comment("");
                                        }
                                      //+------------------------------------------------------------------+

                                      이 전략의 차이점:

                                      pArray와 maArray에 대해 두 개의 배열을 더 생성하고 가격 정보를 저장하기 위해 pArray에는 "MqlRates" 함수를, maArray에는 "double" 함수를 사용하겠습니다;

                                         MqlRates pArray[];
                                         double maArray[];

                                      "ArraySetAsSeries" 함수를 사용하여 maArray의 데이터를 정렬합니다;

                                      ArraySetAsSeries(maArray,true);

                                      maDef에 대한 정수 변수를 만들고 "iMA" 함수를 사용하여 지표 핸들 및 해당 매개 변수를 반환하는 이동 평균을 정의합니다:

                                      • symbol: 심볼 이름을 결정합니다. 현재 차트에 적용할 (_SYMBOL)을 결정합니다.
                                      • period: 기간을 결정하기 위해 현재 기간에 적용될 _PERIOD를 사용하며 동일한 기간에 대해 (PERIOD_CURRENT)를 설정할 수도 있습니다.
                                      • ma_period: 평균 기간을 결정하기 위해 (13)을 사용합니다. 
                                      • ma_shift: 필요한 경우 수평 이동을 결정합니다. MA를 이동할 필요가 없으므로 (0)으로 설정하겠습니다. 
                                      • ma_method: 이동 평균의 유형을 결정합니다. 우리는 EMA(지수 이동 평균)로 설정합니다. 
                                      • applied_price: 계산에 사용되는 가격의 유형을 결정합니다. 우리는 종가를 사용합니다.
                                      int maDef=iMA(_Symbol,_Period,13,0,MODE_EMA,PRICE_CLOSE);

                                      "CopyRates" 함수를 사용하여 MqlRates의 과거 데이터를 가져옵니다:

                                      • symbol_name: 심볼 이름을 결정합니다. 우리는 현재 심볼이 적용될 (_Symbol)을 사용합니다. 
                                      • timeframe: 차트 주기를 결정합니다. 우리는 현재 차트 주기를 사용합니다. 그러므로 (_Period)을 사용합니다. 
                                      • start_pos: 시작점 또는 포지션을 결정합니다. 현재 포지션에서 시작하기 위해 (0)을 사용합니다.
                                      • count: 복사할 개수를 결정합니다. 우리는 (13)을 사용합니다. 
                                      • rates_array[]: 복사할 배열의 대상을 결정합니다. 우리는 (pArray)를 사용합니다. 
                                      int data=CopyRates(_Symbol,_Period,0,13,pArray);

                                      maArray의 "CopyBuffer" 함수를 사용하여 데이터를 정의하고 결과를 저장합니다.

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

                                      현재 지수 이동 평균의 값을 가져와 정규화 합니다.

                                      double maValue=NormalizeDouble(maArray[0],5);

                                      종가의 현재 가치 가져오기.

                                      double closingPrice=pArray[0].close;

                                      게이터 오실레이터 지표의 이중 녹색 바와 이중 빨간색 바의 부울 변수를 생성합니다.

                                         bool douleGreen = gatorUpValue>gatorUpPreValue1&&gatorUpPreValue1>gatorUpPreValue2&&
                                                           gatorDownValue<gatorDownPreValue1&&gatorDownPreValue1<gatorDownPreValue2;
                                         bool douleRed = gatorUpValue<gatorUpPreValue1&&gatorUpPreValue1<gatorUpPreValue2&&
                                                         gatorDownValue>gatorDownPreValue1&&gatorDownPreValue1>gatorDownPreValue2; 

                                      전략의 조건:

                                      매수의 경우

                                         if(douleGreen&&closingPrice>maValue)
                                           {
                                            Comment("Find a good buy position");
                                           }

                                      매도의 경우

                                         else
                                            if(douleRed&&closingPrice<maValue)
                                              {
                                               Comment("Find a good sell position");
                                              }

                                      기타;

                                            else
                                               Comment("");

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

                                       MA 전략이 첨부된 게이터

                                      차트의 오른쪽 상단에 게이터 EA와 MA가 첨부되어 있습니다.

                                      이제 우리는 이 전략의 신호를 받을 준비가 되었으며 다음은 테스트에서 얻은 예시입니다;

                                      매수의 경우

                                       MA 전략 매수 신호가 있는 게이터

                                      왼쪽 상단 모서리에서 볼 수 있듯이 (좋은 매수 포지션) 신호가 있습니다.

                                      매도의 경우

                                      MA 전략 매도 신호가 있는 게이터

                                      보시다시피 (좋은 매도 포지션) 신호가 있음을 알 수 있습니다.

                                      이제 우리는 다양한 전략을 기반으로 거래 시스템을 만드는 방법을 배웠습니다. 이러한 접근 방식은 이 기사 및 시리즈의 주요 목표인 다양한 아이디어를 여러분이 적용할 수 있도록 도울 것입니다.


                                      결론

                                      이제 우리는 게이터 오실레이터 지표가 무엇인지 알아보고 지표를 계산하는 방법과 세 가지 간단한 거래 전략을 통해 사용하는 방법을 배우면서 게이터 오실레이터로 거래 시스템을 설계하는 방법을 안내하는 이 기사의 모든 주제를 다뤘습니다:

                                      • 게이터 상태 식별자: 이 전략은 다양한 조건에 따라 게이터 오실레이터의 상태(깨어 있음, 수면 중, 섭취 중, 포만감)를 결정합니다.
                                      • 게이터 신호: 게이터 오실레이터의 다양한 조건에 따라 적절한 결정 타이밍(좋은 진입, 현재 포지션 유지, 좋은 청산)에 대한 신호를 받습니다.
                                      • 게이터와 MA 전략: 이동평균 지표가 있는 게이터 오실레이터를 기반으로 매수 또는 매도 포지션의 타이밍을 알려주는 신호입니다.

                                      우리는 살펴본 모든 전략을 실행하는 트레이딩 시스템을 효과적이고 쉽게 만드는 데 도움이 되는 단계별 청사진을 만드는 방법을 배웠습니다. 그런 다음 MQL5 IDE에서 소스 코드를 생성하여 이러한 전략이 MetaTrader5 거래 플랫폼에서 실행될 수 있도록 하는 거래 시스템을 만들었습니다.

                                      이 기사가 여러분의 거래에서 더 나은 결과를 얻는 데 도움이 되었기를 바라며 이 기사가 거래 비즈니스에서 사용할 수 있는 새로운 접근 방식을 찾거나 이 기사의 주제 또는 관련 주제에 대한 더 많은 통찰력을 얻는 데 도움이 되었기를 바라며 유사한 기사를 더 읽고 싶다면 이 시리즈의 다른 기사들이 다루는 가장 인기있는 기술 지표를 기반으로 거래 시스템을 설계하는 방법을 배우는 방법에 대한 기사를 읽어 보시기 바랍니다.

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

                                      새로운 기능: MQL5의 커스텀 인디케이터 새로운 기능: MQL5의 커스텀 인디케이터
                                      MetaTrader5와 MQL5의 새로운 기능 전체를 나열하지는 않겠습니다. 종류도 많은 데다가, 별도의 설명이 필요한 기능들도 있거든요. 객체 지향 프로그래밍을 이용한 코드 작성법 또한 다음에 알아보도록 하겠습니다. 다른 기능들과 함께 설명하기에는 조금 어려운 이야기일 수 있으니까요. 이 글에서는 인디케이터와 인디케이터의 구조, 드로잉 타입과 프로그래밍 디테일을 MQL4와 비교해 볼게요. 초보자 분들께 많은 도움이 되면 좋겠고 기존에 사용하시던 개발자 분들도 뭔가 새로운 걸 얻어 가실 수 있길 바랍니다.
                                      MQL5에서 라인을 다루는 방법 MQL5에서 라인을 다루는 방법
                                      이 글에서는 추세선, 지지선, 저항선과 같은 가장 중요한 선을 MQL5로 다루는 방법을 알아보세요.
                                      새 MetaTrader 와 MQL5를 소개해드립니다 새 MetaTrader 와 MQL5를 소개해드립니다
                                      본 문서는 MetaTrader5의 간략 리뷰입니다. 짧은 시간 내에 시스템의 모든 세부 사항을 안내해드리기는 어렵습니다 - 테스트는 2009.09.09에 시작되었습니다. 이는 상징적인 일자로, 전 이것이 행운의 숫자가 될거라 믿어 의심치않습니다. 제가 새 MetaTrader 5 터미널과 MQL5 베타버전을 받은지 며칠이 지났습니다. 아직 모든 기능을 사용해본 것은 아니지만, 벌써부터 감명깊네요.
                                      Scikit-learn 라이브러리의 회귀 모델과 이 모델을 ONNX로 내보내기 Scikit-learn 라이브러리의 회귀 모델과 이 모델을 ONNX로 내보내기
                                      이 글에서는 Scikit-learn 패키지의 회귀 모델을 적용하고 이를 ONNX 형식으로 변환하고 결과 모델을 MQL5 프로그램 내에서 사용하는 방법에 대해 살펴봅니다. 또한 부동 소수점 및 배정밀도 모두에서 오리지널 모델의 정확도를 ONNX 버전과 비교할 것입니다. 이후 더 나아가 회귀 모델의 내부 구조와 작동 원리를 더 잘 이해하기 위해 회귀 모델의 ONNX 표현을 살펴볼 것입니다.