Problem mit ZigZag-Indikator

 

Hallo,

Ich versuche, einen Experten zu entwickeln, der die historischen Daten (Höchst- und Tiefstwerte) für meinen Hauptexperten auswertet. Ich habe mich für den Zigzag-Indikator entschieden, da er einfach ist und das Hoch/Tief leicht findet.

Mein Problem ist, wenn ich ZigZag.ex4 mit der Funktion iCustom() aufrufe, kann ich nicht die korrekten Hoch- und Tiefstwerte erhalten. Um ein erneutes Streichen zu vermeiden, habe ich den Index 20 des iCustom()-Indikators als Basisschutz für das Nachstreichen verwendet.

Es gibt zwei Puffer im ZigZag-Code (unter Verwendung der Metaquotes-Version https://www.mql5.com/en/code/7796 ). Ich könnte die hohen und niedrigen Werte entgegengesetzt nehmen, aber das ist im Moment nicht so wichtig.

Einige der Werte stimmen mit dem Code überein, andere nicht, und im Journal sehe ich sowohl hohe als auch niedrige Werte in derselben Spalte, was nicht möglich sein kann.

Zickzack

Mein Code ist unten:

//+------------------------------------------------------------------+
//|                                                 ZigZagDigger_02  |
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+
/* 

*/

#include <stderror.mqh>
#include <stdlib.mqh>
    
int cnt=0;
double Zig_high[1000];
double Zig_low[1000];

int init()
  {
   ArrayInitialize(Zig_high,0);
   ArrayInitialize(Zig_low,0);
   return(0);
 } 
   
int deinit()
{ 
   return(0);
}

void start()
  {
  
   static datetime tmp;
  

   //  On every tick
   if (tmp!= Time[0]) 
  
   {  tmp =  Time[0];
   
      double zh=iCustom(Symbol(),0,"ZigZag.ex4",6,5,3,1,20);
      double zl=iCustom(Symbol(),0,"ZigZag.ex4",6,5,3,0,20);

      Zig_high[cnt]=zh;
      Zig_low[cnt]=zl;
      cnt=cnt+1;
   
      Alert(" Zig   zh=",zh,"  zl=",zl,"  cnt=",cnt-1);
   
  } // Every tick loop
         
   
  }

Ich frage mich, ob ich den Zickzack-Indikator falsch verwende oder ob ich einen Fehler im Code gemacht habe? Ich konnte das Problem nicht finden, daher bitte ich Sie um Ihre Hilfe, um mein Problem zu identifizieren.

Vielen Dank

 
aed71:

Hallo,

Ich versuche, einen Experten zu entwickeln, der die historischen Daten (Höchst- und Tiefstwerte) für meinen Hauptexperten auswertet. Ich habe mich für den Zigzag-Indikator entschieden, da er einfach ist und das Hoch/Tief leicht findet.

Mein Problem ist, wenn ich ZigZag.ex4 mit der Funktion iCustom() aufrufe, kann ich nicht die korrekten Hoch- und Tiefstwerte erhalten. Um ein erneutes Streichen zu vermeiden, habe ich den Index 20 des iCustom()-Indikators als Basisschutz für das Nachstreichen verwendet.

Es gibt zwei Puffer im ZigZag-Code (unter Verwendung der Metaquotes-Version https://www.mql5.com/en/code/7796 ). Ich könnte die hohen und niedrigen Werte entgegengesetzt nehmen, aber das ist im Moment nicht so wichtig.

Einige der Werte stimmen mit dem Code überein, andere nicht, und im Journal sehe ich sowohl hohe als auch niedrige Werte in derselben Spalte, was nicht möglich sein kann.

Mein Code ist unten:

Ich frage mich, ob ich den Zickzack-Indikator falsch verwende oder ob ich einen Fehler im Code gemacht habe? Ich konnte das Problem nicht finden, daher bitte ich Sie um Ihre Hilfe, um mein Problem zu identifizieren.

Danke

Können Sie sagen, das Lesen der Code MACD Probe, wie das EA funktioniert?

Sieht für mich so aus, als hätten Sie nie versucht ....

was Sie geschrieben haben, ist wie ich etwas tun ..... weiß nicht, was passiert Können Sie mir sagen, was ich tat?

Jede Tick-Schleife, was ist Ihre jede Tick-Schleife?

Das?

   if (tmp!= Time[0]) 
  
   {  tmp =  Time[0];
   
      double zh=iCustom(Symbol(),0,"ZigZag.ex4",6,5,3,1,20);
      double zl=iCustom(Symbol(),0,"ZigZag.ex4",6,5,3,0,20);

      Zig_high[cnt]=zh;
      Zig_low[cnt]=zl;
      cnt=cnt+1;
   
      Alert(" Zig   zh=",zh,"  zl=",zl,"  cnt=",cnt-1);
   
  } // Every tick loop

ja, wo ist dann die Schleife?

nein, dann erklären Sie Zeile für Zeile, was Ihr Code bedeutet...

 
aed71: Ich frage mich, ob ich den ZigZag-Indikator falsch verwende oder ob ich einen Fehler im Code gemacht habe?
  1. Wenn Sie das Forum durchsucht hätten, hätten Sie Ihre Antwort gefunden.
  2.  double zl=iCustom(Symbol(),0,"ZigZag.ex4",6,5,3,0,20);
    
    ZigZag füllt nicht jedes Pufferelement aus (es verwendet DRAW_SECTION.) Führen Sie Ihren Aufruf in einer Schleife aus, bis Sie die Verschiebung finden, die einen Wert ungleich Null hat.
 
WHRoeder:
  1. Wenn Sie das Forum durchsucht hätten, hätten Sie Ihre Antwort gefunden.
  2. ZigZag füllt nicht jedes Pufferelement aus (es verwendet DRAW_SECTION.) Führen Sie Ihren Aufruf in einer Schleife aus, bis Sie die Schicht finden, die einen Wert ungleich Null hat.


Ja, ich weiß, dass es nicht jedes Pufferelement ausfüllt. Ich möchte alle Daten in einem Array speichern, einschließlich Nullen (wenn es keine hohen und niedrigen Werte gibt) und auch die hohen und niedrigen Werte. Der Grund dafür ist, dass ich einen anderen Prozess innerhalb von deinit() haben möchte, um die Tick-Differenz zwischen Hoch- und Tiefstwerten unter Verwendung der Arrays zu berechnen. Ich meine z.B. wie viele Ticks zwischen 2 Hochs vergangen sind und die Differenz zwischen Hoch und Tief. Aber so weit bin ich noch nicht gekommen.

Warum es sowohl hoch und niedrig zur gleichen Zeit zurückgibt, wie ich in das Bild (Journal Teil mit ??? Markierung daneben?) Und diese Werte entspricht keine hohe oder tiefe... Das ist mein Hauptproblem...

Danke

 
deVries:

Können Sie sagen, das Lesen der Code MACD Probe, wie das EA funktioniert?

Sieht für mich aus, als hätten Sie nie versucht ....

was Sie geschrieben haben, ist wie ich etwas tun ..... weiß nicht, was passiert Können Sie mir sagen, was ich tat?

Jede Tick-Schleife, was ist Ihre jede Tick-Schleife?

Das?

ja, wo ist dann die Schleife?

nein, dann erklären Sie Zeile für Zeile, was Ihr Code bedeutet...

Ich glaube nicht, dass ich ein Problem mit der Schleife habe, die Schleife funktioniert und gibt die Ergebnisse aus. Sie prüft den Zeitrahmen (in meinem Fall 15M) und berechnet die Zickzack-Werte und gibt sie aus. Bitte prüfen Sie das grüne Rechteck, wie es alle 15 Minuten funktioniert. Die Funktion Start() ist selbst eine Schleife, nicht wahr?

Alle 15M

 
aed71:

Ich glaube nicht, dass ich ein Problem mit der Schleife habe, die Schleife funktioniert und druckt die Ergebnisse aus. Sie prüft den Zeitrahmen (15M in meinem Fall) und berechnet die Zickzack-Werte und druckt. Bitte überprüfen Sie das grüne Rechteck, wie es alle 15 Minuten funktioniert. Die Funktion Start() ist selbst eine Schleife, nicht wahr?



Sie haben Recht, dass die Funktion Start() selbst eine Schleife ist.

aber wo beginnt diese Schleife und wo endet die Start()-Funktion?

Es ist irgendwo anders ...

die von Ihnen gedruckten Meldungen werden nicht bei jedem Tick wiederholt ....

Was machen Sie also ......??

Versuchen Sie, die Zeilen Ihres Codes ..... so gut wie möglich zu erklären.

 
deVries:


Sie haben Recht, dass die Funktion Start() selbst eine Schleife ist.

aber wo beginnt diese Schleife und wo endet die Funktion Start()?

es ist irgendwo anders ...

die von Ihnen gedruckten Meldungen werden nicht bei jedem Tick wiederholt ....

Was machen Sie also ......??

Versuchen Sie, die Zeilen Ihres Codes ..... so gut wie möglich zu erklären.


Ich bitte um Entschuldigung, wenn ich es nicht richtig erklären konnte.

Dieser Experte soll für Backtests verwendet werden, und mein Ziel ist es, historische Hochs und Tiefs im 15M-Chart zu finden. Dann verarbeite ich die Hoch- und Tiefstwerte, um Phase und Amplitude des Graphen zu berechnen.

Ich habe zwei Arrays verwendet, um die Hoch- und Tiefstwerte zu speichern und einen Zähler, um die Ticks zu zählen. Die Array-Größe 1000 ist mehr als genug, da ich es für maximal 2 Tage laufen lasse (1440/15=96 Ticks pro Tag)

int cnt=0;
double Zig_high[1000];
double Zig_low[1000];

In der init()-Funktion fülle ich die Arrays mit Null.

in der start() Funktion prüfe ich, ob ein neuer Tick mit dem folgenden Code ausgelöst wurde

 if (tmp!= Time[0]) 
  
   {  tmp =  Time[0];

   // the code here runs every 15M.

   }

Die start()-Funktion hat also eine Endlosschleife, bis der Backtest (2 Tage) abgeschlossen ist.

Mein Hauptproblem ist der Aufruf des ZigZag, denke ich. Unten rufe ich den Zigzag-Indikator auf. Normalerweise sollte er bei einem Hoch oder Tief einen Wert ungleich Null zurückgeben. Aber in meinem Fall gibt er manchmal sowohl das Hoch als auch das Tief mit demselben Wert zurück, was unmöglich ist.


  double zh=iCustom(Symbol(),0,"ZigZag.ex4",6,5,3,1,20);
  double zl=iCustom(Symbol(),0,"ZigZag.ex4",6,5,3,0,20);

  Zig_high[cnt]=zh;
  Zig_low[cnt]=zl;
  cnt=cnt+1;

Vielleicht habe ich die Arrays, die im ursprünglichen Metaquotes Zigzag-Indikator verwendet werden, nicht verstanden (siehe unten). Soweit ich weiß, werden diese zum Speichern von Hoch- und Tiefstwerten verwendet.

//---- indicator buffers
double ExtMapBuffer[];
double ExtMapBuffer2[];

Vielen Dank

 

Nehmen Sie sich etwas Zeit zum Lesen und Lernen

Dies könnte Ihnen auch ein wenig helfen

Ausführliche Erklärung von iCustom

 
Ich hänge auch meinen Code an...
Dateien:
 
Was zeigt das Datenfenster an?
 
deVries:
Was zeigt das Datenfenster an?

Das folgende Diagramm zeigt den Minimalwert (Cursorpunkt, Datenfenster und Ausgabe sind identisch)

1.

Das folgende Diagramm zeigt 6 Ticks später den höchsten Wert des Diagramms. Das Datenfenster und die Cursorpunkte sind identisch, aber die Ausgabe ist nicht identisch, und außerdem gibt sie sowohl einen niedrigen als auch einen hohen Wert aus.

2.2.

Ich habe überprüft, dass iCustom() den Indikator korrekt lädt. Der niedrige Wert ist derselbe, aber der hohe Wert ist es nicht. Könnte es mit dem ZigZag-Indikator zusammenhängen?

Was ich falsch mache, kann ich nicht verstehen.