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

 
nen
Ich konnte nicht antworten (ich war verreist). Posten Sie den Code, den Sie analysieren müssen, um über eine Sache zu sprechen.
ZS In diesem Zickzack war kein Fehler, sondern ein Tippfehler (im Vergleich zum Code in MT3), ich fand nur diesen Tippfehler und korrigierte nichts anderes.
 
Vladislav, aus irgendeinem Grund funktioniert Ihr Code nicht in allen Zeitrahmen. In manchen Zeiträumen funktioniert das, in anderen nicht. Es ist seltsam, aber es funktioniert.
 
Rosh, hier ist der Code von codebase.mql4.com. Ich habe denselben. Wenn es möglich ist, sie mit der ganzen Welt zu überwinden, werde ich sehr dankbar sein. Ich werde nicht der Einzige sein. Ich danke Ihnen im Voraus für Ihre Hilfe.

Ich habe inzwischen eine große Anzahl dieser oder anderer Bearbeitungen angehäuft. Sie funktionieren recht gut. Der erste Strahl - derjenige, der vom Null-Balken oder einem der ersten Balken ausgeht - versagt jedoch mit Fehlern in den Funktionen zur Identifizierung von Extremen. Und der Indikator arbeitet unstabil.

//+------------------------------------------------------------------+
//| 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;
}

// endgültiger Schnitt
lasthigh=-1; lasthighpos=-1;
lastlow=-1; lastlowpos=-1;

for(shift=Bars-ExtDepth; shift>=0; shift--)
{
curlow=ExtMapBuffer[shift];
curhigh=ExtMapBuffer2[shift];
if((curlow==0)&&(curhigh==0)) weiter;
//---
if(curhigh!=0)
{
if(lasthigh>0)
{
if(lasthigh<curhigh) ExtMapBuffer2[lasthighpos]=0;
sonst ExtMapBuffer2[shift]=0;
}
//---
if(lasthigh<curhigh || lasthigh<0)
{
lasthigh=curhigh;
lasthighpos=shift;
}
lastlow=-1;
}
//----
if(curlow!=0)
{
if(letzter Wert>0)
{
if(lastlow>curlow) ExtMapBuffer[lastlowpos]=0;
sonst ExtMapBuffer[shift]=0;
}
//---
if((curlow<lastlow)||(lastlow<0))
{
lastlow=curlow;
lastlowpos=shift;
}
lasthigh=-1;
}
}

for(shift=Bars-1; shift>=0; shift--)
{
if(shift>=Bars-ExtDepth) ExtMapBuffer[shift]=0.0;
sonst
{
res=ExtMapBuffer2[shift];
if(res!=0.0) ExtMapBuffer[shift]=res;
}
}
}
 
Vladislav, aus irgendeinem Grund funktioniert Ihr Code nicht in allen Zeitrahmen. In manchen Zeiträumen funktioniert das, in anderen nicht. Es ist seltsam, aber es funktioniert. <br / translate="no">


Bei anderen Zeitrahmen funktioniert es, bei anderen nicht. Bei mir scheint es zu funktionieren. Ja, und es ist nicht mein Code - aus dem Standardangebot scheint es zu sein. Zumindest habe ich das in allen Versionen von MT.
 
Vladislav, es ist klar, dass dies nicht Ihr Code ist. Ich habe den von mir bereitgestellten Code in meiner Lieferung.
In welchen Zeitrahmen er nicht angezeigt wird. BC - Brezan.
GBP-CHF
Es wird nicht auf m1 und m15 angezeigt. Sie wird auf allen anderen Seiten angezeigt.
EUR-USD
Es wird nicht angezeigt - m1, m5
AUD-USD - alle werden angezeigt.
Ich weiß nicht, warum es so aussieht.

Vielleicht haben Sie ja den Code, den Slava im Sommer überarbeitet hat. Aber seine Überarbeitung hat mir nicht gefallen. Einige Probleme wurden dort nicht gelöst.
================
GODZILLA (Nikolay) hat gute Arbeit geleistet. Aber es hat nur zwei Probleme gelöst.
1) Neuberechnung bei jedem Tick. Er hat sie drastisch reduziert
2) Algorithmus zur Entfernung von Höckern hinzugefügt. Buckel entstehen hauptsächlich durch das Vorhandensein von Minimum und Maximum auf einem Balken. Der Zickzack-Algorithmus hinterlässt nur Hochsignale. Dies führt häufig dazu, dass mehrere Höchststände hintereinander erreicht werden.

Ich habe einige Varianten der Indikatorverbesserung durch GODZILL behoben. Die in der Luft hängenden Knicke sind beseitigt worden. Ich vermute jedoch, dass die fehlerhafte Funktionsweise der Extremumssuche in den ersten beiden Strahlen noch immer besteht. Wegen dieses Problems habe ich dieses Thema hier aufgeworfen.

Vielleicht funktioniert die Suchfunktion aber auch richtig, aber es gibt keine klare Beschreibung dieser Funktion. Aus diesem Grund wird er falsch verwendet.
 
Ich habe es auf allen t\f auf den angegebenen Paaren angezeigt. Ich weiß nicht mehr, woher dieser Code stammt - ich dachte, er wäre in der 197er Build-Auslieferung enthalten - ich habe ihn aus irgendeinem Grund in allen MTs :). Ich werde es morgen überprüfen.
 
Ich schäme mich zu sagen, dass ich mich noch nie ernsthaft für Zickzacklinien interessiert habe :). Der Code im Beitrag von nen 18.10.06 17:46
Ich kann es noch nicht herausfinden. Es scheint mir, es sollte etwas wie ..
. // val=High[Highest(NULL,0,MODE_HIGH,ExtDepth,shift)]; highpos=Highest(NULL,0,MODE_HIGH,ExtDepth,shift); val=High[highpos]; if(MathAbs(val-lastlow) < Point) val=0.0; // if(val==lasthigh) val=0.0; else { lasthigh=val; if(highpos!=shift) val=0.0; // if((val-High[shift])>(ExtDeviation*Point)) val=0.0; else { ...


Hier wird der "zusätzliche" alte Code auskommentiert. Auch wenn ich die Zickzack-Idee noch nicht ganz verstehe. In jedem Fall führt dieser Code nicht zu verhedderten Extrema. Wenn diese Code-Variante passt, aber nicht von mir erfunden wurde :), entschuldige ich mich für den fehlenden Hinweis.

 
Aufrichtig, danke. Ich werde sehen, wie es funktioniert. Aber die Frage im Titel des Themas bleibt bestehen. Gerade der Zickzackkurs hat das Problem der "unverständlichen" Arbeit von Funktionen auf der Suche nach Extrema offenbart. Die Zeile highpos=Highest(NULL,0,MODE_HIGH,ExtDepth,shift); hilft, ein Extremum zu finden. Allerdings ist der Highpos-Index, der von der Funktion Highest zurückgegeben wird, wenn sie im Zickzack-Code ausgeführt wird, oft zufällig. Es liegt eine Abweichung von der wahren Position des Balkens vor. Mit anderen Worten: Highpos ist zum Beispiel 15. In Wirklichkeit hat der Balken aber einen anderen Index: 13 oder 16 oder etwas anderes. Sie sehen also den Unterschied. Daher beginnt der Zickzackkurs bei kleinen Parameterwerten und auf "kleinen" Zeitrahmen (1 Minute, 5 Minuten ...) instabil zu arbeiten.

Na gut. Vergessen Sie den Zickzackkurs. Die Frage bezieht sich nicht auf den Zickzackkurs. Die Frage ist, dass die Funktionen der MQ4-Sprache stabil und vorhersehbar funktionieren sollten.

Und das ist das HAUPTPROBLEM. Die Suchfunktionen werden nicht nur im ZigZag verwendet. Aber auch bei vielen anderen Indikatoren.

Der Zickzackkurs ist ein Sonderfall. Aber es hilft, das Problem zu verdeutlichen. Viele Indikatoren beruhen auf Zickzacklinien. Der Zickzackkurs funktioniert nicht nachhaltig. Das ist für niemanden ein Geheimnis. Viele Menschen müssen ihre Zeit damit verbringen, ihre eigenen Zickzacklinien für ihre eigenen Bedürfnisse zu programmieren. Wie viel Zeit wird verschwendet. Vergeblich. Weil man die Ursache des Problems nicht verstanden hat.
 
Candid, deine Worte: Schämst du dich zu sagen, ..... Der Code in Nen's Beitrag 18.10.06 17:46 muss noch verstanden werden.

Das sind goldene Worte. Sie sind nicht der erste, der das sagt. Nichtsdestotrotz sind die Ideen hinter dem Zickzack und teilweise in diesem Code umgesetzt sehr gut. Diese Ideen müssen in die Tat umgesetzt werden.
 
2 nen:
Wenn wir während der Berechnung des Indikators das Fenster verschieben (shift,shift+ExtDepth), kann das Auftreten eines neuen Extremums sowohl mit dem neuen Preis als auch mit der Tatsache zusammenhängen, dass das alte Extremum das Fenster verlassen hat. Dieser Punkt muss behandelt werden. Zu diesem Zweck enthält meine Einfügung die Zeile if(highpos!=shift) val=0.0; . Wie das im Standardcode gemacht wird, verstehe ich nicht. Nach den fehlenden Extrema in meiner Version zu urteilen, wird dies entweder falsch oder gar nicht gemacht.
Und was genau ist die Instabilität des Zickzackkurses?