Синхронизация локального времени Windows с сервером МТ5

 

Добрый день!

Возможно ли из MQL5 подстраивать текущее локальное время компьютера

Будут ли работать функции GetLocalTime() и SetLocalTime()? 

 
prostotrader:

Добрый день!

Возможно ли из MQL5 подстраивать текущее локальное время компьютера? 

Будут ли работать функции GetLocalTime() и SetLocalTime()? 

Проверил, работает

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


 

 

Теперь осталось понять, как правильно синхронизировать локальное время

компьютера с временем сервера МТ5, учитывая, что время TimeCurrent() не обновлянтся в клиринги и в неторговое время (ФОРТС).

Есть идеи? 

 
prostotrader:

Теперь осталось понять, как правильно синхронизировать локальное время

компьютера с временем сервера МТ5, учитывая, что время TimeCurrent() не обновлянтся в клиринги и в неторговое время на ФОРТС.

Есть идеи? 

генерировать тики как в МТ4?
Файлы:
zSendTick.mq4  2 kb
 
prostotrader:

Теперь осталось понять, как правильно синхронизировать локальное время

компьютера с временем сервера МТ5, учитывая, что время TimeCurrent() не обновлянтся в клиринги и в неторговое время на ФОРТС.

Есть идеи? 

Так обновление нужно только тогда, когда тик приходит. Поэтому делать вызов только в OnTick. Перемудрили-с.
 
fxsaber:
Так обновление нужно только тогда, когда тик приходит. Поэтому делать вызов только в OnTick. Перемудрили-с.

Ничего не перемудрились...

Есть премаркет, в который в стакан приходят котировки, поэтому с 9-50 до 10-00 можно синхронизировать время с временем сервера

Добавлено

Если добавить станан какого-либо символа, то без фильтрации, туда будут попадать события от всех инструментов,

которые выбраны в Обзоре рынка. Далее взять CopyTicks() и посмотреть время для синхронизации....

Как-то так. 

Добавлено

Поправте, если что не додумал.

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

На всяуий случай проверка котировки на "свежесть"

              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:

Теперь осталось понять, как правильно синхронизировать локальное время

компьютера с временем сервера МТ5, учитывая, что время TimeCurrent() не обновлянтся в клиринги и в неторговое время (ФОРТС).

Есть идеи? 

Может быть, проще синхронизировать с первоисточником? Любое событие, происходящее на бирже, получает ее штамп времени. Само время на бирже синхронизируется с астрономическим с погрешностью в миллисекунды. Тогда как время прихода извещений в сервер MT5 (он стоит у брокера) уже другое, время отправки пакета в терминал третье, время прихода в терминал четвертое. Если на локальном компьютере сделать синхронизацию системного времени с астрономическим, то она будет работать всегда и локальное время будет совпадать с временем на биржах. Имеется несколько сот публичных (бесплатных) NTP серверов точного времени. Сейчас живы и работают, например, эти:

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

 
К CopyTicks[0] добавить пинг.
 
Vladimir:

Может быть, проще синхронизировать с первоисточником? Любое событие, происходящее на бирже, получает ее штамп времени. Само время на бирже синхронизируется с астрономическим с погрешностью в миллисекунды. Тогда как время прихода извещений в сервер MT5 (он стоит у брокера) уже другое, время отправки пакета в терминал третье, время прихода в терминал четвертое. Если на локальном компьютере сделать синхронизацию системного времени с астрономическим, то она будет работать всегда и локальное время будет совпадать с временем на биржах. Имеется несколько сот публичных (бесплатных) NTP серверов точного времени. Сейчас живы и работают, например, эти:

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

Время, которое берётся из CopyTicks() это и есть биржевое время, понятно, что существуют задерржки доставки

пакета к моему компу, но оно достаточно маленькое 4-6 мс.

Точное время ничего не даст, так как время Биржи может не сопадать с ним, а мы торнуем именно по Биржевому

времени и из МТ5

 
fxsaber:
К CopyTicks[0] добавить пинг.
Он незначительный (миллисекунды) и плавает, думаю, что он "погоды" не сделает.