Neden sadece 200 bar sınırı var?
İyi gösterge. İyi iş...
Gösterge çalışmıyor
Ne yazık ki, evet. Çalışmıyor. 4 derleme hatası ve aptalca olanlar. Ancak gösterge ilginç.
hatalar nedeniyle derlenemiyor
//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); } //+------------------------------------------------------------------+
Alım-satım fırsatlarını kaçırıyorsunuz:
- Ücretsiz alım-satım uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Kayıt
Giriş yap
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz
Hesabınız yoksa, lütfen kaydolun
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.
Author: Nikolay Kositsin