Problema con el indicador ZigZag - página 3

 
FMIC:


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 puntos repintados (puntos cian y rosa en el mío). En el ZigZag estándar también es así, pero simplemente no se ven. Por eso mi indicador los muestra para que puedas entenderlo mejor.

Tienes que comparar los buffers de Altos y Bajos con el primero que contiene AMBOS Altos y Bajos para filtrar SOLO los puntos ZigZag.

NOTA. 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 como usarlo correctamente ( ADJÚSTALO, no uses SRC para no ser un post largo ).


Hola FMIC,

Gracias por tu explicación y ayuda. Todavía no he podido conseguir los valores altos y bajos. El tema es que se repinta (normalmente) y no encuentro el histórico de máximos y mínimos. También estoy utilizando el modo 0 y el modo 1 o el modo 0 y el modo 2 en el indicador original de zigzag sin embargo todos los resultados ya tiene ambos valores. Me refiero a que no hay una sola línea con zh (modo 1) o zl (modo 2) con valores pero no zz (modo 0). Así que no he podido utilizar este método.

Además utilicé el índice de la función iCustom() pero no pude tener éxito. Parece muy simple pero estoy trabajando en ello más de 1 día pero no pude encontrar una solución.

Por favor, encuentre mi código en el archivo adjunto (versión 5). Cualquier ayuda es muy apreciada.

Archivos adjuntos:
 

Hago algunas pruebas más y también realizo la prueba visual. Incluso puse el índice iCustom a 100 ticks atrás para evitar el repintado pero lo hace. El problema es que cuando se llama al indicador de zigzag, éste busca los datos actuales; 100 ticks antes, 10 ticks antes o 1000 ticks antes no tienen ningún impacto en él. Así que es mejor usar el índice como 1.

Lo que entiendo es que tengo que realizar otro bucle comprobando las matrices y corrigiendo los máximos y mínimos eliminando los datos; por ejemplo, si hay dos máximos consecutivos eliminará el más bajo y hará lo contrario para los mínimos. Mi idea inicial es de nuevo retroceder digamos 100 días en el array y comprobar si hay máximos consecutivos. Todavía no he llegado a la conclusión del algoritmo.

¿Tienes una idea mejor? ¿Incluyendo el uso de un enfoque completamente diferente para identificar los máximos y mínimos en los datos históricos?

 
aed71:

Hago algunas pruebas más y también realizo la prueba visual. Incluso puse el índice iCustom a 100 ticks atrás para evitar el repintado pero lo hace. El problema es que cuando se llama al indicador de zigzag, éste busca los datos actuales; 100 ticks antes, 10 ticks antes o 1000 ticks antes no tienen ningún impacto en él. Así que es mejor usar el índice como 1.

Lo que entiendo es que necesito realizar otro bucle comprobando las matrices y corrigiendo los máximos y mínimos eliminando los datos; por ejemplo, si hay dos máximos consecutivos eliminará el más bajo y hará lo contrario para los mínimos. Mi idea inicial es de nuevo retroceder digamos 100 días en el array y comprobar si hay máximos consecutivos. Todavía no he llegado a la conclusión del algoritmo.

¿Tienes una idea mejor? ¿Incluyendo el uso de un enfoque completamente diferente para identificar los máximos y mínimos en los datos históricos?


Hola aed71,

Acabo de regresar de un trabajo y es hora de ir a la cama. Por la mañana, revisaré tu código con más detalle y te daré una solución correcta.

Sin embargo, como nota rápida, no tienes que mirar hacia atrás 1000 o 100 barras, sólo lo suficiente para contemplar los parámetros"depth" y "backstep".

Además, ya que sólo está recogiendo y analizando los datos, considere un Script que recorra instantáneamente todo el historial de datos, en lugar de un EA que utilice intervalos de ticks. De esta manera, no tendrá que preocuparse de repintar.

Mañana te daré una explicación más completa.

Un saludo,
FMIC

 

Hola FMIC,

Desde ayer estoy trabajando en el algoritmo de cómo eliminar los falsos máximos y mínimos y he codificado la versión adjunta para ello. De alguna manera elimina las señales falsas sin embargo a veces elimina la original donde NO debería hacerlo.

El principio detrás del código es:

Si hay un máximo, vuelve hasta el último mínimo conocido y comprueba paso a paso si el máximo actual es mayor que el anterior, entonces borrará el máximo anterior.

Lo mismo es válido para la parte baja. He puesto algunas explicaciones al código.

Al menos ya no tengo máximos ni mínimos concurrentes :-)

Ahora tengo que encontrar el error por el que se borran los puntos altos/bajos originales.

Si puedes echar un vistazo a mi código puede que entiendas el fallo en poco tiempo. Estoy muy concentrado y puede que no vea ni siquiera los errores más simples...

Gracias por tu ayuda de nuevo.

Archivos adjuntos:
 

Buenos días "aed71",

Todavía no he mirado su archivo más reciente, pero aquí está mi Script (no indicador, no EA) para revisar un determinado período de tiempo y la salida de la ZigZag máximos y mínimos a un archivo CSV.

Simplemente adjunte el Script a un gráfico y se ejecutará en segundos. A continuación, sólo revise el archivo CSV que se genera en la carpeta "MQL4\Files". He incluido un ejemplo de ejecución en el gráfico diario del EURUSD para el año 2013.

Como se trata de un Script no hay que preocuparse por los repintados en absoluto.

Saludos cordiales,
FMIC

P.D. Revisaré su último archivo y le daré mis comentarios.

EDIT: He mirado su último código y es todo el lugar. Sólo tienes que echar un vistazo a mi código y ver que la prueba de los máximos y mínimos es mucho más simple. No hay necesidad de toda esa confusión en su código. Aquí hay un extracto (código completo en el archivo ZIP):

if( dblZigZagPoint > 0 )  // Test if a ZigZag Point is found
{
   intZZCount++;  // Increment ZigZag Counter

   // Test if it is a High, Low or Unknown
   string strZZType = strZZUnknown;
   if( dblZigZagHigh > 0 ) strZZType = strZZHigh;
   else if( dblZigZagLow > 0 ) strZZType = strZZLow;
               
   // Output the ZigZag Point Data to CSV File
   FileWrite( intCSVFileHandle, intZZCount, strZZType, DoubleToString( dblZigZagPoint, intDigits ), Time[ intBarShift ] );
}
Archivos adjuntos:
 
FMIC:

Buenos días "aed71",

Todavía no he mirado su archivo más reciente, pero aquí está mi Script (no indicador, no EA) para revisar un determinado período de tiempo y la salida de la ZigZag máximos y mínimos a un archivo CSV.

Simplemente adjunte el Script a un gráfico y se ejecutará en segundos. A continuación, sólo revise el archivo CSV que se genera en la carpeta "MQL4\Files". He incluido un ejemplo de ejecución en el gráfico diario del EURUSD para el año 2013.

Como se trata de un Script no hay que preocuparse por los repintados en absoluto.

Un saludo,
FMIC

¡PS! Revisaré tu último archivo y te daré mis comentarios.

EDIT: He mirado tu último código y está por todas partes.
Sólo echa un vistazo a mi código y ver que las pruebas para los altos y bajos es mucho más simple.

No hay necesidad de toda esa confusión en su código.


Gran trabajo, trabajó sin problemas, debe ser incluido en la base de código.... Gracias.

Tengo dos preguntas si no te importa:

1-) Mis datos que descargué y veo en el gráfico mostraban 4 dígitos pero la salida del script era de 5 dígitos. ¿Cómo puede ser posible? Me refiero a 5 dígitos sin cero al final.

Cuenta,Tipo,Precio,FechaHora

1,H,1.34962,2013.11.04 00:30:00

2,L,1.34861,2013.11.04 02:15:00

3,H,1.35015,2013.11.04 03:00:00

4,L,1.34417,2013.11.04 05:15:00

5,H,1.35127,2013.11.04 11:15:00

6,L,1.34910,2013.11.04 15:45:00

7,H,1.35236,2013.11.04 18:15:00

8,L,1.35045,2013.11.04 19:45:00

9,H,1.35203,2013.11.04 22:45:00

2-) El script es muy útil sin embargo esta fue la primera parte de mi proyecto donde analizo los datos históricos. Después estaba planeando incluir el código a mi experto y de alguna manera encontrar la correlación entre la historia reciente y decidir para una mayor optimización de las variables actuales en consecuencia. En otras palabras, necesito ejecutar algo similar en el experto también. Entonces, ¿cómo sería posible convertirlo en experto?

Gracias de nuevo por su ayuda :-)


 
aed71:


Gran trabajo, trabajó sin problemas, debe ser incluido en la base de código.... Gracias.

Tengo dos preguntas si no te importa:

1-) Mis datos que descargué y veo en el gráfico mostraban 4 dígitos pero la salida del script era de 5 dígitos. ¿Cómo puede ser posible? Me refiero a 5 dígitos sin cero al final.

2-) El script es muy útil sin embargo esta era la primera parte de mi proyecto donde analizo los datos históricos. Después estaba planeando incluir el código a mi experto y de alguna manera encontrar la correlación entre la historia reciente y decidir para una mayor optimización de las variables actuales en consecuencia. En otras palabras, necesito ejecutar algo similar en el experto también. Entonces, ¿cómo sería posible convertirlo en experto?

Gracias de nuevo por su ayuda :-)

  1. Si tienes un broker de 5 dígitos, entonces los datos tendrán los 5 dígitos. El problema en muchos indicadores es que no utilizan la función "IndicatorDigits()" por lo que acaban mostrando sólo el número de dígitos por defecto independientemente de lo que proporcione el broker. Si miras mi código de ZigZagZug verás que he establecido esto explícitamente, para corregir el problema, algo que MetaQuotes no ha hecho en su propio código:

    // Set Number of Digits (Precision)
       IndicatorDigits( Digits );

  2. En cuanto a la utilización del código en un experto, eso depende realmente de muchas cosas, como la estrategia y cómo le afectarán los repintados. Algunas estrategias no se ven afectadas por los repintados, otras son muy sensibles a ellos. No podré ofrecer muchos consejos para una estrategia "desconocida". En ese caso tendría que ser específico. Pero recuerde, que no necesita mirar hacia atrás 1000 barras. Si aprendes cómo funciona el ZigZag y cómo utiliza las rupturas altas y bajas y cómo busca hacia atrás, a veces sólo necesitas mirar hacia atrás una distancia de (Profundidad + Paso atrás) barras - dependiendo de la estrategia podría ser un poco más o incluso menos, pero nunca las 1000 o 100 que utilizas.

 

Gracias por la información sobre los dígitos. Es un dolor de cabeza para mí, tengo que leer y entender los detalles de la misma ...

Permítanme elaborar más lo que estoy tratando de lograr. Tengo un experto bastante rentable (actualmente) que he probado en los últimos 10 años. Sin embargo el experto no se comporta del todo bien en cada condición, no es muy malo pero no es prometedor en algunos años/momentos. Tiene algunas variables pre-optimizadas que impactan en su rentabilidad. Estoy dispuesto a encontrar una correlación entre la historia reciente y la actual para autooptimizar las variables.

Así que lo que necesito es encontrar los picos y los mínimos en los datos históricos para calcular los períodos y la amplitud de los datos históricos. Intentaré encontrar manualmente una correlación entre los datos histórico-recientes y las variables rentables actuales del experto. Si puedo encontrarla de alguna manera, añadiré un código similar a mi experto, cada día comprobará los datos estadísticos de la última semana y según las constantes correlacionadas autooptimizará las variables del experto.

Así que esta es la estrategia. He trabajado en muchos otros temas para analizar los datos históricos, incluyendo Fourier, Hurts Cycles, Goertzel, MESA, etc, pero llegué a la conclusión de que el uso de un método que se ejecuta sobre los datos existentes será mucho mejor.

Así que no necesito un análisis alto-bajo en tiempo real, en un conjunto de datos de 15M, estoy listo para perder datos de medio día (casi 45 ticks). Lo más probable es que mire los últimos 5 días y que el cambio de 4,5 días sea suficiente para encontrar los nuevos valores optimizados.

En cuanto a mi código, creo que el problema es que mientras comprueba los máximos anteriores va demasiado hacia atrás, debería detenerse en el valor local más bajo. Todavía estoy trabajando en ello ya que necesito la parte experta de la herramienta.

 
aed71:

Gracias por la información sobre los dígitos. Es un dolor de cabeza para mí, tengo que leer y entender los detalles de la misma ...

Permítanme elaborar más lo que estoy tratando de lograr. Tengo un experto bastante rentable (actualmente) que he probado en los últimos 10 años. Sin embargo el experto no se comporta del todo bien en cada condición, no es muy malo pero no es prometedor en algunos años/momentos. Tiene algunas variables pre-optimizadas que impactan en su rentabilidad. Estoy dispuesto a encontrar una correlación entre la historia reciente y la actual para autooptimizar las variables.

Así que lo que necesito es encontrar los picos y los mínimos en los datos históricos para calcular los períodos y la amplitud de los datos históricos. Intentaré encontrar manualmente una correlación entre los datos histórico-recientes y las variables rentables actuales del experto. Si puedo encontrarla de alguna manera, añadiré un código similar a mi experto, cada día comprobará los datos estadísticos de la última semana y según las constantes correlacionadas autooptimizará las variables del experto.

Así que esta es la estrategia. He trabajado en muchos otros temas para analizar los datos históricos, incluyendo Fourier, Hurts Cycles, Goertzel, MESA, etc, pero llegué a la conclusión de que el uso de un método que se ejecuta sobre los datos existentes será mucho mejor.

Así que no necesito un análisis alto-bajo en tiempo real, en un conjunto de datos de 15M, estoy listo para perder datos de medio día (casi 45 ticks). Lo más probable es que mire los últimos 5 días y que el cambio de 4,5 días sea suficiente para encontrar los nuevos valores optimizados.

En cuanto a mi código, creo que el problema es que mientras comprueba los máximos anteriores va demasiado hacia atrás, debería detenerse en el valor local más bajo. Todavía estoy trabajando en ello ya que necesito la parte experta de la herramienta.


Lo que has descrito no ayuda realmente a entender la naturaleza del EA para poder aconsejarte.

Si lo deseas, envíame un Mensaje Privado con los detalles y puedo echar un buen vistazo a tu EA y sugerir el código necesario para el mismo.

Alternativamente, todo lo que puedo sugerir es que intentes implementarlo lo mejor que puedas, y cuando tengas un problema específico que necesites resolver, vuelve al foro y publica una consulta específica para ello y ver si los usuarios pueden ayudar.

 

OK Gracias FMIC.

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