Problema con el indicador ZigZag - página 4

 
aed71:

OK Gracias FMIC.

De hecho mi problema era sobre el experto que compartí en el foro. Su script es funciona bien muchas gracias por eso pero básicamente lo necesito en forma de experto que puede trabajar cerca del modo de tiempo real también.

Sus consultas originales en este hilo fueron:

  1. ¿Cómo acceder correctamente a los datos del indicador ZigZag mediante el uso de la función "iCustom"?
  2. ¿Cómo recoger y procesar los puntos altos y bajos del ZigZag para el análisis estadístico?

Mi script le ha proporcionado un código de ejemplo y el conocimiento para responder a esas dos preguntas, de modo que ahora puede aplicar ese conocimiento a otros usos, como un EA que desee desarrollar. Todo lo que tiene que hacer es utilizar mi código para el uso de iCustom() y la prueba de los puntos altos y bajos de ZigZag y aplicarlo a su código de EA.

Sin embargo, la otra consulta, que mencionaste más tarde, de cómo utilizar los datos de ZigZag en un EA específico para las necesidades de optimización de una estrategia que ya tienes funcionando en otro EA, no ha sido planteada o descrita con suficiente detalle aquí en este hilo. Así que, en esencia, no puedo aconsejarte ni ayudarte porque no sé qué es lo que necesitas.

Si lees el artículo que acompaña a mi indicador ZigZagZug en la base de código, verás que usar el ZigZag en estrategias y EAs no es fácil debido al repintado constante, y requiere una comprensión cuidadosa de cómo funciona y cómo puede ser usado en diferentes estrategias y EAs.

En otras palabras, el matrimonio entre los datos de ZigZag y una estrategia EA es complejo y necesita ser bien definido. Por lo tanto, sin saber nada sobre tu estrategia actual o cómo se va a optimizar, no puedo ofrecerte más ayuda o consejo.

Como es comprensible que no quieras ser más comunicativo públicamente, incluso te he ofrecido la posibilidad de hacerlo en privado y sin coste alguno. Soy desarrollador de software y normalmente cobro por estos servicios.

Aparte de lo que ya te he ofrecido, no puedo hacer más ni ofrecerte más consejos sin entender la naturaleza del problema que quieres resolver.

 

Hola,

He conseguido corregir mi código. Había un error en la lógica de los bucles, ahora funciona bien por lo que he probado.

Aquellos que estén interesados podrían utilizarlo. Está diseñado para ser utilizado como experto y utiliza el indicador ZigZag estándar de metaquotes.

Lo que hace básicamente es encontrar los puntos altos y bajos reales en el indicador de zigzag. Se puede utilizar para encontrar puntos altos y bajos en los datos históricos también para el análisis del período y la amplitud.

No es en tiempo real. Se remonta a los últimos valores altos y bajos, por lo que dependiendo de la última duración de la tendencia, podría retroceder y corregir los valores. No lo utilices antes de hacer una prueba rápida en el probador de estrategias.

FMIC, gracias por tu esfuerzo y ayuda.

Archivos adjuntos:
 

Hola aed71,

Todavía hay algunos errores de lógica en tu código.

  1. Tu llamado "bucle de ticks", es en realidad una "Condición de nueva barra", ya que estás probando el "Tiempo[0]" para un cambio en el tiempo con el fin de detectar una nueva barra. Te sugiero que cambies el comentario para no tergiversar el código.
  2. Estás asignando valores al array antes de probar las condiciones y luego estás probando ciertas variables múltiples veces sin necesidad para borrarlo de nuevo. Esto sólo ralentiza tu código y además dificulta seguir la lógica.
  3. Tu forma de encontrar los puntos de repintado es incorrecta y nada robusta. Deberías estudiar cómo funciona el ZigZag para encontrar los puntos de repintado correctamente. Lee su código, o el del ZigZagZug (el que te resulte más fácil de seguir) para entender su lógica.
  4. Estás almacenando valores nulos en el array sin necesidad. Por qué seguir incrementando el contador y añadiendo al array incluso cuando no hay ningún punto ZigZag disponible. Estás desperdiciando recursos valiosos (RAM y ciclos de CPU) sin necesidad. Esto ralentizará la ejecución de tu código. Es preferible utilizar arrays de crecimiento dinámico en lugar de estático, ya que no se puede garantizar un determinado requisito de tamaño de antemano.
  5. Para analizar los datos después, como los periodos de onda o las frecuencias, también necesitarás llevar un registro del índice de tiempo y/o del índice de desplazamiento de barra.

Un saludo,
FMIC

 
FMIC:

Hola aed71,

Todavía hay algunos errores de lógica en tu código.

  1. Tu llamado "bucle de ticks", es en realidad una "Condición de nueva barra", ya que estás probando el "Tiempo[0]" para un cambio en el tiempo con el fin de detectar una nueva barra. Te sugiero que cambies el comentario para no tergiversar el código.
  2. Estás asignando valores al array antes de probar las condiciones y luego estás probando ciertas variables múltiples veces sin necesidad para borrarlo de nuevo. Esto sólo ralentiza tu código y además dificulta seguir la lógica.
  3. Tu forma de encontrar los puntos de repintado es incorrecta y nada robusta. Deberías estudiar cómo funciona el ZigZag para encontrar los puntos de repintado correctamente. Lee su código, o el del ZigZagZug (el que te resulte más fácil de seguir) para entender su lógica.
  4. Estás almacenando valores nulos en el array sin necesidad. Por qué seguir incrementando el contador y añadiendo al array incluso cuando no hay ningún punto ZigZag disponible. Estás desperdiciando recursos valiosos (RAM y ciclos de CPU) sin necesidad. Esto ralentizará la ejecución de tu código. Es preferible utilizar arrays de crecimiento dinámico en lugar de estático, ya que no se puede garantizar un determinado requisito de tamaño de antemano.
  5. Para analizar los datos después, como los periodos de onda o las frecuencias, también necesitarás llevar un registro del índice de tiempo y/o del índice de desplazamiento de barra.

Un saludo,
FMIC

Gracias de nuevo por tus comentarios;

No soy un buen programador así que el código en sí puede no ser perfecto :-) Sin embargo, voy a tratar de explicar mi lógica;

1-) La parte del comentario podría cambiarse por "cada nueva barra"..

2-) 4-) 5-) La lógica de usar arrays grandes es que después con un nuevo proceso contaré las barras de valor cero entre máximos o entre máximos y mínimos para encontrar el periodo, la amplitud, etc. Así que necesito inicializar el array antes de usarlo y no necesito lidiar con el índice de tiempo, etc. Sólo más buffer que no es un gran problema para mi proyecto actualmente.

3-) He trazado el zigzag y el zigzagzug varias veces. en el zigzag aunque tienes altos y bajos reales al final, si pones esos valores en un array, verás que hay bajos o altos intermedios. No puedes evitarlos y aunque uses la combinación mode0 y mode1/mode2. Siempre hay entre bajos y altos. En el zigzagzug puedes ver claramente esos puntos. Además veo que hay casos en los que mode0 es cero pero mode1 o mode2 son mayores que cero, lo que son puntos incorrectos. Así que decidí poner código extra para evitar estos puntos.

Como mencioné, este puede no ser el mejor código para encontrar puntos en zigzag, sin embargo el código funciona correctamente en mis pruebas. He probado varias veces. Siempre recomiendo a los que quieran usarlo que lo prueben antes.

¿Lo has probado? No da los puntos correctos. Cuando dices que no es robusto o que es incorrecto, supongo que tus pruebas fallaron, ¿es así?

Gracias.

 
aed71:

Gracias de nuevo por vuestros comentarios;

No soy un buen programador así que el código en sí puede no ser perfecto :-) Sin embargo, voy a tratar de explicar mi lógica;

1-) La parte del comentario podría cambiarse por "cada nueva barra"..

2-) 4-) 5-) La lógica de usar arrays grandes es que después con un nuevo proceso contaré las barras de valor cero entre máximos o entre máximos y mínimos para encontrar el periodo, la amplitud, etc. Así que necesito inicializar el array antes de usarlo y no necesito lidiar con el índice de tiempo, etc. Sólo más buffer que no es un gran problema para mi proyecto actualmente.

3-) He trazado el zigzag y el zigzagzug varias veces. en el zigzag aunque tienes altos y bajos reales al final, si pones esos valores en un array, verás que hay bajos o altos intermedios. No puedes evitarlos y aunque uses la combinación mode0 y mode1/mode2. Siempre hay entre bajos y altos. En el zigzagzug se pueden ver claramente esos puntos. Además, veo que hay casos en los que mode0 es cero pero mode1 o mode2 son mayores que cero, lo que son puntos incorrectos. Así que decidí poner código extra para evitar estos puntos.

Como mencioné, este puede no ser el mejor código para encontrar puntos en zigzag, sin embargo el código en sí mismo funciona correctamente en mis pruebas. He probado varias veces. Siempre recomiendo a los que quieran usarlo que lo prueben antes.

¿Lo has probado? No da los puntos correctos. Cuando dices que no es robusto o que es incorrecto, supongo que tus pruebas fallaron, ¿es así?

Gracias.


No entiendes nada. El código que proporcioné le muestra cómo identificar correctamente los puntos ZigZag altos/bajos; sin embargo, usted elige ignorarlo y hacerlo a su manera, lo que hace que el código sea más difícil de entender y más lento, además de utilizar más recursos de los necesarios. ¿Por qué?
 
Fernando Carreiro #:

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 puntos de ZigZag (ya que también contiene 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.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.

no te vas a creer lo mucho que me ha ayudado esto, muchas gracias