Was die Funktionen Lowest und Highest zurückgeben - Seite 5

 
Candid Jetzt geht es mir gut.
Klot, interessante Option.

Wenn Ihre Zickzack-Varianten interessante Ergebnisse zeigen, kann ich sie in meiner Entwicklung anwenden?

Natürlich können Sie das, ich verfolge die Entwicklung mit Interesse und ich mag Ihre Arbeit sehr.
 
Ich danke Ihnen.
 
2 nen:
Mehr zu den "Optionen". Eine der Bedingungen für das Umschalten auf ein Extremum ist nun, dass der aktuelle Low-Wert um mehr als ExtDeviation-Punkte höher ist als der aktuelle Low-Wert (ähnlich für High). Der Code erlaubt es, bei Bedarf ganz einfach andere Optionen zu implementieren.
Nun, im Anschluss an klot möchte ich hinzufügen, dass mein derzeitiges Interesse am Zickzack allein durch mein Interesse an Ihrem Entwurf hervorgerufen wurde.
 
Ich habe den Quellcode erneut korrigiert - gestern habe ich festgestellt, dass die Regel des ersten signifikanten Balkens bei Minuten manchmal nicht beachtet wird. Um das zu überprüfen, hatte ich nur anderthalb Stunden Online-Zeit, aber es scheint, als ob es darum ging, das Doppelte mit dem Nullten zu vergleichen.
 
Ein weiterer Fehler: Extrema können nur am Ende eines Taktes umgeschaltet werden, sonst gibt es einen Unterschied zwischen Echtzeit und Historie. Es ist nicht schwer zu beheben. Ich habe den Quellcode im Zweig noch nicht korrigiert - lassen Sie die neue Version auf Minuten laufen.
 
Candid, hat eine 45er Version des ZUP-Indikators erstellt: http://onix-trade.net/forum/index.php?s=&showtopic=118&view=findpost&p=117997
Sie haben Ihren Zickzack als externen Zickzack eingeschlossen. Sobald eine stabile funktionierende Version erscheint, werde ich sie ändern.
 
Bis jetzt sehe ich keine Probleme, hier ist die korrigierte Version des Codes:
//+------------------------------------------------------------------+
//|                                                      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);
}
//+------------------------------------------------------------------+


Zu den Besonderheiten der verschiedenen Zickzacklinien. Das Hauptmerkmal dieses Zickzackkurses ist, dass alles in einem Durchgang gemacht wird, die Wiederholung der historischen Daten wird nur gemacht, wenn ein Extremum festgelegt ist, und nur für Daten nach diesem Extremum. Das heißt, sie muss ziemlich schnell sein. Die Einzelheiten der Zeichnung hängen natürlich von den Kriterien der Extremwertfestlegung ab, aber verschiedene Optionen können hier leicht umgesetzt werden. Zum Beispiel habe ich bereits Varianten erstellt, die nach dem Prozentsatz einer vorherigen Bewegung, nach der Abweichung des Hochs vom Minimum (bzw. des Tiefs vom Maximum) schalten und den Wechsel an die durchschnittliche Balkengröße binden.

 
Hier ist ein weiteres Problem mit dem Indikator: Ich habe einen Knick in meinem Zickzack gefunden (Cursorkreuz im Bild). Der Zeitpunkt des Knicks entspricht dem Zeitpunkt, an dem das Terminal ausgeschaltet wurde, der Preis dem Zeitpunkt, an dem es wieder eingeschaltet wurde.


Um meinen Verdacht zu klären, habe ich den Ausdruck in den Code eingefügt:
if (shift<5) Print ("shift=",shift,", Bars=",Bars,", Time[shift]=",TimeToStr(Time[shift],TIME_DATE|TIME_MINUTES),", High[shift]=",High[shift],", Low[shift]=",Low[shift]);


Das Terminal wurde dann geschlossen und einige Minuten später neu gestartet. Und hier ist ein Fragment des Protokolls:

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, Hoch[shift]=1.2763, Tief[shift]=1.2763 2006.10.31 23:58:26 CZZ2 EURUSD,M1: shift=0, Bars=38233, Zeit[shift]=2006.10.31 22:51, Hoch[shift]=1.2763, Tief[shift]=1.2763 2006.10.31 23:58:26 CZZ2 EURUSD,M1: shift=1, Bars=38233, Time[shift]=2006.10.31 22:50, Hoch[shift]=1.2763, Tief[shift]=1.2762 2006.10.3131 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, Hoch[shift]=1.2763, Tief[shift]=1.2762 2006.10.31 23:58:26 CZZ2 EURUSD,M1: shift=4, Bars=38233, Zeit[shift]=2006.10.31 22:45, Hoch[shift]=1.2763, Tief[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, Hoch[shift]=1.2762, Tief[shift]=1.2762 2006.10.31 23:58:22 CZZ2 EURUSD,M1: shift=0, Bars=38229, Zeit[shift]=2006.10.31 22:45, Hoch[shift]=1.2762, Tief[shift]=1.2762


Sie können sehen, dass um 23:58:23 der Verlauf noch nicht gepumpt wurde, und um 23:58:25 wurde das letzte 1 bar gepumpt. Und erst am 31.10.2006 23:58:26 waren alle Zwischenstäbe gepumpt.
Frage an die Entwickler: Ist dies die normale Reihenfolge der Seitenwechsel? Und wenn ja, was hat das für einen Sinn? Natürlich ist es wünschenswert, den aktuellen Kurswert frühzeitig zu erfahren. Aber die geplante Existenz eines Lochs in der Geschichte für einige Zeit bedeutet im Wesentlichen einen garantierten Ausfall von Indikatoren für diese Zeit. Ist es für den Benutzer nicht sicherer, die Berechnung der Indikatoren zu verschieben, bis die Geschichte vollständig ausgetauscht ist? Oder zumindest eine Neuinitialisierung nach dem vollständigen Tausch?

 
Die Sache mit dem "Reinitialisieren" war ein Fehler, es wäre im Grunde ein Wegbereiter :)
 
Ich bin mit dieser Art des Auslagerns der Geschichte vertraut. Ich habe eine Überprüfung der ersten fünf Zickzack-Breaks UND eine Neuberechnung des ZUP-Indikators vorgenommen.