Sincronizzare l'ora locale di Windows con il server MT5

 

Buon pomeriggio!

È possibile regolare l'ora locale corrente del computer da MQL5?

GetLocalTime() e SetLocalTime() funzioneranno?

 
prostotrader:

Buon pomeriggio!

È possibile regolare l'ora locale corrente del computer da MQL5?

GetLocalTime() e SetLocalTime() funzioneranno?

Controllato, funziona.

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

Ora dobbiamo solo capire come sincronizzare correttamente l'ora locale

computer con l'orario del server MT5, tenendo conto che TimeCurrent() non viene aggiornato al tempo di compensazione e non negoziazione (FORTS).

Qualche idea?

 
prostotrader:

Ora dobbiamo solo capire come sincronizzare correttamente l'ora locale

l'ora del computer con l'ora del server MT5, tenendo conto del fatto che TimeCurrent() non viene aggiornato al tempo di compensazione e non di negoziazione su FORTS.

Qualche idea?

Generare tick come in MT4?
File:
zSendTick.mq4  2 kb
 
prostotrader:

Ora dobbiamo solo capire come sincronizzare correttamente l'ora locale

l'ora del computer con l'ora del server MT5, tenendo conto del fatto che TimeCurrent() non viene aggiornato al tempo di compensazione e non di negoziazione su FORTS.

Qualche idea?

Quindi l'aggiornamento è necessario solo quando arriva la zecca. Pertanto, dovrebbe essere chiamato solo in OnTick. Hai creato troppi problemi.
 
fxsaber:
Quindi l'aggiornamento è necessario solo quando arriva la zecca. Pertanto, la chiamata solo in OnTick. Sono troppo complicati.

Niente è esagerato...

C'è un pre-mercato dove le quotazioni entrano nello stack, quindi dalle 9-50 alle 10-00 puoi sincronizzare l'ora con quella del server.

Aggiunto

Se si aggiunge uno stanan di qualsiasi simbolo, allora senza filtraggio, gli eventi di tutti gli strumenti andranno lì,

che sono selezionati in Market Watch. Poi prendere CopyTicks() e vedere il tempo di sincronizzazione....

Come questo.

Aggiunto

Correggetemi se mi sono perso qualcosa.

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

Per sicurezza, controlla la citazione per "freschezza"

              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:

Ora dobbiamo solo capire come sincronizzare correttamente l'ora locale

computer con l'orario del server MT5, tenendo conto che TimeCurrent() non viene aggiornato al tempo di compensazione e non negoziazione (FORTS).

Qualche idea?

Forse è più facile sincronizzarsi con la fonte? Qualsiasi evento che si verifica nello scambio ottiene la sua marca temporale. Il tempo della borsa stessa è sincronizzato con il tempo astronomico con un margine di errore di millisecondi. Mentre il tempo di arrivo delle notifiche al server MT5 (che è presso il broker) è già diverso, il tempo di invio di un pacchetto al terminale è terzo, il tempo di arrivo al terminale è quarto. Se sincronizzi l'ora del sistema con l'ora astronomica del computer locale, funzionerà sempre e l'ora locale coinciderà con quella degli scambi. Ci sono diverse centinaia di server NTP pubblici (gratuiti) per l'ora esatta. Questi sono vivi e funzionanti ora, per esempio:

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

Non sarebbe più facile sincronizzarsi con la fonte originale? Qualsiasi evento che si verifica in uno scambio ottiene la sua marca temporale. Il tempo della borsa stessa è sincronizzato con il tempo astronomico con un margine di errore di millisecondi. Mentre il tempo di arrivo delle notifiche al server MT5 (che è presso il broker) è già diverso, il tempo di invio di un pacchetto al terminale è terzo, il tempo di arrivo al terminale è quarto. Se sincronizzi l'ora del sistema con l'ora astronomica del computer locale, funzionerà sempre e l'ora locale coinciderà con quella degli scambi. Ci sono diverse centinaia di server NTP pubblici (gratuiti) per l'ora esatta. Questi sono vivi e funzionanti ora, per esempio:

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

Tempo, che è preso da CopyTicks() questo è il tempo di scambio, è chiaro che ci sono ritardi nella consegna

del pacchetto al mio computer, ma è abbastanza piccolo 4-6ms.

L'ora esatta non darà nulla, perché l'ora di Exchange può non coincidere con essa, e noi torrentiamo esattamente all'ora di Exchange

e da MT5.

 
fxsaber:
A CopyTicks[0] aggiungere un ping.
È insignificante (millisecondi) e galleggia, non credo che farà "tempo".
Motivazione: