Problema con l'indicatore ZigZag - pagina 2

 
Ho dimenticato di evidenziare i valori dell'indicatore, il minimo corrisponde ma il massimo non corrisponde come ho cercato di mostrare nel 2° grafico...
 
aed71:

Il grafico qui sotto mostra il valore minimo (sia il valore del punto del cursore, sia il valore della finestra dei dati e l'uscita è lo stesso)

Quello sotto è 6 tick dopo la parte più alta del grafico. Sia la finestra dei dati che i punti del cursore sono gli stessi, ma l'uscita non è la stessa e inoltre restituisce sia il valore basso che quello alto.

Ho controllato che iCustom() carichi correttamente l'indicatore. Il valore basso è lo stesso ma il valore alto no. Potrebbe essere legato all'indicatore ZigZag?

Cosa sto facendo di sbagliato non riesco proprio a capirlo.


Vedo solo un valore proveniente dal tuo indicatore ZigZag

Questo valore cos'è?

 
aed71:

Il grafico qui sotto mostra il valore minimo (sia il valore del punto del cursore, sia il valore della finestra dei dati e l'uscita è lo stesso)

Quello sotto è 6 tick dopo la parte più alta del grafico. Sia la finestra dei dati che i punti del cursore sono gli stessi, ma l'uscita non è la stessa e inoltre restituisce sia il valore basso che quello alto.

Ho controllato che iCustom() carichi correttamente l'indicatore. Il valore basso è lo stesso ma il valore alto no. Potrebbe essere legato all'indicatore ZigZag?

Non riesco proprio a capire cosa sto facendo di sbagliato.

Stai usando lo ZigZag in modo sbagliato nel tuo esempio iCustom. Lo ZigZag standard di MetQuotes ha TRE (non due) buffer (Modalità o Line Index in iCustom)

  1. Mode = 0: Tiene entrambi i punti alti e bassi dello ZigZag.
  2. Mode = 1: Punti alti ma non necessariamente solo i punti ZigZag (dato che tiene anche i punti di riverniciatura).
  3. Mode = 2: Punti bassi ma non necessariamente solo punti ZigZag (poiché contiene anche punti di ridipintura).

Dovrai confrontare il primo buffer (Modo 0) con gli altri 2 buffer per decidere se è un Punto Alto o un Punto Basso (per esempio, se sia il Buffer 1 che il Buffer 3 hanno lo stesso valore, allora è un punto ZigZag Basso, e se sia il Buffer 1 che il Buffer 2 sono uguali, allora è un Punto Alto).

Inoltre, per capire meglio come funziona uno ZigZag e come si ridisegna, suggerisco di giocare con il mio indicatore ZigZagZug. Tuttavia, nel tuo codice usa lo ZigZag di MetaQuotes, perché è più veloce. La mia versione fa più elaborazione a causa delle caratteristiche extra ed è quindi più lenta.

PS! Se il Buffer 1 (Mode = 0) ha un valore di 0.0, ma gli altri buffer hanno valori non nulli, allora sono vecchi punti di ridipintura e NON punti ZigZag.

Nel tuo codice stai usando il Buffer Mode 0 come Low e il Buffer Mode 1 come High. Questo è totalmente scorretto.

 
FMIC:

Stai usando lo ZigZag in modo sbagliato nel tuo esempio iCustom. Lo ZigZag standard di MetQuotes ha TRE (non due) buffer (Mode o Line Index in iCustom)

  1. Mode = 0: Tiene entrambi i punti alti e bassi dello ZigZag.
  2. Mode = 1: Punti alti ma non necessariamente solo i punti ZigZag (dato che tiene anche i punti di riverniciatura).
  3. Mode = 2: Punti bassi ma non necessariamente solo punti ZigZag (poiché contiene anche punti di ridipintura).

Dovrai confrontare il primo buffer (Modo 0) con gli altri 2 buffer per decidere se è un Punto Alto o un Punto Basso (per esempio, se sia il Buffer 1 che il Buffer 3 hanno lo stesso valore, allora è un punto ZigZag Basso, e se sia il Buffer 1 che il Buffer 2 sono uguali, allora è un Punto Alto).

Inoltre, per capire meglio come funziona uno ZigZag e come si ridisegna, suggerisco di giocare con il mio indicatore ZigZagZug. Tuttavia, nel tuo codice usa lo ZigZag di MetaQuotes, perché è più veloce. La mia versione fa più elaborazione a causa delle caratteristiche extra ed è quindi più lenta.

PS! Se il Buffer 1 (Mode = 0) ha un valore di 0.0, ma gli altri buffer hanno valori non nulli, allora sono vecchi punti di ridipintura e NON punti ZigZag.

Nel tuo codice stai usando il Buffer Mode 0 come Low e il Buffer Mode 1 come High. Questo è totalmente scorretto.


Guarda qui https://www.mql5.com/en/forum/149492/page2#912747 le barre esterne sono un problema per il vecchio Zigzag codificato

La linea gialla dà un modo migliore di visualizzare lo zigzag

 
deVries:


Guarda qui https://www.mql5.com/en/forum/149492/page2#912747 le barre esterne sono un problema per il vecchio codice Zigzag

La linea gialla sta dando un modo migliore di visualizzare lo zigzag


Le barre esterne non hanno niente a che fare con l'attuale dilemma di "aed71". Il suo uso dello ZigZag è semplicemente scorretto.

Per favore non deviare dal problema attuale perché confonderai solo la situazione.

Inoltre, ho anche dato un link al mio codice ZigZagZug che non ha quel problema.

 
FMIC:

Stai usando lo ZigZag in modo sbagliato nel tuo esempio iCustom. Lo ZigZag standard di MetQuotes ha TRE (non due) buffer (Mode o Line Index in iCustom)

  1. Mode = 0: Tiene entrambi i punti alti e bassi dello ZigZag.
  2. Mode = 1: Punti alti ma non necessariamente solo i punti ZigZag (dato che tiene anche i punti di riverniciatura).
  3. Mode = 2: Punti bassi ma non necessariamente solo punti ZigZag (poiché contiene anche punti di ridipintura).

Dovrai confrontare il primo buffer (Modo 0) con gli altri 2 buffer per decidere se è un Punto Alto o un Punto Basso (per esempio, se sia il Buffer 1 che il Buffer 3 hanno lo stesso valore, allora è un punto ZigZag Basso, e se sia il Buffer 1 che il Buffer 2 sono uguali, allora è un Punto Alto).

Inoltre, per capire meglio come funziona uno ZigZag e come si ridisegna, suggerisco di giocare con il mio indicatore ZigZagZug. Tuttavia, nel tuo codice usa lo ZigZag di MetaQuotes, perché è più veloce. La mia versione fa più elaborazione a causa delle caratteristiche extra ed è quindi più lenta.

PS! Se il Buffer 1 (Mode = 0) ha un valore di 0, ma gli altri buffer hanno dei valori, allora sono punti di repaint più vecchi.


Grande, grazie per i suggerimenti importanti! Ora ho capito perché non funziona...

Penso che il codice originale di Metaquotes ZigZag non sia corretto poiché ha solo 2 buffer. Quindi stavo pensando che uno di essi dovrebbe essere alto e l'altro basso...

Infatti anche il titolo non corrisponde, l'ho visto di recente. Qualcuno dovrebbe controllare!

Mi riferisco al codice qui https://www.mql5.com/en/code/7796

//+------------------------------------------------------------------+
//|                                        Custom Moving Average.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 ExtMapBuffer2[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   IndicatorBuffers(2);
//---- drawing settings
   SetIndexStyle(0,DRAW_SECTION);
//---- indicator buffers mapping
   SetIndexBuffer(0,ExtMapBuffer);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexEmptyValue(0,0.0);
//---- indicator short name
   IndicatorShortName("ZigZag("+ExtDepth+","+ExtDeviation+","+ExtBackstep+")");
//---- initialization done
   return(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;
      else 
        { 
         lastlow=val; 
         if((Low[shift]-val)>(ExtDeviation*Point)) val=0.0;
         else
           {
            for(back=1; back<=ExtBackstep; back++)
              {
               res=ExtMapBuffer[shift+back];
               if((res!=0)&&(res>val)) ExtMapBuffer[shift+back]=0.0; 
              }
           }
        } 
      ExtMapBuffer[shift]=val;
      //--- high
      val=High[Highest(NULL,0,MODE_HIGH,ExtDepth,shift)];
      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=ExtMapBuffer2[shift+back];
               if((res!=0)&&(res<val)) ExtMapBuffer2[shift+back]=0.0; 
              } 
           }
        }
      ExtMapBuffer2[shift]=val;
     }

   // final cutting 
   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)) continue;
      //---
      if(curhigh!=0)
        {
         if(lasthigh>0) 
           {
            if(lasthigh<curhigh) ExtMapBuffer2[lasthighpos]=0;
            else ExtMapBuffer2[shift]=0;
           }
         //---
         if(lasthigh<curhigh || lasthigh<0)
           {
            lasthigh=curhigh;
            lasthighpos=shift;
           }
         lastlow=-1;
        }
      //----
      if(curlow!=0)
        {
         if(lastlow>0)
           {
            if(lastlow>curlow) ExtMapBuffer[lastlowpos]=0;
            else 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;
      else
        {
         res=ExtMapBuffer2[shift];
         if(res!=0.0) ExtMapBuffer[shift]=res;
        }
     }
  }
 
aed71:


Ottimo, grazie per i suggerimenti importanti! Ora ho capito perché non funziona...

Penso che il codice originale di Metaquotes ZigZag non sia corretto poiché ha solo 2 buffer. Quindi stavo pensando che uno di loro dovrebbe essere alto e l'altro basso...

Infatti anche il titolo non corrisponde, l'ho visto di recente. Qualcuno dovrebbe controllare!

Mi riferisco al codice qui https://www.mql5.com/en/code/7796


Non usare quel codice! È antico!

Usa il codice che viene attualmente spinto attraverso i LiveUpdates. Usate l'attuale versione 600+ o almeno la versione 509.

PS! NB! Inoltre, usate solo "ZigZag" nel Nome e non "ZigZag.ex4" nell'iCustom.

 
FMIC:


Non usare quel codice! È antico!

Usate il codice che viene attualmente spinto attraverso i LiveUpdates. Usate l'attuale versione 600+ o almeno la versione 509.

PS! NB! Inoltre, usate solo "ZigZag" nel Nome e non "ZigZag.ex4" nell'iCustom.


Ciao FMIC,

Grazie per i consigli. Stavo aggiungendo ex4 alla fine del file per non dimenticare di compilarlo. Purtroppo il mio nuovo build 610 ZigZag sostituito da quello vecchio.

Ho deciso di usare il tuo, dal momento che il tempo non è un problema per me. Devo affrontare alcuni problemi anche qui, apprezzerei se puoi guidarmi.

Ho usato lo stesso codice indicato sopra, ho solo cambiato il nome del file con la tua versione. Sto usando i parametri 6,5,3; questa è l'unica differenza dalle tue impostazioni predefinite.

Ho affrontato alcuni problemi:

Innanzitutto l'indicatore carica ogni volta in ogni tick per leggere i valori zh,zl. E alla fine rilascia tutti i carichi alla fine (che non potete vedere nell'immagine) affermando qualcosa come "2014.02.22 09:35:09.171 2013.11.01 22:55 Custom indicator ZigZagZug EURUSD,M15: removed" . Si prega di fare riferimento al file di log che ho allegato. Causa qualche problema di memoria in seguito?

In secondo luogo nel diario il contatore cnt è saltato da cnt8 a cnt84, il che è strano. Nei registri non salta. Penso che dovrei considerare i log come valori corretti.

Il terzo e più critico è che ha trovato due minimi di conseguenza, cosa che non dovrebbe fare. Nella figura voglio ottenere i valori alti e bassi delle linee grigie a zig zag, ma quando scrivo tutti gli alti e bassi nel log sono esattamente gli stessi con i tuoi punti di colore rosa e ciano. Tuttavia ho bisogno solo dei valori a zig zag. Ho controllato gli altri buffer ma non hanno portato i valori corretti. Qualche suggerimento? O dovrei andare con il classico zigzag (per la build 610?)

Grazie.

ZigZagZug

 
aed71:


Ciao FMIC,

Grazie per i consigli. Stavo aggiungendo ex4 alla fine del file per non dimenticare di compilarlo. Purtroppo la mia nuova build 610 ZigZag ha sostituito quella vecchia.

Ho deciso di usare il tuo, dal momento che il tempo non è un problema per me. Devo affrontare alcuni problemi anche qui, apprezzerei se puoi guidarmi.

Ho usato lo stesso codice indicato sopra, ho solo cambiato il nome del file con la tua versione. Sto usando i parametri 6,5,3; questa è l'unica differenza dalle tue impostazioni predefinite.

Qualche suggerimento? O dovrei andare con il classico zigzag (per la build 610?)

Grazie.

Non c'è niente di sbagliato nell'usare il nuovo ZigZag 610. Infatti ti incoraggio a usare quello invece, in modo che sia compatibile con le future build. Non usare quello vecchio o anche il mio.

Il mio indicatore ZigZagZug usa parametri extra e in un ordine e tipo diverso, quindi non puoi semplicemente usare un iCustom simile a quello che stai usando ora. È completamente diverso.

Inoltre uso 7 buffer nell'indicatore per le caratteristiche extra. Si suppone che sia usato come strumento di apprendimento visivo per capire lo ZigZag e non realmente per l'uso in un EA.

PS! E' normale avere un indicatore che si carica e si scarica diverse volte durante un back-test di un EA usando iCustom. Tutto dipende da come l'EA e l'indicatore sono codificati. Per evitare ciò e per rendere un EA più veloce, di solito ricodifico solo il codice essenziale nell'EA stesso in modo da non dipendere da indicatori esterni, ma questa è un'altra questione non direttamente collegata al tuo caso. Solo un suggerimento per i tuoi futuri EA.

 
aed71:


Ciao FMIC,

... Voglio ottenere i valori alti e bassi delle linee grigie a zig zag, ma quando scrivo tutti i valori alti e bassi nel registro sono esattamente gli stessi con i vostri punti di colore rosa e ciano. Tuttavia ho bisogno solo dei valori a zig zag. ...

Grazie.


Come già spiegato in un post precedente, non si può usare solo il buffer Alto e Basso per ottenere i punti dello ZigZag, perché questi includono anche i punti ridipinti (cerchi aqua e magenta sullo ZigZagZug). Anche sullo ZigZag standard è così, ma non li vedi. Ecco perché il mio indicatore li mostra in modo da poterlo capire meglio.

Devi confrontare i buffer Alti e Bassi con il primo che contiene ENTRAMBI i bassi e gli alti per filtrare SOLO i punti a zig zag.

NB! Dovrai confrontare il primo buffer (Modo 0) con gli altri 2 buffer per decidere se è un Punto Alto o un Punto Basso (es. se sia il Buffer 1 che il Buffer 3 hanno lo stesso valore allora è un punto ZigZag Basso, e se sia il Buffer 1 che il Buffer 2 sono uguali allora è un punto Alto).

Se vuoi, allega il tuo file ad un post, e lo correggerò in modo che tu possa vedere come usarlo correttamente ( ALLEGALO, non usare SRC per non essere un post lungo ).