Sincronizar a hora local do Windows com o servidor MT5

 

Boa tarde!

É possível ajustar a hora local atual do computador da MQL5?

Será que GetLocalTime() e SetLocalTime() funcionarão?

 
prostotrader:

Boa tarde!

É possível ajustar a hora local atual do computador da MQL5?

Será que GetLocalTime() e SetLocalTime() funcionarão?

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

Agora só precisamos descobrir como sincronizar corretamente a hora local

computador com tempo de servidor MT5, levando em conta que o TimeCurrent() não é atualizado no tempo de compensação e não-comercialização (FORTS).

Alguma idéia?

 
prostotrader:

Agora só precisamos descobrir como sincronizar corretamente a hora local

tempo do computador com o tempo do servidor MT5, levando em conta que o TimeCurrent() não é atualizado no tempo de compensação e não-comercialização no FORTS.

Alguma idéia?

Gerar carrapatos como no MT4?
Arquivos anexados:
zSendTick.mq4  2 kb
 
prostotrader:

Agora só precisamos descobrir como sincronizar corretamente a hora local

tempo do computador com o tempo do servidor MT5, levando em conta que o TimeCurrent() não é atualizado no tempo de compensação e não-comercialização no FORTS.

Alguma idéia?

Portanto, a atualização só é necessária quando o carrapato chega. Portanto, deve ser chamado apenas no OnTick. Você criou demasiados problemas.
 
fxsaber:
Portanto, a atualização é necessária apenas quando o tique chega. Portanto, a chamada somente no OnTick. Eles são muito complicados.

Nada é exagerado...

Há um pré-mercado onde as cotações entram na pilha, assim de 9-50 a 10-00 você pode sincronizar o tempo com o tempo do servidor.

Adicionado

Se você acrescentar um stanan de qualquer símbolo, então sem filtrar, os eventos de todos os instrumentos irão para lá,

que são selecionados na Market Watch. Depois pegue CopyTicks() e veja o tempo para sincronizar....

Assim.

Adicionado

Corrija-me se eu perdi alguma coisa.

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

Só por precaução, verifique a citação para "frescor".

              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:

Agora só precisamos descobrir como sincronizar corretamente a hora local

computador com tempo de servidor MT5, levando em conta que o TimeCurrent() não é atualizado no tempo de compensação e não-comercialização (FORTS).

Alguma idéia?

Talvez seja mais fácil de sincronizar com a fonte? Qualquer evento que ocorra no intercâmbio recebe seu carimbo de tempo. O tempo na própria troca é sincronizado com o tempo astronômico com uma margem de erro de milissegundos. Enquanto a hora de chegada das notificações ao servidor MT5 (que está na corretora) já é diferente, a hora de envio de um pacote ao terminal é a terceira, a hora de chegada ao terminal é a quarta. Se você sincronizar a hora do sistema com a hora astronômica no computador local, ele sempre funcionará e a hora local coincidirá com a hora das trocas. Existem várias centenas de servidores públicos (gratuitos) NTP para o tempo exato. Estes estão vivos e funcionando agora, por exemplo:

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

 
Para CopyTicks[0] adicionar um ping.
 
Vladimir:

Não seria mais fácil sincronizar com a fonte original? Qualquer evento que ocorra em uma troca recebe seu carimbo de tempo. O tempo na própria troca é sincronizado com o tempo astronômico com uma margem de erro de milissegundos. Enquanto a hora de chegada das notificações ao servidor MT5 (que está na corretora) já é diferente, a hora de envio de um pacote ao terminal é a terceira, a hora de chegada ao terminal é a quarta. Se você sincronizar a hora do sistema com a hora astronômica no computador local, ele sempre funcionará e a hora local coincidirá com a hora das trocas. Existem várias centenas de servidores públicos (gratuitos) NTP para o tempo exato. Estes estão vivos e funcionando agora, por exemplo:

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, que é retirado de CopyTicks() isto é tempo de troca, é claro que há atrasos na entrega

do pacote para o meu computador, mas é bastante pequeno 4-6ms.

A hora exata não dará nada, porque o tempo de troca pode não coincidir com ele, e nós torramos exatamente no tempo de troca

e da MT5.

 
fxsaber:
Para CopyTicks[0] adicionar um ping.
É insignificante (milissegundos) e flutua, eu não acho que fará "tempo".