Synchroniser l'heure locale de Windows avec le serveur MT5

 

Bonjour !

Est-il possible de régler l'heure locale actuelle de l'ordinateur à partir de MQL5 ?

Est-ce que GetLocalTime() et SetLocalTime() fonctionneront ?

 
prostotrader:

Bonjour !

Est-il possible de régler l'heure locale actuelle de l'ordinateur à partir de MQL5 ?

Est-ce que GetLocalTime() et SetLocalTime() fonctionneront ?

Je l'ai vérifié, ça marche.

//+------------------------------------------------------------------+
//|                                                     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()
  {
//---
  
  }
//+------------------------------------------------------------------+
 

Maintenant, nous devons juste trouver comment synchroniser correctement l'heure locale.

ordinateur avec l'heure du serveur MT5, en tenant compte du fait que TimeCurrent() n'est pas mis à jour à l'heure de compensation et de non-négociation (FORTS).

Des idées ?

 
prostotrader:

Maintenant, nous devons juste trouver comment synchroniser correctement l'heure locale.

l'heure de l'ordinateur avec l'heure du serveur MT5, en tenant compte du fait que TimeCurrent() n'est pas mis à jour au moment de la compensation et en dehors des heures de négociation sur FORTS.

Des idées ?

Générer des ticks comme dans MT4 ?
Dossiers :
zSendTick.mq4  2 kb
 
prostotrader:

Maintenant, nous devons juste trouver comment synchroniser correctement l'heure locale.

l'heure de l'ordinateur avec l'heure du serveur MT5, en tenant compte du fait que TimeCurrent() n'est pas mis à jour au moment de la compensation et en dehors des heures de négociation sur FORTS.

Des idées ?

La mise à jour n'est donc nécessaire que lorsque la tique arrive. Par conséquent, il ne doit être appelé que dans OnTick. Vous avez fait trop d'efforts.
 
fxsaber:
La mise à jour n'est donc nécessaire que lorsque la tique arrive. Par conséquent, l'appel ne se fait que dans OnTick. Ils sont trop compliqués.

Rien n'est exagéré...

Il y a un pré-marché où les cotations arrivent dans la pile, donc de 9-50 à 10-00 vous pouvez synchroniser l'heure avec l'heure du serveur.

Ajouté

Si vous ajoutez un stanan de n'importe quel symbole, alors sans filtrage, les événements de tous les instruments iront là,

qui sont sélectionnés dans Market Watch. Ensuite, prenez CopyTicks() et voyez le temps pour synchroniser....

Comme ça.

Ajouté

Corrigez-moi si j'ai raté quelque chose.

//+------------------------------------------------------------------+
//|                                              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;
     }
  }
//+------------------------------------------------------------------+
 

Juste au cas où, vérifiez la citation pour la "fraîcheur".

              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:

Maintenant, nous devons juste trouver comment synchroniser correctement l'heure locale.

ordinateur avec l'heure du serveur MT5, en tenant compte du fait que TimeCurrent() n'est pas mis à jour à l'heure de compensation et de non-négociation (FORTS).

Des idées ?

Peut-être est-il plus facile de se synchroniser avec la source ? Tout événement se produisant sur la bourse obtient son horodatage. L'heure de la bourse elle-même est synchronisée avec l'heure astronomique avec une marge d'erreur de quelques millisecondes. Alors que le temps d'arrivée des notifications au serveur MT5 (qui se trouve chez le courtier) est déjà différent, le temps d'envoi d'un paquet au terminal est le troisième, le temps d'arrivée au terminal est le quatrième. Si vous synchronisez l'heure du système avec l'heure astronomique de l'ordinateur local, cela fonctionnera toujours et l'heure locale coïncidera avec l'heure des échanges. Il existe plusieurs centaines de serveurs NTP publics (gratuits) pour l'heure exacte. Ceux-ci sont vivants et fonctionnent aujourd'hui, par exemple :

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] ajouter un ping.
 
Vladimir:

Ne serait-il pas plus simple de se synchroniser avec la source originale ? Tout événement survenant sur un échange est horodaté. L'heure de la bourse elle-même est synchronisée avec l'heure astronomique avec une marge d'erreur de quelques millisecondes. Alors que le temps d'arrivée des notifications au serveur MT5 (qui se trouve chez le courtier) est déjà différent, le temps d'envoi d'un paquet au terminal est le troisième, le temps d'arrivée au terminal est le quatrième. Si vous synchronisez l'heure du système avec l'heure astronomique de l'ordinateur local, cela fonctionnera toujours et l'heure locale coïncidera avec l'heure des échanges. Il existe plusieurs centaines de serveurs NTP publics (gratuits) pour l'heure exacte. Ceux-ci sont vivants et fonctionnent aujourd'hui, par exemple :

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

Temps, qui est pris de CopyTicks() c'est le temps d'échange, il est clair qu'il y a des retards dans la livraison.

du paquet à mon ordinateur, mais elle est assez faible : 4-6ms.

L'heure exacte ne donnera rien, car l'heure de l'échange peut ne pas coïncider avec elle, et nous torrent exactement à l'heure de l'échange.

et de MT5.

 
fxsaber:
A CopyTicks[0] ajouter un ping.
C'est insignifiant (millisecondes) et flottant, je ne pense pas que cela fera "météo".