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

피보나치 트레이딩 시스템 설계하는 방법 알아보기

MetaTrader 5트레이딩 |
783 4
Mohamed Abdelmaaboud
Mohamed Abdelmaaboud

소개

가장 인기 있는 기술적 분석 도구와 보조지표를 기반으로 트레이딩 시스템을 설계하는 방법을 배우는 시리즈의 이번 글에서 우리는 트레이딩에서 가장 인기 있고 널리 사용되는 피보나치 되돌림 기술 도구를 기반으로 트레이딩 시스템을 만드는 방법을 알아볼 것입니다. 이 후 여러분은 MetaTrader 5 트레이딩 터미널에서 이 트레이딩 시스템을 사용할 수 있습니다. 여기서 우리는 MetaTrader 5에 내장된 IDE인 MQL5(MetaQuotes Language 5)를 사용할 것입니다. MetaTrader 5 및 MQL5 IDE를 다운로드하고 사용하는 방법을 알아보려면 이전 글에서 MetaEditor에서 MQL5 코드 작성하기 항목을 읽어 보시기 바랍니다.

우리가 다룰 주제는 다음과 같습니다:

이 피보나치를 추세 분석, 지지, 저항 등과 같은 다른 기술적 도구와 함께 사용하면 더 나은 통찰력과 결과를 얻을 수 있다는 점을 알려드리고 싶습니다. 또한 이 글이나 다른 곳에서 배운 전략이나 도구를 실제 거래에 사용하기 전에 여러분은 반드시 테스트하여 거래에 유용하고 수익성이 있는지 확인해야 합니다. 이 단계는 프로그래밍 기술 개발자에게 매우 유익하므로 읽은 내용을 직접 적용하고 코딩해 보는 것이 좋습니다.

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


피보나치 정의

이 섹션에서는 피보나치 되돌림 도구에 대해 알아보고 차트에서 이 도구를 사용하는 방법을 알아보겠습니다. 피보는 차트에서 지지 또는 저항 영역을 찾는 데 사용할 수 있는 기술적 도구로 우리는 이러한 영역에서 가격의 변동을 기대할 수 있습니다. 이 지표는 수학적 수열인 피보나치 수열을 기반으로 합니다. 이 수열의 각 숫자는 이전 두 숫자의 합입니다. 23.6%, 38.2%, 50%, 61.8%와 같은 특정 레벨에서 수평선으로 그려지며 이 레벨들이 가장 많이 사용되는 레벨들입니다.

이 지표를 차트에서 어떻게 찾을 수 있는지 물어보신다면 그 대답은 MetaTrader 5의 기술 도구에서 삽입하기만 하면 된다는 것입니다. 그 단계는 다음과 같습니다:

MetaTrader 5를 여는 동안 삽입 탭 --> 객체 --> 피보나치 되돌림으로 이동합니다.

피보 인서트

그 후 상승 추세 후 되돌림이 있으면 저점에서 고점으로, 반대로 하락 추세 후 되돌림이 있으면 다음과 같이 고점에서 저점으로 그립니다.

상승 추세 이후의 FIBO:

 피보 인서트 강세

하락 추세 이후의 FIBO:

피보 인서트 약세

이전의 예제에서 볼 수 있듯이 23.6, 38.2, 50, 61.8의 특정 레벨을 가진 수평선과 더불어 가장 높은 값과 가장 낮은 값의 두 지점 사이에 추세선이 그려져 있습니다. 이들 레벨이 가장 인기 있는 레벨입니다. 이 가격대를 전후해 상승 추세 또는 하락 추세 이후에는 조정 또는 되돌림이 일어나며 조정 후에는 이 가격대에서 반등을 기대할 수 있습니다. 따라서 FIBO 레벨은 지지 또는 저항 레벨로 작용될 수 있는 것입니다.

그리기 도구를 마우스 오른쪽 버튼으로 클릭하거나 메뉴에서 객체 목록을 선택한 다음 피보 객체를 선택하면 이 도구의 창을 통해 이러한 레벨을 제어할 수도 있습니다. 창은 다음과 같이 열립니다:

Fibo1

우리는 이전 공통 탭에서 객체의 이름과 색상, 선 유형, 두께와 같은 스타일을 제어할 수 있습니다.

피보 2

이전 그림에서 볼 수 있듯이 우리는 원하는 레벨 설정과 스타일을 제어하고 결정할 수 있습니다.

피보 3

매개변수 탭에서 볼 수 있듯이 우리는 피보나치 객체의 시작 날짜, 시간, 값과 종료 날짜, 시간, 값을 결정할 수 있습니다.


피보나치 전략

이번 파트에서는 두 가지 접근법을 기반한 간단한 전략을 통해 피보나치 되돌림을 사용하는 방법을 알아보겠습니다. 그 중 하나는 일일 마지막 바를 기준으로 FIBO 레벨을 결정하는 것이고 두 번째는 특정 기간 동안의 바 수를 결정하고 이를 기준으로 FIBO 레벨을 결정하는 것입니다. 그런 다음 또 다른 전략을 함께 사용하여 각각의 접근 방식에 따라 미리 정해진 특정 FIBO 수준을 기반으로 매수 또는 매도 신호를 얻으며 다음은 이러한 전략에 대한 자세한 내용입니다.

첫 번째 접근 방식입니다: 일일 데이터 사용:

간단한 FIBO 시스템:

이 전략에 따라 우리는 일일 바 데이터와 상태를 기반으로 FIBO 되돌림 가격 수준을 얻어야 합니다. 마지막 일일 바이 강세인 경우 바의 저점에서 고점까지 강세 FIBO와 각 레벨의 가격 수준을 얻어야 합니다. 마지막 일일 바이 약세인 경우 이 바의 고점에서 저점까지 빨간색 약세 FIBO와 이 FIBO의 가격 수준을 얻어야 합니다.

간단히 하면,

전일 종가 > 시가 ==> 상승 바

녹색 FIBO 레벨과 각 레벨의 가격을 가져옵니다.  

전일 종가 < 시가 ==> 약세 바

빨간색 FIBO 레벨과 각 레벨의 가격을 가져옵니다.

FIBO 신호:

이 전략에 따라 우리는 강세 또는 약세 FIBO 레벨로 판단하고 이 판단에 따라 매수 및 매도 진입을 해야 합니다. 강세 이평선이 38.2로 결정되었다면 이 가격대를 매수 진입으로, 약세 이평선이 같은 수준으로 결정되었다면 이 가격대를 매도 진입으로 가져와야 합니다.

두 번째 접근 방식: 특정 바 배열을 사용합니다:

간단한 FIBO 시스템 2:

이 전략에 따라 바 배열을 기준으로 FIBO 가격 수준을 얻고 배열의 방향에 따라 강세 FIBO가 있으면 그에 해당하는 FIBO 가격 수준을 얻고 약세 FIBO가 있으면 그에 해당하는 FIBO 가격 수준을 얻어야 합니다.

간단히 하면,

배열의 첫 번째 바 시가 < 같은 배열의 마지막 바 종가 ==> 강세 피보, 우리는 이 강세 피보의 가격 수준을 구해야 합니다.

배열의 첫 번째 바 시가 > 같은 배열의 마지막 바 종가 ==> 약세 피보, 우리는 이 약세 피보의 가격 수준을 구해야 합니다.

FIBO 신호 2: 

이 전략에 따라 원하는 FIBO 레벨의 사용자가 입력한 값에 따라 매수 또는 매도 항목을 엔트리 레벨로 가져와야 합니다. 이 접근법에 따라 앞서 살펴본 내용을 바탕으로 강세 피보가 있다면 특정 피보 레벨의 매수 진입 레벨을 얻어야 합니다. 약세 피보가 있는 경우에는 특정 피보 레벨의 매도 진입 레벨을 가져와야 합니다.


피보나치 전략 청사진

이 부분에서는 위에서 살펴본 두 가지 접근 방식의 각각의 전략에 대한 청사진을 살펴보고 무엇을 해야 하는지 시각적인 방식으로 이해해 보겠습니다.

첫 번째 접근 방식: 일일 데이터 사용:

여기서 언급했듯이 일일 마지막 바를 사용하여 이 바의 시가, 종가, 고가, 저가를 결정합니다. 시가와 종가를 비교하면 상승 바인지 하락 바인지 확인할 수 있습니다. 이 마지막 일일 바의 움직임 유형에 따라 피보나치 객체를 그려 원하는 신호를 얻습니다.

간단한 FIBO 시스템:

간단한 피보 시스템 청사진

FIBO 신호:

피보 신호 청사진

두 번째 접근 방식: 특정 바의 배열을 사용:

앞서 언급했듯이 배열에 특정한 개수의 바를 사용하고 첫 번째 바의 시초가, 마지막 바의 종가, 최고값, 최저값을 결정합니다. 시가와 종가를 비교하면 상승 바인지 하락 바인지 확인할 수 있습니다. 이 배열의 움직임의 유형에 따라 피보나치 객체를 그려서 원하는 신호를 얻습니다.

간단한 FIBO 시스템 2:

간단한 피보 시스템 2

FIBO 신호 2:

피보 시그널 2 청사진

피보나치 트레이딩 시스템

이번 파트에서는 앞서 설명한 내용을 바탕으로 트레이딩 시스템을 만드는 방법에 대해 알아보겠습니다. 차트에서 피보나치 레벨을 코멘트로 반환할 수 있는 프로그램을 만들겠습니다. 첫 번째는 마지막 일일 데이터를 사용하여 이를 기반으로 피보나치 레벨을 그리는 것이고 다른 하나는 미리 정해진 수의 바를 사용하여 이를 배열로 사용하는 것입니다. 또한 이 두 가지 접근법을 사용하여 피보나치에 기반한 매수 및 매도 신호를 반환하는 방법에 대해 자세히 살펴 보겠습니다.

첫 번째 접근 방식입니다: 일일 데이터 사용:

간단한 FIBO 시스템:

이 전략에 따르면 우리는 피보나치 시스템에 사용할 일일 데이터를 사용하며 이를 위한 단계는 다음과 같습니다:

컴파일하기 전에 매크로 대체(#define)를 사용하여 필요한 객체 이름을 정의하여 소스 코드를 사전 처리합니다.

#define FIB_OBJ "Fibonacci Retracement"

barsTotal에 대한 정수 변수 만들기.

int barsTotal;

그 후 onTick에서 iBar 함수를 할당하여 바에 대한 정수 변수를 생성하여 심볼의 사용 가능한 과거 바의 수를 반환합니다. 매개변수는 다음과 같습니다:

  • symbol: 원하는 심볼을 결정합니다. 우리는 현재 심볼을 나타내는 _Symbol을 사용합니다.
  • timeframe: 기간을 결정합니다. 우리는 일별 차트인 D1을 사용합니다.
int bars = iBars(_Symbol, PERIOD_D1);

우리가 피보나치에 사용할 일일 바를 감지하기 위해서는 (!=) 연산자를 사용하여 barsTotal이 bars와 같지 않아야 하고 동시에 현재 시간이 이 일일 바의 종료 시간보다 커야 합니다. 따라서 우리는 시간이 포함된 문자열을 날짜/시간 유형의 숫자로 변환하기 위해 TimeCurrent 함수와 StringToTime 함수를 사용합니다.

if(barsTotal != bars  && TimeCurrent() > StringToTime("00:05"))

이 조건이 참이면 프로그램에서 다음을 수행해야 합니다:

바를 barsTotal에 할당합니다.

barsTotal=bars;

ObjectDelete 함수와 그 매개 변수를 사용하여 차트에서 FIB_OBJ를 삭제합니다:

  • chart_id: 차트 식별자를 결정합니다. 우리는 현재 차트를 의미하는 (0)을 사용합니다. 
  • name: 객체 이름(FIB_OBJ)을 결정합니다.
ObjectDelete(0,FIB_OBJ);

일일 바의 가격을 반환하는 iOpen, iClose, iHigh, iLow 함수를 사용하여 네 가지 가격 변수(시가, 종가, 고가, 저가)를 생성합니다. 해당 매개 변수는 다음과 같습니다:

  • symbol: 원하는 심볼을 결정합니다. 우리는 현재 심볼에 사용할 _Symbol을 사용합니다.
  • timeframe: 원하는 시간 프레임을 결정합니다. 우리는 일일 시간 프레임에 사용할 (PERIOD_D1)을 사용합니다.
  • shift: 시계열에서 받은 값의 인덱스를 결정하기 위해 사용합니다. 여기서는 사용하지 않습니다.
      double open = iOpen(_Symbol,PERIOD_D1,1);
      double close = iClose(_Symbol,PERIOD_D1,1);
      double high = iHigh(_Symbol,PERIOD_D1,1);
      double low = iLow(_Symbol,PERIOD_D1,1);

나중에 피보나치 객체를 그리는 데 사용할 시작 시간과 종료 시간을 결정합니다. 우리는 바가 생기는 시간을 반환하는 iTime 함수를 사용하겠습니다. 매개변수는 다음과 같습니다:

  • symbol: 원하는 심볼을 결정합니다. 우리는 현재 심볼에 사용할 _Symbol을 사용합니다.
  • timeframe: 원하는 시간 프레임을 결정합니다. 우리는 일일 시간 프레임에 사용할 (PERIOD_D1)을 사용합니다.
  • shift: 시계열에서 받은 값의 인덱스를 결정합니다. 우리는 시작 시간에는 1을, 종료 시간에는 0을 사용합니다.

종료 시간의 경우 이 계산 시점의 현재 일일 바가 될 새로운 날의 반환 값에서 1을 뺄 것이므로 이전 바를 감지하기 위해 이렇게 합니다.

      datetime startingTime = iTime(_Symbol,PERIOD_D1,1);
      datetime endingTime = iTime(_Symbol,PERIOD_D1,0)-1;

그런 다음 if-else 조건 연산자를 사용하여 두 가지 조건을 설정하여 피보나치 객체를 그립니다:

종가가 시가보다 큰 경우 강세 바이므로 다음과 같은 상황이 발생합니다.

지정된 문자로 객체를 그리는 ObjectCreate 함수를 사용하여 객체를 만듭니다. 매개변수는 다음과 같습니다:

  • chart_id: 차트를 결정합니다. 우리는 현재 차트를 사용할 것이므로 0을 사용합니다.
  • name: 원하는 객체의 이름을 결정하기 위해 FIB_OBJ를 사용합니다.
  • type: 오브젝트 유형을 결정합니다. 우리는 피보나치 되돌림을 사용할 것이므로 OBJ_FIBO를 사용합니다.
  • nwin: 창 인덱스를 결정합니다. 우리는 기본 창 0을 사용합니다.
  • time1: 첫 번째 지점의 시간을 결정합니다. 우리는 시작 시간을 사용합니다.
  • price1: 첫 번째 포인트의 가격을 결정합니다. 우리는 저가를 사용합니다.
  • timeN=0: 마지막 지점의 시간을 결정합니다. 우리는 종료 시간을 사용합니다.
  • priceN=0: 마지막 지점의 가격을 결정합니다. 우리는 고가를 사용합니다.

객체의 색상을 바의 방향에 맞게 업데이트하기 위해 ObjectSetInteger와 for loop 연산자를 사용합니다. ObjectSetInteger의 매개변수는 다음과 같습니다:

  • chart_id: 차트를 결정합니다. 우리는 현재 차트를 사용할 것이므로 0을 사용합니다.
  • name: 객체의 이름을 결정합니다. 우리는 FIB_OBJ를 사용합니다.
  • prop_id: 프로퍼티 ID(색상)를 결정합니다. 우리는 OBJPROP_COLOR를 사용합니다.
  • prop_value: 속성 값을 결정합니다. 우리는 clrGreen을 사용합니다.
  • for 루프를 사용하여 객체 색상을 지속적으로 업데이트합니다.
23.6 - 38.2 - 50 - 61.8 - 100의 피보나치 레벨을 정의합니다. 차트에 마지막 날, 개장일, 마감일을 나타내는 코멘트를 달 수 있습니다.
      if(close>open)
        {
         ObjectCreate(0,FIB_OBJ,OBJ_FIBO,0,startingTime,low,endingTime,high);
         ObjectSetInteger(0,FIB_OBJ,OBJPROP_COLOR,clrGreen);
         for(int i = 0; i < ObjectGetInteger(0,FIB_OBJ,OBJPROP_LEVELS); i++)
           {
            ObjectSetInteger(0,FIB_OBJ,OBJPROP_LEVELCOLOR,i,clrGreen);
           }
         double fibRetracLvl1 = NormalizeDouble(high - (high-low) * 23.6 / 100,_Digits);
         double fibRetracLvl2 = NormalizeDouble(high - (high-low) * 38.2 / 100,_Digits);
         double fibRetracLvl3 = NormalizeDouble(high - (high-low) * 50 / 100,_Digits);
         double fibRetracLvl4 = NormalizeDouble(high - (high-low) * 61.8 / 100,_Digits);
         double fibRetracLvl5 = NormalizeDouble(high - (high-low) * 100 / 100,_Digits);
         Comment("Last Day Open = ",open,"\n",
                 "Last Day Close = ",close,"\n",
                 "Fib lvl 0% = ",high,"\n",
                 "Fib lvl 23.6% = ",fibRetracLvl1,"\n",
                 "Fib lvl 38.2% = ",fibRetracLvl2,"\n",
                 "Fib lvl 50% = ",fibRetracLvl3,"\n",
                 "Fib lvl 61.8% = ",fibRetracLvl4,"\n",
                 "Fib lvl 100% = ",fibRetracLvl5);
        }

약세일의 경우에도 동일하지만 차이는 다음과 같습니다:

  • 객체를 만들고 높은 곳에서 낮은 곳으로 시작합니다.
  • 객체의 색상은 빨간색이 됩니다.
      else
        {
         ObjectCreate(0,FIB_OBJ,OBJ_FIBO,0,startingTime,high,endingTime,low);
         ObjectSetInteger(0,FIB_OBJ,OBJPROP_COLOR,clrRed);
         for(int i = 0; i < ObjectGetInteger(0,FIB_OBJ,OBJPROP_LEVELS); i++)
           {
            ObjectSetInteger(0,FIB_OBJ,OBJPROP_LEVELCOLOR,i,clrRed);
           }
         double fibRetracLvl1 = NormalizeDouble(low + (high-low) * 23.6 / 100,_Digits);
         double fibRetracLvl2 = NormalizeDouble(low + (high-low) * 38.2 / 100,_Digits);
         double fibRetracLvl3 = NormalizeDouble(low + (high-low) * 50 / 100,_Digits);
         double fibRetracLvl4 = NormalizeDouble(low + (high-low) * 61.8 / 100,_Digits);
         double fibRetracLvl5 = NormalizeDouble(low + (high-low) * 100 / 100,_Digits);
         Comment("Last Day Open = ",open,"\n",
                 "Last Day Close = ",close,"\n",
                 "Fib lvl 0% = ",low,"\n",
                 "Fib lvl 23.6% = ",fibRetracLvl1,"\n",
                 "Fib lvl 38.2% = ",fibRetracLvl2,"\n",
                 "Fib lvl 50% = ",fibRetracLvl3,"\n",
                 "Fib lvl 61.8% = ",fibRetracLvl4,"\n",
                 "Fib lvl 100% = ",fibRetracLvl5);
        }

다음은 이 전략의 전체 코드입니다:

//+------------------------------------------------------------------+
//|                                         Simple Fibo System#2.mq5 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#define FIB_OBJ "Fibonacci Retracement"
#property script_show_inputs
input double fibRetracLvl = 38.2;
int barsTotal;
//+------------------------------------------------------------------+
void OnTick()
  {

   int bars = iBars(_Symbol, PERIOD_D1);
   if(barsTotal != bars  && TimeCurrent() > StringToTime("00:05"))
     {
      barsTotal=bars;
      ObjectDelete(0,FIB_OBJ);
      double open = iOpen(_Symbol,PERIOD_D1,1);
      double close = iClose(_Symbol,PERIOD_D1,1);
      double closeCandle = iClose(_Symbol,_Period,1);
      double high = iHigh(_Symbol,PERIOD_D1,1);
      double low = iLow(_Symbol,PERIOD_D1,1);
      datetime startingTime = iTime(_Symbol,PERIOD_D1,1);
      datetime endingTime = iTime(_Symbol,PERIOD_D1,0)-1;
      if(close>open)
        {
         ObjectCreate(0,FIB_OBJ,OBJ_FIBO,0,startingTime,low,endingTime,high);
         ObjectSetInteger(0,FIB_OBJ,OBJPROP_COLOR,clrGreen);
         for(int i = 0; i < ObjectGetInteger(0,FIB_OBJ,OBJPROP_LEVELS); i++)
           {
            ObjectSetInteger(0,FIB_OBJ,OBJPROP_LEVELCOLOR,i,clrGreen);
           }
         double fibRetracLvl1 = NormalizeDouble(high - (high-low) * 23.6 / 100,_Digits);
         double fibRetracLvl2 = NormalizeDouble(high - (high-low) * 38.2 / 100,_Digits);
         double fibRetracLvl3 = NormalizeDouble(high - (high-low) * 50 / 100,_Digits);
         double fibRetracLvl4 = NormalizeDouble(high - (high-low) * 61.8 / 100,_Digits);
         double fibRetracLvl5 = NormalizeDouble(high - (high-low) * 100 / 100,_Digits);
         double entryLvl = NormalizeDouble(high - (high-low) * fibRetracLvl /100,_Digits);
         Comment("Last Day Open = ",open,"\n",
                 "Last Day Close = ",close,"\n",
                 "Buy Entry Price: ",entryLvl,"\n",
                 "Close: ",closeCandle,"\n");
        }
      else
        {
         ObjectCreate(0,FIB_OBJ,OBJ_FIBO,0,startingTime,high,endingTime,low);
         ObjectSetInteger(0,FIB_OBJ,OBJPROP_COLOR,clrRed);
         for(int i = 0; i < ObjectGetInteger(0,FIB_OBJ,OBJPROP_LEVELS); i++)
           {
            ObjectSetInteger(0,FIB_OBJ,OBJPROP_LEVELCOLOR,i,clrRed);
           }
         double fibRetracLvl1 = NormalizeDouble(low + (high-low) * 23.6 / 100,_Digits);
         double fibRetracLvl2 = NormalizeDouble(low + (high-low) * 38.2 / 100,_Digits);
         double fibRetracLvl3 = NormalizeDouble(low + (high-low) * 50 / 100,_Digits);
         double fibRetracLvl4 = NormalizeDouble(low + (high-low) * 61.8 / 100,_Digits);
         double fibRetracLvl5 = NormalizeDouble(low + (high-low) * 100 / 100,_Digits);
         double entryLvl = NormalizeDouble(low + (high-low) * fibRetracLvl /100,_Digits);
           {
            Comment("Last Day Open = ",open,"\n",
                    "Last Day Close = ",close,"\n",
                    "Sell Entry Price: ",entryLvl,"\n",
                    "Close: ",closeCandle);
           }
        }
     }
  }
//+------------------------------------------------------------------+

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

//+------------------------------------------------------------------+
//|                                         Simple Fibo System#1.mq5 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#define FIB_OBJ "Fibonacci Retracement"
int barsTotal;
//+------------------------------------------------------------------+
void OnTick()
  {
   int bars = iBars(_Symbol, PERIOD_D1);
   if(barsTotal != bars  && TimeCurrent() > StringToTime("00:05"))
     {
      barsTotal=bars;
      ObjectDelete(0,FIB_OBJ);
      double open = iOpen(_Symbol,PERIOD_D1,1);
      double close = iClose(_Symbol,PERIOD_D1,1);
      double high = iHigh(_Symbol,PERIOD_D1,1);
      double low = iLow(_Symbol,PERIOD_D1,1);
      datetime startingTime = iTime(_Symbol,PERIOD_D1,1);
      datetime endingTime = iTime(_Symbol,PERIOD_D1,0)-1;
      if(close>open)
        {
         ObjectCreate(0,FIB_OBJ,OBJ_FIBO,0,startingTime,low,endingTime,high);
         ObjectSetInteger(0,FIB_OBJ,OBJPROP_COLOR,clrGreen);
         for(int i = 0; i < ObjectGetInteger(0,FIB_OBJ,OBJPROP_LEVELS); i++)
           {
            ObjectSetInteger(0,FIB_OBJ,OBJPROP_LEVELCOLOR,i,clrGreen);
           }
         double fibRetracLvl1 = NormalizeDouble(high - (high-low) * 23.6 / 100,_Digits);
         double fibRetracLvl2 = NormalizeDouble(high - (high-low) * 38.2 / 100,_Digits);
         double fibRetracLvl3 = NormalizeDouble(high - (high-low) * 50 / 100,_Digits);
         double fibRetracLvl4 = NormalizeDouble(high - (high-low) * 61.8 / 100,_Digits);
         double fibRetracLvl5 = NormalizeDouble(high - (high-low) * 100 / 100,_Digits);
         Comment("Last Day Open = ",open,"\n",
                 "Last Day Close = ",close,"\n",
                 "Fib lvl 0% = ",high,"\n",
                 "Fib lvl 23.6% = ",fibRetracLvl1,"\n",
                 "Fib lvl 38.2% = ",fibRetracLvl2,"\n",
                 "Fib lvl 50% = ",fibRetracLvl3,"\n",
                 "Fib lvl 61.8% = ",fibRetracLvl4,"\n",
                 "Fib lvl 100% = ",fibRetracLvl5);
        }
      else
        {
         ObjectCreate(0,FIB_OBJ,OBJ_FIBO,0,startingTime,high,endingTime,low);
         ObjectSetInteger(0,FIB_OBJ,OBJPROP_COLOR,clrRed);
         for(int i = 0; i < ObjectGetInteger(0,FIB_OBJ,OBJPROP_LEVELS); i++)
           {
            ObjectSetInteger(0,FIB_OBJ,OBJPROP_LEVELCOLOR,i,clrRed);
           }
         double fibRetracLvl1 = NormalizeDouble(low + (high-low) * 23.6 / 100,_Digits);
         double fibRetracLvl2 = NormalizeDouble(low + (high-low) * 38.2 / 100,_Digits);
         double fibRetracLvl3 = NormalizeDouble(low + (high-low) * 50 / 100,_Digits);
         double fibRetracLvl4 = NormalizeDouble(low + (high-low) * 61.8 / 100,_Digits);
         double fibRetracLvl5 = NormalizeDouble(low + (high-low) * 100 / 100,_Digits);
         Comment("Last Day Open = ",open,"\n",
                 "Last Day Close = ",close,"\n",
                 "Fib lvl 0% = ",low,"\n",
                 "Fib lvl 23.6% = ",fibRetracLvl1,"\n",
                 "Fib lvl 38.2% = ",fibRetracLvl2,"\n",
                 "Fib lvl 50% = ",fibRetracLvl3,"\n",
                 "Fib lvl 61.8% = ",fibRetracLvl4,"\n",
                 "Fib lvl 100% = ",fibRetracLvl5);
        }
     }
  }
//+------------------------------------------------------------------+

이 코드를 오류 없이 컴파일하고 실행하면 강세 및 약세에 대한 테스트에서 다음 예제와 동일한 신호를 확인할 수 있습니다.

일일 바는 강세입니다:

단순 피보나치 시스템 - 강세 - 매일

따라서 FIBO는 낮음에서 높음으로 그려지고 색상은 녹색이며 FIBO 레벨과 하루의 개장 및 마감은 우리가 일일 차트에서 발견한 것과 동일합니다. 다음 그림은 이를 위한 것입니다.

단순 피보나치 시스템 - 강세

이전 그림에서 볼 수 있듯이 일일 강세 바에 따라 FIBO는 저점에서 고점으로 그려지며 색상은 녹색이며 차트에는 다음 값의 코멘트가 필요합니다:

  • 전일 시가 ==> 일간 차트 데이터 창에서와 동일합니다.
  • 전일 종가 ==> 일일 차트와 동일합니다.
  • 다섯 가지 피보나치 되돌림 가격 수준.

일일 바는 약세입니다:

단순 피보 시스템 - 약세 - 매일

따라서 FIBO는 고점에서 저점으로 그려지고 색상은 빨간색이며 FIBO 레벨과 하루의 개장 및 마감은 우리가 일일 차트에서 본 것과 동일해야 합니다. 다음 그림은 이를 위한 것입니다.

단순 피보나치 시스템 - 약세

이전 그림에서 볼 수 있듯이 일일 약세 바에 따라 FIBO는 고점에서 저점으로 그려지며 색상은 빨간색이며 차트에 다음과 같은 값의 코멘트가 있습니다:

  • 이전 일 시가 ==> 일간 차트 데이터 창에서와 같습니다.
  • 이전 일 종가 ==> 일간 차트에서와 같습니다.
  • 다섯 가지 피보나치 되돌림 가격 수준.

FIBO 신호:

이 접근 방식에 따르면 우리는 FIBO 레벨에 기반한 초급 수준의 사용자 입력을 기반으로 매매 신호를 반환할 수 있는 거래 시스템을 만들어야 합니다. 다음은 이를 수행하는 전체 코드입니다:

//+------------------------------------------------------------------+
//|                                         Simple Fibo System#2.mq5 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#define FIB_OBJ "Fibonacci Retracement"
#property script_show_inputs
input double fibRetracLvl = 38.2;
int barsTotal;
//+------------------------------------------------------------------+
void OnTick()
  {

   int bars = iBars(_Symbol, PERIOD_D1);
   if(barsTotal != bars  && TimeCurrent() > StringToTime("00:05"))
     {
      barsTotal=bars;
      ObjectDelete(0,FIB_OBJ);
      double open = iOpen(_Symbol,PERIOD_D1,1);
      double close = iClose(_Symbol,PERIOD_D1,1);
      double closeCandle = iClose(_Symbol,_Period,1);
      double high = iHigh(_Symbol,PERIOD_D1,1);
      double low = iLow(_Symbol,PERIOD_D1,1);
      datetime startingTime = iTime(_Symbol,PERIOD_D1,1);
      datetime endingTime = iTime(_Symbol,PERIOD_D1,0)-1;
      if(close>open)
        {
         ObjectCreate(0,FIB_OBJ,OBJ_FIBO,0,startingTime,low,endingTime,high);
         ObjectSetInteger(0,FIB_OBJ,OBJPROP_COLOR,clrGreen);
         for(int i = 0; i < ObjectGetInteger(0,FIB_OBJ,OBJPROP_LEVELS); i++)
           {
            ObjectSetInteger(0,FIB_OBJ,OBJPROP_LEVELCOLOR,i,clrGreen);
           }
         double fibRetracLvl1 = NormalizeDouble(high - (high-low) * 23.6 / 100,_Digits);
         double fibRetracLvl2 = NormalizeDouble(high - (high-low) * 38.2 / 100,_Digits);
         double fibRetracLvl3 = NormalizeDouble(high - (high-low) * 50 / 100,_Digits);
         double fibRetracLvl4 = NormalizeDouble(high - (high-low) * 61.8 / 100,_Digits);
         double fibRetracLvl5 = NormalizeDouble(high - (high-low) * 100 / 100,_Digits);
         double entryLvl = NormalizeDouble(high - (high-low) * fibRetracLvl /100,_Digits);
         Comment("Last Day Open = ",open,"\n",
                 "Last Day Close = ",close,"\n",
                 "Buy Entry Price: ",entryLvl);
        }
      else
        {
         ObjectCreate(0,FIB_OBJ,OBJ_FIBO,0,startingTime,high,endingTime,low);
         ObjectSetInteger(0,FIB_OBJ,OBJPROP_COLOR,clrRed);
         for(int i = 0; i < ObjectGetInteger(0,FIB_OBJ,OBJPROP_LEVELS); i++)
           {
            ObjectSetInteger(0,FIB_OBJ,OBJPROP_LEVELCOLOR,i,clrRed);
           }
         double fibRetracLvl1 = NormalizeDouble(low + (high-low) * 23.6 / 100,_Digits);
         double fibRetracLvl2 = NormalizeDouble(low + (high-low) * 38.2 / 100,_Digits);
         double fibRetracLvl3 = NormalizeDouble(low + (high-low) * 50 / 100,_Digits);
         double fibRetracLvl4 = NormalizeDouble(low + (high-low) * 61.8 / 100,_Digits);
         double fibRetracLvl5 = NormalizeDouble(low + (high-low) * 100 / 100,_Digits);
         double entryLvl = NormalizeDouble(low + (high-low) * fibRetracLvl /100,_Digits);
           {
            Comment("Last Day Open = ",open,"\n",
                    "Last Day Close = ",close,"\n",
                    "Sell Entry Price: ",entryLvl);
           }
        }
     }
  }
//+------------------------------------------------------------------+

이 코드에서의 차이점:

속성을 표시해 주는 #property script_show_input을 사용하여 사용자 입력 창을 표시하는 속성을 추가합니다.

#property script_show_inputs

입력 변수를 사용하여 기본값이 38.2인 fibRetracLvl에 대한 더블 데이터 유형을 생성합니다.

input double fibRetracLvl = 38.2;

강세의 경우 사용자 입력에 따라 진입 레벨을 정의합니다.

double entryLvl = NormalizeDouble(high - (high-low) * fibRetracLvl /100,_Digits);

약세의 경우 사용자 입력에 따라 진입 레벨을 정의합니다.

double entryLvl = NormalizeDouble(low + (high-low) * fibRetracLvl /100,_Digits);

강세인 경우 차트에 코멘트를 달 수 있습니다.

         Comment("Last Day Open = ",open,"\n",
                 "Last Day Close = ",close,"\n",
                 "Buy Entry Price: ",entryLvl,"\n",
                 "Close: ",closeCandle,"\n");

약세인 경우 차트에 코멘트를 달 수 있습니다.

            Comment("Last Day Open = ",open,"\n",
                    "Last Day Close = ",close,"\n",
                    "Sell Entry Price: ",entryLvl,"\n",
                    "Close: ",closeCandle);

이 코드를 컴파일하고 실행하면 신호를 수신할 준비가 된 것이며, 강세와 약세 사례에 대한 테스트의 예시를 볼 수 있습니다.

일일 바는 강세입니다:

피보 신호 - 강세 - 일일

따라서 15분 안에 저점에서 고점까지 녹색 FIBO가 그려지고 마지막 날 시가와 종가는 일일 차트와 동일하며 진입선은 38.2 옆의 가격 수준입니다. 15분 차트의 경우 다음과 같습니다:

피보 신호 - 강세

이전 15분 차트에서 볼 수 있듯이 다음 값들은 우리가 결정한 값과 같습니다.

  • 전일 시가 ==> 일간 차트와 동일합니다.
  • 전일 종가 ==> 마찬가지입니다.
  • 매수 진입 가격 ==> 38.2 FIBO 수준 옆의 가격 수준입니다.

일일 바는 약세입니다:

피보 신호 - 약세 - 일일

이제 15분 차트를 확인하여 트레이딩 전략에 따른 시그널을 확인해보겠습니다. FIBO 레벨 38.2를 기준으로 매도 진입 레벨이 표시되어야 할 것입니다. 다음 그림을 통해 이를 확인해 보겠습니다:

피보 신호 - 약세

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

  • 전일 시가 ==> 일간 차트와 동일합니다.
  • 전일 종가 ==> 마찬가지입니다.
  • 매도 진입가 ==> 38.2 FIBO 수준과 동일합니다.

두 번째 접근 방식: 특정 바 배열을 사용합니다:

간단한 FIBO 시스템 2:

이 접근 방식에 따르면 우리는 피보나치 생성에 사용할 미리 정해진 수의 바를 사용하게 되는데 다음은 이를 다소 다르게 수행하는 단계입니다:

define을 사용하여 FIB_OBJ를 정의합니다.

#define FIB_OBJ "Fibonacci Retracement"

가장 높은 바와 가장 낮은 바에 대해 두 개의 정수 변수를 생성합니다.

int highestCandle, lowestCandle;

고가와 저가에 대한 두 개의 배열을 만듭니다.

double high[],low[];

"ArraySetAsSeries" 함수를 사용하여 데이터를 고가 배열과 저가 배열로 정렬합니다. 매개변수:

  • array[]: 를 사용하여 생성된 배열의 높낮이를 결정합니다.
  • flag: 배열 인덱싱 방향을 참으로 설정합니다.
ArraySetAsSeries(high,true);
ArraySetAsSeries(low,true);

CopyHigh 및 CopyLow를 사용하여 최고값과 최저값의 히스토리 데이터를 가져옵니다. CopyHigh 매개 변수는 다음과 같습니다:

  • symbol_name: 현재 심볼을 (_Symbol)로 지정합니다.
  • timeframe: 현재 시간 프레임에는 (_Period)를 사용합니다. 
  • start_pos: 시작 위치를 결정합니다. (0)을 사용합니다.
  • count: 복사할 데이터 개수를 결정합니다. 우리는 100을 사용합니다.
  • high_array[]: 대상 배열을 결정합니다. 우리는 생성된 고가 배열을 사용합니다.

CopyLow 매개변수는 동일하지만 대상 배열이 저가 배열로 생성됩니다.

CopyHigh(_Symbol,_Period,0,100,high);
CopyLow(_Symbol,_Period,0,100,low);

배열의 첫 번째 바의 시가와 배열의 마지막 바의 종가를 iOpen 및 iClose 함수를 사용하여 정의합니다.

double openCandle = iOpen(_Symbol,_Period,100);
double closeCandle = iClose(_Symbol,_Period,1);

ArrayMaximum 및 ArrayMinimum 바를 사용하여 최고 및 최저값을 정의하여 고가 배열과 저가 배열을 생성합니다. 매개변수는 다음과 같습니다:

  • array[]: 최대값은 고가, 최소값은 저가를 사용합니다.
  • start=0: 확인을 시작할 인덱스를 결정합니다. 우리는 0을 사용합니다.
  • count: 검사할 요소의 수를 결정합니다. 100을 사용하거나 WHOLE_ARRAY를 사용할 수도 있습니다.
highestCandle=ArrayMaximum(high,0,100);
lowestCandle=ArrayMinimum(low,0,100);

MqlRates 함수를 사용하여 가격에 대한 정보를 저장하는 가격 배열을 생성하고 ArraySetAsSeries 함수를 사용하여 이 배열에 데이터를 정렬합니다.

MqlRates pArray[];
ArraySetAsSeries(pArray,true);

CopyRates 함수와 그 매개 변수를 통해 MqlRates에서 히스토리 데이터를 가져오는 방법은 다음과 같습니다:

  • symbol_name: 심볼명을 결정합니다. 우리는 현재 심볼에 적용되도록 하기 위해 (_Symbol)을 사용합니다.
  • timeframe: 현재 차트 주기에 적용되도록 하기 위해 (_Period)을 사용합니다.
  • start_pos: 시작점 또는 위치의 결정과 관련하여 현재 위치에서 시작하게 하기 위해 (0)을 사용합니다.
  • count: 복사할 개수를 결정합니다. 우리는 (Bars)를 사용합니다.
  • rates_array[]: 복사할 배열의 대상을 결정합니다. 우리는 (pArray)를 사용합니다.
int pData=CopyRates(_Symbol,_Period,0,Bars(_Symbol,_Period),pArray);

ObjectGetInteger와 ObjectGetDouble을 사용하여 0 레벨과 100 레벨의 날짜 시간과 가격을 정의합니다.

datetime dTlvl0 = ObjectGetInteger(0,"Fibonacci Retracement",OBJPROP_TIME,0);
double PriceFibLvl00 = ObjectGetDouble(0,"Fibonacci Retracement",OBJPROP_PRICE,0);
datetime dTlvl1 = ObjectGetInteger(0,"Fibonacci Retracement",OBJPROP_TIME,1);
double PriceFibLvl0 = ObjectGetDouble(0,"Fibonacci Retracement",OBJPROP_PRICE,1);

if-else 연산자를 사용하여 강세 및 약세의 조건을 설정합니다.

강세(CloseCandle이 openCandle보다 큰 경우)의 경우 우리는 다음 단계를 수행해야 합니다:

  • ObjectDelete를 사용하여 이전에 그린 FIBO 객체를 삭제합니다.
  • ObjectCreate를 사용하여 배열의 하단에서 상단으로 시작하여 새로운 FIBO 객체를 만듭니다.
  • 케이스에 따라 계속 업데이트하기 위해 ObjectSetInteger와 for loop를 사용하여 FIBO 객체의 색상을 녹색으로 업데이트합니다.
  • 고가와 저가의 차이를 구하여 가격 범위를 정의합니다.
  • 23.6 - 38.2 - 50 - 61.8의 FIBO 레벨을 정의합니다.
  • Array Open, Array Close 및 FIBO 레벨을 차트에 코멘트로 달 수 있습니다.
   if(closeCandle>openCandle)
     {
      ObjectDelete(_Symbol, "Fibonacci Retracement");
      ObjectCreate(_Symbol, "Fibonacci Retracement",OBJ_FIBO,0,pArray[100].time,
                   pArray[lowestCandle].low,pArray[0].time,pArray[highestCandle].high);
      ObjectSetInteger(0,FIB_OBJ,OBJPROP_COLOR,clrGreen);
      for(int i = 0; i < ObjectGetInteger(0,FIB_OBJ,OBJPROP_LEVELS); i++)
        {
         ObjectSetInteger(0,FIB_OBJ,OBJPROP_LEVELCOLOR,i,clrGreen);
        }
      double pRange =  PriceFibLvl0 - PriceFibLvl00;
      double PriceFibLvl1 = NormalizeDouble (PriceFibLvl0 - pRange * 23.6/100,_Digits);
      double PriceFibLvl2 = NormalizeDouble (PriceFibLvl0 - pRange * 38.2/100,_Digits);
      double PriceFibLvl3 = NormalizeDouble (PriceFibLvl0 - pRange * 50/100,_Digits);
      double PriceFibLvl4 = NormalizeDouble(PriceFibLvl0 - pRange * 61.8/100,_Digits);
      Comment("Array Open: ",openCandle,"\n",
              "Array Close: ",closeCandle,"\n",
              "Fib lvl 0% = ",PriceFibLvl0,"\n",
              "Fib lvl 23.6% = ",PriceFibLvl1,"\n",
              "Fib lvl 38.2% = ",PriceFibLvl2,"\n",
              "Fib lvl 50% = ",PriceFibLvl3,"\n",
              "Fib lvl 61.8% = ",PriceFibLvl4,"\n",
              "Fib lvl 100% = ",PriceFibLvl00);
     }

약세(CloseCandle이 openCandle보다 낮은 경우)의 경우 다음 단계가 필요합니다:

  • ObjectDelete를 사용하여 이전에 그린 FIBO 객체를 삭제합니다.
  • ObjectCreate를 사용하여 배열의 가장 높은 곳에서부터 가장 낮은 곳까지 새로운 FIBO 객체를 만듭니다.
  • 케이스에 따라 계속 업데이트하기 위해 ObjectSetInteger와 for loop를 사용하여 FIBO 객체의 색상을 빨간색으로 업데이트합니다.
  • 저가와 고가의 차이를 구하여 가격 범위를 정의합니다.
  • 23.6 - 38.2 - 50 - 61.8의 FIBO 레벨을 정의합니다.
  • Array Open, Array Close 및 FIBO 레벨을 차트에 코멘트로 달 수 있습니다.
   else
     {
      ObjectDelete(_Symbol, "Fibonacci Retracement");
      ObjectCreate(_Symbol, "Fibonacci Retracement",OBJ_FIBO,0,pArray[100].time,
                   pArray[highestCandle].high,pArray[0].time,pArray[lowestCandle].low);
      ObjectSetInteger(0,FIB_OBJ,OBJPROP_COLOR,clrRed);
      for(int i = 0; i < ObjectGetInteger(0,FIB_OBJ,OBJPROP_LEVELS); i++)
        {
         ObjectSetInteger(0,FIB_OBJ,OBJPROP_LEVELCOLOR,i,clrRed);
        }
      double pRange =  PriceFibLvl00 - PriceFibLvl0;
      double PriceFibLvl1 = NormalizeDouble (PriceFibLvl0 + pRange * 23.6/100,_Digits);
      double PriceFibLvl2 = NormalizeDouble (PriceFibLvl0 + pRange * 38.2/100,_Digits);
      double PriceFibLvl3 = NormalizeDouble(PriceFibLvl0 + pRange * 50/100,_Digits);
      double PriceFibLvl4 = NormalizeDouble (PriceFibLvl0 + pRange * 61.8/100,_Digits);
      Comment("Array Open: ",openCandle,"\n",
              "Array Close: ",closeCandle,"\n",
              "Fib lvl 0% = ",PriceFibLvl0,"\n",
              "Fib lvl 23.6% = ",PriceFibLvl1,"\n",
              "Fib lvl 38.2% = ",PriceFibLvl2,"\n",
              "Fib lvl 50% = ",PriceFibLvl3,"\n",
              "Fib lvl 61.8% = ",PriceFibLvl4,"\n",
              "Fib lvl 100% = ",PriceFibLvl00);
     }

다음은 전체 코드입니다:

//+------------------------------------------------------------------+
//|                                         Simple Fibo System 2.mq5 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#define FIB_OBJ "Fibonacci Retracement"
//+------------------------------------------------------------------+
void OnTick()
  {
   int highestCandle, lowestCandle;
   double high[],low[];
   ArraySetAsSeries(high,true);
   ArraySetAsSeries(low,true);
   CopyHigh(_Symbol,_Period,0,100,high);
   CopyLow(_Symbol,_Period,0,100,low);
   double openCandle = iOpen(_Symbol,_Period,100);
   double closeCandle = iClose(_Symbol,_Period,1);
   highestCandle=ArrayMaximum(high,0,100);
   lowestCandle=ArrayMinimum(low,0,100);
   MqlRates pArray[];
   ArraySetAsSeries(pArray,true);
   int pData=CopyRates(_Symbol,_Period,0,Bars(_Symbol,_Period),pArray);
   datetime dTlvl0 = ObjectGetInteger(0,"Fibonacci Retracement",OBJPROP_TIME,0);
   double PriceFibLvl00 = ObjectGetDouble(0,"Fibonacci Retracement",OBJPROP_PRICE,0);
   datetime dTlvl1 = ObjectGetInteger(0,"Fibonacci Retracement",OBJPROP_TIME,1);
   double PriceFibLvl0 = ObjectGetDouble(0,"Fibonacci Retracement",OBJPROP_PRICE,1);
   if(closeCandle>openCandle)
     {
      ObjectDelete(_Symbol, "Fibonacci Retracement");
      ObjectCreate(_Symbol, "Fibonacci Retracement",OBJ_FIBO,0,pArray[100].time,
                   pArray[lowestCandle].low,pArray[0].time,pArray[highestCandle].high);
      ObjectSetInteger(0,FIB_OBJ,OBJPROP_COLOR,clrGreen);
      for(int i = 0; i < ObjectGetInteger(0,FIB_OBJ,OBJPROP_LEVELS); i++)
        {
         ObjectSetInteger(0,FIB_OBJ,OBJPROP_LEVELCOLOR,i,clrGreen);
        }
      double pRange =  PriceFibLvl0 - PriceFibLvl00;
      double PriceFibLvl1 = NormalizeDouble (PriceFibLvl0 - pRange * 23.6/100,_Digits);
      double PriceFibLvl2 = NormalizeDouble (PriceFibLvl0 - pRange * 38.2/100,_Digits);
      double PriceFibLvl3 = NormalizeDouble (PriceFibLvl0 - pRange * 50/100,_Digits);
      double PriceFibLvl4 = NormalizeDouble(PriceFibLvl0 - pRange * 61.8/100,_Digits);
      Comment("Array Open: ",openCandle,"\n",
              "Array Close: ",closeCandle,"\n",
              "Fib lvl 0% = ",PriceFibLvl0,"\n",
              "Fib lvl 23.6% = ",PriceFibLvl1,"\n",
              "Fib lvl 38.2% = ",PriceFibLvl2,"\n",
              "Fib lvl 50% = ",PriceFibLvl3,"\n",
              "Fib lvl 61.8% = ",PriceFibLvl4,"\n",
              "Fib lvl 100% = ",PriceFibLvl00);
     }
   else
     {
      ObjectDelete(_Symbol, "Fibonacci Retracement");
      ObjectCreate(_Symbol, "Fibonacci Retracement",OBJ_FIBO,0,pArray[100].time,
                   pArray[highestCandle].high,pArray[0].time,pArray[lowestCandle].low);
      ObjectSetInteger(0,FIB_OBJ,OBJPROP_COLOR,clrRed);
      for(int i = 0; i < ObjectGetInteger(0,FIB_OBJ,OBJPROP_LEVELS); i++)
        {
         ObjectSetInteger(0,FIB_OBJ,OBJPROP_LEVELCOLOR,i,clrRed);
        }
      double pRange =  PriceFibLvl00 - PriceFibLvl0;
      double PriceFibLvl1 = NormalizeDouble (PriceFibLvl0 + pRange * 23.6/100,_Digits);
      double PriceFibLvl2 = NormalizeDouble (PriceFibLvl0 + pRange * 38.2/100,_Digits);
      double PriceFibLvl3 = NormalizeDouble(PriceFibLvl0 + pRange * 50/100,_Digits);
      double PriceFibLvl4 = NormalizeDouble (PriceFibLvl0 + pRange * 61.8/100,_Digits);
      Comment("Array Open: ",openCandle,"\n",
              "Array Close: ",closeCandle,"\n",
              "Fib lvl 0% = ",PriceFibLvl0,"\n",
              "Fib lvl 23.6% = ",PriceFibLvl1,"\n",
              "Fib lvl 38.2% = ",PriceFibLvl2,"\n",
              "Fib lvl 50% = ",PriceFibLvl3,"\n",
              "Fib lvl 61.8% = ",PriceFibLvl4,"\n",
              "Fib lvl 100% = ",PriceFibLvl00);
     }
  }
//+------------------------------------------------------------------+

이 코드를 컴파일하고 실행하면 EA별로 우리는 다음과 같은 신호를 확인할 수 있습니다. 다음은 테스트 신호의 예시입니다.

배열이 강세인 경우:

단순 피보 시스템 2 - 강세

차트에 녹색 FIBO 객체가 있고 차트 왼쪽 상단에 이 EA에 따라 다음과 같은 값이 있는 코멘트가 있는 것을 볼 수 있습니다:

  • Array open ==> 배열에서 첫번째 바의 시가.
  • Array close ==> 배열에서 마지막 바의 종가.
  • FIBO 레벨 0, 23.6, 38.2, 50, 61.8, 100.

배열이 약세인 경우:

단순 피보나치 시스템 2 - 약세

차트에 빨간색 FIBO 객체가 있고 차트 왼쪽 상단에 이 EA에 따라 다음과 같은 값이 있는 코멘트를 볼 수 있습니다:

  • Array open ==> 배열에서 첫번째 바의 시가.
  • Array close ==> 배열에서 마지막 바의 종가.
  • FIBO 레벨 0, 23.6, 38.2, 50, 61.8, 100.

FIBO 신호 2:

이제 두 번째 접근 방식을 기반으로 사용자 입력 FIBO 레벨에 따라 매수 및 매도 신호를 반환하는 거래 시스템을 만들겠습니다. 다음은 이 간단한 거래 시스템을 만드는 전체 코드입니다:

//+------------------------------------------------------------------+
//|                                               Fibo Signals 2.mq5 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#define FIB_OBJ "Fibonacci Retracement"
#property script_show_inputs
input double fibRetracLvl = 38.2;
//+------------------------------------------------------------------+
void OnTick()
  {
   int highestCandle, lowestCandle;
   double high[],low[];
   ArraySetAsSeries(high,true);
   ArraySetAsSeries(low,true);
   CopyHigh(_Symbol,_Period,0,100,high);
   CopyLow(_Symbol,_Period,0,100,low);
   double openCandle = iOpen(_Symbol,_Period,100);
   double closeCandle = iClose(_Symbol,_Period,1);
   highestCandle=ArrayMaximum(high,0,100);
   lowestCandle=ArrayMinimum(low,0,100);
   MqlRates pArray[];
   ArraySetAsSeries(pArray,true);
   int pData=CopyRates(_Symbol,_Period,0,Bars(_Symbol,_Period),pArray);
   datetime dTlvl0 = ObjectGetInteger(0,"Fibonacci Retracement",OBJPROP_TIME,0);
   double PriceFibLvl00 = ObjectGetDouble(0,"Fibonacci Retracement",OBJPROP_PRICE,0);
   datetime dTlvl1 = ObjectGetInteger(0,"Fibonacci Retracement",OBJPROP_TIME,1);
   double PriceFibLvl0 = ObjectGetDouble(0,"Fibonacci Retracement",OBJPROP_PRICE,1);
   if
   (closeCandle>openCandle)
     {
      ObjectDelete(_Symbol, "Fibonacci Retracement");
      ObjectCreate(_Symbol, "Fibonacci Retracement",OBJ_FIBO,0,pArray[100].time,
                   pArray[lowestCandle].low,pArray[0].time,pArray[highestCandle].high);
      ObjectSetInteger(0,FIB_OBJ,OBJPROP_COLOR,clrGreen);
      for(int i = 0; i < ObjectGetInteger(0,FIB_OBJ,OBJPROP_LEVELS); i++)
        {
         ObjectSetInteger(0,FIB_OBJ,OBJPROP_LEVELCOLOR,i,clrGreen);
        }
      double pRange =  PriceFibLvl0 - PriceFibLvl00;
      double PriceFibLvl1 = NormalizeDouble(PriceFibLvl0 - pRange * 23.6/100,_Digits);
      double PriceFibLvl2 = NormalizeDouble(PriceFibLvl0 - pRange * 38.2/100,_Digits);
      double PriceFibLvl3 = NormalizeDouble(PriceFibLvl0 - pRange * 50/100,_Digits);
      double PriceFibLvl4 = NormalizeDouble(PriceFibLvl0 - pRange * 61.8/100,_Digits);
      double entryLvl = NormalizeDouble(PriceFibLvl0 - pRange * fibRetracLvl/100,_Digits);
      Comment("Array Open: ",openCandle,"\n",
              "Array Close: ",closeCandle,"\n",
              "Buy Entry Price: ",entryLvl);
     }
   else
     {
      ObjectDelete(_Symbol, "Fibonacci Retracement");
      ObjectCreate(_Symbol, "Fibonacci Retracement",OBJ_FIBO,0,pArray[100].time,
                   pArray[highestCandle].high,pArray[0].time,pArray[lowestCandle].low);
      ObjectSetInteger(0,FIB_OBJ,OBJPROP_COLOR,clrRed);
      for(int i = 0; i < ObjectGetInteger(0,FIB_OBJ,OBJPROP_LEVELS); i++)
        {
         ObjectSetInteger(0,FIB_OBJ,OBJPROP_LEVELCOLOR,i,clrRed);
        }
      double pRange =  PriceFibLvl00 - PriceFibLvl0;
      double PriceFibLvl1 = NormalizeDouble(PriceFibLvl0 + pRange * 23.6/100,_Digits);
      double PriceFibLvl2 = NormalizeDouble(PriceFibLvl0 + pRange * 38.2/100,_Digits);
      double PriceFibLvl3 = NormalizeDouble(PriceFibLvl0 + pRange * 50/100,_Digits);
      double PriceFibLvl4 = NormalizeDouble(PriceFibLvl0 + pRange * 61.8/100,_Digits);
      double entryLvl = NormalizeDouble(PriceFibLvl0 + pRange * fibRetracLvl/100,_Digits);
      Comment("Array Open: ",openCandle,"\n",
              "Array Close: ",closeCandle,"\n",
              "Sell Entry Price: ",entryLvl);
     }
  }
//+------------------------------------------------------------------+

이 코드에서의 차이점:

속성이 있는 창을 표시하는 #property script_show_input을 사용하여 속성을 추가하고 입력 변수를 사용하여 기본값이 38.2인 fibRetracLvl의 더블 데이터 유형을 만들 수 있습니다(예: 38.2).

#property script_show_inputs
input double fibRetracLvl = 38.2;

강세의 경우 사용자 입력에 따라 진입 레벨을 정의합니다.

double entryLvl = NormalizeDouble(PriceFibLvl0 - pRange * fibRetracLvl/100,_Digits);

약세의 경우 사용자 입력에 따라 진입 레벨을 정의합니다.

double entryLvl = NormalizeDouble(PriceFibLvl0 + pRange * fibRetracLvl/100,_Digits);

강세일 경우 코멘트

      Comment("Array Open: ",openCandle,"\n",
              "Array Close: ",closeCandle,"\n",
              "Buy Entry Price: ",entryLvl);

약세일 경우 코멘트

      Comment("Array Open: ",openCandle,"\n",
              "Array Close: ",closeCandle,"\n",
              "Sell Entry Price: ",entryLvl);

이 코드를 컴파일하고 실행하면 우리는 테스트에서 얻은 다음과 같은 강세 및 약세 배열의 예시와 같은 신호를 얻을 수 있습니다.

배열은 강세입니다:

피보 신호 2 - 강세

배열의 가장 낮은 값부터 가장 높은 값까지 녹색 FIBO 객체가 그려져 있고 차트에 주석으로 다음과 같은 값이 표시되어 있는 것을 볼 수 있습니다:

  • Array open ==>배열의 첫 번째 바의 시가.
  • Array close ==>배열의 마지막 바의 종가.
  • 매수 진입 가격 ==> 38.2 FIBO 레벨의 값.

배열은 약세입니다:

피보 신호 2 - 약세

배열의 가장 높은 값부터 가장 낮은 값까지 빨간색 FIBO 객체가 그려져 있고 차트에 코멘트로 다음 값이 표시되어 있는 것을 볼 수 있습니다:

  • Array open ==>배열의 첫 번째 바의 시가.
  • Array close ==>배열의 마지막 바의 종가.
  • 매도 진입가 ==>는 38.2 FIBO 레벨과 동일한 값입니다.


결론

이제 여러분은 피보나치 정의 주제를 통해 피보나치 기술 도구에 대해 자세히 알아보고 MetaTrader 5 거래 터미널에 사용할 수 있도록 MQL5로 간단한 피보나치 거래 시스템을 만드는 방법을 배웠고 이를 MetaTrader 5에 삽입한 후 사용하는 방법을 배웠습니다.

또한 피보나치를 만드는 두 가지 접근법을 살펴보았는데 하나는 일일 데이터를 사용하는 방법이고 다른 하나는 특정 바의 배열을 임의의 시간대에 사용하여 피보나치 레벨을 반환하고 이 레벨에 따라 매수 또는 매도 진입 레벨을 얻는 방법입니다. 더 나은 결과를 얻기 위해 이 도구를 다른 기술 도구와 결합할 것을 다시 한 번 말씀드리고 살펴본 전략이나 개념을 실제 계정에서 사용하기 전에 테스트하여 수익성이 있는지 확인해야 하며 이 글에서 주요 목표는 교육 전용이며 살펴본 전략에 대한 일부 개선 또는 최적화를 찾을 수 있다는 것 외에 모든 사람에게 공통적으로 적합한 것은 아닙니다.

이 글을 통해 새로운 것을 배우거나 트레이딩 결과를 개선할 수 있는 새로운 아이디어에 눈을 뜨는 등 유용하고 통찰력 있는 정보를 얻으셨기를 바랍니다. 가장 인기있는 기술 지표 및 도구를 기반으로 한 트레이딩 시스템 설계에 대한 유사한 기사를 더 읽고 싶다면 이동 평균, MACD, 볼린저 밴드, 스토캐스틱 등과 같은 대부분의 인기 지표를 공유하는이 시리즈의 다른 기사를 통해 알아볼 수 있으며 유용하게 사용되기를 바랍니다.

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

최근 코멘트 | 토론으로 가기 (4)
olaniyitaiye
olaniyitaiye | 14 4월 2023 에서 08:57
최고예요, 공유해 주셔서 감사합니다🙏🙏
Mohamed Abdelmaaboud
Mohamed Abdelmaaboud | 14 4월 2023 에서 14:12
olaniyitaiye #:
최고예요, 공유해 주셔서 감사합니다🙏🙏

친절한 댓글 감사합니다.

BriarK
BriarK | 13 9월 2023 에서 13:02
정말 감사합니다
Cuneyt Ates
Cuneyt Ates | 17 9월 2023 에서 22:40
르네 발케, 이 게시물 한 달 전에 만든 동영상

다음 링크에서 시청할 수 있습니다: https: //youtu.be/QmxlptpUdNE?si=bWiOXuJQjcUFr5QT
Mac OS용 MetaTrader 4 Mac OS용 MetaTrader 4
당사는 macOS용 MetaTrader 4 트레이딩 플랫폼 전용 설치 프로그램을 제공합니다. 이 프로그램은 애플리케이션을 기본적으로 설치할 수 있는 본격적인 마법사 기능을 합니다. 설치 프로그램은 필요한 모든 단계를 수행합니다: 시스템을 식별하고 최신 Wine 버전을 다운로드 및 설치하고 구성한 다음 그 안에 MetaTrader를 설치합니다. 모든 단계는 자동화 모드로 완료되며 설치 후 즉시 플랫폼을 사용할 수 있습니다.
모집단 최적화 알고리즘: 박테리아 먹이 채집 최적화(BFO) 모집단 최적화 알고리즘: 박테리아 먹이 채집 최적화(BFO)
대장균 박테리아 먹이 채집 전략은 과학자들이 BFO 최적화 알고리즘을 개발하는 데 영감을 주었습니다. 이 알고리즘에는 최적화에 대한 독창적인 아이디어와 유망한 접근 방식이며 앞으로 더 연구해 볼 만한 가치가 있습니다.
MQL5를 사용하여 캔들 스틱 패턴을 감지하는 방법 MQL5를 사용하여 캔들 스틱 패턴을 감지하는 방법
이 기사는 MQL5로 가격의 캔들 스틱 패턴을 자동으로 감지하는 방법을 알아보는 새로운 글입니다.
예제로 패턴 살펴보기(1부): 멀티 탑 예제로 패턴 살펴보기(1부): 멀티 탑
이번 글은 알고리즘 트레이딩 프레임워크의 반전 패턴과 관련된 시리즈의 첫 번째 글입니다. 더블 탑과 더블 바텀 패턴에서 유래한 가장 흥미로운 패턴 계열부터 살펴보겠습니다.