[SERVICE DESK] ¡Error al obtener la hora de la TF superior en el temporizador! - página 6
![MQL5 - Lenguaje de estrategias comerciales para el terminal de cliente MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
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
Parece que la solución más fiable es realmente esperar a la llamada de OnCalculate() con la comprobación obligatoria de la conexión al servidor de comercio. Si no comprobamos la conexión (IsConnected()), entonces incluso en OnCalculate() la obtendremos en la carga del terminal:
Sin embargo, no elimina todos los interrogantes:
1. ¿Por qué no está escrito en la documentación de IsConnected() que debe ser llamado necesariamente antes de recibir los datos (al menos) del TF superior en OnCalculate()?
2. ¿Por qué no funciona IsConnected() en OnTimer()? ¿No se supone que el hecho de establecer la conexión con un servidor comercial nos indica que se pueden obtener datos?
3. Una vez que hemos establecido una conexión con el servidor de operaciones y estamos intentando recibir datos en OnTimer(), ¿no deberían las funciones iTime(), iBarShift(), SeriesInfoInteger() y funciones similares a ellas devolver errores si los datos de este servidor de operaciones en particular, del que toman la información, aún no están sincronizados? De lo contrario, resulta alguna tontería, como que te devolvemos el error 4066 una vez y luego puedes usar los datos que tienes.
He hablado con los promotores y con uno de mis amigos de allí y les digo lo siguiente: 1 ¿Qué hago?
1 Tonterías, puedes llamar cuando quieras y desde cualquier lugar.
2 IsConnected se puede llamar desde cualquier parte del código y funciona, pero es una función que no escribe nada en la pila de errores devuelve true/false y ya está. Teniendo en cuenta que el procedimiento de conexión es bastante largo (mínimo 1 segundo) y que IsConnected se activa en el momento de la conexión, es necesario comprobar el estado de la conexión y esperar el inicio del flujo de citas al iniciar el terminal.
3 Estas funciones no escriben nada en la pila de errores, sino que devuelven ellas mismas el resultado.
¿Por qué obtuvimos 4066? Ese error fue causado por la función TimeCurrent. Terminal conectado y el tiempo solicitado desde el servidor, dependiendo de la calidad de la conexión también toma algún tiempo, así que no se olvide de nuestro temporizador rápido. Y luego obtuvimos 4066 en nuestra solicitud de TimeCurrent. Y entonces conseguimos el tiempo y nuestras funciones empezaron a trabajar normalmente y ellas mismas devuelven un error como resultado de su trabajo saltándose la pila de errores.
Como recomendación en tal situación, el temporizador rápido y el inicio de la terminal, asegúrese de comprobar que empezamos a recibir datos del servidor. Mi versión es un poco muleta, sería correcto recibir una señal de OnCalculate para empezar a recibir datos.
¿Qué sugieres para resolver el problema (existe, en tu opinión)? ¿Esperar hasta que OnCalculate() sea llamado 1-2 veces?
Sí, exactamente. En OnInit() simplemente llame a los TFs requeridos sin comprobar el resultado (no puede confiar en él), y en OnCalculate llame a la función IsTFDataReady(). Tan pronto como se devuelva true para todos los TFs solicitados, se puede empezar a ejecutar el algoritmo del indicador.
1. ¿Por qué la documentación de IsConnected() no dice que debe llamarse siempre antes de recibir los datos (al menos) del TF superior en OnCalculate()?
IsConnected() es una función bastante complicada. Devuelve el estado de una sola conexión con el servidor. Pero el terminal utiliza más de una conexión. Hay 8 hilos comerciales por sí mismo. Por lo tanto, aunque IsConnected() devuelva verdadero, no está muy claro qué significa. Al menos, no podemos esperar que se soliciten y construyan series de tiempo. Pero si IsConnected() devuelve false, entonces podemos estar seguros de que el terminal sigue desconectado.
¿Cuál es la tarea para la que la presencia de la conexión del terminal es tan crucial? Según tengo entendido, el indicador es una herramienta de visualización de datos. Los datos que están disponibles. Cuando lleguen nuevos datos, se actualizará la visualización. No debería exigirse la comprobación de la pertinencia de los datos. Esa es la tarea del terminal.
Supongo que estamos hablando de MQL5, la preparación de OHLC no es la misma que en MT4
Estoy hablando de MT4. Hace unos 2 ó 3 años me encontré con un error con Time[0]. Los desarrolladores parecen haberlo solucionado, pero luego, con el tiempo, volvió a aparecer. El problema es que es imposible reproducir inequívocamente este fallo.
IsConnected() es una función bastante complicada. Sólo devuelve el estado de una de las conexiones con el servidor. Pero el terminal utiliza más de una conexión. Sólo hay 8 hilos comerciales. Por lo tanto, aunque IsConnected() devuelva verdadero, no está muy claro qué significa. Al menos, no podemos esperar que se soliciten y construyan series de tiempo. Pero si IsConnected() devuelve false, entonces podemos estar seguros de que el terminal sigue desconectado.
¿Cuál es la tarea para la que la presencia de la conexión del terminal es tan crucial? Según tengo entendido, el indicador es una herramienta de visualización de datos. Los datos que están disponibles. Cuando lleguen nuevos datos, se actualizará la visualización. No debería ser necesario comprobar si los datos están actualizados. Esta es la tarea del terminal.
Para los indicadores no recuerdo la necesidad de comprobar la conexión con el servidor, lo que tenemos en el historial se dibuja, cuando se carga el historial significa que se recalculan todos los buffers de los indicadores
He desarrollado y utilizado la siguiente función en mi EA. En general es satisfactoria y comprueba la conexión con el servidor correctamente:
Específicamente uso Sleep() en él para transmitir el control a la terminal y luego comprobar la conexión con el servidor y la posibilidad de operar
Estoy hablando de MT4. Hace unos 2 ó 3 años me encontré con un error con Time[0]. Los desarrolladores parecían haberlo solucionado, pero luego, con el tiempo, volvió a aparecer. El problema es que es imposible reproducir inequívocamente este fallo.
Si no es demasiado problema, aquí está el tema del tema - la descarga correcta de la historia de la mayor TF, aquí está el indicador: "Tengo que dibujar la MA" de la mayor TF en las barras de la menor TF, lo hice dentro de 5 minutos, funcionará para el 98% correctamente, donde en este código 2% "trampas" que causará errores?
Estoy interesado en el código correcto para MT4
He hablado con los desarrolladores y con un amigo que conozco allí, y te diré una cosa a la vez.
1 Tonterías, puedes llamar cuando quieras y desde cualquier lugar.
2 IsConnected se puede llamar desde cualquier parte del código y funciona, pero es una función que no pone nada en la pila de errores, devuelve true/false y ya está. Teniendo en cuenta que el procedimiento de conexión es bastante largo (mínimo 1 segundo) y que IsConnected se activa en el momento de la conexión, es necesario comprobar el estado de la conexión y esperar el inicio del flujo de citas al iniciar el terminal.
3 Estas funciones no escriben nada en la pila de errores, sino que devuelven el resultado ellas mismas.
¿Por qué obtuvimos 4066? Ese error fue causado por la función TimeCurrent. Terminal conectado y el tiempo solicitado desde el servidor, dependiendo de la calidad de la conexión también toma algún tiempo, así que no se olvide de nuestro temporizador rápido. Y luego obtuvimos 4066 en nuestra solicitud de TimeCurrent. Y entonces conseguimos el tiempo y nuestras funciones empezaron a trabajar normalmente y ellas mismas devuelven un error como resultado de su trabajo saltándose la pila de errores.
Como recomendación en esta situación, el temporizador rápido y el inicio de la terminal, asegúrese de comprobar que empezamos a recibir los datos del servidor. Mi variante es un poco muletilla, sería correcto recibir una señal de OnCalculate para empezar a recibir datos.
1. Lee atentamente lo que escribo. ¡No es la primera vez que te lo digo! ¡No he dicho nada de no llamar a ningún sitio!
¿Estás diciendo que todas las funciones iBarShift(), iTime(), SeriesInfo...() solicitan TimeCurrent()?