Sincronizar la hora local de Windows con el servidor MT5

 

¡Buenas tardes!

¿Es posible ajustar la hora local actual del ordenador desde el MQL5?

¿Funcionarán GetLocalTime() y SetLocalTime()?

 
prostotrader:

¡Buenas tardes!

¿Es posible ajustar la hora local actual del ordenador desde el MQL5?

¿Funcionarán GetLocalTime() y SetLocalTime()?

Lo he comprobado, funciona.

//+------------------------------------------------------------------+
//|                                                     TimeTest.mq5 |
//|                                      Copyright 2016 prostotrader |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016 prostotrader"
#property link      "https://www.mql5.com"
#property version   "1.00"
//---
struct _SYSTEMTIME {
  ushort wYear;
  ushort wMonth;
  ushort wDayOfWeek;
  ushort wDay;
  ushort wHour;
  ushort wMinute;
  ushort wSecond;
  ushort wMilliseconds;
};

_SYSTEMTIME loc_time;

#import "kernel32.dll"
void GetLocalTime(_SYSTEMTIME &sys_time);
bool SetLocalTime(_SYSTEMTIME &sys_time);
#import
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
    GetLocalTime(loc_time);
    if(loc_time.wYear > 0)
    {
      loc_time.wSecond = 55;
      if(SetLocalTime(loc_time))
      {
        if(loc_time.wYear > 0)
        {
        }
      }
    }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
  
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
  
  }
//+------------------------------------------------------------------+
 

Ahora sólo tenemos que averiguar cómo sincronizar correctamente la hora local

ordenador con la hora del servidor de MT5, teniendo en cuenta que TimeCurrent() no se actualiza en la hora de compensación y de no negociación (FORTS).

¿Alguna idea?

 
prostotrader:

Ahora sólo tenemos que averiguar cómo sincronizar correctamente la hora local

hora del ordenador con la hora del servidor de MT5, teniendo en cuenta que TimeCurrent() no se actualiza a la hora de compensación y de no negociación en FORTS.

¿Alguna idea?

¿Generar ticks como en MT4?
Archivos adjuntos:
zSendTick.mq4  2 kb
 
prostotrader:

Ahora sólo tenemos que averiguar cómo sincronizar correctamente la hora local

hora del ordenador con la hora del servidor de MT5, teniendo en cuenta que TimeCurrent() no se actualiza a la hora de compensación y de no negociación en FORTS.

¿Alguna idea?

Así que la actualización sólo es necesaria cuando llega la garrapata. Por lo tanto, debe ser llamado sólo en OnTick. Has creado demasiados problemas.
 
fxsaber:
Así que la actualización es necesaria sólo cuando llega la garrapata. Por lo tanto, la llamada sólo en OnTick. Son demasiado complicados.

Nada es exagerado...

Hay un pre-mercado donde las cotizaciones entran en la pila, así que de 9-50 a 10-00 puedes sincronizar la hora con la del servidor.

Añadido

Si añade un stanan de cualquier símbolo, entonces sin filtrar, los eventos de todos los instrumentos irán allí,

que se seleccionan en Market Watch. Luego toma CopyTicks() y ve el tiempo para sincronizar....

Así.

Añadido

Corríjanme si me he perdido algo.

//+------------------------------------------------------------------+
//|                                              Time_sync_forts.mq5 |
//|                                      Copyright 2017 prostotrader |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017 prostotrader"
#property link      "https://www.mql5.com"
#property version   "1.00"
//---
struct _SYSTEMTIME
  {
   ushort            wYear;
   ushort            wMonth;
   ushort            wDayOfWeek;
   ushort            wDay;
   ushort            wHour;
   ushort            wMinute;
   ushort            wSecond;
   ushort            wMilliseconds;
  };

_SYSTEMTIME loc_time;

#import "kernel32.dll"
void GetLocalTime(_SYSTEMTIME &sys_time);
bool SetLocalTime(_SYSTEMTIME &sys_time);
#import
//---
bool is_sync;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   is_sync=false;
   MarketBookAdd(Symbol());
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   MarketBookRelease(Symbol());
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
  {
   loc_time.wYear=0;
   GetLocalTime(loc_time);
   if(loc_time.wYear>0)
     {
      if((loc_time.wHour==9) && (loc_time.wMinute>=50) && (loc_time.wMinute<=59))
        {
         MqlTick curr_tick[1];
         if(CopyTicks(symbol,curr_tick,COPY_TICKS_ALL,0,1)==1)
           {
            MqlDateTime sv_time;
            TimeToStruct(curr_tick[0].time,sv_time);
            if(!is_sync)
              {
               loc_time.wHour=ushort(sv_time.hour);
               loc_time.wMinute = ushort(sv_time.min);
               loc_time.wSecond = ushort(sv_time.sec);
               loc_time.wMilliseconds=ushort(ulong(curr_tick[0].time_msc)-ulong(curr_tick[0].time)*1000);
               if(SetLocalTime(loc_time))
                {
                 is_sync=true;
                 Print("Local time sync is done.");
                }
              }
           }
        }
      else is_sync=false;
     }
  }
//+------------------------------------------------------------------+
 

Por si acaso, comprueba la cita de "frescura"

              if(!is_sync)
              {
                if((loc_time.wDayOfWeek == ushort(sv_time.day_of_week)) &&
                   (loc_time.wHour == ushort(sv_time.hour)))
                {
                   loc_time.wMinute = ushort(sv_time.min);
                 loc_time.wSecond = ushort(sv_time.sec);
                 loc_time.wMilliseconds=ushort(ulong(curr_tick[0].time_msc)-ulong(curr_tick[0].time)*1000);
                 if(SetLocalTime(loc_time))
                 {
                  is_sync=true;
                  Print("Local time sync is done.");
                 }
                }
              }
 
prostotrader:

Ahora sólo tenemos que averiguar cómo sincronizar correctamente la hora local

ordenador con la hora del servidor de MT5, teniendo en cuenta que TimeCurrent() no se actualiza en la hora de compensación y de no negociación (FORTS).

¿Alguna idea?

¿Tal vez sea más fácil sincronizar con la fuente? Cualquier evento que se produzca en la bolsa recibe su sello de tiempo. La hora de la propia bolsa está sincronizada con la hora astronómica con un margen de error de milisegundos. Mientras que el tiempo de llegada de las notificaciones al servidor de MT5 (que está en el broker) ya es diferente, el tiempo de envío de un paquete al terminal es el tercero, el tiempo de llegada al terminal es el cuarto. Si sincronizas la hora del sistema con la hora astronómica del ordenador local, siempre funcionará y la hora local coincidirá con la de las centrales. Hay varios cientos de servidores NTP públicos (gratuitos) para obtener la hora exacta. Estos están vivos y funcionando ahora, por ejemplo:

195.234.155.123;ntp.dvconsulting.dk
85.17.207.62;ntp.edge.tillo.ch
195.34.89.227;ntp.favey.ch
195.234.155.124;ntp.gal.dk
193.226.65.36;ntp.idsi.md

 
A CopyTicks[0] agrega un ping.
 
Vladimir:

¿No sería más fácil sincronizar con la fuente original? Cualquier evento que se produzca en una bolsa recibe su sello de tiempo. La hora de la propia bolsa está sincronizada con la hora astronómica con un margen de error de milisegundos. Mientras que el tiempo de llegada de las notificaciones al servidor de MT5 (que está en el broker) ya es diferente, el tiempo de envío de un paquete al terminal es el tercero, el tiempo de llegada al terminal es el cuarto. Si sincronizas la hora del sistema con la hora astronómica del ordenador local, siempre funcionará y la hora local coincidirá con la de las centrales. Hay varios cientos de servidores NTP públicos (gratuitos) para obtener la hora exacta. Estos están vivos y funcionando ahora, por ejemplo:

195.234.155.123;ntp.dvconsulting.dk
85.17.207.62;ntp.edge.tillo.ch
195.34.89.227;ntp.favey.ch
195.234.155.124;ntp.gal.dk
193.226.65.36;ntp.idsi.md

Tiempo, que se toma de CopyTicks() este es el tiempo de intercambio, está claro que hay retrasos en la entrega

del paquete a mi ordenador, pero es bastante pequeño 4-6ms.

La hora exacta no dará nada, porque la hora de intercambio puede no coincidir con ella, y nosotros torramos exactamente a la hora de intercambio

y de MT5.

 
fxsaber:
A CopyTicks[0] agrega un ping.
Es insignificante (milisegundos) y flota, no creo que haga "tiempo".
Razón de la queja: