Was die Funktionen Lowest und Highest zurückgeben

 
Liebe Metatrader-Entwickler!

Was geben die Funktionen Lowest und Highest zurück?
Warum stelle ich eine solche Frage? Die Beschreibung dieser Funktionen ist verwirrend. Bei der Analyse, warum ZigZag im MetaTrader nicht richtig funktioniert, musste ich feststellen, dass unklar ist, was die oben genannten Funktionen zurückgeben. Oder werden sie vielleicht wegen der verwirrenden Beschreibung falsch angewandt? Ich habe dieses Problem in diesem Forum auf Seite 77 im Abschnitt "Trading strategy based on Elliot's wave theory" beschrieben. Ich versuche zu verstehen, ob der ZigZag-Algorithmus falsch ist. Aber es hängt alles davon ab, wie diese Funktionen funktionieren.

Ich habe auch bei anderen Indikatoren Probleme mit diesen Funktionen beobachtet. Aber im Moment ist es in ZigZag.

Bitte klären Sie das.
 
Sie geben die Nummer des höchsten und des niedrigsten Balkens über N Balken vom aktuellen Balken bis zum Ende der Historie zurück. In diesem Fall, wenn zwei Werte gleich sind (zwei Balken sind Extremwerte in dieser Stichprobe), wird immer die Nummer des Balken zurückgegeben, der früher kam (älter ist).

Der Zigzag-Algorithmus (standardmäßig in MT4 enthalten) berücksichtigt nicht die Situation, dass ein Balken gleichzeitig ein Maximum und ein Minimum sein kann (ein äußerer Balken).
 
Rosh, das ist verständlich. Versuchen Sie, die Zeilen, die ich im Thread zur Wellenanalyse angegeben habe, in den Zickzack-Text einzufügen. Und sehen Sie, was Sie bekommen. Und Sie bekommen Müll. Deshalb wurde die Frage aufgeworfen.

In der Theorie ist alles klar, bis sie von der Praxis abweicht. Wenn Fehler auftreten, müssen Sie bis zum Ende durchgehen. Und finden Sie heraus, woher die Fehler kommen.
 
Rosh, das ist verständlich. Versuchen Sie, die Zeilen, die ich im Thread zur Wellenanalyse angegeben habe, in den Zickzack-Text einzufügen. Und sehen Sie, was Sie bekommen. Und Sie bekommen Müll. Aus diesem Grund habe ich Ihnen diese Frage gestellt. <br / translate="no">


Ich habe mir die Seite von onyx angesehen und die Standard-Zigzag zum Vergleich geöffnet. Die Codes sind unterschiedlich, du musst deine Variante von Zigzag finden, sie gründlich auseinandernehmen und erst dann kannst du etwas sagen. Deshalb kann ich auch nicht antworten.

Aber ja, es gibt einige Unterschiede bei der Aufzeichnung der Werte im Code, der auf Ihrer Seite angezeigt wird, aber vielleicht sollte es so sein, es ist schwer zu sagen. Ich habe solche Indikatoren mit Crawl-Werten gemacht, es sieht aus wie ein Kanal, aber zumindest liegt es nicht auf der Geschichte.
 
Rosh, hier ist der Zickzack-Code von codebase.mql.com

//+------------------------------------------------------------------+
//| Benutzerdefinierter gleitender Durchschnitt.mq4 |
//| Copyright © 2005, MetaQuotes Software Corp.
//| https://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, MetaQuotes Software Corp."
#Eigenschaftslink "https://www.metaquotes.net/

#property indicator_chart_window
#Eigenschaft indicator_buffers 1
#property indicator_color1 Rot
//---- Indikatorparameter
extern intDepth=12;
extern inttern ExtDeviation=5;
extern inttern ExtBackstep=3;
//---- Indikatorpuffer
double ExtMapBuffer[];
double ExtMapBuffer2[];

//+------------------------------------------------------------------+
//| Benutzerdefinierte Initialisierungsfunktion für Indikatoren |
//+------------------------------------------------------------------+
int init()
{
IndikatorPuffer(2);
//---- Zeichnungseinstellungen
SetIndexStyle(0,DRAW_SECTION);
//---- Zuordnung von Indikatorpuffern
SetIndexBuffer(0,ExtMapBuffer);
SetIndexPuffer(1,ExtMapPuffer2);
SetIndexEmptyValue(0,0.0);
//---- Indikator Kurzbezeichnung
IndicatorShortName("ZigZag("+ExtDepth+", "+ExtDeviation+", "+ExtBackstep+")");
//---- Initialisierung abgeschlossen
zurück(0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
int shift,back,lasthighpos,lastlowpos;
double val,res;
double curlow,curhigh,lasthigh,lastlow;

for(shift=Bars-ExtDepth; shift>=0; shift--)
{
val=Low[Lowest(NULL,0,MODE_LOW,ExtDepth,shift)];
if(val==lastlow) val=0.0;
sonst
{
lastlow=val;
if((Low[shift]-val)>(ExtDeviation*Point)) val=0.0;
sonst
{
for(back=1; back<=ExtBackstep; back++)
{
res=ExtMapBuffer[shift+back];
if((res!=0)&&(res>val)) ExtMapBuffer[shift+back]=0.0;
}
}
}
****** ExtMapBuffer[shift]=val;
//--- hoch
val=High[Highest(NULL,0,MODE_HIGH,ExtDepth,shift)];
if(val==lasthigh) val=0.0;
sonst
{
lasthigh=val;
if((val-High[shift])>(ExtDeviation*Point)) val=0.0;
sonst
{
for(back=1; back<=ExtBackstep; back++)
{
res=ExtMapBuffer2[shift+back];
if((res!=0)&&(res<val)) ExtMapBuffer2[shift+back]=0.0;
}
}
}
***** ExtMapBuffer2[shift]=val;
}


============================

Die Sternchen kennzeichnen Stellen, die ich auf Seite 77 meines Wellenanalysezweigs zitiert habe. Inwiefern unterscheidet sich dieser Kodex von dem, den ich zitiert habe? Dies ist ein Standardcode.

Jetzt zitiere ich Ihre Worte aus dem zweiten Beitrag dieses Themas

Rosh 18.10.06 10:14

Sie gibt die Nummer des höchsten und des niedrigsten Balkens innerhalb von N Balken ab dem aktuellen Balken in der Tiefe der Historie zurück. Wenn dabei zwei Werte gleich sind (zwei Balken sind Extrema in dieser Stichprobe), wird immer die Nummer des ersten Balkens (des ältesten) zurückgegeben.

Der Zickzack-Algorithmus (standardmäßig in MT4 enthalten) berücksichtigt nicht die Situation, dass ein Balken gleichzeitig ein Maximum und ein Minimum sein kann (äußerer Balken).
======================
Es gibt eine Zeile im Code: val=High[Highest(NULL,0,MODE_HIGH,ExtDepth,shift)];
Die eckigen Klammern enthalten die Taktnummer... Ihre Antwort gibt Aufschluss darüber, was diese Bar-Nummer ist.

Dann in der Zeile: ExtMapBuffer[shift]=val; - was haben wir? Müssen wir das weiter erklären?

Zunächst muss der Index des Indikatorpuffers mit dem Index des Balkens übereinstimmen, aus dem wir den Val-Wert entnehmen. Andernfalls kommt es zu einer Diskrepanz. Wenn wir sehen, dass das Zickzack eine Unterbrechung in der Luft hat, dann haben wir es tatsächlich mit einem Problem zu tun.

Rosh, lass dich nicht ablenken. Ihr Geistesprodukt ist ein Zickzack. Gehen wir der Sache auf den Grund. Der Code enthält eine Menge Fehler. Wenn Sie sorgfältig analysieren, was ich schreibe, werden Sie offensichtliche Fehler erkennen.

Aber das ist auch nicht die Hauptsache. Wenn es nur um diese Fehler ginge, hätte ich die Frage, die der Titel dieses Threads ist, nicht gestellt.
 
Nochmals zu den Funktionen "Niedrigste" und "Höchste".

Im letzten Beitrag habe ich über einen Fehler im Zickzack-Code geschrieben.

Der Hauptfehler.

In einer Reihe von ExtDepth-Balken wird der Balken mit dem höchsten Hoch oder dem niedrigsten Tief gesucht. Die Suche wird über die SHIFT-Leiste durchgeführt. Roche gab die folgende Funktionsdefinition an: Sie gibt die Nummer des höchsten und des niedrigsten Balkens innerhalb von N Balken des aktuellen Balkens in der Historie zurück. Es gibt jedoch keine Definition, was die aktuelle Messlatte ist. Der aktuelle Balken ist ein Nullbalken oder ein Balken mit Verschiebungsnummer. Nach dem gegebenen Code des Zickzacks zu urteilen, sollte der aktuelle Takt als ein Takt mit Verschiebungsnummer verstanden werden.

Angenommen, wir haben die Taktnummer in der ExtDepth-Sektion der Takte gefunden, wobei wir vom Takt mit der Verschiebungsnummer aus zählen. Und dieser Balken hat nicht unbedingt eine Schichtnummer. Aber der Wert des Extremwerts des gefundenen Balkens, der sich von dem Balken mit der Verschiebungsnummer unterscheidet, wird in den Indikatorpuffer mit der Verschiebungsnummer gestellt: ExtMapBuffer[shift]=val. Dadurch entstehen Unterbrechungen in dem in der Luft hängenden Zickzack. Jeder, der versucht hat, mit Zickzack von MT zu arbeiten, hat es gesehen.

Dies ist ein großer Fehler. Aber dieser Fehler ist leicht zu korrigieren. Und es hat sich nicht gelohnt, das Thema anzusprechen.

Wenn man anfängt, diesen Fehler zu beheben, wird man sich fragen: Auf dem Balken mit welcher Nummer haben die Funktionen Lowest und Highest das gesuchte Extremum gefunden? Hier hilft keine Logik. So sehr ich mich auch bemühte, die Nummer dieses Balkens herauszufinden, es gelang mir nicht.

Aus diesem Grund wurde die Frage an die Entwickler gerichtet.

Aber ich war froh, dass die Frage von Rosh beantwortet wurde. Nach seinen Bearbeitungen verwenden wir seit langem den in MT enthaltenen Zickzackkurs.

Liebe Entwickler, bitte beachten Sie die gestellten Fragen. Die Fragen sind ernst. Viele Indikatoren verwenden den Zickzackkurs, der in der MT enthalten ist. Ich kann die Zahl der Beschwerden über die Arbeit des Zickzack nicht zählen.
Ich habe eine Beschreibung der Fehler gegeben. Fehler müssen zu einem guten Teil korrigiert werden. Die Nichtbehebung von Fehlern schadet dem Ruf des Unternehmens. Und das ist nicht gut. Niemand will das.
 
...stellt sich die Frage, auf welchem Balken die niedrigste und die höchste Funktion das gesuchte Extremum finden? Hier hilft keine Logik. Egal, wie sehr ich mich bemühte, die Nummer des Balkens zu berechnen, es funktionierte nicht.
Nach der Idee, Index des Balkens = Höchste(NULL,0,MODE_HIGH,ExtDepth,shift)

D.h. es sollte ExtMapBuffer2[Highest(NULL,0,MODE_HIGH,ExtDepth,shift)]=val sein;
 
nen, jetzt habe ich mir den Standard-Zig-Zag-Algorithmus angesehen - es gibt noch einen anderen Algorithmus, der sich von dem, den du angegeben hast, unterscheidet:

//+------------------------------------------------------------------+
//|                                                       ZigZag.mq4 |
//|                      Copyright © 2005, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net/"

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Red
//---- indicator parameters
extern int ExtDepth=12;
extern int ExtDeviation=5;
extern int ExtBackstep=3;
//---- indicator buffers
double ExtMapBuffer[];
double ExtLowBuffer[];
double ExtHighBuffer[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   IndicatorBuffers(3);
//---- drawing settings
   SetIndexStyle(0,DRAW_SECTION);
//---- indicator buffers mapping
   SetIndexBuffer(0,ExtMapBuffer);
   SetIndexBuffer(1,ExtLowBuffer);
   SetIndexBuffer(2,ExtHighBuffer);
   SetIndexEmptyValue(0,0.0);
//---- indicator short name
   IndicatorShortName("ZigZag("+ExtDepth+","+ExtDeviation+","+ExtBackstep+")");
//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   int    shift, back,lasthighpos,lastlowpos,index;
   double val,res;
   double curlow,curhigh,lasthigh,lastlow;
//----
   for(shift=Bars-ExtDepth; shift>=0; shift--)
     {
      index=Lowest(NULL,0,MODE_LOW,ExtDepth,shift);
      val=Low[index];
      if(val==lastlow) val=0.0;
      else 
        { 
         lastlow=val; 
         if((Low[shift]-val)>(ExtDeviation*Point)) val=0.0;
         else
           {
            for(back=1; back<=ExtBackstep; back++)
              {
               res=ExtLowBuffer[shift+back];
               if((res!=0)&&(res>val)) ExtLowBuffer[shift+back]=0.0; 
              }
           }
        } 
      ExtLowBuffer[shift]=0.0;
      if(val!=0.0) ExtLowBuffer[index]=val;
      //--- high
      index=Highest(NULL,0,MODE_HIGH,ExtDepth,shift);
      val=High[index];
      if(val==lasthigh) val=0.0;
      else 
        {
         lasthigh=val;
         if((val-High[shift])>(ExtDeviation*Point)) val=0.0;
         else
           {
            for(back=1; back<=ExtBackstep; back++)
              {
               res=ExtHighBuffer[shift+back];
               if((res!=0)&&(res<val)) ExtHighBuffer[shift+back]=0.0; 
              } 
           }
        }
      ExtHighBuffer[shift]=0.0;
      if(val!=0.0) ExtHighBuffer[index]=val;
     }
//---- final cutting 
   lasthigh=-1; lasthighpos=-1;
   lastlow=-1;  lastlowpos=-1;

   for(shift=Bars-ExtDepth; shift>=0; shift--)
     {
      curlow=ExtLowBuffer[shift];
      curhigh=ExtHighBuffer[shift];
      if(curlow==0 && curhigh==0) continue;
      //---
      if(curhigh!=0)
        {
         if(lasthigh>0) 
           {
            if(lasthigh<curhigh) ExtHighBuffer[lasthighpos]=0;
            else ExtHighBuffer[shift]=0;
           }
         //---
         if(lasthigh<curhigh || lasthigh<0)
           {
            lasthigh=curhigh;
            lasthighpos=shift;
           }
         lastlow=-1;
        }
      //----
      if(curlow!=0)
        {
         if(lastlow>0)
           {
            if(lastlow>curlow) ExtLowBuffer[lastlowpos]=0;
            else ExtLowBuffer[shift]=0;
           }
         //---
         if((curlow<lastlow)||(lastlow<0))
           {
            lastlow=curlow;
            lastlowpos=shift;
           } 
         lasthigh=-1;
        }
     }
//---- merge 2 buffers
   lasthighpos=-1;
   lastlowpos=-1;
   for(shift=Bars-1; shift>=0; shift--)
     {
      if(shift>=Bars-ExtDepth) ExtMapBuffer[shift]=0.0;
      else
        {
         curlow=ExtLowBuffer[shift];
         curhigh=ExtHighBuffer[shift];
         //----
         res=0;
         if(curlow!=0)
           {
            if(lastlowpos==-1)
              {
               res=curlow;
               lastlowpos=shift;
              }
            else
              {
               if(lasthighpos!=-1 && lastlowpos>lasthighpos)
                 {
                  res=curlow;
                  lastlowpos=shift;
                 }
              }
           }
         if(curhigh!=0)
           {
            if(lasthighpos==-1)
              {
               res=curhigh;
               lasthighpos=shift;
              }
            else
              {
               if(lastlowpos!=-1 && lasthighpos>lastlowpos)
                 {
                  res=curhigh;
                  lasthighpos=shift;
                 }
              }
           }
         //----
         ExtMapBuffer[shift]=res;
        }
     }
  }
//+------------------------------------------------------------------+



Hier scheint alles korrekt zu sein - sowohl der Index wird gespeichert als auch der Wert in das gewünschte Array-Element geschrieben. Beginnen wir mit diesem Algorithmus.

 
nen, entschuldigen Sie, aber wäre es nicht einfacher, einen kurzen Code zu schreiben, der diese Lowest und Highest findet? Ich habe diese Funktionen einfach nie benutzt, weil ich die Daten, die ich für die Extrema benötige, durch einen einfachen kurzen Code erhalte, der sicherlich schneller funktioniert als die Standardfunktionen. Meines Erachtens ist es sinnvoll, sie nur dann zu verwenden, wenn es notwendig ist, Daten aus einem anderen Zeitrahmen zu erhalten.
 
komposter, das ist richtig. Dann schauen Sie nach, wohin sie geschrieben wird. Im Indikatorpuffer mit welchem Index.
Vladislav, der Code stammt von codebase.mql.com und ist genau derselbe. Ich werde versuchen, Ihren Code einzufügen. Ich werde sehen, was passieren kann.
Candid, ich stimme zu, dass es einfacher sein könnte. Aber ich brauche diese Funktionen, um mit einem anderen Zeitrahmen zu arbeiten.