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:
- 58
- Derecelendirme:
- Yayınlandı:
-
Bu koda dayalı bir robota veya göstergeye mi ihtiyacınız var? Freelance üzerinden sipariş edin Freelance'e git
Kurulum
İhtiyacımız olacak :
- 1 zigzag arsa
- Yüksek ve düşük değerler için 2 veri tamponu
- giriş parametreleri
- gösterge her yeniden hesaplandığında sıfırlanan sürekli bir sistem değişkenleri seti
#property indicator_buffers 2 #property indicator_plots 1 input double retracement=23.6;//geri çekilme miktarı input double minSizeInAtrUnits=0.0;//atr birimlerinde dalgaların dakika boyutu input int rollingAtrPeriod=14;//dönen atr periyodu input color Color=clrDodgerBlue;//dalga rengi input int Width=3;//dalga genişliği input ENUM_LINE_STYLE Style=STYLE_SOLID;//dalga stili //+------------------------------------------------------------------+ //| Özel gösterge başlatma işlevi | //+------------------------------------------------------------------+ //--- yukarı dalgalar ve aşağı dalgalar double upWaves[],dwWaves[];
upWaves dizisi tizleri, dwWaves dizisi ise pesleri depolayacaktır
Sistem değişkenleri :
son dalga türünü, nerede başladığını, nerede bittiğini, başlangıç ve bitiş arasındaki çubuklardaki mesafeyi bilmemiz gerekir.
Daha sonra yerel bir yüksek ve yerel bir düşük değişkene ve her noktadan çubuk cinsinden mesafelere ihtiyacımız var.
//--- zigzagı takip etmek //--- sahip olduğumuz dalga türü [0] yok [1] yukarı [2] aşağı int wave_type=0; //--- dalganın başlangıç fiyatı (başlangıç fiyatı) double wave_start_price=0.0; //--- dalganın fiyatı (bitiş fiyatı) double wave_end_price=0.0; //--- başlangıç fiyatından çubuk cinsinden uzaklık int wave_start_distance=0; //--- bitiş fiyatından çubuk cinsinden uzaklık int wave_end_distance=0; //--- yüksek fiyat takibi double high_mem=0.0; int distance_from_high=0; //--- düşük fiyat takibi double low_mem=0.0; int distance_from_low=0; //--- yuvarlanan atr double rollingAtr=0.0; int rollingAtrs=0;
Son olarak yuvarlanan atr birimi ve kaç tanesinin hesaplandığı
Daha sonra bir sistem sıfırlama fonksiyonu oluşturuyoruz:
void resetSystem(){ ArrayFill(upWaves,0,ArraySize(upWaves),0.0); ArrayFill(dwWaves,0,ArraySize(dwWaves),0.0); wave_type=0; wave_start_price=0.0; wave_end_price=0.0; wave_start_distance=0; wave_end_distance=0; high_mem=0.0; low_mem=0.0; distance_from_high=0; distance_from_low=0; rollingAtr=0.0; rollingAtrs=0; }
Standart şeyler, dizileri sıfırlarla doldurun ve sistem değişkenlerini sıfırlayın.
Başlangıçta tamponları ve grafiği ayarlarız ve ilk kez sıfırlama çağrısı yaparız:
SetIndexBuffer(0,upWaves,INDICATOR_DATA); SetIndexBuffer(1,dwWaves,INDICATOR_DATA); PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0); PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_ZIGZAG); PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,Color); PlotIndexSetInteger(0,PLOT_LINE_WIDTH,Width); PlotIndexSetInteger(0,PLOT_LINE_STYLE,Style); resetSystem();
Öyleyse hemen hesaplamaya geçelim.
Dikkat etmemiz gereken ilk şey yuvarlanan atr.
Atr döneminden daha fazla çubuk toplayana kadar başka bir şey yapmayacağız.
Yuvarlanan atr'yi yöneten kısım aşağıdaki gibidir :
- dönemden daha fazla toplamadıysak, bulunan çubukların aralığını bir toplamaya eklemeye devam edin
- döneme ulaştığımızda ilk bölümü (ortalama) gerçekleştiririz
- Bundan sonra, yuvarlanan atr'nin atr / dönem olan bir bölümünü kırpıyoruz ve ardından çubuk / dönem aralığı olan yeni bir bölüm ekliyoruz
//--- atr'yi yönetin rollingAtrs++; if(rollingAtrs>rollingAtrPeriod){ double new_portion=((high[i]-low[i])/_Point)/((double)rollingAtrPeriod); //--- eski bir kısmı kaldırıyoruz ve yeni bir kısım ekliyoruz rollingAtr=(rollingAtr)-(rollingAtr/((double)rollingAtrPeriod))+new_portion; } else if(rollingAtrs<=rollingAtrPeriod){ rollingAtr+=(high[i]-low[i])/_Point; if(rollingAtrs==rollingAtrPeriod){ rollingAtr/=((double)rollingAtrs); //--- yüksekler ve alçaklar ve sistem için belleği başlatın high_mem=high[i]; low_mem=low[i]; distance_from_high=0; distance_from_low=0; } }
Harika, şimdi başka bir sorun var.
Bu zig zagın temeli bir geri çekilmedir.
Ancak bir geri çekilmenin gerçekleşmesi için en az bir dalga olmalıdır.
Ama ilk dalga neyi geri çekecek? xD
Bu nedenle aşağıdakileri yapacağız:
- atr dolar dolmaz (atr toplandı = dönem), sistem değişkenlerimizdeki en yüksek ve en düşük değerleri alacağız
- hangi taraf atr birimlerinde geçerli bir boyuta sahip bir dalga oluşturmayı başarırsa ve yeni bir tepe (yukarı dalga) veya yeni bir dip (aşağı dalga) oluşturursa kazanır
bu şekilde ilk dalga olarak bir geri çekilmemiz olmaz, ancak diziyi bir şekilde başlatmalıyız.
Burada sadece ilk dalga için klasik bir fraktal yaklaşımı da seçebilirdik ve daha sonra geri çekilmelerle devam edebilirdik.
Dalgamız olmadığı sürece yapacağımız şey budur:
//--- eğer henüz bir dalga tipimiz yoksa else{ //--- eğer en yüksek seviyeyi kırdıysak ve en düşük seviyeyi kırmadıysak if(high[i]>high_mem&&low[i]>=low_mem){ double new_wave_size_in_atr_units=((high[i]-low_mem)/_Point)/rollingAtr; //--- yeni dalga boyutu geçerliyse if(new_wave_size_in_atr_units>=minSizeInAtrUnits){ //--- yeni bir yukarı dalga başlat wave_type=1; //--- başlangıç fiyatı düşük mem wave_start_price=low_mem; wave_start_distance=distance_from_low; //--- son fiyat yeni en yüksek fiyattır wave_end_price=high[i]; wave_end_distance=0; //--- dalgayı çizin dwWaves[i-wave_start_distance]=low_mem; upWaves[i]=high[i]; //--- yüksek olanı değiştir high_mem=high[i]; distance_from_high=0; //--- düşük olanı değiştir low_mem=low[i]; distance_from_low=0; } } //--- eğer en yüksek seviyeyi değil de en düşük seviyeyi kırdıysak else if(low[i]<low_mem&&high[i]<=high_mem){ double new_wave_size_in_atr_units=((high_mem-low[i])/_Point)/rollingAtr; //--- yeni dalga boyutu geçerliyse if(new_wave_size_in_atr_units>=minSizeInAtrUnits){ //--- yeni bir aşağı dalga başlatın wave_type=-1; //--- başlangıç fiyatı yüksek mem'dir wave_start_price=high_mem; wave_start_distance=distance_from_high; //--- son fiyat yeni düşük fiyattır wave_end_price=low[i]; wave_end_distance=0; //--- dalgayı çizin upWaves[i-wave_start_distance]=high_mem; dwWaves[i]=low[i]; //--- yüksek olanı değiştir high_mem=high[i]; distance_from_high=0; //--- düşük olanı değiştir low_mem=low[i]; distance_from_low=0; } } //--- eğer ikisini de kırdıysak else if(low[i]<low_mem&&high[i]>high_mem){ //--- onları değiştirin high_mem=high[i]; low_mem=low[i]; distance_from_high=0; distance_from_low=0; } }
Harika. Şimdi son parça.
- Eğer bir yükseliş dalgamız varsa:
- yeni bir yüksek yapılırsa, zikzağı önceki yüksek konumdan yeni yüksek konuma taşıyın, bunu çubuk mesafelerini koruduğumuz için yapabiliriz Ayrıca düşük ve düşük mesafeyi güncelleyin Bunu yapıyoruz, böylece zirveden bu yana en düşük düşük seviyeyi yakalayabilir ve yeni bir düşük başlatmak için yeterince geri çekilip çekilmediğini kontrol edebiliriz
- Yeni bir düşük yapılırsa veya yeni bir düşük ayarlanırsa, zirveden alçağa olan mesafeyi hesaplar ve bunu dalga boyutuna böleriz. Ayrıca giriş parametresi ölçeğine uyması için 100 ile çarpıyoruz, yani dalga boyutu 100 puan ve geri çekilme 24 puan ise 24/100 0,24, sonra x 100 %24 elde ediyoruz. Bir öncekini geri çeken yeni "olacak" dalganın boyutu da atr birimlerine karşı geçerliyse, yeni bir aşağı dalga başlatırız, yeni yerel yüksekleri ve düşükleri ayarlarız, çubuk mesafelerini ayarlarız.
işte yukarıdakiler için ilgili kod:
//--- eğer bir yukarı dalgamız varsa if(wave_type==1){ //--- dalga yukarı doğru genişlerse if(high[i]>wave_end_price){ //--- önceki son fiyatı dizi konumundan kaldırın (0.0=boş) upWaves[i-wave_end_distance]=0.0; //--- yeni konuma yerleştirin upWaves[i]=high[i]; wave_end_price=high[i]; wave_end_distance=0; //--- yüksek olanı değiştir high_mem=high[i]; distance_from_high=0; //--- düşük olanı değiştir low_mem=low[i]; distance_from_low=0; } //--- geri çekilme olup olmadığını kontrol edin if(low[i]<low_mem||distance_from_low==0){ low_mem=low[i]; distance_from_low=0; double size_of_wave=(wave_end_price-wave_start_price)/_Point; double size_of_retracement=(wave_end_price-low_mem)/_Point; if(size_of_wave>0.0){ double retraced=(size_of_retracement/size_of_wave)*100.0; double new_wave_size_in_atr_units=((wave_end_price-low_mem)/_Point)/rollingAtr; //--- yeni dalga boyutu geçerliyse if(new_wave_size_in_atr_units>=minSizeInAtrUnits){ //--- geri çekilme önemli ise, bir aşağı dalga başlatın if(retraced>=retracement){ //--- yeni bir aşağı dalga başlatın wave_type=-1; //--- başlangıç fiyatı yüksek mem'dir wave_start_price=high[i-distance_from_high]; wave_start_distance=distance_from_high; //--- son fiyat yeni düşük fiyattır wave_end_price=low[i]; wave_end_distance=0; //--- dalgayı çizin upWaves[i-wave_start_distance]=high_mem; dwWaves[i]=low[i]; //--- yüksek olanı değiştir high_mem=high[i]; distance_from_high=0; //--- düşük olanı değiştir low_mem=low[i]; distance_from_low=0; } } } } }
Bir aşağı dalgamız olduğunda tam tersini yaparız.
Ve işimiz bitti, geri çekilme zig zagımız hazır.
İşte %23,6 geri çekilme ve atr birimlerinde 0,0 dakika dalga boyutuna sahip zikzak
ve işte atr birimlerinde 3 dakikalık dalga boyutuyla aynı zig zag
MetaQuotes Ltd tarafından İngilizceden çevrilmiştir.
Orijinal kod: https://www.mql5.com/en/code/56619

TradeReportExporter betiği, işlemlerin (alım satımların) geçmişini uygun bir CSV dosyasına aktarmak için tasarlanmıştır. Yüklü olduğu enstrüman için geçen yıla ait tüm işlemlere ilişkin verileri otomatik olarak toplar. Dosya tarih ve saat, işlem türü (alış/satış), fiyat, hacim, komisyon ve kar/zarar gibi verileri içerir. Sonuç, Excel'de veya başka bir elektronik tablo düzenleyicisinde açılabilen bir dosyaya kaydedilir.

Bu robot, her bir ticaretin yönüne karar vermek için yazı tura atmayı simüle etmek için rastgele bir sayı üreteci kullanır. Nesne yönelimli bir tarzda programlanmış minimal bir uzman danışman örneği sağlar. Ayrıca, alternatif giriş yöntemlerinin kattığı değeri ölçmek için bir temel sağlar.

RSI standart sapma değerlerine göre hesaplanmıştır.

Yalnızca kene bilgilerini bir dosyaya kaydetmenize değil, aynı zamanda test cihazı tarafından modellenen keneleri kaydetmenize de olanak tanıyan bir Uzman Danışman.