Fan sayfamıza katılın
Öyleyse bir link gönderin -
başkalarının da faydalanmasını sağlayın
- Görüntülemeler:
- 64
- Derecelendirme:
- Yayınlandı:
-
Bu koda dayalı bir robota veya göstergeye mi ihtiyacınız var? Freelance üzerinden sipariş edin Freelance'e git
Mümkün olan en basit prensipte ultra hızlı zikzak.
Sarkan köşe yok. Zaman optimizasyonlu köşe bulma desteği ile.

Avantajlar:
- Hesaplamalardaki en ağır işlev - tepe noktası araması için gereksiz döngüleri tamamen değiştiren iBarShift, ArrayBSearch ile değiştirildi, bu da göstergenin MQL4 analogundan daha verimli çalışacağı anlamına geliyor;
- Her çubuk için gerekli tüm bilgiler yalnızca tarihin herhangi bir anında mevcut olmakla kalmaz, aynı zamanda tarihin herhangi bir anı için Uzman Danışman tarafından da kullanılabilir;
- Asılı üstler yok;
- Gösterge değerlerini aramadan üstleri verimli bir şekilde arama imkanı;
- Çok hızlı çalışma;
- Geçmiş ekleme ve zaman dilimlerini değiştirmenin doğru işlenmesi;
- Uzman Danışmanlarda çalışmak için vazgeçilmezdir.
Dezavantajları:
- Bellek maliyetleri. Doğru bir zigzag çizimi için 2 tampon gerekir (1 yeterli değildir, takılmalar olacaktır), burada 5 tampon kullanılır. (Bence) #6'nın avantajı ile tamamen telafi edilmiştir. Tanım olarak, hiçbir hızlı zikzak iki tamponda geçmiş ekleme işlemini doğru bir şekilde gerçekleştiremez.
- Ek çizgiler çizmek. Bunları Uzman Danışman tarafından görünür kılmak gerekir. Hiçbir koşulda görünmemesi gereken büyüklük sırasının değerleri.
Prensip:
Yeni bir diz, ayarlarda ayarlanandan daha büyük bir geri çekilmede oluşturulmaya başlar. Nokta olarak (IdealZZZ) veya yüzde olarak (IdealZZP) ayarlanabilir
Köşeleri almak:
input int ChannelWidth=100; #property indicator_chart_window datetime LastTime; int ZZHandle; //+------------------------------------------------------------------+ //| Özel gösterge başlatma işlevi | //+------------------------------------------------------------------+ void OnInit() { LastTime = 0; ZZHandle = iCustom(_Symbol, Period(), "IdealZZ", ChannelWidth); } //+------------------------------------------------------------------+ //| GetValue| //+------------------------------------------------------------------+ bool GetValue(double dir,int bar,int prevBar,double &peak, int &peakBar,datetime &peakTime,const datetime &T[]) { if(dir<0) { double t[1]; if(0>=CopyBuffer(ZZHandle,2,bar,1,t)) return false; int i= ArrayBsearch(T, (datetime)t[0]); if(i==prevBar) { if(0>=CopyBuffer(ZZHandle,2,bar+1,1,t)) return false; i=ArrayBsearch(T,(datetime)t[0]); } double v[1]; if(0>=CopyBuffer(ZZHandle,1,i,1,v)) return false; if(v[0]==EMPTY_VALUE) { if(0>=CopyBuffer(ZZHandle,2,bar+1,1,t)) return false; i=ArrayBsearch(T,(datetime)t[0]); if(0>=CopyBuffer(ZZHandle,1,i,1,v)) return false; } peak=v[0]; peakBar=i; peakTime=(datetime)t[0]; } else if(dir>0) { double t[1]; if(0>=CopyBuffer(ZZHandle,3,bar,1,t)) return false; int i= ArrayBsearch(T, (datetime)t[0]); if(i==prevBar) { if(0>=CopyBuffer(ZZHandle,3,bar+1,1,t)) return false; i=ArrayBsearch(T,(datetime)t[0]); } double v[1]; if(0>=CopyBuffer(ZZHandle,0,i,1,v)) return false; if(v[0]==EMPTY_VALUE) { if(0>=CopyBuffer(ZZHandle,3,bar+1,1,t)) return false; i=ArrayBsearch(T,(datetime)t[0]); if(0>=CopyBuffer(ZZHandle,0,i,1,v)) return false; } peak=v[0]; peakBar=i; peakTime=(datetime)t[0]; } else { return(false); } return(true); } //+------------------------------------------------------------------+ //| GetValue| //+------------------------------------------------------------------+ void SetPt(string name,double price,datetime time) { ObjectCreate(0,name,OBJ_ARROW,0,time,price); ObjectSetInteger(0,name,OBJPROP_ARROWCODE,108); ObjectSetDouble(0,name,OBJPROP_PRICE,price); ObjectSetInteger(0,name,OBJPROP_TIME,time); } //+------------------------------------------------------------------+ //| Özel gösterge yineleme işlevi | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const datetime &T[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { if(LastTime==T[0]) return(rates_total); LastTime=T[0]; ArraySetAsSeries(T,true); double dir_[1]; if(0>=CopyBuffer(ZZHandle,4,1,1,dir_)) return rates_total; double dir=dir_[0]; double rdir=-dir; if(dir==EMPTY_VALUE) return(rates_total); double v1,v2,v3,v4,v5; int i1,i2,i3,i4,i5; datetime t1,t2,t3,t4,t5; if( GetValue(dir,1,0,v1,i1,t1,T) && GetValue(rdir,i1,0,v2,i2,t2,T) && GetValue(dir,i2,i1,v3,i3,t3,T) && GetValue(rdir,i3,i2,v4,i4,t4,T) && GetValue(dir,i4,i3,v5,i5,t5,T) ) { SetPt("1",v1,t1); SetPt("2",v2,t2); SetPt("3",v3,t3); SetPt("4",v4,t4); SetPt("5",v5,t5); Print(v1," ",v2," ",v3," ",v4," ",v5," ",i1," ",i2," ",i3," ",i4," ",i5); } else { Print("Seems to be error available..."); } return(rates_total); } //+------------------------------------------------------------------+
Bu örnek, her çubuğun (çubuk başına bir kez) son 5 tepeyi (mevcut biçimlendirilmemiş olan dahil) işaretlediğinin bir göstergesidir.
Uyarı. Sıfır çubuk modu etkinleştirilirse kod düzgün çalışmayabilir
Sıfır çubuk modu:
Kodda DrawZeroBar değişkeni tarafından açılır. Varsayılan olarak kapalıdır. Açılması tavsiye edilmez. Gösterge bir Uzman Danışman'da kullanılıyorsa, kesinlikle önerilmez.
Kullanın :) . Lütfen bulduğunuz eksiklikleri bildirin.
MetaQuotes Ltd tarafından Rusçadan çevrilmiştir.
Orijinal kod: https://www.mql5.com/ru/code/925
Corrected Average (CA)
A.Uhl tarafından Düzeltilmiş Ortalama göstergesi ("Optimal hareketli ortalama" olarak da bilinir).
Chart_Period_Changer
Ana zaman dilimlerini değiştirmek için basit komut dosyası. Ana amaç, kısayol tuşları ile geçiş kolaylığıdır.
Gün İçi Üçlü Performans
Üç çarpı işareti belirleyin ve belirli bir zamandan başlayarak (bu da ayarlanabilir) günlük yüzde performansını izleyin.
CDatetimeMsc
CDateTime milisaniye uzantısı + datetime denetleyici değişken uzantısı