[SERVICE DESK] ¡Error al obtener la hora de la TF superior en el temporizador! - página 15
Está perdiendo oportunidades comerciales:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Registro
Entrada
Usted acepta la política del sitio web y las condiciones de uso
Si no tiene cuenta de usuario, regístrese
Su indicador no sigue la actualización de los datos.
Llegan nuevas barras del corredor y no las compruebas.
He añadido un par de líneas para mostrar que cuando se comprueba, todo se muestra correctamente.
Es una situación de trabajo - comprobando el nuevo bar.
¡No me digas! ¿Qué te hace pensar que tengo que llevar la cuenta de los bares nuevos? ¿Está escrito en la documentación? Me refiero a que DEBO obtener el valor de la función, y luego necesariamente debo compararlo con el valor anterior? Hay una función, la función está diseñada para trabajar con plazos altos. La función puede devolver un error cuando no tiene datos, o devolver un valor incorrecto (igual a 0 en este caso). Eso es todo. Los programadores no tienen que hacer nada para obtener un valor 100% correcto.
Pero mira lo que he encontrado en la documentación de SeriesInfoInteger():
Para obtener más información sobre el error, es necesario llamar a la función GetLastError().
Y mira mi primer post. ¿Ves ahí el error 4066? Entonces el error es 0 y devuelve datos incorrectos. ¿Por qué la función (en este caso, SeriesInfoInteger()) no comprueba la relevancia antes de enviar los datos? ¿Por qué no pone el indicador de error? Verás, prefiero esperar un poco más a que pasen las comprobaciones internas que buscar errores después.
Pero después me han dado muchos consejos, con los que todavía no he conseguido ningún resultado. Y resultó que ni siquiera se trataba del temporizador.
Ok, lee la ayuda)
SeriesInfoInteger
Devuelve información sobre el estado de los datos históricos.
¿Qué significa la palabra "histórico"?
Si el historial está cargado, no hay ningún error.
¡No puede ser! ¿Y qué te hace pensar que debo seguir necesariamente nuevos bares? ¿Está escrito en la documentación? Es decir, ¿debo obtener el valor de la función, y luego debo necesariamente compararlo con el anterior? Hay una función, la función está diseñada para trabajar con plazos altos. La función puede devolver un error cuando no tiene datos, o devolver un valor incorrecto (igual a 0 en este caso). Eso es todo. Los programadores no tienen que hacer nada para obtener un valor 100% correcto.
Pero mira lo que he encontrado en la documentación de SeriesInfoInteger():
En mi código ver GetLastError()? Aquí hay una comprobación. Esta comprobación debe ser necesaria y REAL. Todo lo demás son soluciones de muleta.No tienes que hacer nada).
...el corredor le envía datos actualizados - si quiere, úselos para el cálculo, si no - no hay problema, use el historial existente).
ps. es fin de semana, el mercado está cerrado, ¡tiene datos incorrectos en su terminal!
y no hay ningún error!!!)
ok, lee la ayuda)
¿Qué significa la palabra historia?
Si el historial está cargado, no hay ningún error.
No debes nada).
...el broker te envía datos actualizados - si quieres usarlos para calcular, si no - no hay problema, usa el Historial)
Cada garrapata que entra en el terminal es ya una historia. Y quiero obtener sus valores reales o el error. Si eso le conviene, está bien.
Cada garrapata que entra en el terminal es ya una historia. Y quiero recibir sus valores reales o el error. Si eso te conviene, está bien.
Sí, el historial es lo que ya se ha descargado o lo que se está descargando en el pasado.
Y lo que se actualiza sólo ahora (después de la última cita) no es la historia, son los nuevos datos en bruto.
Comprueba el tiempo de la vela, no el cálculo de las barras.
Así se actualizará correctamente (comprobado).
Taras, aquí está el resultado de tu código:
Taras, aquí está el resultado de tu código:
Sí, es la primera garrapata, la que produce la historia terminada, la que está disponible.
Después de este tick (si hay nuevas barras), inmediatamente viene el segundo tick, en el que mi código actualiza sus variables y muestran los datos correctos.
ps. puedes insertar tu propia función para comprobar la nueva barra, será la misma.
Yo mismo compruebo constantemente el número de barras, si el número ha cambiado en más de 1, significa que hay que recalcular todo de nuevo, si el número ha cambiado en 1, significa simplemente una nueva barra. Y compruebo sólo los errores más críticos, y no veo este error de retraso.
Sí, este es el primer tic, el que da la historia lista.
Después de este tick (si hay nuevas barras), inmediatamente viene el segundo tick, en el que mi código actualiza sus variables y muestran los datos correctos.
Pc. puede insertar su propia función para comprobar la nueva barra, será la misma.
Yo mismo compruebo constantemente el número de barras, si el número ha cambiado en más de 1, significa que hay que recalcular todo de nuevo, si el número ha cambiado en 1, significa simplemente una nueva barra. Y compruebo sólo los errores más críticos, y no veo este error de retraso.
Y aquí, por cierto, hay otro argumento a favor de que el error se produzca. Es un error de cálculo en el indicador. Escribí un Asesor Experto:
Se ejecuta desde el mismo gráfico que el indicador. Veamos los resultados:
Lo que vemos. Vemos que todo está bien. Todo cargado, y fíjate que no hay errores, ¡los datos se actualizan inmediatamente! La pregunta principal es ¿por qué los datos del GMT se pueden obtener normalmente, mientras que el indicador debe "jugar con los diamantes"? ¿No deberían funcionar los programas por igual? ¿Por qué el mismo código funciona de forma diferente en un indicador y en un Asesor Experto? Este no debería ser el caso.
Y aquí, por cierto, hay otro argumento a favor de que se produzca un error. ¡Es el ERROR en el cálculo en el indicador! He escrito un Asesor Experto:
Se ejecuta desde el mismo gráfico que el indicador. Veamos los resultados:
Lo que vemos. Vemos que todo está bien. Todo cargado, y fíjate que no hay errores, ¡los datos se actualizan inmediatamente! La pregunta principal es ¿por qué los datos del GMT se pueden obtener normalmente, mientras que el indicador debe "jugar con los diamantes"? ¿No deberían funcionar los programas por igual? ¿Por qué el mismo código funciona de forma diferente en un indicador y en un Asesor Experto? Este no debería ser el caso.
Todos los indicadores están en un solo hilo, y no ocurrirá nada nuevo hasta el final del flujo (de hecho, hasta la siguiente llamada de OpsulCalcuter). El Asesor Experto está en su propio hilo separado, por lo que cuando se inicia, se le permite posponer su inicio para las actualizaciones de datos, actualizar los datos - todo lo demás en el terminal no se ve afectado. Lleva así desde su nacimiento y no hay forma de arreglarlo, ya que el entorno de metatrader4 ha sido enterrado.
Dado que es el terminal el que se conecta y hace algo con la carga, la comprobación, etc., todos los indicadores están en un hilo, y no ocurre nada nuevo hasta que todo en el hilo termina (de hecho, hasta la siguiente llamada de OpCalculate), es decir, estando en este hilo, no obtendrá nada más rápido que el final del hilo de todos modos. El Asesor Experto está en su propio hilo separado, por lo que cuando se inicia, se le permite retrasar su inicio para las actualizaciones de datos, actualizar los datos - todo lo demás en el terminal no se ve afectado. Lleva así desde su nacimiento y no hay forma de arreglarlo, porque el entorno de metatrader4 ha sido enterrado.
Soy consciente de que todos los indicadores de un símbolo están en un hilo mientras que cada experto tiene su propio hilo. Pero este no es el caso. Los desarrolladores son los mismos que corrigen los errores de sus creaciones. Los programas no deberían funcionar de forma diferente. Si los indicadores se han saltado algo, es un error y no hay problema. ¡El Asesor Experto ha recibido de alguna manera los datos correctos sin errores! Así que podemos ponerlo en práctica. @Slava, ¿puedes dar tu opinión sobre si se corregirá el comportamiento obviamente erróneo? ¿O, al menos, la adición de documentación (que con prev_calculated = 0 no se pueden obtener datos correctos de los TF superiores)?
Sí, soy consciente de que todos los indicadores de un símbolo están en un hilo, y se asigna un hilo diferente a cada experto. Pero este no es el caso. Los desarrolladores son los que corrigen los errores de sus creaciones. Los programas no deberían funcionar de forma diferente. Si los indicadores se han saltado algo, es un error y no hay problema. ¡El Asesor Experto ha recibido de alguna manera los datos correctos sin errores! Así que podemos ponerlo en práctica. @Slava, ¿puedes dar tu opinión sobre si se corregirá el comportamiento obviamente erróneo? O al menos, ¿es un añadido a la documentación (que no podemos obtener datos correctos de TF alta cuando prev_calculated = 0)?
En la documentación había algo que decía que el Asesor Experto tiene 5 segundos enteros antes de empezar a recibir datos y durante este tiempo el terminal intenta recibir datos para el Asesor Experto. Al indicador no se le da esa posibilidad y de la misma manera no debe solicitar el refresco del historial, no es crítico para él, si es crítico, entonces debe ser calculado en un Asesor Experto. La idea principal es que la situación deseada no es posible en la aplicación actual. Esencialmente, los TFs son temporizadores y hay periodos en los que estos múltiples temporizadores coinciden en un mismo momento - esto es un proceso sincrónico 100% coincidente (excepto la hora de apertura/cierre), porque el primer tick del minuto del TF actual coincide con el primer minuto de cinco minutos, hora, etc. - es sólo escribir el mismo valor en varias variables, y es lógico establecer un conjunto de TFs necesarios y obtener todos los datos necesarios a la vez. Por qué los desarrolladores lo han hecho y no a la inversa, no lo sé. Tal vez, no se puede (no se quiere) hacer en el modelo de funcionamiento del terminal existente debido a la división cliente-servidor, ya que si ahora permitimos que los expertos usen indicadores, colgarán el terminal.
Al final, si te interesa, podrás ver cómo funciona la llamada de indicadores, el indicador llama a otro indicador, el experto(_asktfexp) llama al indicador(_asktf_sample) llamando al indicador(_asktf). Cuando se llama a un indicador desde un experto, el temporizador en el indicador no se iniciará, por lo que las soluciones con un temporizador en el indicador son sólo para los casos en los que este indicador sólo se colgará en el gráfico y no se llamará (lo cual es lógico en general).