Error/problema de TimeCurrent() y iTime() - página 2

 
RaptorUK:
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() informará de la hora incorrecta. No he verificado esto. . .

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

Sí, esto es lo que quiero decir.
 
Es un indicador, por qué te importa lo que es TimeCurrent. Haz tu bucle for del indicador contado y dibuja en las barras. No mire el TimeCurrent, no mire el Bid.
 
Estoy trazando ciertos tiempos en un gráfico que coinciden con GMT, por lo que importa mucho cuando se trata de obtener el desplazamiento entre la hora del servidor MT4 y GMT.
 

Paul_B:
I'm plotting certain times on a chart which match to GMT, so it matters a great deal when trying to get the offset between MT4 server time and GMT.

<g> Creo que aún no estás al tanto de la cultura de este foro. La secuencia de respuestas de los moderadores y otros usuarios de larga duración del foro es siempre "Estás haciendo algo mal" seguido de "¿Por qué querrías hacer eso?" cuando resulta que no estás haciendo algo mal.

Si yo fuera usted, simplemente saldría de las llamadas a start() si IsConnected() es falso. O podrías mantener un conteo de ticks en una variable estática e ignorar el tick #1, pero eso retrasaría innecesariamente el arranque en circunstancias normales.

 
Gracias por el aporte cyclops993, actualmente lo tengo funcionando pero lo que tengo no parece una solución ideal ni particularmente robusta. Voy a explorar IsConnected() un poco más.
 
Paul_B: Estoy trazando ciertos tiempos en un gráfico que coinciden con GMT, por lo que importa mucho cuando se trata de obtener el desplazamiento entre la hora del servidor MT4 y GMT.
Ahora entendemos el por qué. (¿Por qué no te explicaste en el OP?) Exactamente como mi código
      nextAutoUpdate = timeSrv + HR2400;
      if(Srvr_To_UTC_Auto) if(
         IsDllsAllowed()){                            // Complained @ init
         int      srvrToUTC         = LocalTimeToUTC() - TimeCurrent();
         double   nearestHalfHour   = MathRound(srvrToUTC / 1800.);
         Srvr_To_UTC_Hours          = nearestHalfHour / 2.; // Update external
      }

Voy a secundar la sugerencia de RaptorUK, para un indicador Ignorar la primera garrapata y actualizar todas las barras en el segundo.

Tampoco es del todo inesperado. Dado que los indicadores no pueden dormir, si un EA carga un indicador en su init a través de iCustom, la llamada no puede devolver un valor del buffer hasta que el indicador ejecute su init Y arranque.

 
Paul_B:
Gracias por el aporte cyclops993, actualmente lo tengo funcionando pero lo que tengo no parece una solución ideal ni particularmente robusta. Voy a explorar IsConnected() un poco más.

No creo que tengas muchas opciones. MT4 genera una llamada ficticia a start() para hacer que los indicadores se llenen en los gráficos fuera de línea, y porque en general quiere que los indicadores (re)aparezcan en los gráficos tan pronto como se cargue MT4, sin esperar a que se establezca una conexión.

Si quiere aumentar la certeza de que hay una conexión correctamente establecida y un TimeCurrent() válido, entonces también puede buscar AccountNumber() != 0 y AccountBalance() > 0. O podría simplemente esperar al segundo tick, a costa de retrasos de varios segundos en símbolos con poca liquidez.

 

Gracias chicos, programaré el indicador para que espere hasta que se reciba el segundo tick.

Por cierto, acabo de explorar la posibilidad de IsConnected(), pero seguía obteniendo el TimeCurrent() "incorrecto" incluso cuando IsConnected() informaba como verdadero.

 
cyclops993:

<g> Creo que aún no estás al tanto de la cultura de este foro. La secuencia de respuestas de los moderadores y otros usuarios de larga duración del foro es siempre "Estás haciendo algo mal" seguido de "¿Por qué querrías hacer eso?" cuando resulta que no estás haciendo algo mal.

Si yo fuera usted, simplemente saldría de las llamadas a start() si IsConnected() es falso. O podrías mantener un conteo de ticks en una variable estática e ignorar el tick #1, pero eso retrasaría innecesariamente el arranque en circunstancias normales.

Si un usuario no proporciona código de prueba para demostrar el problema es un poco difícil dar ayuda específica y a menudo la mejor suposición que se puede hacer es la de un error en el código . . tal vez debería hacerse cargo y responder a todas y cada una de las preguntas y solicitudes de ayuda. Eso solucionaría todos tus problemas, entonces no tendrías que echar un pulso a los que sólo intentan ayudar . . .
 
RaptorUK:
Si un usuario no proporciona un código de prueba para demostrar el problema [...]

No había nada incorrecto o que faltara en el OP. Estaba claro que Paul_B estaba asumiendo, perfectamente razonable de la documentación de MT4, que start() sólo se llama en respuesta a nuevos ticks.(Por qué quería comprobar TimeCurrent() no hace ninguna diferencia, y en realidad no es de nuestra incumbencia).

Su respuesta fue básicamente una buena versión de RTFM, a pesar del hecho de que el manual es claramente deficiente en esta área [que voy a subrayar es inusual; la calidad de la documentación de MT4 es bastante buena]. La respuesta de Angevoyageur fue describir esto como un alboroto, lo que parece ser parte de un patrón de respuestas patológicamente sensibles a cualquier crítica de MT4 de cualquier tipo, por leve que sea. WHRoeder entonces intervino con un "no quieres hacer eso", seguido de copiar y pegar algún código que era claramente irrelevante porque Paul_B claramente ya sabía cómo calcular un offset GMT.