En Düşük ve En Yüksek Fonksiyonlar Ne Getirir? - sayfa 5

 
Candid şimdi iyi.
Klot , ilginç bir seçenek.

Zigzag çeşitleriniz ilginç sonuçlar gösteriyorsa, geliştirmenizde kullanılabilirler mi?

Elbette yapabilirsiniz, gelişmeleri ilgiyle takip ediyorum ve çalışmalarınızı çok beğeniyorum.
 
Teşekkür ederim.
 
2 gün :
"Seçenekler" hakkında daha fazla bilgi. Şimdi, uç değerleri değiştirmenin koşullarından biri, mevcut düşük değerin, mevcut düşük değerden ExtDeviation noktalarından daha fazla (benzer şekilde yüksek için) daha yüksek olmasıdır. Gerekirse, kod diğer seçeneklerin uygulanmasını oldukça kolaylaştırır.
Pekala, klot'u takip ederek, ZigZag'a olan şu anki ilgimin yalnızca sizin geliştirmenize olan ilgimden kaynaklandığını eklemek istiyorum.
 
Bir kez daha kaynak kodunu düzelttim - dün ilk önemli çubuğun kuralına bazen birkaç dakika boyunca uyulmadığını öğrendim. Gerçeği kontrol etmek için çevrimiçi sadece bir buçuk saat vardı, ancak mesele iki katı sıfırla karşılaştırmak gibi görünüyor.
 
Başka bir hata: ekstremumları yalnızca çubuğun sonunda değiştirebilirsiniz, aksi takdirde gerçek zamanlı ve geçmiş arasında bir fark elde edersiniz. Düzeltmek kolaydır. Daldaki kaynak kodu henüz düzeltilmedi - yeni sürümün birkaç dakika daha dönmesine izin verin.
 
Candid , ZUP göstergesinin 45. sürümünü yaptı: http://onix-trade.net/forum/index.php?s=&showtopic=118&view=findpost&p=117997
İçine zikzakınızı harici bir zikzak olarak dahil ettim. Kararlı çalışan bir sürüm çıkar çıkmaz onu değiştireceğim.
 
Görünen herhangi bir sorun olmasa da, kodun düzeltilmiş hali aşağıdadır:
//+------------------------------------------------------------------+
//|                                                      CZigZag.mq4 |
//|                                         Copyright © 2006, Candid |
//|                                                   likh@yandex.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, Candid"
#property link      "likh@yandex.ru"

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Navy

//---- indicator parameters
extern int ExtDepth=12;
extern int ExtDeviation=5;
//extern int ExtBackstep=3;

int    shift;
double res=0;
int i;
double CurMax,CurMin;
int CurMaxPos,CurMinPos;
int CurMaxBar,CurMinBar;
double hPoint;
double mhPoint;
double EDev;
int MaxDist,MinDist;
bool FirstRun;
bool AfterMax,AfterMin;
int BarTime;

//---- indicator buffers
double ZigZag[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init() {
//---- indicators
   SetIndexStyle(0,DRAW_SECTION);
//---- indicator buffers mapping
   SetIndexBuffer(0,ZigZag);
   SetIndexEmptyValue(0,0.0);
//---- indicator short name
   IndicatorShortName("ZigZag("+ExtDepth+","+ExtDeviation+")");
   
   FirstRun = true;
//----
  return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit() {
//----
   
//----
  return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start() {
  int counted_bars=IndicatorCounted();
  int fBar;
  
  if (FirstRun) {
    hPoint = 0.5*Point;
    mhPoint = -hPoint;
    EDev = (ExtDeviation+0.5)*Point;
    AfterMax = true;
    AfterMin = true;
    fBar = Bars-1;
    CurMax = High[fBar];
    CurMaxBar = 1;
    CurMin = Low[fBar];
    CurMinBar = 1;
    MaxDist = 0;
    MinDist = 0;
    BarTime = 0;
    FirstRun = false;
  }


//----
  fBar = Bars-counted_bars-1;
  if (fBar > Bars-2) fBar = Bars-2;
  for(shift=fBar; shift>=0; shift--) {
    if (BarTime!=Time[shift]) {
      BarTime=Time[shift];
      if (res > hPoint ) {
        MaxDist = Bars-CurMaxBar-shift+1;
        MinDist = Bars-CurMinBar-shift+1;
        if ((MaxDist>ExtDepth && MinDist>ExtDepth) || res > EDev) {
          if (AfterMax) {
            AfterMax = false;
            AfterMin = true;
            CurMaxBar = CurMinBar+1;
            CurMaxPos = Bars-CurMaxBar;
            CurMax = High[CurMaxPos];
            for (i=CurMaxPos-1;i>=shift;i--) {
              if (High[i] > CurMax+hPoint) {
                CurMaxBar = Bars-i;
                CurMax = High[i];
              }
            }  //  for (i=CurMaxPos-1;i>=shift;i--)
            ZigZag[Bars-CurMaxBar] = CurMax;
          } else {  //  if (AfterMax)
            AfterMin = false;
            AfterMax = true;
            CurMinBar = CurMaxBar+1;
            CurMinPos = Bars-CurMinBar;
            CurMin = Low[CurMinPos];
            for (i=CurMinPos-1;i>=shift;i--) {
              if (Low[i] < CurMin-hPoint) {
                CurMinBar = Bars-i;
                CurMin = Low[i];
              }
            }  //  for (i=CurMinPos-1;i>=shift;i--)
            ZigZag[Bars-CurMinBar] = CurMin;
          }  //  else if (AfterMax)    
        }  //  if ((MaxDist>ExtDepth && MinDist>ExtDepth) || res > EDev)
      }  //  if (res > hPoint )
    }  //  if (BarTime!=Time[0])
    if (AfterMax) {
      res = Low[shift]-CurMin;
      if (res < mhPoint) {
        ZigZag[Bars-CurMinBar] = 0;
        CurMin = Low[shift];
        CurMinBar = Bars-shift; 
        ZigZag[Bars-CurMinBar] = CurMin;
      }  //  if (res < mhPoint)
    }  //  if (AfterMax) 
    if (AfterMin) {
      res = CurMax-High[shift];
      if (res < mhPoint) {
        ZigZag[Bars-CurMaxBar] = 0;
        CurMax = High[shift];
        CurMaxBar = Bars-shift; 
        ZigZag[Bars-CurMaxBar] = CurMax;
      }  //  if (res < mhPoint)
    }  //  if (AfterMin) 
  }  //  for(shift=fBar; shift>=0; shift--)
//----
  return(0);
}
//+------------------------------------------------------------------+


Farklı zikzakların özellikleri sorusu üzerine. Bu zikzağın ana işareti, her şeyin tek geçişte yapılması, geçmiş verilerin yalnızca bir ekstremum sabitlendiğinde ve yalnızca bu ekstremden sonraki veriler için yeniden görüntülenmesidir. Yani, oldukça hızlı olmalı. Çizim özellikleri elbette ekstremum sabitleme kriterlerine bağlı olacaktır, ancak burada çeşitli seçenekleri uygulamak kolaydır. Örneğin, önceki hareketin bir yüzdesiyle geçiş yaparak, Yüksek ile düşükten uzaklaşarak (sırasıyla, Düşükten yüksekten) ve geçişi ortalama çubuk boyutuna bağlayarak seçenekler yaptım.

 
İşte göstergeyle ilgili başka bir sorun: ZigZag'ımda bir kırılma buldum (resimde imleç çarpı işareti). Mola süresi terminalin kapatıldığı zamana, fiyat ise tekrar açıldığı zamana karşılık gelir.


Ortaya çıkan bazı şüpheleri açıklığa kavuşturmak için aşağıdaki Print'i koda ekledim:
 if (shift<5) Print ("shift=",shift,", Bars=",Bars,", Time[shift]=",TimeToStr(Time[shift],TIME_DATE|TIME_MINUTES),", Yüksek[shift] =",Yüksek[shift],", Düşük[shift]=",Düşük[shift]);


Bundan sonra terminal kapatıldı ve birkaç dakika sonra tekrar başladı. Ve işte günlük pasajı:

 2006.10.31 23:58:26 CZZ2 EURUSD,M1: shift=0, Bars=38233, Time[shift]=2006.10.31 22:51, High[shift]=1.2763, Low[shift]=1.2763
2006.10.31 23:58:26 CZZ2 EURUSD,M1: shift=0, Bars=38233, Time[shift]=2006.10.31 22:51, High[shift]=1.2763, Low[shift]=1.2763
2006.10.31 23:58:26 CZZ2 EURUSD,M1: shift=0, Bars=38233, Time[shift]=2006.10.31 22:51, High[shift]=1.2763, Low[shift]=1.2763
2006.10.31 23:58:26 CZZ2 EURUSD,M1: shift=1, Bars=38233, Time[shift]=2006.10.31 22:50, High[shift]=1.2763, Low[shift]=1.2762
2006.10.31 23:58:26 CZZ2 EURUSD,M1: shift=2, Bars=38233, Time[shift]=2006.10.31 22:49, High[shift]=1.2763, Low[shift]=1.2763
2006.10.31 23:58:26 CZZ2 EURUSD,M1: shift=3, Bars=38233, Time[shift]=2006.10.31 22:47, High[shift]=1.2763, Low[shift]=1.2762
2006.10.31 23:58:26 CZZ2 EURUSD,M1: shift=4, Barlar=38233, Time[shift]=2006.10.31 22:45, High[shift]=1.2763, Low[shift]=1.2762
2006.10.31 23:58:25 CZZ2 EURUSD,M1: shift=0, Bars=38230, Time[shift]=2006.10.31 22:51, High[shift]=1.2763, Low[shift]=1.2763
2006.10.31 23:58:25 CZZ2 EURUSD,M1: shift=1, Bars=38230, Time[shift]=2006.10.31 22:45, High[shift]=1.2762, Low[shift]=1.2762
2006.10.31 23:58:23 CZZ2 EURUSD,M1: shift=0, Bars=38229, Time[shift]=2006.10.31 22:45, High[shift]=1.2762, Low[shift]=1.2762
2006.10.31 23:58:22 CZZ2 EURUSD,M1: shift=0, Bars=38229, Time[shift]=2006.10.31 22:45, High[shift]=1.2762, Low[shift]=1.2762


23:58:23'te tarihin henüz pompalanmadığı ve 23:58:25'e kadar 1 son çubuğun pompalandığı görülebilir. Ve sadece 2006.10.31 23:58:26'ya kadar tüm ara çubuklar indirildi.
Geliştiricilere soru: Bu standart bir takas sırası mı? Ve eğer öyleyse, amaç ne? Mevcut fiyat değerinin erken elde edilmesinin arzu edilir olduğu açıktır. Ancak tarihte bir süre için planlanan bir deliğin varlığı, esasen bu süre için göstergelerin garantili bir başarısızlığı anlamına gelir. Kullanıcının göstergelerin hesaplanmasını geçmiş tamamen yüklenene kadar ertelemesi daha güvenli değil mi? Veya en azından onları yeniden başlatmak için tam bir takastan sonra?

 
"Yeniden başlat" konusuna gelince, boşuna yazdım, esasen izleri kapatacak :)
 
Bu tür tarihin değiş tokuşuna aşinayım. İlk beş zikzak molasının kontrolünü VE ZUP göstergesinin yeniden hesaplanmasını yaptım.