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

 
pivomoe:
Lo sé. ¿Cuál es tu punto?

A qué:

pivomoe:

En la visión general del mercado siguen apareciendo las columnas "Volumen" "Última operación " Existe la sospecha de que esta función simplemente devuelve la .hora del último tick.

La funciónSymbolInfoInteger(_Symbol,SYMBOL_TIME) devuelve sólo la hora del último tick. Porque el cambio de una cita provoca la aparición de un nuevo tick informativo.

Se quiere medir el tiempo entre la llegada de la última cotización y la hora del último tick. En segundos, parece ser siempre 0. Por lo tanto, el terminal devuelve todo con prontitud.

 
Alexey Kozitsyn:

Para:

La funciónSymbolInfoInteger(_Symbol,SYMBOL_TIME) devuelve sólo la hora del último tick. Porque el cambio de una cita lleva a un nuevo tic informativo.

Se quiere medir el tiempo entre la llegada de la última cotización y la hora del último tick. En segundos, parece que siempre es 0. Por lo tanto, el terminal devuelve todo con prontitud.

Una vez más lo que veo es el problema.

Dada:

La hora local y la del servidor están más o menos sincronizadas, es decir, la diferencia entre .time_msc de los nuevos ticks y la hora local es de unos pocos segundos.

A las 18:00:00 hora local estás intentando obtener un nuevo tick por el símbolo SBER con SymbolInfoTick, obtienes un tick con la hora 17:57:00

A las 18:00:01 comp. intentamos obtener un nuevo tick con SymbolInfoTick, obtenemos un tick con la hora 17 :58:30

No creo que esto pueda llamarse operativo.

Ahora me he alejado de la hora local del ordenador y utilizo en su lugar la hora máxima del último tick entre todos los símbolos de la visión general del mercado.

 
pivomoe:

Una vez más, lo que veo es el problema.

Dada:

La hora local y la del servidor están más o menos sincronizadas, es decir, la diferencia entre .time_msc del nuevo tick y la hora local es de pocos segundos.

A las 18:00:00 hora local estás intentando obtener un nuevo tick por símbolo SBER con SymbolInfoTick, obtienes un tick con la hora 17:57:00

A las 18:00:01 comp. intentamos obtener un nuevo tick con SymbolInfoTick, obtenemos un tick con la hora 17 :58:30

No creo que esto pueda llamarse operativo.

Ahora me he alejado de la hora local del ordenador y utilizo en su lugar la hora máxima del último tick entre todos los símbolos de la visión general del mercado.

¿Comprendes que puedes establecer cualquier hora del ordenador? No puedes usarlo. Ya se lo han dicho. Esto es lo primero.

En segundo lugar, no se puede utilizar el tiempo máximo del último tick entre todos los símbolos de la visión general del mercado. Quiere encontrar el desfase del tiempo del último tick del símbolo SBER (SymbolInfoTick) con respecto al tiempo de la última cotización del símbolo SBER (SymbolInfoInteger). Es decir, tienes que hacerlo más o menos como he escrito (más o menos porque tienes que usar un bombo para tener más precisión, como te han aconsejado).

En tercer lugar, esto:

В 18:00:00 по времени компа  пытаемся получить новый тик по символу SBER с помощью SymbolInfoTick, нам отдают тик со временем 17:57:00

В 18:00:01 по времени компа опять пытаемся получить новый тик по символу SBER с помощью SymbolInfoTick, нам отдают тик со временем 17:58:30

Se afirma sin pruebas. Si considera que su código es una prueba, vea la "segunda".

 
Alexey Kozitsyn:

¿Te das cuenta de que puedes ajustar la hora del ordenador a cualquier cosa? No puedes estar atado a ella. Ya te lo han dicho. En primer lugar.


No se puede establecer en cualquier momento si se trata de milisegundos o incluso segundos. Hablar de retrasos de minutos es muy posible. No estoy midiendo la diferencia con ella ahora, sino con el tiempo máximo .time_msc del último tick para todos los símbolos del resumen del mercado.

Alexey Kozitsyn:

Quiere encontrar el desfase del tiempo del último tick del símbolo SBER (SymbolInfoTick) con respecto al tiempo de la última cotización del símbolo SBER (SymbolInfoInteger).

No lo sé.

Alexey Kozitsyn:

En segundo lugar, tampoco se puede utilizar el tiempo máximo del último tick entre todos los símbolos de la visión general del mercado.

¿Por qué? No estoy comparando la hora del último tick ( por ordenador ) , estoy comparando el time_msc .

Alexey Kozitsyn:

No puedo usar tu código sin pruebas. Si considera que su código es una prueba - vea la "segunda".

Por lo general, los desarrolladores piden el código para reproducir el problema. Aquí hay un retraso de 2 segundos recientemente capturado.

14:53:10.277    ProverkaAktyalnostiTikov (RTS-3.19,H1)  РЕКОРДная  Разница между временем последенго тика по ВСЕМ символам Минус только, что полученный новый тик по символу 2057 милесекундa.
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
14:53:10.277    ProverkaAktyalnostiTikov (RTS-3.19,H1)   Локальное время получения нового тика по символу.                                   2019.03.20 14:53:10.277
14:53:10.277    ProverkaAktyalnostiTikov (RTS-3.19,H1)   Предпоследние Локальное время попытки получить новый тик по символу    2019.03.20 14:53:10.259
AlexeyKozitsyn:

(más o menos porque hay que usar un bombo para mayor precisión, como te han aconsejado).

Me han aconsejado utilizar OnBookEvent en lugar de OnTimer. Lo he puesto en práctica. Puedes elegir en la configuración dónde recibir los ticks, ya sea OnTimer o OnBookEvent. Es aún peor con OnBookEvent, sólo capta el 70% de los nuevos eventos de tick.
Archivos adjuntos:
 

pivomoe:

14:53:10.277    ProverkaAktyalnostiTikov (RTS-3.19,H1)  РЕКОРДная  Разница между временем последенго тика по ВСЕМ символам Минус только, что полученный новый тик по символу 2057 милесекундa.
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
14:53:10.277    ProverkaAktyalnostiTikov (RTS-3.19,H1)   Локальное время получения нового тика по символу.                                   2019.03.20 14:53:10.277
14:53:10.277    ProverkaAktyalnostiTikov (RTS-3.19,H1)   Предпоследние Локальное время попытки получить новый тик по символу    2019.03.20 14:53:10.259

Sólo por estas líneas, parece claro lo que quiere. Te interesa algo así como la sincronización entre símbolos. Es decir, la pertinencia general de los datos sobre los instrumentos que desea.

No puedo ayudarte con esto por el momento, no he participado en esta pregunta. Pregunte a los desarrolladores.

 
Alexey Kozitsyn:

Sólo por estas líneas, parece claro lo que quiere. Te interesa algo así como la sincronización entre símbolos. Es decir, la pertinencia general de los datos sobre los instrumentos que desea.

No puedo ayudarte con esto por el momento, no he participado en esta pregunta. Dirección a los desarrolladores.

Alexey (no quería participar, pero...).

¿No es el código de "relevancia" (NEW_TICK) de la página 2 de este hilo?

//+------------------------------------------------------------------+
//|                                                         Time.mq5 |
//|                                                   Copyright 2019 |
//|                                                                  |
//+------------------------------------------------------------------+
enum FRESH_TICK
{
  UNKNOWN_TICK,
  NEW_TICK,
  CUR_TICK
};
//
int is_book;
ulong last_tick_time; //Время последнего тика
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
  last_tick_time = 0;
  is_book = MarketBookAdd(Symbol());
  if(is_book == false) 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:; //Тик не определен
       break;
       case NEW_TICK:;     //Торговое время, можно отсылать ордера;
       break;
       case CUR_TICK:;     //По усмотрению разработчика;
       break;
      }
    }  
  }
}
//+------------------------------------------------------------------+
//| Expert Check Market Time function                                |
//+------------------------------------------------------------------+
FRESH_TICK CheckTickTime(MqlTick &a_tick)
{
  MqlDateTime cur_time, tick_time;
  cur_time.year = 0;
  TimeTradeServer(cur_time); //Возвращает расчетное текущее время торгового сервера.
  if(cur_time.year > 0)
  {
    if(TimeToStruct(a_tick.time, tick_time) == true)
    {
      if(tick_time.day_of_year == cur_time.day_of_year)      //Проверка, что это сегодняшний тик
      {
        double t_msc = double(a_tick.time_msc - ulong(a_tick.time) * 1000)/1000;
        double tr_time = double(tick_time.hour * 3600 + tick_time.min * 60 + tick_time.sec) + t_msc;
        if(((tr_time >= 36000) && (tr_time < 50370)) ||   //10:00:00 - 13:59:30
           ((tr_time >= 50700) && (tr_time < 67470)) ||   //14:05:00 - 19:44:30 
           ((tr_time >= 68700) && (tr_time < 85770)))     //19:05:00 - 23:49:30
        {
          if(ulong(a_tick.time_msc) > last_tick_time)
          {
            last_tick_time = ulong(a_tick.time_msc);
            return(NEW_TICK);
          } else return(CUR_TICK);  
        }
      }
    }
  }   
  return(UNKNOWN_TICK);
} 

Añadido

Con CUR_TICK, se puede seguir haciendo comprobaciones de que es el mismo tick que había o

el nuevo paquete de garrapatas contiene una garrapata que no estaba en el anterior.

 
prostotrader:

Alexey (no quería involucrarse, pero...).

¿No es este el código de "relevancia" (NEW_TICK) de la página 2 de este hilo?

Parece que no. Desde entonces:

TimeTradeServer

Devuelve la hora actual estimada del servidor comercial. A diferencia deTimeCurrent(), el valor de la hora se calcula en el terminal del cliente y depende de la configuración de la hora en el ordenador del usuario.

Es decir, depende del tiempo del ordenador (no debería ser así por la precisión de la medición).

Lo bueno aquí, por supuesto, es comprobar el códigopivomoe para la corrección, y si realmente hay un error - en contacto con los desarrolladores.

 
prostotrader:

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

 
Alexey Kozitsyn:

Parece que no. Porque sí:


¡Mira bien el código!

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

TimeTradeServer() puede no realizarse en absoluto.

Añadido por

Repito

"Con CUR_TICK, se puede seguir comprobando que es el mismo tick que había, o

el nuevo paquete de garrapatas contiene una garrapata no pasada en el paquete anterior, y el paquete contiene 1 garrapata("antigua")".

if(ulong(a_tick.time_msc) > last_tick_time)
{
  last_tick_time = ulong(a_tick.time_msc);
  return(NEW_TICK);
}
 else
{
   //Дополнительные проверки 
}
 
Alexey Kozitsyn:

Lo bueno aquí, por supuesto, es comprobarque el código depivomoe es correcto y, si efectivamente hay un error, contactar con los desarrolladores.

El fallo aparece si hay decenas de caracteres en la revisión del mercado o si hay varios caracteres abiertos en la revisión, pero hay varias decenas de pestañas en el navegador Opera. He escrito a los desarrolladores por mensaje privado.

Como escribí antes el problema se arregla con un Sleep suficientemente grande entre llamadas, para 40 caracteres sleep(10) es suficiente. A medida que el número de personajes crece, se necesita más y más sueño.