Error/problema de TimeCurrent() y iTime()

 

Hola chicos,

Acabo de encontrarme con un problema/bug interesante y no estoy seguro de si ha sido identificado antes o incluso si es específico del broker.

Trate de usar lo siguiente en algún código de indicador, tener el indicador que se ejecuta en el inicio y tenga en cuenta los valores cuando se ejecuta por primera vez MT4 (asegúrese de que MT4 no se ha ejecutado durante al menos 10 minutos antes de reiniciar).

Print(TimeToStr(TimeCurrent(),TIME_DATE|TIME_MINUTES));
Print(TimeToStr(iTime(NULL,PERIOD_M1,0),TIME_DATE|TIME_MINUTES));

Usted notará que los tiempos devueltos son en realidad el tiempo que MT4 estaba ejecutando por última vez.

Para evitar esto he tenido que introducir un retraso en mi código, lo que no es ideal para un indicador.

Me preguntaba si alguien tiene alguna solución más elocuente. Lo ideal sería que la hora correcta del servidor de MT4 se devolviera al inicio cada vez.

Saludos

PaulB

 
Paul_B:

Hola chicos,

Acabo de encontrarme con un problema/bug interesante y no estoy seguro de si ha sido identificado antes o incluso si es específico del broker.

Trate de usar lo siguiente en algún código de indicador, tener el indicador que se ejecuta en el inicio y tenga en cuenta los valores cuando se ejecuta por primera vez MT4 (asegúrese de que MT4 no se ha ejecutado durante al menos 10 minutos antes de reiniciar).

Usted notará que los tiempos devueltos son en realidad el tiempo que MT4 estaba ejecutando por última vez.

Para evitar esto he tenido que introducir un retraso en mi código, lo que no es ideal para un indicador.

Me preguntaba si alguien tiene alguna solución más elocuente. Lo ideal sería que la hora correcta del servidor de MT4 se devolviera al inicio cada vez.

Saludos

PaulB


Este?
Print(TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS));
 

Hola deVries,

puedes usar TIME_SECONDS también, no importa realmente, siempre que el código esté en init{} o al principio de start{}.

El punto es que se obtiene la última vez que MT4 se ejecuta, que podría ser potencialmente horas o días atrás.

 
Paul_B:

Hola chicos,

Acabo de encontrarme con un problema/bug interesante y no estoy seguro de si ha sido identificado antes o incluso si es específico del broker.

Trate de usar lo siguiente en algún código de indicador, tener el indicador que se ejecuta en el inicio y tenga en cuenta los valores cuando se ejecuta por primera vez MT4 (asegúrese de que MT4 no se ha ejecutado durante al menos 10 minutos antes de reiniciar).

Usted notará que los tiempos devueltos son en realidad el tiempo que MT4 estaba ejecutando por última vez.

Para evitar esto he tenido que introducir un retraso en mi código, lo que no es ideal para un indicador.

Me preguntaba si alguien tiene alguna solución más elocuente. Lo ideal sería que la hora correcta del servidor de MT4 se devolviera al inicio cada vez.

Saludos

PaulB

¿No es la documentación 100% clara en este punto? "Devuelve la última hora conocida del servidor (hora de entrada de la última cotización) como número de segundos transcurridos desde las 00:00 del 1 de enero de 1970". si el último tick fue hace 10 minutos entonces TimeCurrent() devolverá un datetime basado en esa hora....
 
RaptorUK:
¿No es la documentación 100% clara en este punto?

En realidad no, no lo es.

Hay una distinción importante entre los EAs y los indicadores que no está cubierta en la documentación: Los EAs sólo reciben una llamada a start() si hay una conexión con el broker y un nuevo tick, mientras que los indicadores siempre reciben una llamada inicial a start() antes o sin que se establezca una conexión con el broker. Por lo tanto, TimeCurrent() puede tener diferentes significados en los EAs y en los indicadores.

Si desea un valor definitivamente actualizado para TimeCurrent() en un indicador, entonces probablemente puede utilizar IsConnected() para comprobar si TimeCurrent() puede referirse al último tiempo conocido en una sesión anterior.

 

Como punto adicional, incluso he probado

https://docs.mql4.com/windows/RefreshRates

antes de llamar a TimeCurrent() y no hubo diferencia. Ciertamente es algo a tener en cuenta.

Lo estoy usando como parte de un código para obtener el desplazamiento entre la hora del servidor MT4 y GMT, y está tirando los cálculos posteriores.

 
cyclops993:

En realidad no, no lo es.

Hay una distinción importante entre los EAs y los indicadores que no está cubierta en la documentación: Los EAs sólo reciben una llamada a start() si hay una conexión con el broker y un nuevo tick, mientras que los indicadores siempre reciben una llamada inicial a start() antes o sin que se establezca una conexión con el broker. Por lo tanto, TimeCurrent() puede tener diferentes significados en los EAs y en los indicadores.

No veo que eso sea relevante teniendo en cuenta lo que dice la documentación... si se comprueba TimeCurrent() antes de que llegue un nuevo tick se obtiene el tiempo del último tick. ¿No es eso lo que dice la documentación?
 
RaptorUK:
No veo que eso sea relevante teniendo en cuenta lo que dice la documentación... si se comprueba TimeCurrent() antes de que llegue un nuevo tick se obtiene la hora del último tick. ¿No es eso lo que dice la documentación?

Sigue siendo engañoso, pero si quieres ser pedante podrías decir que el problema no está en la definición de TimeCurrent() sino en la definición en https://docs.mql4.com/runtime/start. Allí se dice "Al recibir nuevas cotizaciones, se ejecutará la función start() de los expertos e indicadores personalizados adjuntos". Hay una clara implicación de que start() sólo se llama en relación con los nuevos ticks, como es el caso de los EAs, y que, implícitamente, TimeCurrent() por lo tanto no puede devolver el tiempo del último tick en una sesión anterior de uso del software MT4.

[De nuevo, una respuesta a todo esto es ignorar las llamadas a start() en un indicador si IsConnected() devuelve false].

 
cyclops993:

Sigue siendo engañoso, pero si quieres ser pedante [...]

Siendo aún más pedante, si usted tiene una nueva instalación de MT4, y copia en ella un archivo gráfico con un indicador adjunto antes de iniciar MT4 por primera vez, entonces presumiblemente el indicador obtendría una llamada a start() con TimeCurrent() reportado como 1/1/1970. Por lo tanto, la documentación de TimeCurrent() debería decir "...la última hora conocida del servidor, o 1/1/1970 si no ha habido conexión con el servidor".

 
cyclops993:

Siendo aún más pedante, si usted tiene una nueva instalación de MT4, y copia en ella un archivo gráfico con un indicador adjunto antes de iniciar MT4 por primera vez, entonces presumiblemente el indicador obtendría una llamada a start() con TimeCurrent() reportado como 1/1/1970. Por lo tanto, la documentación de TimeCurrent() debería decir "...la última hora conocida del servidor, o 1/1/1970 si no ha habido conexión con el servidor".

No es necesario hacer un escándalo. Simplemente espera el primer/siguiente tick, TimeCurrent() se actualiza y todo está bien. Un indicador sobre los precios de la historia solamente es inútil.
 
angevoyageur:
No hay necesidad de hacer un escándalo. Solo hay que esperar el primer/siguiente tick, TimeCurrent() se actualiza y todo está bien. Un indicador en los precios de la historia sólo es inútil.
Creo que el problema es que la primera vez que se llama a start() para un indicador puede no ser como resultado de un nuevo tick. . . en ese caso TimeCurrent() reportará el tiempo incorrecto. No he verificado esto. . .

En este caso yo simplemente ignoraría el primer tick. . . y continuaría normalmente a partir del tick 2.