Características del lenguaje mql5, sutilezas y técnicas - página 75

 
Vitaly Muzichenko:

Puse el EA en el gráfico el sábado, pero el EA puede obtener la hora del último tick, es por ejemplo en Market Watch 23:58, y mi hora local es 04:45. El tiempo del servidor no lo sé.

Mi pregunta es: ¿Cuánto tiempo ha pasado desde el último tick hasta la hora del servidor (hora del terminal)

Pensé durante un tiempo. Resulta que no hay ninguna diferencia cuando un EA se adjunta a un gráfico. Hasta que no haya un tick real, no podemos ejecutar la parte del algoritmo del programa que utiliza el tiempo real del servidor.

Si se requieren cálculos antes de que llegue el tick, entonces pida ServerGMTOffset.

Por lo tanto, el problema se puede resolver incluso sin ServerTradeTime().

 
Ihor Herasko:

Lo he pensado un poco. Resulta que no hay ninguna diferencia cuando el EA está unido al gráfico. Mientras no haya un tick real, no podemos ejecutar la parte del algoritmo del programa que utiliza el tiempo real del servidor.

Si se requieren cálculos antes de que llegue el tick, entonces pida ServerGMTOffset.

Por lo tanto, el problema se puede resolver incluso sin ServerTradeTime().

El usuario no sabe el Offset del servidor, no lo conoce.

Sólo se conocen dos valores, y estos datos no son suficientes para calcular"cuánto tiempo ha pasado desde el último tick hasta la hora del servidor(del terminal)".

Es una tarea muy peculiar y no veo la solución, como tú.

 
Vitaly Muzichenko:

Puse el EA en el gráfico el sábado, pero el EA puede obtener la hora del último tick, es por ejemplo en Market Watch 23:58, y mi hora local es 04:45. El tiempo del servidor no lo sé.

La pregunta es cuánto tiempo pasó desde el último tick hasta la hora del servidor (hora del terminal)

No es sólo una hora, es una fecha. Es decir, tanto la fecha como la hora. Así, la operación aritmética con estos datos dará la diferencia en segundos, que no es difícil de traducir en días, horas, minutos y segundos.

Además, hay que comprobar lo que TimeTradeServer mostrará los fines de semana.

2018.03.29 15:00:03.640 00 (EURUSD,H1)  TimeCurrent() = 2018.03.29 14:59:54
2018.03.29 15:00:03.640 00 (EURUSD,H1)  TimeLocal() = 2018.03.29 15:00:03
2018.03.29 15:00:03.640 00 (EURUSD,H1)  TimeGMT() = 2018.03.29 12:00:03
2018.03.29 15:00:03.640 00 (EURUSD,H1)  TimeGMTOffset() = -10800
2018.03.29 15:00:03.640 00 (EURUSD,H1)  TimeTradeServer() = 2018.03.29 15:00:03
Preste atención a la discrepancia entre la hora del servidor y la hora local, y luego a la coincidencia exacta entre la hora local y la hora estimada del servidor.
 
En el caso de forex se puede rehacer este código de cuatro

Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

Características del lenguaje mql4, sutilezas y trucos

fxsaber, 2018.03.29 14:32

#property strict

#define  HOUR 3600
#define  DAY (24 * HOUR)
#define  WEEK 7

datetime GetBarTime( const datetime time, const bool NextBar = false, string Symb = NULL, const ENUM_TIMEFRAMES TimeFrame = PERIOD_M1 )
{
  if (Symb == NULL)
    Symb = _Symbol;
    
  return(iTime(Symb, TimeFrame, iBarShift(Symb, TimeFrame, time) - (NextBar ? 1 : 0)));
}

datetime GetTimeDayOfWeek( const int Shift = 0, const ENUM_DAY_OF_WEEK Day = SUNDAY )
{
  const datetime Res = TimeCurrent() / DAY * DAY;
  
  return(Res - (((WEEK + (TimeDayOfWeek(Res) - Day)) % WEEK) + Shift * WEEK) * DAY);
}

// Аналог по серверному времени - https://www.mql5.com/ru/docs/dateandtime/timegmtoffset
// Работает для FOREX-символов, когда M1-история доступна за ближайшую неделю
int TimeServerGMTOffset( void )
{
  const datetime Sunday = GetTimeDayOfWeek();
  
  return(((int)MathRound((double)MathMin(Sunday - DAY - GetBarTime(Sunday), Sunday + DAY - GetBarTime(Sunday, true)) / HOUR) - 3) * HOUR);
}

// Аналог по серверному времени - https://www.mql5.com/ru/docs/dateandtime/timegmt
// Работает для FOREX-символов, когда M1-история доступна за ближайшую неделю
datetime TimeServerGMT( void )
{
  return(TimeCurrent() + TimeServerGMTOffset());
}
 
fxsaber:
Puede rehacer este código para forex

Gracias, voy a echar un vistazo. Pero además, hay símbolos que no son de Forex.

Lo que no es conveniente es que no puedas obtener simple y brevemente la hora actual del servidor, en cualquier momento.

Alexey Viktorov:

Ambos no son sólo tiempo, son fecha. En otras palabras, es tanto la fecha como la hora. Así, la operación aritmética con estos datos dará la diferencia en segundos, que no es difícil de traducir en días, horas, minutos y segundos.

Además, tenemos que comprobar los fines de semana lo que muestra TimeTradeServer.

Preste atención a la discrepancia entre los segundos de la hora del servidor y la hora local, y luego a la coincidencia exacta entre la hora local y el cálculo de la hora del servidor.

Lo he imprimido de la misma manera, pero cómo se puede utilizar en el fin de semana. En general, la información debe ser probada.

La tarea es mínima:"cuánto tiempo pasó desde el último tick hasta la hora del servidor (terminal)".

if( TimeCurrent()<TimeServer()-60 ) Alert( "нет котировок более 1-й минуты" );
 
Vitaly Muzichenko:

Gracias, voy a echar un vistazo. Pero también hay símbolos que no son de Forex.

Si el corredor tiene al menos un símbolo de divisas, funcionará para otros.

Si el corredor no tiene un solo símbolo de Forex, se plantea la cuestión de la razonabilidad.

 
Vitaly Muzichenko:

Gracias, voy a echar un vistazo. Pero además, hay símbolos que no son de Forex.

No es conveniente que no se pueda obtener simple y brevemente la hora actual del servidor, en cualquier momento.

Yo también lo tengo impreso, pero cómo utilizarlo el fin de semana. En general, hay que rotar la información proporcionada.

La tarea es mínima:"cuánto tiempo ha pasado desde el último tick hasta la hora del servidor (terminal)".

Por supuesto, tenemos que comprobarlo, pero a juzgar por la diferencia entre TimeCurrent y TimeTradeServer podemos suponer que la diferencia crecerá.

Por favor, dime si la hora del servidor MQ-demo es la misma que en Moscú.

 
Alexey Viktorov:

Vale la pena comprobarlo, pero la diferencia entre TimeCurrent y TimeTradeServer sugiere que la diferencia se ampliará.

Por favor, dígame si la hora de mi servidor MQ-demo es la misma que la de Moscú y qué muestra si la hora del servidor no es la misma que mi hora local.

Robo

Mi hora local era 17:17:13

 

Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

Bichos, errores, preguntas

fxsaber, 2017.05.19 22:35

TimeTradeServer puede devolver todo tipo de tonterías. Por ejemplo, un valor inferior a TimeCurrent. Esto anula completamente su aplicación práctica.

Si entiendo bien la idea, el TimeTradeServer debe calcular el tiempo transcurrido después de recibir el TimeCurrent y añadir esta diferencia, una especie de emulación de los valores futuros del TimeCurrent.

Ahora, habiendo ejecutado el Asesor Experto

#define  TOSTRING(A) #A + " = " + (string)(A) + "\n"

void OnInit()
{
  EventSetTimer(1);
}

void OnTimer()
{
  Comment(TOSTRING(TimeTradeServer()) + TOSTRING(TimeCurrent()));
}

puedes ver cualquier tontería.

Fíjate en las fechas.

 
fxsaber:

¿Y quién tiene la culpa de esto, el terminal, o el DC con los ajustes torcidos?