Un minuto y medio de diferencia entre la hora local y la hora fresca. Qué hacer. - página 6

 
prostotrader:

Mira el código con atención.

¡TimeTradeServer() se toma sólo para determinar el día y ya está (esta comprobación se hace "por si acaso")!

TimeTradeServer() puede omitirse por completo.

Lo he mirado. Estoy de acuerdo, lo he escrito mal, pero la función, en mi opinión, sigue sin resolver el problema. Para ser honesto, no estoy muy seguro de por qué es necesario. Parece que tú:

1. Obtiene el número de milisegundos de un tick;

2. Descompones la garrapata en sus componentes;

3. Entonces, ¿¡vuelves a montar la garrapata!? Aquí es donde no me queda claro para qué sirve esto? Siempre obtendrá el mismo valor que se pasó originalmente a la función. ¿O quizás me estoy perdiendo algo?

Y luego comparas la hora del tic con la anterior;


Necesitamos saber la hora del servidor, ¿no? Sin la hora del servidor, no podemos determinar si el hilo de un personaje se está retrasando con respecto a los hilos de otros personajes.

Es decir, su código no se vincula a la hora del servidor y no compara la hora del servidor con la hora del hilo, cosa que necesitamos hacer. Para entender no el retardo de la pila de los ticks de un solo símbolo (como pensé originalmente al entrar en esta discusión), sino el retardo de la transferencia de datos sobre un conjunto de símbolos desde el servidor al terminal.

 
Alexey Kozitsyn:

Parece que la comprobación debe hacerse a través de TimeGMTOffset. Más adelante esbozaré un ejemplo.

Es curioso, eres una persona con experiencia (no un principiante).

No necesitas nada de tiempo, ¡excepto el tiempo de las garrapatas que llegan!

¡Recuerda la hora (en la inicialización) del último tick, y luego todas las comparaciones van con esta hora!

 
Alexey Kozitsyn:

He echado un vistazo. Estoy de acuerdo, lo escribí un poco mal, pero la función, en mi opinión, sigue sin resolver la tarea en cuestión. Para ser honesto, no estoy muy seguro de por qué es necesario. Parece que sí:

3. ¿Y luego volver a montar la garrapata? Aquí es donde no me queda claro para qué sirve? Siempre obtendrá el mismo valor que se pasó originalmente a la función. ¿O me estoy perdiendo algo?


Este código está "sacado" de mi Asesor Experto, donde compruebo si el tick está actualizado y si la hora está dentro de

sesiones comerciales

Añadido por

El "desglose" del tick es necesario para determinar el tiempo exacto (milisegundos) (sin fecha), ya que en la configuración de la sesión de mi EA

Sólo puse la hora

input string          TimeStMon    = "10:00:00";               //Время начала утренней сессии
input string          TimeStDay    = "14:05:00";               //Время начала дневной сессии
input string          TimeStEvn    = "19:05:00";               //Время начала вечерней сессии
 
prostotrader:

Es simplemente ridículo, eres una persona experimentada (no una novata).

No necesitas nada de tiempo, ¡excepto el tiempo de las garrapatas que llegan!

Recuerde la hora (en la inicialización) del último tic, ¡y luego todas las comparaciones van con esta hora!

Más tarde escribiré mi ejemplo, ya entraré en la cuestión con más detalle. No excluyo que tal vez me equivoque (al igual que pivomoe) y tengas razón.

 
prostotrader:

Este código es "sacado" de mi EA donde compruebo la relevancia del tick y el tiempo en que se encuentra el tick

sesiones comerciales

Añadido

El "desglose" del tick es necesario para determinar la hora exacta (sin fecha), ya que en la configuración de la sesión de mi EA

Sólo he puesto la hora

Exacto, culpa mía, se me pasó.

 
Alexey Kozitsyn:

Exacto, culpa mía, no lo vi así.

Lo que pasa es que TC no tenía claro inicialmente lo que quería conseguir (o tal vez se entendió mal).

Toma, ejecútalo y comprueba:

//+------------------------------------------------------------------+
//|                                                         Time.mq5 |
//|                                                   Copyright 2019 |
//|                                                                  |
//+------------------------------------------------------------------+
enum FRESH_TICK
{
  UNKNOWN_TICK,
  NEW_TICK,
  CUR_TICK,
  OLD_TICK
};
//
MqlTick stored_ticks[];
bool is_book;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
  int result = CopyTicks(Symbol(), stored_ticks, COPY_TICKS_ALL, 0, 1);
  if(result > 0)
  {
    is_book = MarketBookAdd(Symbol());
    if(is_book == false) return(INIT_FAILED);
  } else return(INIT_FAILED);
  return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
  if(is_book == true) MarketBookRelease(Symbol()); 
}
//+------------------------------------------------------------------+
// Expert Book event function                                        |
//+------------------------------------------------------------------+  
void OnBookEvent(const string &symbol)
{
  if(symbol == Symbol())
  {
    MqlTick a_ticks[];
    int result = CopyTicks(symbol, a_ticks, COPY_TICKS_ALL, 0, 1);
    if(result > 0)
    {
      FRESH_TICK tick_state = CheckTickTime(a_ticks[0]);
      switch(tick_state)
      {
       case UNKNOWN_TICK: Print(EnumToString(UNKNOWN_TICK), " - Тик не определен."); //Тик не определен
       break;
       case NEW_TICK: Print(EnumToString(NEW_TICK), " - Новый тик");     //Торговое время, можно отсылать ордера;
       break;
       case CUR_TICK: Print(EnumToString(CUR_TICK), " - Текущий тик");    //По усмотрению разработчика;
       break;
       case OLD_TICK: Print(EnumToString(OLD_TICK), " - Старый тик");     //По усмотрению разработчика;
       break;
      }
    }  
  }
}
//+------------------------------------------------------------------+
//| Expert Check Market Time function                                |
//+------------------------------------------------------------------+
FRESH_TICK CheckTickTime(MqlTick &a_tick)
{
  if(a_tick.time_msc > stored_ticks[0].time_msc)
  {
    stored_ticks[0] = a_tick;
    return(NEW_TICK);
  }
  else
  {
    if(stored_ticks[0].time_msc == a_tick.time_msc)
    {
      if((stored_ticks[0].ask == a_tick.ask) && (stored_ticks[0].bid == a_tick.bid) &&
         (stored_ticks[0].flags == a_tick.flags) && (stored_ticks[0].last == a_tick.last) &&
         (stored_ticks[0].time == a_tick.time) && (stored_ticks[0].volume == a_tick.volume) &&
         (stored_ticks[0].volume_real == a_tick.volume_real))
        {
          return(CUR_TICK);
        }
        else return(OLD_TICK);
        
    }
    else return(OLD_TICK);
  }
  return(UNKNOWN_TICK);
} 
      
 
prostotrader:

Es que el TC no estaba seguro de lo que quería conseguir en primer lugar.

Toma, ejecútalo y compruébalo:

Michael, no hay preguntas a la llegada de la nueva garrapata / cheque en la vieja garrapata. Tampoco hay preguntas a su código. La cuestión es diferente. Tienes que comprobar esta situación:

14:53:10.277    ProverkaAktyalnostiTikov (RTS-3.19,H1)   Получен НОВЫЙ тик по символу                     GAZR-3.19 time_msc= 2019.03.20 14:53:11.638
14:53:10.277    ProverkaAktyalnostiTikov (RTS-3.19,H1)   ХОТЯ до этого был получeн тик                     RTS-3.19 time_msc  2019.03.20 14:53:13.695
 
Alexey Kozitsyn:

Michael, no hay preguntas a la llegada de la nueva garrapata / cheque en la vieja garrapata. Tampoco hay dudas sobre su código. La cuestión es diferente. Necesito comprobar la siguiente situación:

He retocado el código (ver arriba) y ha aparecido el (OLD_TICK).

Y sabiendo que el nuevo paquete puede contener una garrapata "antigua", el desarrollador debe utilizarla a su discreción.

 
prostotrader:

He retocado el código (ver arriba) y ha aparecido (OLD_TICK).

No importa... flujos de caracteres DIFERENTES.

 
Alexey Kozitsyn:

No importa... flujos de caracteres DIFERENTES.

Entonces no entiendo en absoluto QUÉ ES LO QUE NECESITO ????

Si la hora actual es la del SERVIDOR, ¡hay que olvidarse de ella hasta que la difundan!
o utilizar lo que es TimeTradeServer()