将Windows本地时间与MT5服务器同步

 

下午好!

是否可以从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()
  {
//---
  
  }
//+------------------------------------------------------------------+
 

现在我们只需要弄清楚如何正确地同步本地时间

计算机与MT5服务器时间,考虑到TimeCurrent()在清算和非交易时间(FORTS)不更新。

有什么想法吗?

 
prostotrader:

现在我们只需要弄清楚如何正确地同步本地时间

考虑到FORTS的TimeCurrent()在清算和非交易时间不更新,将计算机的时间与MT5服务器的时间相比较。

有什么想法吗?

像在MT4中一样生成ticks?
附加的文件:
zSendTick.mq4  2 kb
 
prostotrader:

现在我们只需要弄清楚如何正确地同步本地时间

考虑到FORTS的TimeCurrent()在清算和非交易时间不更新,将计算机的时间与MT5服务器的时间相比较。

有什么想法吗?

因此,只有在打勾的时候才需要更新。因此,它应该只在OnTick中被调用。你已经制造了太多的麻烦。
 
fxsaber:
因此,只有在蜱虫来临时才需要更新。因此,只在OnTick中调用。它们太复杂了。

没有什么是过度的...

有一个前市场,报价进入堆栈,所以从9-50到10-00你可以将时间与服务器时间 同步。

添加

如果你添加了一个任何符号的stanan,那么在没有过滤的情况下,所有乐器的事件都会进入那里。

在市场观察中选择的。然后采取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:

现在我们只需要弄清楚如何正确地同步本地时间

计算机与MT5服务器时间,考虑到TimeCurrent()在清算和非交易时间(FORTS)不更新。

有什么想法吗?

也许与源头同步比较容易?在交易所发生的任何事件都会得到其时间戳。交易所本身的时间是与天文时间同步的,误差为几毫秒。而通知到达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-6ms。

准确的时间不会提供任何东西,因为交换时间可能与之不一致,而我们正是在交换时间激流。

并从MT5。

 
fxsaber:
对CopyTicks[0]添加一个平移。
它是微不足道的(几毫秒),而且是浮动的,我不认为它会产生 "天气"。