Problema con el indicador ZigZag - página 2

 
Se me olvidó resaltar los valores del indicador, el mínimo coincide pero el máximo no coincide como he intentado mostrar en el 2º gráfico...
 
aed71:

El gráfico de abajo muestra el valor mínimo (tanto el valor del punto del cursor, como el valor de la ventana de datos y la salida es la misma)

El de abajo es 6 ticks más tarde la parte alta más alta del gráfico. Tanto la ventana de datos como los puntos del cursor son los mismos, sin embargo la salida no es la misma y además devuelve tanto el valor bajo como el alto.

He comprobado que iCustom() carga el indicador correctamente. El valor bajo es el mismo pero el valor alto no lo es. ¿Podría estar relacionado con el indicador ZigZag?

Lo que estoy haciendo mal realmente no lo he podido entender.


Sólo veo un valor procedente de su indicador ZigZag

¿este valor que es?

 
aed71:

El gráfico de abajo muestra el valor mínimo (tanto el valor del punto del cursor, como el valor de la ventana de datos y la salida es la misma)

El de abajo es 6 ticks más tarde la parte alta más alta del gráfico. Tanto la ventana de datos como los puntos del cursor son los mismos, sin embargo la salida no es la misma y además devuelve tanto el valor bajo como el alto.

He comprobado que iCustom() carga el indicador correctamente. El valor bajo es el mismo pero el valor alto no lo es. ¿Podría estar relacionado con el indicador ZigZag?

Lo que estoy haciendo mal no lo entiendo.

Usted está utilizando el ZigZag incorrectamente en su ejemplo iCustom. El ZigZag estándar de MetQuotes tiene TRES (no dos) buffers (modos o índice de línea en iCustom)

  1. Modo = 0: Mantiene los puntos altos y bajos del ZigZag.
  2. Modo = 1: Puntos altos pero no necesariamente sólo los puntos de ZigZag (ya que también mantiene los puntos de repintado).
  3. Modo = 2: Puntos Bajos pero no necesariamente sólo puntos ZigZag (ya que también contiene puntos de repintado).

Tendrás que comparar el primer búfer (Modo 0) con los otros 2 búferes para decidir si es un Punto Alto o un Punto Bajo (por ejemplo, si tanto el Búfer 1 como el Búfer 3 tienen el mismo valor entonces es un punto ZigZag Bajo, y si tanto el Búfer 1 como el Búfer 2 son iguales entonces es un punto Alto).

Además, para entender mejor cómo funciona un ZigZag y cómo se repinta, te sugiero que juegues con mi indicador ZigZagZug. Sin embargo, en su código utilice el ZigZag de MetaQuotes, ya que es más rápido. Mi versión hace más procesamiento debido a las características adicionales y por lo tanto es más lento.

¡PS! Si el Buffer 1 (Modo = 0) tiene un valor de 0.0, pero los otros buffers tienen valores diferentes a cero, entonces son puntos de repintado más antiguos y NO puntos ZigZag.

En tu código estás usando el Buffer de Modo 0 como el Bajo y el Buffer de Modo 1 como el Alto. Esto es totalmente incorrecto.

 
FMIC:

Está utilizando el ZigZag incorrectamente en su ejemplo de iCustom. El ZigZag estándar de MetQuotes tiene TRES (no dos) búferes (modos o índice de línea en iCustom)

  1. Modo = 0: Mantiene los puntos altos y bajos del ZigZag.
  2. Modo = 1: Puntos altos pero no necesariamente sólo los puntos de ZigZag (ya que también mantiene los puntos de repintado).
  3. Modo = 2: Puntos Bajos pero no necesariamente sólo puntos ZigZag (ya que también contiene puntos de repintado).

Tendrás que comparar el primer búfer (Modo 0) con los otros 2 búferes para decidir si es un Punto Alto o un Punto Bajo (por ejemplo, si tanto el Búfer 1 como el Búfer 3 tienen el mismo valor entonces es un punto ZigZag Bajo, y si tanto el Búfer 1 como el Búfer 2 son iguales entonces es un punto Alto).

Además, para entender mejor cómo funciona un ZigZag y cómo se repinta, te sugiero que juegues con mi indicador ZigZagZug. Sin embargo, en su código utilice el ZigZag de MetaQuotes, ya que es más rápido. Mi versión hace más procesamiento debido a las características adicionales y por lo tanto es más lento.

¡PS! Si el Buffer 1 (Modo = 0) tiene un valor de 0.0, pero los otros buffers tienen valores diferentes a cero, entonces son puntos de repintado más antiguos y NO puntos ZigZag.

En tu código estás usando el Buffer de Modo 0 como el Bajo y el Buffer de Modo 1 como el Alto. Esto es totalmente incorrecto.


Mira aquí https://www.mql5.com/en/forum/149492/page2#912747 outsidebars es un problema para el antiguo Zigzag codificado

La línea amarilla está dando una mejor manera de cómo el zigzag tiene que mostrar

 
deVries:


Mira aquí https://www.mql5.com/en/forum/149492/page2#912747 outsidebars es un problema para el antiguo código de Zigzag

La línea amarilla está dando una mejor manera de cómo el zigzag tiene que mostrar


Outside bars no tiene nada que ver con el dilema actual de "aed71". Su uso del ZigZag es simplemente incorrecto.

Por favor, no te desvíes del problema actual ya que sólo confundirás la situación.

Además, también di un enlace a mi código ZigZagZug que no tiene ese problema.

 
FMIC:

Está utilizando el ZigZag incorrectamente en su ejemplo de iCustom. El ZigZag estándar de MetQuotes tiene TRES (no dos) búferes (modos o índice de línea en iCustom)

  1. Modo = 0: Mantiene los puntos altos y bajos del ZigZag.
  2. Modo = 1: Puntos altos pero no necesariamente sólo los puntos de ZigZag (ya que también mantiene los puntos de repintado).
  3. Modo = 2: Puntos Bajos pero no necesariamente sólo puntos ZigZag (ya que también contiene puntos de repintado).

Tendrás que comparar el primer buffer (Modo 0) con los otros 2 buffers para decidir si es un Punto Alto o un Punto Bajo (por ejemplo, si tanto el Buffer 1 como el Buffer 3 tienen el mismo valor entonces es un punto ZigZag Bajo, y si tanto el Buffer 1 como el Buffer 2 son iguales entonces es un punto Alto).

Además, para entender mejor cómo funciona un ZigZag y cómo se repinta, te sugiero que juegues con mi indicador ZigZagZug. Sin embargo, en su código utilice el ZigZag de MetaQuotes, ya que es más rápido. Mi versión hace más procesamiento debido a las características adicionales y por lo tanto es más lento.

¡PS! Si el Buffer 1 (Modo = 0) tiene un valor de 0, pero los otros buffers tienen valores, entonces son puntos de repintado más antiguos.


Genial, ¡gracias por las importantes pistas! Ahora entiendo por qué no funciona...

Creo que el código original de Metaquotes ZigZag no es correcto ya que sólo tiene 2 buff ers. Así que estaba pensando que uno de ellos debería ser alto y el otro bajo...

De hecho el título también no coincide, lo vi hace poco. ¡Alguien debería revisarlo!

Me refiero al código aquí 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:


Genial, ¡gracias por los importantes consejos! Ahora entiendo por qué no funciona...

Creo que el código original de Metaquotes ZigZag no es correcto ya que tiene 2 buffers solamente. Así que estaba pensando que uno de ellos debería ser alto y el otro bajo...

De hecho el título también no coincide, lo vi hace poco. ¡Alguien debería revisarlo!

Me refiero al código aquí https://www.mql5.com/en/code/7796


¡No uses ese código! ¡Esto es antiguo!

Utiliza el código que actualmente se está empujando a través de los LiveUpdates. Utiliza la versión actual de 600+ o al menos la de 509.

¡PS! ¡NB! Además, utilice sólo "ZigZag" en el nombre y no "ZigZag.ex4" en el iCustom.

 
FMIC:


No uses ese código. Es antiguo.

Utiliza el código que se está enviando actualmente a través de las LiveUpdates. Utilice la versión actual 600+ o al menos la versión 509.

P.D. ¡NB! Además, utilice sólo "ZigZag" en el nombre y no "ZigZag.ex4" en el iCustom.


Hola FMIC,

Gracias por los consejos. Estaba añadiendo ex4 al final del archivo para no olvidarme de compilarlo. Desgraciadamente, mi nueva build 610 ZigZag fue sustituida por la antigua.

Decidí utilizar el suyo, ya que el tiempo no es un problema para mí. Me enfrento a algunos problemas aquí también, le agradecería si usted me puede guiar.

Utilicé el mismo código indicado arriba sólo cambié el nombre del archivo con tu versión. Estoy usando los parámetros 6,5,3; esa es la única diferencia con respecto a su configuración por defecto.

Lo que enfrenté algunos problemas:

En primer lugar el indicador carga cada vez en cada tick para leer los valores zh,zl. Y al final libera todas las cargas al final (que no se puede ver en la imagen) indicando algo como "2014.02.22 09:35:09.171 2013.11.01 22:55 Custom indicator ZigZagZug EURUSD,M15: removed". Por favor, consulte el archivo de registro que he adjuntado. Causa algún problema de memoria después?

En segundo lugar en el diario el contador cnt saltó de cnt8 a cnt84 lo cual es extraño. En los registros no salta. Creo que debo considerar los registros como valores correctos.

La tercera y más crítica es que encontró dos mínimos consecuentes que no debería. En la figura quiero obtener los valores altos y bajos de las líneas grises en zigzag pero cuando escribo todos los altos y bajos en el registro son exactamente los mismos con sus puntos de color rosa y cian. Sin embargo necesito los valores del zig zag solamente. He comprobado los otros buffers pero no traen los valores correctos. ¿Alguna sugerencia? ¿O debo ir con el clásico zigzag (para la construcción 610?)

Gracias.

ZigZagZug

 
aed71:


Hola FMIC,

Gracias por los consejos. Yo estaba añadiendo ex4 al final del archivo para no olvidarse de compilarlo. Por desgracia, mi nueva build 610 ZigZag sustituido por el antiguo.

Me decidí a utilizar el suyo, ya que el tiempo no es un problema para mí. Me enfrento a algunos problemas aquí también, le agradecería si me puede guiar.

Utilicé el mismo código indicado arriba sólo cambié el nombre del archivo con tu versión. Estoy usando los parámetros 6,5,3; esa es la única diferencia con respecto a tu configuración por defecto.

¿Alguna sugerencia? ¿O debería usar el clásico zigzag (para la versión 610)?

Gracias.

No hay nada malo en utilizar el nuevo ZigZag 610. De hecho, te animo a que lo utilices para que sea compatible con futuras versiones. No utilices el antiguo o incluso el mío.

Mi indicador ZigZagZug utiliza parámetros adicionales y en un orden y tipo diferente, por lo que no puede simplemente utilizar un iCustom similar al que está utilizando ahora. Es completamente diferente.

También utilizo 7 buffers en el indicador para las características adicionales. Se supone que se utiliza como herramienta de aprendizaje visual para entender el ZigZag y no realmente para su uso en un EA.

¡PS! Es normal que un indicador se cargue y se descargue varias veces durante un back-test de un EA usando iCustom. Todo depende de cómo esté codificado el EA y el indicador. Para evitarlo y hacer un EA más rápido, suelo recodificar sólo el código esencial en el propio EA para no depender de indicadores externos, pero ese es otro tema que no está directamente relacionado con tu caso. Sólo una sugerencia para tus futuros EAs.

 
aed71:


Hola FMIC,

... Quiero obtener los valores altos y bajos de las líneas grises en zigzag pero cuando escribo todos los altos y bajos en el registro son exactamente los mismos con sus puntos de color rosa y cian. Sin embargo necesito los valores del zig zag solamente. ...

Gracias.


Como ya se ha explicado en un post anterior, no se puede utilizar sólo el buffer de alta y baja para obtener los puntos del ZigZag, ya que también incluyen los puntos repintados (círculos aqua y magenta en el ZigZagZug). En el ZigZag estándar también es así, pero simplemente no se ven. Por eso mi indicador los muestra para que lo entiendas mejor.

Tienes que comparar los buffers de máximos y mínimos con el primero que contiene AMBOS mínimos y máximos para filtrar SOLO los puntos en zigzag.

¡NB! Tendrás que comparar el primer buffer (Modo 0) con los otros 2 buffers para decidir si es un Punto Alto o un Punto Bajo (por ejemplo, si tanto el Buffer 1 como el Buffer 3 tienen el mismo valor entonces es un punto ZigZag Bajo, y si tanto el Buffer 1 como el Buffer 2 son iguales entonces es un punto Alto).

Si quieres, adjunta tu archivo en un post, y lo corregiré para que veas cómo usarlo correctamente ( ADJÚSTALO, no uses SRC para no ser un post largo ).