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

프랙탈로 트레이딩 시스템 설계하는 방법 알아보기

MetaTrader 5트레이딩 | 20 3월 2024, 12:54
230 0
Mohamed Abdelmaaboud
Mohamed Abdelmaaboud

소개

새로운 기사는 가장 인기 있는 기술 지표 중 하나인 프랙탈 지표를 기반으로 거래 시스템을 설계하는 방법을 알아보는 글 입니다. 우리는 다음의 주제를 통해 이 지표에 대해 자세히 알아볼 것입니다:

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

우리는 이 지표의 주요 개념을 이해하기 위해 이 지표가 무엇인지, 무엇을 측정하는지, 그리고 지표를 수동으로 계산하는 방법을 배울 것입니다. 우리는 이 지표의 기본 개념을 바탕으로 간단한 매매 전략을 통해 유리하게 작용하는 방법을 배울 것입니다. 이후 우리는 MetaTrader 5 거래 터미널에서 자동 신호를 생성하는 데 사용되는 전략을 기반으로 거래 시스템을 만들 것입니다.

우리는 MetaTrader 5 거래 터미널의 IDE에 내장된 MQL5(MetaQuotes Language 5)를 사용하여 코드를 작성할 것입니다. 여러분 중에 MetaTrader 5를 다운로드하고 사용하는 방법을 모르시는 경우 이전 글 MetaEditor에서 MQL5 코드 작성하기 에서 자세히 알아볼 수 있습니다. 저는 여러분이 코딩 실력을 향상시키고 싶다면 스스로 배운 내용을 적용해 볼 것을 권합니다.

이 기사의 주요 목적은 교육이기 때문에 언급된 전략을 실제 계정에서 사용하기 전에 테스트해야 합니다. 모든 사람에게 공통으로 맞는 것은 없습니다. 따라서 여러분은 이 글의 내용이 여러분의 거래에 적합한지 확인해야 합니다.

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

프랙탈 정의

프랙탈 지표는 Bill Williams가 개발했습니다. 이는 강세 또는 약세를 통해 가격의 잠재적 움직임을 예측하도록 설계되었습니다. 강세 신호는 잠재적인 상승세를 나타내지만 약세 신호는 잠재적인 하락세를 나타냅니다. 또한 이 지표는 차트의 최고점과 최저점을 예측하려고 한다고 할 수도 있습니다. 차트에서 가격 위와 아래에 생성된 화살표를 보면 이러한 신호를 볼 수 있습니다.

이 지표는 위쪽 프랙탈 화살표와 아래쪽 프랙탈 화살표라는 두 가지 다른 화살표를 생성합니다. 여러분이 이 두 개의 화살표를 계산하는 방법을 묻는다면 이 질문에 대한 답은 다음과 같습니다:

프랙탈 지표는 위 또는 아래 양방향으로 차트에 형성되는 특정한 가격의 움직임의 패턴이 필요합니다.

상승 프랙탈의 경우 가격의 움직임에서 다음이 필요합니다:

  • 5개 이상의 연속된 캔들 또는 바.
  • 가운데 캔들(세 번째 캔들)이 최고점입니다.
  • 이 고점의 양쪽에서 고점이 낮아집니다.
  • 다섯 번째 캔들이 이전과 동일한 조건으로 마감된 후 캔들(세 번째 캔들) 위에 위쪽 프랙탈 화살표가 형성됩니다.

하향 프랙탈의 경우 가격의 움직임에서 다음이 필요합니다:

  • 5개 이상의 연속된 캔들 또는 바.
  • 중간 캔들(세 번째 캔들)이 최저점입니다.
  • 이 저점의 양쪽에 더 높은 저점이 있습니다.
  • 이전과 동일한 조건으로 다섯 번째 캔들이 종료되면 캔들(세 번째 캔들) 아래에 하향 프랙탈 화살표가 형성됩니다.

다행스럽게도 MetaTrader 5에서는 프랙탈 지표가 준비되어 있으므로 차트에 프랙탈 지표를 그리기 위해 여러분이 이러한 단계를 수행할 필요가 없습니다. 사용 가능한 지표에서 프랙탈 지표를 선택하기만 하면 됩니다. MetaTrader 5 터미널을 열고 다음을 누르면 됩니다.

삽입 --> 지표 --> 빌 윌리엄스 --> 프랙탈

 Frac 삽입

프랙탈을 선택하면 다음과 같은 지표 매개변수 창이 열립니다.

 Frac 매개변수

1- 화살의 색상을 결정합니다.

2- 선의 두께를 결정합니다.

"확인"을 누르면 다음과 같이 EA가 차트에 첨부되어 있는 것을 확인할 수 있습니다:

 Frac 부착

보시다시피 캔들 위와 아래에는 가격의 잠재적인 움직임을 나타내는 화살표가 있습니다. 캔들 아래에는 잠재적인 상승 움직임을 나타내는 하향 화살표가 있고 캔들 위에는 잠재적인 하향 움직임을 나타내는 상향 화살표가 있습니다.

프랙탈 전략

우리는 이 기술 지표의 주요 개념을 바탕으로 한 간단한 전략을 만들어 보며 프랙탈 인디케이터를 활용하는 방법을 알아볼 것입니다. 우리는 프랙탈 지표 하나만 사용해 보고 그 다음 이를 다른 기술 지표와 함께 사용하여 더 많은 통찰력을 얻고 신호를 향상시키는 개념을 배워 볼 것입니다.

전략 1: 프랙탈의 고점과 저점

    이 전략에 따르면 우리는 프랙탈의 고점과 저점 위치를 기반으로 고점과 저점 신호를 얻어야 합니다. 지표가 아래쪽 화살표를 생성한 경우 이는 저점 신호가 됩니다. 프랙탈이 위쪽 화살표를 생성한 경우 이는 고점 신호가 됩니다.

    간단히 하면,

    아래쪽 화살표 -> 프랙탈 저점

    위쪽 화살표 -> 프랙탈 고점

    전략 2: MA를 사용한 프랙탈

      이 전략에 따르면 생성된 프랙탈 지표 신호 외에도 우리는 가격의 움직임의 방향과 이동 평균을 기반으로 매수 및 매도 신호를 얻어야 합니다. 종가가 이동 평균보다 높고 프랙탈 지표가 저점 화살표를 생성한 경우 이는 매수 신호가 됩니다. 종가가 이동평균보다 낮고 프랙탈 지표가 고점 화살표를 생성한 경우 이는 매도 신호가 됩니다.

      간단히 하면,

      종가 > MA 및 저점 화살표 생성 --> 매수 신호

      종가 < MA 및 고점 화살표 생성 --> 매도 신호

      전략 3: 앨리게이터와 프랙탈

        이 전략에 따르면 생성된 프랙탈 지표 신호 외에도 앨리게이터 지표를 사용하여 포지션에 따른 가격 움직임의 방향을 기반으로 매수 및 매도 신호를 얻어야 합니다. 앨리게이터의 입술 라인이 이빨과 턱 위에 있고 이빨 라인이 턱 위에 있고 종가가 이빨 위에 있고 프랙탈 지표 신호가 저점 화살표이면 매수 신호가 됩니다. 다른 시나리오에서는 입술 라인이 이빨과 턱보다 낮고 이빨이 턱보다 낮으며 종가가 이빨보다 낮고 프랙탈 신호가 고점 화살표이면 매도 신호가 됩니다.

        간단히 하면,

        입술 > 이빨과 턱, 이빨 > 턱, 종가 > 이빨, 그리고 프랙탈 신호는 저점 화살표 --> 매수 신호입니다.

        입술 < 치아와 턱, 치아 < 턱, 종가 < 치아, 프랙탈 신호는 고점 화살표 --> 매도 신호

        프랙탈 전략 청사진

        우리는 위에서 살펴본 단계별 청사진을 설계해 볼 것입니다. 그러면 우리의 트레이딩 아이디어를 정리하게 되며 이는 거래 시스템을 쉽게 만들 수 있도록 도와줍니다.

        1. 프랙탈의 고점과 저점

          이 전략을 기반으로 우리는 fracUpvalue 및 fracDownValue를 지속적으로 확인하여 Fractals 지표의 고점들과 저점들을 차트에 주석으로 반환하는 거래 시스템을 만들어야 합니다. fracUp이 0보다 크거나 빈 값이 없고 fracDown에 빈 값이 있는 경우 거래 시스템이 차트에 다음 값이 포함된 주석으로 신호를 반환해야 합니다:

            • 프랙탈 고점 주변: n

          또 다른 경우 fracDown이 0보다 크거나 빈 값이 없고 fracUp에 빈 값이 있으면 거래 시스템이 차트에 다음 값이 포함된 주석으로 신호를 반환해야 합니다:

            • 프랙탈 저점 주변: n

          다음은 이 전략의 청사진입니다:

          프랙탈 최고점 및 최저점 청사진

          2. MA를 사용한 프랙탈

            우리는 이 전략을 바탕으로 다음의 값들을 지속적으로 확인하여 차트에 매수 및 매도 신호를 코멘트로로 반환하는 거래 시스템을 만들어야 합니다.

              • 종가
              • 지수 이동 평균(EMA)
              • fracDown 값
              • fracUp 값

            종가가 EMA 값보다 크고 fracDown 값이 빈 값이 아닌 경우 거래 시스템이 다음 값을 반환해야 합니다.

              • 매수
              • 현재 EMA
              • 프랙탈 저점 값: n

            다른 경우 종가가 EMA 값보다 낮고 fracUp 값이 빈 값이 아닌 경우 않으면 거래 시스템이 다음 값을 반환해야 합니다.

              • 매도
              • 현재 EMA
              • 프랙탈 고점 값: n

            다음 그래프는 이 청사진을 표현한 것입니다:

            MA 청사진이 있는 Frac

            3. 앨리게이터와 프랙탈

              이 거래 전략을 바탕으로 우리는 다음 값들을 지속적으로 확인하여 매수 및 매도 신호를 생성하는 시스템을 구축해야 합니다.

                • 입술 값
                • 이빨 값
                • 턱 값
                • 종가
                • fracDown 값
                • fracUp 값

              입술 값이 이빨 값 및 턱 값보다 크고, 이빨 값이 턱 값보다 크고, 종가가 이빨 값보다 크고, fracDown 값이 빈 값이 아닌 경우 거래 시스템은 다음 값을 사용하여 차트에 코멘트를 반환해야 합니다:

                • 매수
                • 턱 값 = n
                • 이빨 값 = n
                • 입술 값 = n
                • 프랙탈 저가: n

              다른 경우, 입술 값이 치아 및 턱 값보다 낮고, 치아 라인이 턱 값보다 낮고, 종가가 치아보다 낮고, fracUp 값이 빈 값이 아닌 경우, 다음 값을 반환하는 거래 시스템이 필요합니다:

                • 매도
                • 턱 값 = n
                • 이빨 값 = n
                • 입술 값 = n
                • 프랙탈 고점 주변: n

              다음 그래프는 이 청사진을 표현한 것입니다:

              Alligator 청사진이 포함된 Frac

              프랙탈 거래 시스템

              이 주제에서 우리는 언급된 전략을 기반으로 거래 시스템을 생성하여 MetaTrader 5 터미널에서 실행하는 방법을 단계별로 학습합니다. 우리는 프랙탈 지표 값을 사용하여 차트에 주석을 반환하는 데 사용할 수 있는 간단한 프랙탈 시스템을 만들기 시작할 것이며 그 방법은 다음과 같습니다.

              double 함수를 사용하여 위아래로 프랙탈 배열을 만듭니다.

                 double fracUpArray[];
                 double fracDownArray[];

              "ArraySetAsSeries" 함수를 사용하여 데이터 정렬 매개변수는 다음과 같습니다:

              • array[]: 생성된 배열 fracUpArray 및 fracDownArray를 사용합니다.
              • flag: true를 사용합니다.
                 ArraySetAsSeries(fracUpArray,true);
                 ArraySetAsSeries(fracDownArray,true);

              프랙탈 지표의 핸들을 반환하는 "iFractals" 함수를 사용하여 프랙탈 지표를 정의합니다. 매개변수는 다음과 같습니다:

              • symbol: 현재 심볼에 적용하기 위해 (_Symbol)을 사용합니다.
              • period: 현재 차트 주기에 적용하기 위해 (_Period)를 사용합니다.
              int fracDef=iFractals(_Symbol,_Period);

              "CopyBuffer" 함수를 사용하여 데이터를 정의하고 결과를 저장합니다. 매개변수는 다음과 같습니다:

              • indicator_handle: 지표 핸들을 결정하기 위해 (alligatorDef)를 사용합니다.
              • buffer_num: 지표 버퍼 번호를 결정하기 위해 (fracUp의 경우 UPPER_LINE), (fracDown의 경우 LOWER_LINE)을 사용합니다.
              • start_pos: 시작 위치를 결정하기 위해 (1)을 결정합니다.
              • count: 복사할 양을 결정합니다. 우리는 (3)을 사용합니다.
              • buffer[]: 복사할 대상 배열을 정의하려면 (fracUpArray, fracDownArray)를 사용합니다.
                 CopyBuffer(fracDef,UPPER_LINE,2,1,fracUpArray);
                 CopyBuffer(fracDef,LOWER_LINE,2,1,fracDownArray);

              프랙탈 값을 위아래로 가져옵니다.

                 double fracUpValue=NormalizeDouble(fracUpArray[0],5);
                 double fracDownValue=NormalizeDouble(fracDownArray[0],5);

              fracUpValue 및 FaceDownValue에 대한 값이 비어 있는 경우 0 값을 반환합니다.

                 if(fracUpValue==EMPTY_VALUE)
                    fracUpValue = 0;
                 if(fracDownValue==EMPTY_VALUE)
                    fracDownValue = 0;

              "Comment" 함수를 사용하여 프랙탈 값을 차트에 코멘트로 반환합니다.

                 Comment("Fractals Up Value = ",fracUpValue,"\n",
                         "Fractals Down Value = ",fracDownValue);

              다음은 이 간단한 거래 시스템을 만드는 전체 코드입니다:

              //+------------------------------------------------------------------+
              //|                                       Simple Fractals 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()
                {
              //creating price array
                 double fracUpArray[];
                 double fracDownArray[];
              //Sorting data
                 ArraySetAsSeries(fracUpArray,true);
                 ArraySetAsSeries(fracDownArray,true);
              //define frac
                 int fracDef=iFractals(_Symbol,_Period);
              //define data and store result
                 CopyBuffer(fracDef,UPPER_LINE,2,1,fracUpArray);
                 CopyBuffer(fracDef,LOWER_LINE,2,1,fracDownArray);
              //get values of fracUp and fracDown
                 double fracUpValue=NormalizeDouble(fracUpArray[0],5);
                 double fracDownValue=NormalizeDouble(fracDownArray[0],5);
              //returning zero if there is empty value of fracUp
                 if(fracUpValue==EMPTY_VALUE)
                    fracUpValue = 0;
              //returning zero if there is empty value of fracDown
                 if(fracDownValue==EMPTY_VALUE)
                    fracDownValue = 0;
              //comment on the chart
                 Comment("Fractals Up Value = ",fracUpValue,"\n",
                         "Fractals Down Value = ",fracDownValue);
                }
              //+------------------------------------------------------------------+

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

               Frac Nav

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

               단순 Frac 시스템

              "알고 거래 허용" 옆을 체크한 후 "확인"을 누르면 다음과 같이 EA가 차트에 첨부된 것을 확인할 수 있습니다:

              Simple Frac System 부착

              차트의 오른쪽 상단에서 볼 수 있듯이 EA가 연결되어 있으며 이는 우리가 원하는 신호를 수신할 준비가 되었다는 것을 알려줍니다. 다음은 테스트의 예입니다.

               단순 Frac 시스템 신호

              왼쪽 상단에서 볼 수 있듯이 다음과 같은 두 값이 있습니다:

              • Fractals Up Value = n
              • Fractals Down Value = 0

              그리고 Fractals up에 값이 있으므로 Fractals Down 값이 0이라는 것은 분명합니다.

               단순 Frac 시스템 신호 2

              우리는 두 값을 가지고 있습니다:

              • Fractals Up Value = 0
              • Fractals Down Value = n

              여기서 Fractals Down 값이 있으므로 Fractals Up Value는 0입니다.

              1. 프랙탈의 고점과 저점

                다음은 프랙탈 고점 저점 거래 시스템을 생성하기 위한 전체 코드 입니다.

                //+------------------------------------------------------------------+
                //|                                      Fractals highs and lows.mq5 |
                //|                                  Copyright 2022, MetaQuotes Ltd. |
                //|                                             https://www.mql5.com |
                //+------------------------------------------------------------------+
                #property copyright "Copyright 2022, MetaQuotes Ltd."
                #property link      "https://www.mql5.com"
                #property version   "1.00"
                //+------------------------------------------------------------------+
                void OnTick()
                  {
                //creating arrays
                   double fracUpArray[];
                   double fracDownArray[];
                //Sorting data
                   ArraySetAsSeries(fracUpArray,true);
                   ArraySetAsSeries(fracDownArray,true);
                //define frac
                   int fracDef = iFractals(_Symbol,_Period);
                //define data and store result
                   CopyBuffer(fracDef,UPPER_LINE,2,1,fracUpArray);
                   CopyBuffer(fracDef,LOWER_LINE,2,1,fracDownArray);
                //define values
                   double fracUpValue = NormalizeDouble(fracUpArray[0],5);
                   double fracDownValue = NormalizeDouble(fracDownArray[0],5);
                //returning zero in case of empty values
                   if(fracUpValue ==EMPTY_VALUE)
                      fracUpValue = 0;
                   if(fracDownValue ==EMPTY_VALUE)
                      fracDownValue = 0;
                //conditions of the strategy and comment on the chart with highs and lows
                //in case of high
                   if(fracUpValue>0)
                     {
                      Comment("Fractals High around: ",fracUpValue);
                     }
                //in case of low
                   if(fracDownValue>0)
                     {
                      Comment("Fractals Low around: ",fracDownValue);
                     }
                  }
                //+------------------------------------------------------------------+

                이 코드의 차이점.

                전략의 조건:

                고점의 경우:

                   if(fracUpValue>0)
                     {
                      Comment("Fractals High around: ",fracUpValue);
                     }

                저점의 경우:

                   if(fracDownValue>0)
                     {
                      Comment("Fractals Low around: ",fracDownValue);
                     }

                이 코드를 컴파일하고 이전과 같이 차트에 첨부하면 프랙탈 고점과 저점 EA가 다음과 같이 첨부됩니다.

                 프랙탈 최고점 및 최저점 첨부

                이제 우리는 고점과 저점에 대해 원하는 결과를 얻을 수 있습니다. 저점의 경우:

                 프랙탈 최고 및 최저 - 낮은 신호

                왼쪽 위 모서리에 있는 이전 차트에서 프랙탈 지표가 저점을 형성한 것을 볼 수 있습니다. 그러므로 프랙탈 값도 낮다는 것을 볼 수 있습니다.

                고점의 경우:

                프랙탈 최고 및 최저 - 높은 신호

                보시다시피 지표가 차트에서 고점을 형성함에 따라 프랙탈의 고가가 형성된 것을 알 수 있습니다.

                2. MA를 사용한 프랙탈

                  다음은 이 거래 전략을 사용한 거래 시스템을 생성하는 전체 코드입니다.

                  //+------------------------------------------------------------------+
                  //|                                             Fractals with MA.mq5 |
                  //|                                  Copyright 2022, MetaQuotes Ltd. |
                  //|                                             https://www.mql5.com |
                  //+------------------------------------------------------------------+
                  #property copyright "Copyright 2022, MetaQuotes Ltd."
                  #property link      "https://www.mql5.com"
                  #property version   "1.00"
                  //+------------------------------------------------------------------+
                  void OnTick()
                    {
                  //creating arrays
                     double fracUpArray[];
                     double fracDownArray[];
                     MqlRates priceArray[];
                     double maArray[];
                  //Sorting data
                     ArraySetAsSeries(fracUpArray,true);
                     ArraySetAsSeries(fracDownArray,true);
                     ArraySetAsSeries(priceArray,true);
                     ArraySetAsSeries(maArray,true);
                  //define values
                     int fracDef = iFractals(_Symbol,_Period);
                     int Data = CopyRates(_Symbol,_Period,0,3,priceArray);
                     int maDef = iMA(_Symbol,_Period,50,0,MODE_EMA,PRICE_CLOSE);
                  //define data and store result
                     CopyBuffer(fracDef,UPPER_LINE,2,1,fracUpArray);
                     CopyBuffer(fracDef,LOWER_LINE,2,1,fracDownArray);
                     CopyBuffer(maDef,0,0,3,maArray);
                  //get values
                     double fracUpValue = NormalizeDouble(fracUpArray[0],5);
                     double fracDownValue = NormalizeDouble(fracDownArray[0],5);
                     double closingPrice = priceArray[0].close;
                     double maValue = NormalizeDouble(maArray[0],6);
                     bool isBuy = false;
                     bool isSell = false;
                  //conditions of the strategy and comment on the chart
                  //in case of buy
                     if(closingPrice > maValue && fracDownValue != EMPTY_VALUE)
                       {
                        Comment("Buy","\n",
                                "Current EMA: ",maValue,"\n",
                                "Fractals Low around: ",fracDownValue);
                        isBuy = true;
                       }
                  //in case of sell
                     if(closingPrice < maValue && fracUpValue != EMPTY_VALUE)
                       {
                        Comment("Sell","\n",
                                "Current EMA: ",maValue,"\n",
                                "Fractals High around: ",fracUpValue);
                        isSell = true;
                       }
                    }
                  //+------------------------------------------------------------------+

                  이 코드의 차이점.

                  "MqlRates" 함수를 사용하여 가격, 거래량, 스프레드에 대한 정보를 저장하고 "double" 함수를 사용하여 maArray 배열을 두 개 더 생성합니다.

                     MqlRates priceArray[];
                     double maArray[];

                  이 두 배열의 데이터를 정렬합니다.

                     ArraySetAsSeries(priceArray,true);
                     ArraySetAsSeries(maArray,true);

                  "CopyRates"를 사용하여 MqlRates의 히스토리 데이터를 가져옵니다. 매개변수는 다음과 같습니다:

                  • symbol_name: 심볼 이름을 결정하기 위해 (_Symbol)을 사용합니다.
                  • timeframe: 차트 주기를 결정하기 위해 (_period)를 사용합니다.
                  • start_pos: 시작 위치를 결정하기 위해 (0)을 사용합니다.
                  • count: 복사할 데이터 개수를 결정합니다. (3)을 사용합니다.
                  • rates_array[]: 복사할 대상 배열을 결정하기 위해 (pArray)를 사용합니다.

                  "iMA" 함수를 사용하여 이동 평균을 정의합니다. 매개변수:

                  • 심볼: 심볼 이름을 결정합니다.
                  • period: 기간을 결정합니다.
                  • ma_period: 평균 기간을 결정합니다. 우리는 (50)를 사용합니다.
                  • ma_shift: 수평 이동을 결정합니다. 우리는 (0)을 사용합니다.
                  • ma_method를 사용하여 이동 평균의 유형을 결정합니다. 우리는 지수 이동 평균(EMA)을 사용합니다.
                  • apply_price: 가격 유형을 결정합니다. 우리는 종가를 사용합니다.
                     int Data = CopyRates(_Symbol,_Period,0,3,priceArray);
                     int maDef = iMA(_Symbol,_Period,50,0,MODE_EMA,PRICE_CLOSE);

                  데이터 정렬.

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

                  종가와 MA 값을 정의합니다.

                  double closingPrice = priceArray[0].close;
                  double maValue = NormalizeDouble(maArray[0],6);

                  동일한 캔들의 매수 및 매도 신호 간의 충돌을 피하기 위해 isBuy 및 isSell에 대한 두 개의 bool 변수를 생성합니다.

                     bool isBuy = false;
                     bool isSell = false;

                  전략의 조건.

                  매수 신호의 경우:

                     if(closingPrice > maValue && fracDownValue != EMPTY_VALUE)
                       {
                        Comment("Buy","\n",
                                "Current EMA: ",maValue,"\n",
                                "Fractals Low around: ",fracDownValue);
                        isBuy = true;
                       }

                  매도 신호의 경우:

                     if(closingPrice < maValue && fracUpValue != EMPTY_VALUE)
                       {
                        Comment("Sell","\n",
                                "Current EMA: ",maValue,"\n",
                                "Fractals High around: ",fracUpValue);
                        isSell = true;
                       }

                  이 코드를 컴파일하고 실행하면 EA가 첨부됩니다.

                   MA가 부착된 Frac

                  보시다시피 MA가 있는 Fractals의 EA가 차트 오른쪽 상단에 첨부되어 있습니다. 다음 예와 같이 우리는 원하는 신호를 수신할 것입니다:

                  매수 신호의 경우:

                   MA가 있는 Frac - 매수 신호

                  차트에 다음과 같은 값의 코멘트가 있는 것을 볼 수 있습니다:

                  • 매수
                  • 현재 EMA
                  • 프랙탈 저가: n

                  매도 신호의 경우:

                   MA가 있는 Frac - 매도 신호

                  다음과 같은 데이터가 있다고 가정합니다:

                  • 매도
                  • 현재 EMA
                  • 프랙탈 고점 주변: n

                  3. 앨리게이터와 프랙탈

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

                    //+------------------------------------------------------------------+
                    //|                                      Fractals with Alligator.mq5 |
                    //|                                  Copyright 2022, MetaQuotes Ltd. |
                    //|                                             https://www.mql5.com |
                    //+------------------------------------------------------------------+
                    #property copyright "Copyright 2022, MetaQuotes Ltd."
                    #property link      "https://www.mql5.com"
                    #property version   "1.00"
                    //+------------------------------------------------------------------+
                    void OnTick()
                      {
                    //creating arrays
                       double fracUpArray[];
                       double fracDownArray[];
                       MqlRates priceArray[];
                       double jawsArray[];
                       double teethArray[];
                       double lipsArray[];
                    //Sorting data
                       ArraySetAsSeries(fracUpArray,true);
                       ArraySetAsSeries(fracDownArray,true);
                       ArraySetAsSeries(jawsArray,true);
                       ArraySetAsSeries(teethArray,true);
                       ArraySetAsSeries(lipsArray,true);
                    //define values
                       int fracDef=iFractals(_Symbol,_Period);
                       int Data = CopyRates(_Symbol,_Period,0,3,priceArray);
                       int alligatorDef=iAlligator(_Symbol,_Period,13,8,8,5,5,3,MODE_SMMA,PRICE_MEDIAN);
                    //define data and store result
                       CopyBuffer(fracDef,UPPER_LINE,2,1,fracUpArray);
                       CopyBuffer(fracDef,LOWER_LINE,2,1,fracDownArray);
                       CopyBuffer(alligatorDef,0,0,3,jawsArray);
                       CopyBuffer(alligatorDef,1,0,3,teethArray);
                       CopyBuffer(alligatorDef,2,0,3,lipsArray);
                    //get values
                       double fracUpValue=NormalizeDouble(fracUpArray[0],5);
                       double fracDownValue=NormalizeDouble(fracDownArray[0],5);
                       double closingPrice = priceArray[0].close;
                       double jawsValue=NormalizeDouble(jawsArray[0],5);
                       double teethValue=NormalizeDouble(teethArray[0],5);
                       double lipsValue=NormalizeDouble(lipsArray[0],5);
                    //creating bool variables to aviod buy ans sell signals at the same time
                       bool isBuy = false;
                       bool isSell = false;
                    //conditions of the strategy and comment on the chart
                    //in case of buy
                       if(lipsValue>teethValue && lipsValue>jawsValue && teethValue>jawsValue
                       && closingPrice > teethValue && fracDownValue != EMPTY_VALUE)
                         {
                          Comment("Buy","\n",
                                  "jawsValue = ",jawsValue,"\n",
                                  "teethValue = ",teethValue,"\n",
                                  "lipsValue = ",lipsValue,"\n",
                                  "Fractals Low around: ",fracDownValue);
                          isBuy = true;
                         }
                    //in case of sell
                       if(lipsValue<teethValue && lipsValue<jawsValue && teethValue<jawsValue
                       && closingPrice < teethValue && fracUpValue != EMPTY_VALUE)
                         {
                          Comment("Sell","\n",
                                  "jawsValue = ",jawsValue,"\n",
                                  "teethValue = ",teethValue,"\n",
                                  "lipsValue = ",lipsValue,"\n",
                                  "Fractals High around: ",fracUpValue);
                          isSell = true;
                         }
                      }
                    //+------------------------------------------------------------------+

                    이 코드의 차이점.

                    앨리게이터 요소의 세 가지 배열을 만듭니다.

                       double jawsArray[];
                       double teethArray[];
                       double lipsArray[];

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

                       ArraySetAsSeries(jawsArray,true);
                       ArraySetAsSeries(teethArray,true);
                       ArraySetAsSeries(lipsArray,true);

                    "iAlligator" 함수를 사용하여 앨리게이터 정의. 매개변수:

                    • 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_SMA)를 사용합니다.
                    • applied_price: 가격의 유형을 결정하기 위해 (PRICE_MEDIAN)을 사용합니다.
                    int alligatorDef=iAlligator(_Symbol,_Period,13,8,8,5,5,3,MODE_SMMA,PRICE_MEDIAN);

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

                    • indicator_handle: 지표 핸들을 결정하기 위해 (alligatorDef)를 사용합니다.
                    • buffer_num: 지표 버퍼 번호를 결정하기 위해 (턱의 경우 0), (이빨의 경우 1), (입술의 경우 2)를 사용합니다.
                    • start_pos: 시작 위치를 결정하기 위해 (0)을 결정합니다.
                    • count: 복사할 양을 결정합니다. 우리는 (3)을 사용합니다.
                    • buffer[]: 복사할 대상 배열을 결정하기 위해 (jawsArray, teethArray, lipsArray)를 사용합니다.
                       CopyBuffer(alligatorDef,0,0,3,jawsArray);
                       CopyBuffer(alligatorDef,1,0,3,teethArray);
                       CopyBuffer(alligatorDef,2,0,3,lipsArray);

                    Alligator 구성 요소의 값을 가져옵니다.

                       double jawsValue=NormalizeDouble(jawsArray[0],5);
                       double teethValue=NormalizeDouble(teethArray[0],5);
                       double lipsValue=NormalizeDouble(lipsArray[0],5);

                    전략의 조건:

                    매수 신호의 경우:

                       if(lipsValue>teethValue && lipsValue>jawsValue && teethValue>jawsValue
                       && closingPrice > teethValue && fracDownValue != EMPTY_VALUE)
                         {
                          Comment("Buy","\n",
                                  "jawsValue = ",jawsValue,"\n",
                                  "teethValue = ",teethValue,"\n",
                                  "lipsValue = ",lipsValue,"\n",
                                  "Fractals Low around: ",fracDownValue);
                          isBuy = true;
                         }

                    매도 신호의 경우:

                       if(lipsValue<teethValue && lipsValue<jawsValue && teethValue<jawsValue
                       && closingPrice < teethValue && fracUpValue != EMPTY_VALUE)
                         {
                          Comment("Sell","\n",
                                  "jawsValue = ",jawsValue,"\n",
                                  "teethValue = ",teethValue,"\n",
                                  "lipsValue = ",lipsValue,"\n",
                                  "Fractals High around: ",fracUpValue);
                          isSell = true;
                         }

                    이 코드를 컴파일하고 터미널에서 Expert를 실행하면 우리는 다음과 같이 Expert가 차트에 첨부되는 것을 확인할 수 있습니다.

                     악어가 부착된 Frac

                    오른쪽 상단에서 이전 차트와 마찬가지로 이 EA가 차트에 첨부된 것을 찾을 수 있습니다. 이제 우리는 이 전략을 기반으로 원하는 신호를 얻을 수 있습니다.

                    다음은 테스트에서 얻은 신호의 예입니다:

                    매수신호의 경우

                     악어가 있는 Frac - 신호 구매

                    차트 왼쪽 상단에서 우리는 다음과 같은 값을 볼수 있습니다:

                    • 매수
                    • 턱 값
                    • 이빨 값
                    • 입술 값
                    • 프랙탈 저점 값

                     악어가 있는 Frac - 신호 매도

                    이전 차트에서 다음과 같은 값이 신호로 표시됩니다:

                    • 매도
                    • 턱 값
                    • 이빨 값
                    • 입술 값
                    • 프랙탈 고점 값


                    결론

                    프랙탈 기술 지표는 우리가 이 기사에서 배운 것과 같이 유용한 통찰력을 제공합니다. 이 지표는 우리가 독립형 도구로 사용하거나 다른 기술 지표와 함께 사용하는 경우에도 유용하고 효과적인 거래 도구입니다. 여러분은 이 지표가 무엇인지, 무엇을 측정하는지, 계산 방법은 어떠한지 등을 알아보며 차트에 어떻게 형성되는지, MetaTrader 5 터미널에 표시되도록 내장된 지표를 삽입하는 방법을 배웠습니다. 그 외에도 여러분은 다음과 같은 간단한 거래 전략을 통해 이를 사용하는 방법을 배웠습니다.

                    • 프랙탈 고점 및 저점: 프랙탈 지표의 고점 및 저점을 감지하고 이를 통해 차트에 신호를 표시합니다.
                    • MA를 사용한 프랙탈: 가격 위치 및 이동 평균에 따라 생성된 프랙탈 신호를 기반으로 매수 및 매도 신호를 얻습니다.
                    • 앨리게이터를 이용한 프랙탈: 가격 위치와 앨리게이터 지표에 따라 프랙탈 신호를 기반으로 매매 신호를 얻습니다.

                    우리는 또한 MQL5로 이러한 전략을 코딩하여 MetaTrader 5 차트에서 자동으로 신호를 얻기 위해 언급된 각 전략을 기반으로 거래 시스템을 만드는 방법도 배웠습니다. 여러분이 이 글의 주제 또는 관련 주제에 대한 깊은 이해와 더 많은 통찰력을 얻고 이 글을 읽으면서 많은 것을 얻을 수 있도록 스스로 적용해 보시길 바랍니다.

                    언급된 전략을 실제 계정에서 사용하기 전에 테스트하여 수익성이 있는지 확인해야 함을 다시 한 번 강조합니다. 이 기사가 여러분에게 도움이 되기를 바라며 귀하의 거래 결과를 향상시킬 수 있는 새로운 내용을 배웠기를 바랍니다. 다른 좋은 기사를 읽어 보시려면 가장 인기 있는 기술 지표를 기반으로 거래 시스템을 설계하는 방법에 대한 시리즈의 다른 기사를 읽어 보시기 바랍니다.

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

                    Expert Advisor 개발 기초부터(26부): 미래를 향해(I) Expert Advisor 개발 기초부터(26부): 미래를 향해(I)
                    오늘은 주문 시스템을 한 단계 더 발전시켜 보겠습니다. 하지만 그 전에 우리는 몇 가지 문제를 해결해야 합니다. 우리가 어떻게 하고 싶은지, 거래일 동안 우리가 어떤 일을 할 것인지와 관련된 몇 가지 질문이 있습니다.
                    모집단 최적화 알고리즘: 침입성 잡초 최적화(IWO) 모집단 최적화 알고리즘: 침입성 잡초 최적화(IWO)
                    다양한 조건에서 살아남는 잡초의 놀라운 능력은 강력한 최적화 알고리즘을 만들기 위한 아이디어가 되었습니다. IWO는 앞서 검토한 알고리즘 중 가장 우수한 알고리즘 중 하나입니다.
                    트레이딩 전문가 어드바이저를 처음부터 개발하기(27부): 다음을 향해(II) 트레이딩 전문가 어드바이저를 처음부터 개발하기(27부): 다음을 향해(II)
                    차트에서 좀 더 완전한 주문 시스템을 살펴보겠습니다. 이 글에서는 주문 시스템을 수정하거나 오히려 더 직관적으로 만드는 방법을 보여드리겠습니다.
                    클래스에서 ONNX 모델 래핑하기 클래스에서 ONNX 모델 래핑하기
                    객체 지향 프로그래밍을 사용하면 읽기 쉽고 수정하기 쉬운 보다 간결한 코드를 작성할 수 있습니다. 여기서는 세개의 ONNX 모델에 대한 예제를 살펴보겠습니다.