Problema con el indicador ZigZag

 

Hola,

Estoy tratando de desarrollar un experto que excava los datos históricos (pico y fondos) para ser utilizado por mi experto principal. Decidí usar el indicador zigzag ya que es simple y encuentra el alto/bajo fácilmente.

Mi problema es que cuando llamo al ZigZag.ex4 usando la función iCustom() no puedo obtener los valores altos y bajos correctos. Para evitar el repintado, he utilizado el índice 20 del indicador iCustom() como protección básica para el repintado.

Hay dos buffers en el código de ZigZag (usando la versión de metaquotes https://www.mql5.com/en/code/7796 ). Podría tomar los valores altos y bajos opuestos pero no importa demasiado en este momento.

Algunos de los valores coinciden con el código otros no y en el Diario, puedo ver los valores altos y bajos en la misma columna lo cual no puede ser posible.

ZigZag

Mi código es el siguiente:

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

Me pregunto si estoy usando mal el indicador de zig zag o si me he equivocado en el código. No he podido encontrar el problema así que les pido su ayuda para identificar mi problema.

Gracias

 
aed71:

Hola,

Estoy tratando de desarrollar un experto que excava los datos históricos (pico y fondos) para ser utilizado por mi experto principal. Decidí usar el indicador zigzag ya que es simple y encuentra el alto/bajo fácilmente.

Mi problema es que cuando llamo al ZigZag.ex4 usando la función iCustom() no puedo obtener los valores altos y bajos correctos. Para evitar el repintado, he utilizado el índice 20 del indicador iCustom() como protección básica para el repintado.

Hay dos buffers en el código de ZigZag (usando la versión de metaquotes https://www.mql5.com/en/code/7796 ). Podría tomar los valores altos y bajos opuestos pero no importa demasiado en este momento.

Algunos de los valores coinciden con el código otros no y en el Diario, puedo ver los valores altos y bajos en la misma columna lo cual no puede ser posible.

Mi código es el siguiente:

Me pregunto si estoy usando mal el indicador de zig zag o si me he equivocado en el código. No he podido encontrar el problema así que les pido su ayuda para identificar mi problema.

Gracias

¿Puedes decir leyendo el código MACD Sample cómo funciona ese EA?

Me parece que nunca has probado ....

lo que has escrito es como si hiciera algo ..... no se que pasa ¿Puedes decirme que hice?

Cada bucle de ticks ¿Cuál es su bucle de ticks?

¿Esto?

   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

si entonces ¿dónde está el bucle?

no entonces explica línea por línea lo que significa tu código...

 
aed71: Me pregunto si estoy usando mal el indicador de zigzag o si me he equivocado en el código.
  1. Si hubieras buscado en el foro habrías encontrado la respuesta.
  2.  double zl=iCustom(Symbol(),0,"ZigZag.ex4",6,5,3,0,20);
    
    ZigZag no rellena cada elemento del buffer (utiliza DRAW_SECTION.) Haz tu llamada en un bucle hasta que encuentres el desplazamiento que tiene un valor distinto de cero
 
WHRoeder:
  1. Si hubieras buscado en el foro habrías encontrado la respuesta.
  2. ZigZag no rellena cada elemento del buffer (utiliza DRAW_SECTION.) Haz tu llamada en un bucle hasta que encuentres el desplazamiento que tiene un valor distinto de cero


Sí, ya sé que no rellena todos los elementos del buffer. Quiero poner todos los datos en un array incluyendo los ceros (si no hay altos y bajos) y también los valores altos y bajos. La razón de esto es que me gustaría tener otro proceso dentro de deinit() para calcular la diferencia de ticks entre altos y bajos usando los arrays. Es decir, cuántos ticks han pasado entre 2 máximos y la diferencia entre el máximo y el mínimo. Pero no puedo llegar a esa etapa todavía.

¿Por qué devuelve al mismo tiempo altos y bajos como me imaginé en la imagen (parte del diario con la marca ??? al lado?) Y estos valores no corresponden a ningún alto o bajo... Este es mi principal problema...

Gracias

 
deVries:

¿Puedes decir leyendo el código MACD Sample cómo funciona ese EA?

Me parece que nunca has probado ....

lo que has escrito es como si yo hiciera algo ..... no se que pasa ¿Puedes decirme que hice?

Cada bucle de ticks ¿Cuál es su bucle de ticks?

¿Esto?

si entonces ¿dónde está el bucle?

no entonces explica línea por línea lo que significa tu código...

No creo que tenga problemas con el bucle, el bucle funciona e imprime los resultados. comprueba el marco de tiempo (15M en mi caso) y calcula los valores en zigzag e imprime. Por favor, compruebe el rectángulo verde cómo funciona cada 15 minutos. La propia función Start() es un bucle, ¿no es así?

Cada 15M

 
aed71:

No creo que tenga problemas con el bucle, el bucle funciona e imprime los resultados. comprueba el marco de tiempo (15M en mi caso) y calcula los valores en zigzag e imprime. Por favor, compruebe el rectángulo verde cómo funciona cada 15 minutos. La función Start() es en sí misma un bucle, ¿no es así?



Tienes razón en que la propia función Start() es un bucle

pero ¿dónde empieza ese bucle y dónde termina la función Start()?

es en otro lugar ...

los mensajes que imprimiste no se repiten cada tick ....

Entonces, ¿qué estás haciendo ......?

Intenta explicar las líneas de tu código ..... tanto como puedas

 
deVries:


Tienes razón en que la propia función Start() es un bucle

pero ¿dónde empieza ese bucle y dónde termina la función Start()?

es en otro lugar ...

los mensajes que imprimes no se repiten en cada tick ....

Entonces, ¿qué estás haciendo ......?

Intenta explicar las líneas de tu código ..... tanto como puedas


Mis disculpas si no pude explicar correctamente.

Este experto va a ser utilizado para backtest y mi objetivo es encontrar los máximos y mínimos históricos en el gráfico 15M. Luego reprocesaré los datos altos y bajos para calcular la fase y la amplitud del gráfico.

Lo que hice fue utilizar dos arrays para almacenar los valores altos y bajos y un contador para contar los ticks. El tamaño del array 1000 es más que suficiente ya que lo estoy ejecutando durante 2 días como máximo (1440/15=96 ticks por día)

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

en la función init() estoy llenando los arrays con cero.

en la función start() estoy comprobando si se ha disparado un nuevo tick con el siguiente código

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

   // the code here runs every 15M.

   }

Así que la función start() tiene un bucle continuo hasta que el backtest (2 días) finaliza.

Mi principal problema es llamar al ZigZag creo. Abajo estoy llamando el indicador de zigzag. Normalmente si hay un máximo o un mínimo debería devolver con un valor distinto de cero. Pero en mi caso, a veces devuelve tanto el alto como el bajo con el mismo valor, lo cual es imposible.


  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;

Tal vez no entendí las matrices utilizadas en el indicador de zigzag original de Metaquotes (ver abajo). Mi entendimiento es que estos se utilizan para almacenar los valores altos y bajos.

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

Gracias

 

Tómate un tiempo para leer y aprender

Esto podría ayudarte también un poco

Explicación detallada de iCustom

 
También adjunto mi código...
Archivos adjuntos:
 
¿Qué muestra la ventana de datos?
 
deVries:
¿Qué muestra la ventana de datos?

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)

1º

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.

2do.

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

Lo que estoy haciendo mal no lo entiendo.