Göstergeler: iGDR_Fractal_Levels

 

iGDR_Fractal_Levels:

iGDR_Fractal_Levels göstergesi fraktalların seviyelerini gösterir, ancak hepsini değil, yalnızca belirli bir süre için ortalama değerlerini gösterir.

iGDR_Fractal_Levels

Author: Nikolay Kositsin

 
Neden sadece 200 bar sınırı var?
 
İyi gösterge. İyi iş...
 
Automated-Trading:

iGDR_Fractal_Levels:

Yazar: Nikolay Kositsin

Gösterge çalışmıyor
 
Ne yazık ki, evet. Çalışmıyor. 4 derleme hatası ve aptalca olanlar. Ancak gösterge ilginç.
 

Derleme sırasında hata aldım

nasıl düzeltilir

 
hatalar nedeniyle derlenemiyor
 
Benkele Goitsemodimo # hatalar nedeniyle derlenemiyor

Düzeltildi.

 

//Gösterge ilginç. Düzeltilmiş kod

      //+------------------------------------------------------------------+
//|iGDR_Fractal_Levels.mq5 |
//| Telif Hakkı © 2008-2009, GreenDog, Rusya |
//|krot@inbox.ru |
//+------------------------------------------------------------------+
//---- gösterge yazarlığı
#property copyright "Telif Hakkı © 2008-2009, GreenDog."
//---- yazarın web sitesine bağlantı
#property link      "krot@inbox.ru"
//---- gösterge sürüm numarası
#property version   "1.00"
//---- ana pencerede gösterge çizin
#property indicator_chart_window 
#property indicator_buffers  1
#property indicator_plots    1
//+----------------------------------------------+
//|| Bir numaralandırma bildirme |
//+----------------------------------------------+
enum FRACTAL_MODE
  {
   MODE_HIGH_LOW=0, // extrema tarafından
   MODE_LOW,        // tepe noktasına göre
   MODE_HIGH        // çukurlar tarafından
  };
//+----------------------------------------------+
//|| Bir numaralandırma bildirme |
//+----------------------------------------------+
enum FRACTAL_TYPE
  {
   TYPE1=0, // katı
   TYPE2    // katı olmayan
  };
//+----------------------------------------------+
//|| Gösterge giriş parametreleri |
//+----------------------------------------------+
input uint frNum_=2;                      // Fraktalın çubuk sayısı, 2=5-bar fraktal, 3=7-bar fraktal, vb.
input FRACTAL_TYPE frType= TYPE2;         // Fraktal tanımının türü 0=sıkı, 1=sıkı olmayan
input FRACTAL_MODE frMode =MODE_HIGH_LOW; // Mod 
input double dlt_=0.24;                   // Ortalama çubuk yüksekliğinden kaynaklanan hata
input uint sBars_=200;                    // Çubuk sayısı (maks. 200)
//----
input color  BG1_Color = PaleGreen;  // İlk seviyelerin arka plan rengi
input color  TL1Color  = Green;      // İlk seviye satırların rengi
input color  BG2_Color = Yellow;     // İkinci seviyelerin arka plan rengi
input color  TL2Color  = DarkOrange; // İkinci seviyelerin çizgilerinin rengi
input color  BG3_Color = Pink;       // Üçüncü seviyelerin arka plan rengi
input color  TL3Color  = Red;        // Üçüncü seviye çizgilerin rengi
//+----------------------------------------------+
uint lastBars=0;
uint frNum,sBars;
datetime lastTime=0;
color BGColor[3],TLColor[3];
double aData[240][2],aRes[3][2];
//+------------------------------------------------------------------+
//| Özel gösterge başlatma işlevi |
//+------------------------------------------------------------------+ 
void OnInit()
  {
//---- sabitlerin başlatılması
   frNum=frNum_;
   if(frNum_<2) frNum=2;
   sBars=sBars_;
   if(sBars_>200) sBars=200;
   if(sBars_<10) sBars=10;
   BGColor[0]=BG1_Color;
   BGColor[1]=BG2_Color;
   BGColor[2]=BG3_Color;
   TLColor[0]=TL1Color;
   TLColor[1]=TL2Color;
   TLColor[2]=TL3Color;
//----
  }
//+------------------------------------------------------------------+
//| Metin etiketi oluşturma|
//+------------------------------------------------------------------+
void CreateTextLabel(long     chart_id,   // grafik tanımlayıcısı
                     string   name,       // nesne adı
                     int      nwin,       // pencere indeksi
                     datetime time1,      // 1 fiyat seviyesinin zamanı
                     double   price1,     // 1 fiyat seviyesi
                     color    Color,      // çizgi rengi
                     string   text,       // metin
                     string   font,       // yazı tipi 
                     int      fontsize)   // yazı tipi boyutu
  {
//----
   ObjectCreate(chart_id,name,OBJ_TEXT,nwin,time1,price1);
   ObjectSetInteger(chart_id,name,OBJPROP_COLOR,Color);
   ObjectSetInteger(chart_id,name,OBJPROP_BACK,true);
   ObjectSetInteger(chart_id,name,OBJPROP_SELECTED,true);
   ObjectSetInteger(chart_id,name,OBJPROP_SELECTABLE,true);
   ObjectSetInteger(chart_id,name,OBJPROP_ZORDER,true);
   ObjectSetString(chart_id,name,OBJPROP_FONT,font);
   ObjectSetString(chart_id,name,OBJPROP_TEXT,text);
   ObjectSetInteger(chart_id,name,OBJPROP_FONTSIZE,fontsize);
//----
  }
//+------------------------------------------------------------------+
//|| Metin etiketini sıfırlama|
//+------------------------------------------------------------------+
void SetTextLabel(long     chart_id,    // grafik tanımlayıcısı
                  string   name,        // nesne adı
                  int      nwin,        // pencere indeksi
                  datetime time1,       // 1 fiyat seviyesinin zamanı
                  double   price1,      // 1 fiyat seviyesi
                  color    Color,       // çizgi rengi
                  int      style,       // çizgi stili
                  int      width,       // çizgi kalınlığı
                  string   text,        // metin
                  string   font,        // yazı tipi
                  int      fontsize)    // yazı tipi boyutu
  {
//----
   if(ObjectFind(chart_id,name)==-1)
     {
      CreateTextLabel(chart_id,name,nwin,time1,price1,Color,text,font,fontsize);
     }
   else
     {
      ObjectSetString(chart_id,name,OBJPROP_TEXT,text);
      ObjectMove(chart_id,name,0,time1,price1);
      ObjectSetInteger(chart_id,name,OBJPROP_COLOR,Color);
     }
//----
  }
//+------------------------------------------------------------------+
//| Kanal oluşturma|
//+------------------------------------------------------------------+
void CreateChannel(long     chart_id,      // grafik tanımlayıcısı
                   string   name,          // nesne adı
                   int      nwin,          // pencere indeksi
                   datetime time1,         // 1 fiyat seviyesinin zamanı
                   double   price1,        // 1 fiyat seviyesi
                   datetime time2,         // fiyat seviyesi 2'nin zamanı
                   double   price2,        // 2 fiyat seviyesi
                   datetime time3,         // fiyat seviyesi 3'ün zamanı
                   double   price3,        // 3 fiyat seviyesi
                   color    Color,         // çizgi rengi
                   int      style,         // çizgi stili
                   int      width,         // çizgi kalınlığı
                   string   text)          // metin
  {
//----
   ObjectCreate(chart_id,name,OBJ_CHANNEL,nwin,time1,price1,time2,price2);
   ObjectSetInteger(chart_id,name,OBJPROP_COLOR,Color);
   ObjectSetInteger(chart_id,name,OBJPROP_STYLE,style);
   ObjectSetInteger(chart_id,name,OBJPROP_WIDTH,width);
   ObjectSetString(chart_id,name,OBJPROP_TEXT,text);
   ObjectSetInteger(chart_id,name,OBJPROP_FILL,true);
   ObjectSetInteger(chart_id,name,OBJPROP_BACK,true);
   ObjectSetInteger(chart_id,name,OBJPROP_RAY_RIGHT,true);
   ObjectSetInteger(chart_id,name,OBJPROP_RAY,true);
   ObjectSetInteger(chart_id,name,OBJPROP_SELECTED,true);
   ObjectSetInteger(chart_id,name,OBJPROP_SELECTABLE,true);
   ObjectSetInteger(chart_id,name,OBJPROP_ZORDER,true);
//----
  }
//+------------------------------------------------------------------+
//|| Kanalın yeniden yüklenmesi|
//+------------------------------------------------------------------+
void SetChannel(long     chart_id,    // grafik tanımlayıcısı
                string   name,        // nesne adı
                int      nwin,        // pencere indeksi
                datetime time1,       // 1 fiyat seviyesinin zamanı
                double   price1,      // 1 fiyat seviyesi
                datetime time2,       // fiyat seviyesi 2'nin zamanı
                double   price2,      // 2 fiyat seviyesi
                datetime time3,       // fiyat seviyesi 3'ün zamanı
                double   price3,      // 3 fiyat seviyesi
                color    Color,       // çizgi rengi
                int      style,       // çizgi stili
                int      width,       // çizgi kalınlığı
                string   text)        // metin
  {
//----
   if(ObjectFind(chart_id,name)==-1)
     {
      CreateChannel(chart_id,name,nwin,time1,price1,time2,price2,time3,price3,Color,style,width,text);
     }
   else
     {
      ObjectSetString(chart_id,name,OBJPROP_TEXT,text);
      ObjectMove(chart_id,name,0,time1,price1);
      ObjectMove(chart_id,name,1,time2,price2);
      ObjectMove(chart_id,name,2,time3,price3);
      ObjectSetInteger(chart_id,name,OBJPROP_COLOR,Color);
     }
//----
  }
//+------------------------------------------------------------------+
//| Trend çizgisi oluşturma|
//+------------------------------------------------------------------+
void CreateTline(long     chart_id,    // grafik tanımlayıcısı
                 string   name,        // nesne adı
                 int      nwin,        // pencere indeksi
                 datetime time1,       // 1 fiyat seviyesinin zamanı
                 double   price1,      // 1 fiyat seviyesi
                 datetime time2,       // fiyat seviyesi 2'nin zamanı
                 double   price2,      // 2 fiyat seviyesi
                 color    Color,       // çizgi rengi
                 int      style,       // çizgi stili
                 int      width,       // çizgi kalınlığı
                 string   text)        // metin
  {
//----
   ObjectCreate(chart_id,name,OBJ_TREND,nwin,time1,price1,time2,price2);
   ObjectSetInteger(chart_id,name,OBJPROP_COLOR,Color);
   ObjectSetInteger(chart_id,name,OBJPROP_STYLE,style);
   ObjectSetInteger(chart_id,name,OBJPROP_WIDTH,width);
   ObjectSetString(chart_id,name,OBJPROP_TEXT,text);
   ObjectSetInteger(chart_id,name,OBJPROP_BACK,false);
   ObjectSetInteger(chart_id,name,OBJPROP_RAY_RIGHT,true);
   ObjectSetInteger(chart_id,name,OBJPROP_RAY,true);
   ObjectSetInteger(chart_id,name,OBJPROP_SELECTED,true);
   ObjectSetInteger(chart_id,name,OBJPROP_SELECTABLE,true);
   ObjectSetInteger(chart_id,name,OBJPROP_ZORDER,true);
//----
  }
//+------------------------------------------------------------------+
//|| Trend çizgisini sıfırlama|
//+------------------------------------------------------------------+
void SetTline(long     chart_id,    // grafik tanımlayıcısı
              string   name,        // nesne adı
              int      nwin,        // pencere indeksi
              datetime time1,       // 1 fiyat seviyesinin zamanı
              double   price1,      // 1 fiyat seviyesi
              datetime time2,       // fiyat seviyesi 2'nin zamanı
              double   price2,      // 2 fiyat seviyesi
              color    Color,       // çizgi rengi
              int      style,       // çizgi stili
              int      width,       // çizgi kalınlığı
              string   text)        // metin
  {
//----
   if(ObjectFind(chart_id,name)==-1)
     {
      CreateTline(chart_id,name,nwin,time1,price1,time2,price2,Color,style,width,text);
     }
   else
     {
      ObjectSetString(chart_id,name,OBJPROP_TEXT,text);
      ObjectMove(chart_id,name,0,time1,price1);
      ObjectMove(chart_id,name,1,time2,price2);
      ObjectSetInteger(chart_id,name,OBJPROP_COLOR,Color);
     }
//----
  }
//+------------------------------------------------------------------+
//| Üst fraktalın bulunması|
//+------------------------------------------------------------------+ 
bool upFrac(int cnt,const double &High[])
  {
//----
   for(int i=1; i<=int(frNum); i++)
     {
      if(frType==TYPE1)
        {
        //---- eğer katı koşul ve post veya pre-bar'lar komşuya eşit-üstü ise - fraktal yok
         if(High[cnt+i]>=High[cnt+i-1] || High[cnt-i]>=High[cnt-i+1]) return(false);
        }
      else
        { 
        //---- koşul katı değilse ve post veya pre-çubuklar merkezin üzerindeyse - fraktal yok
         if(High[cnt+i]>High[cnt] || High[cnt-i]>High[cnt]) return(false);
        }
     }
//----
   return(true);
  }
//+------------------------------------------------------------------+
//| Alt fraktalın bulunması|
//+------------------------------------------------------------------+ 
bool dwFrac(int cnt,const double &Low[])
  {
//----
   for(int i=1; i<=int(frNum); i++)
     {
      if(frType==TYPE1)
        { 
         //---- eğer katı koşul ve post veya pre-bar'lar komşuya göre düşük-eşit ise - fraktal yok
         if(Low[cnt+i]<=Low[cnt+i-1] || Low[cnt-i]<=Low[cnt-i+1]) return(false);
        }
      else
        { 
         //---- koşul katı değilse ve son veya ön çubuklar merkezin altındaysa - fraktal yok
         if(Low[cnt+i]<Low[cnt] || Low[cnt-i]<Low[cnt]) return(false);
        }
     }
//----
   return(true);
  }
//+------------------------------------------------------------------+
//| Özel gösterge devre dışı bırakma işlevi |
//+------------------------------------------------------------------+ 
void OnDeinit(const int reason)
  {
//----
   Comment("");
   for(int i=0; i<3; i++)
     {
      string name="IPGDR_Lv"+string(i);
      ObjectDelete(0,name);
      ObjectDelete(0,name+"Up");
      ObjectDelete(0,name+"Dw");
      ObjectDelete(0,name+"Tx");
     }
//----
  }
//+------------------------------------------------------------------+
//| Özel gösterge yineleme işlevi |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,    // geçerli tikteki çubuklardaki geçmiş miktarı
                const int prev_calculated,// önceki tikteki çubuklardaki geçmiş miktarı
                const datetime &time[],
                const double &open[],
                const double& high[],     // gösterge hesaplaması için maksimum fiyatların fiyat dizisi
                const double& low[],      // gösterge hesaplaması için minimum fiyatların fiyat dizisi
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---- hesaplama için yeterlilik açısından çubuk sayısını kontrol edin
   if(rates_total<int(sBars)) return(0);

//---- zaman serilerinde olduğu gibi dizilerdeki öğelerin indekslenmesi 
   ArraySetAsSeries(time,true);
   ArraySetAsSeries(close,true);
   ArraySetAsSeries(open,true);
   ArraySetAsSeries(high,true);
   ArraySetAsSeries(low,true);

   lastBars=rates_total;

//---- fraktalları arayın, onları diziye yerleştirin, ancak izin verilen fraktal sayısından fazla olmamalıdır.
   int sh=0;
   ArrayInitialize(aData,0);
   double lastExt=0;
   int total=int(sBars-2*frNum);
   int start=int(frNum+1);

   for(int i=start; i<total; i++)
     {
    // if(frMode!=MODE_LOW && upFrac(i,high))
    if(frMode!=FRACTAL_MODE::MODE_LOW && upFrac(i,high))
        { 
         //---- köşe ekle [çukur modu hariç]
         //---- katı olmayan koşullar altında yinelenen komşu köşeleri atla
         if(!(frType!=TYPE1 && lastExt>0 && lastExt==high[i]))
           {
            aData[sh][0]=high[i];
            lastExt=high[i];
            sh++;
           }
        }

      if(sh>=240) break;

     // if(frMode!=MODE_HIGH && dwFrac(i,low))
     if(frMode!=FRACTAL_MODE::MODE_HIGH && dwFrac(i,low))
        { 
         //---- çöküntü ekleyin [tepe noktası modu hariç]
         //---- katı olmayan koşullar altında yinelenen komşu olukları atlayın
         if(!frType!=TYPE1 && lastExt>0 && lastExt==low[i])
           {
            aData[sh][0]=low[i];
            lastExt=low[i];
            sh++;
           }
        }
      if(sh>=240) break;
     }

//---- ortalama mum yayılımını ve buna karşılık gelen toleransı belirleyin
   double dlt,sHL=0;
   for(int i=1; i<=int(sBars); i++) sHL+=(high[i]-low[i]);
   sHL/=sBars;
   dlt=sHL*dlt_;

//---- her seviye için derecelendirme tanımlayın
   for(int i=0; i<sh; i++)
      for(int j=i+1; j<sh; j++)
         if(aData[j][0]>aData[i][0]-dlt && aData[j][0]<aData[i][0]+dlt)
           {
            aData[i][1]+=1;
            aData[j][1]+=1;
           }

//---- en güçlü üç seviyeyi tanımlayın
   double cur[2],tmp[2];
   aRes[0][0]=aData[0][0];
   aRes[0][1]=aData[0][1];

   for(int i=1; i<sh; i++)
     {
      cur[0]=aData[i][0];
      cur[1]=aData[i][1];

      if(cur[1]>aRes[0][1])
        { 
         //---- eğer derece 1'den büyükse, 1. derece geçerli olur
         tmp[0]=aRes[0][0];
         tmp[1]=aRes[0][1];
         aRes[0][0]=cur[0];
         aRes[0][1]=cur[1];
         cur[0]=tmp[0];
         cur[1]=tmp[1];
        }

      //---- reyting 2. sıradan yüksekse ve yine de 1. sıraya ait değilse, 2. sırayı değiştirin
      if(cur[1]>aRes[1][1] && (cur[0]<aRes[0][0]-dlt || cur[0]>aRes[0][0]+dlt))
        {
         tmp[0]=aRes[1][0]; tmp[1]=aRes[1][1]; aRes[1][0]=cur[0]; aRes[1][1]=cur[1]; cur[0]=tmp[0]; cur[1]=tmp[1];
        }
      //---- derecelendirme 3. sıradan daha yüksekse ve yine de 1. ve 2. sıraya ait değilse, 3. sırayı değiştirin
      if(cur[1]>aRes[2][1] && (cur[0]<aRes[0][0]-dlt || cur[0]>aRes[0][0]+dlt) && (cur[0]<aRes[1][0]-dlt || cur[0]>aRes[1][0]+dlt))
        {
         aRes[2][0]=cur[0];
         aRes[2][1]=cur[1];
        }
     }

   for(int i=0; i<3; i++)
     {
      double dwL=aRes[i][0]-dlt,upL=aRes[i][0]+dlt;
      string name="IPGDR_Lv"+string(i);

      SetChannel(0,name,0,time[24],upL,time[1],upL,time[24],dwL,BGColor[i],STYLE_SOLID,1,name);
      SetTline(0,name+"Up",0,time[24],upL,time[1],upL,TLColor[i],STYLE_SOLID,1,name+"Up");
      SetTline(0,name+"Dw",0,time[24],dwL,time[1],dwL,TLColor[i],STYLE_SOLID,1,name+"Dw");
      SetTextLabel(0,name+"Tx",0,time[32],upL+2*_Point,TLColor[i],STYLE_SOLID,1,DoubleToString(aRes[i][0],_Digits),"tahoma",14);
     }

//---- yorumları görüntüle
   string rem1="",rem2="";
   if(frType==TYPE2) rem1=rem1+"Klasik";
   else rem1=rem1+"Kesinlikle";

   rem1=rem1+string(frNum*2+1)+"-bar fraktalları.";
  // if(frMode==MODE_LOW) rem1=rem1+", troughs";
 if(frMode==FRACTAL_MODE::MODE_LOW) rem1=rem1+", dipler.";
   //else if(frMode==MODE_HIGH) rem1=rem1+", vertex";
else if(frMode==FRACTAL_MODE::MODE_HIGH) rem1=rem1+", üstler.";
   rem1=rem1+"\n Bulundu."+string(sh)+" fraktal(lar) \n En güçlü seviyeler ";

   StringConcatenate(rem2,aRes[0][0],"[",aRes[0][1],"], ",
                     aRes[1][0],"[",aRes[1][1],"], ",aRes[2][0],"[",aRes[2][1],
                     "], hata ±",NormalizeDouble(dlt/_Point,1),"paragraf(lar)");
   Comment(rem1+rem2);

//----
   ChartRedraw(0);
//---- 
   return(rates_total);
  }
//+------------------------------------------------------------------+