Synchronisierung der Windows-Ortszeit mit dem MT5-Server

 

Guten Tag!

Ist es möglich, die aktuelle Ortszeit des Computers von MQL5 aus einzustellen?

Werden GetLocalTime() und SetLocalTime() funktionieren?

 
prostotrader:

Guten Tag!

Ist es möglich, die aktuelle Ortszeit des Computers von MQL5 aus einzustellen?

Werden GetLocalTime() und SetLocalTime() funktionieren?

Ich habe es überprüft, es funktioniert.

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

Jetzt müssen wir nur noch herausfinden, wie wir die Ortszeit korrekt synchronisieren können

Computer mit der MT5-Serverzeit, wobei zu berücksichtigen ist, dass TimeCurrent() nicht zu Clearing- und Nicht-Handelszeiten (FORTS) aktualisiert wird.

Irgendwelche Ideen?

 
prostotrader:

Jetzt müssen wir nur noch herausfinden, wie wir die Ortszeit korrekt synchronisieren können

Zeit des Computers mit der Zeit des MT5-Servers, wobei zu berücksichtigen ist, dass TimeCurrent() bei FORTS zu Clearing- und Nicht-Handelszeiten nicht aktualisiert wird.

Irgendwelche Ideen?

Ticks wie in MT4 generieren?
Dateien:
zSendTick.mq4  2 kb
 
prostotrader:

Jetzt müssen wir nur noch herausfinden, wie wir die Ortszeit korrekt synchronisieren können

Zeit des Computers mit der Zeit des MT5-Servers, wobei zu berücksichtigen ist, dass TimeCurrent() bei FORTS zu Clearing- und Nicht-Handelszeiten nicht aktualisiert wird.

Irgendwelche Ideen?

Die Aktualisierung ist also nur erforderlich, wenn die Zecke eintrifft. Daher sollte sie nur in OnTick aufgerufen werden. Sie haben sich zu viel Mühe gemacht.
 
fxsaber:
Die Aktualisierung ist also nur erforderlich, wenn die Zecke kommt. Daher erfolgt der Aufruf nur in OnTick. Sie sind zu kompliziert.

Nichts ist übertrieben...

Es gibt einen Vormarkt, bei dem die Kurse in den Stack einfließen, so dass Sie von 9:50 bis 10:00 Uhr die Zeit mit der Serverzeit synchronisieren können.

Hinzugefügt

Wenn Sie einen Stananan eines beliebigen Symbols hinzufügen, werden ohne Filterung Ereignisse von allen Instrumenten dorthin geleitet,

die in Market Watch ausgewählt sind. Dann nehmen Sie CopyTicks() und sehen die Zeit bis zur Synchronisierung....

Zum Beispiel so.

Hinzugefügt

Korrigieren Sie mich, wenn ich etwas übersehen habe.

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

Prüfen Sie vorsichtshalber das Zitat auf "Frische".

              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:

Jetzt müssen wir nur noch herausfinden, wie wir die Ortszeit korrekt synchronisieren können

Computer mit der MT5-Serverzeit, wobei zu berücksichtigen ist, dass TimeCurrent() nicht zu Clearing- und Nicht-Handelszeiten (FORTS) aktualisiert wird.

Irgendwelche Ideen?

Vielleicht ist es einfacher, mit der Quelle zu synchronisieren? Jedes Ereignis, das in der Börse eintritt, erhält einen Zeitstempel. Die Zeit an der Börse selbst wird mit einer Fehlermarge von Millisekunden mit der astronomischen Zeit synchronisiert. Während der Zeitpunkt des Eintreffens der Meldungen auf dem MT5-Server (der sich beim Broker befindet) bereits unterschiedlich ist, ist der Zeitpunkt des Versands eines Pakets an das Terminal der dritte, der Zeitpunkt des Eintreffens auf dem Terminal der vierte. Wenn Sie die Systemzeit mit der astronomischen Zeit auf dem lokalen Computer synchronisieren, wird dies immer funktionieren und die lokale Zeit wird mit der Zeit in den Börsen übereinstimmen. Es gibt mehrere hundert öffentliche (kostenlose) NTP-Server für die genaue Zeit. Diese leben und arbeiten jetzt zum Beispiel:

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

 
Zu CopyTicks[0] wird ein Ping hinzugefügt.
 
Vladimir:

Wäre es nicht einfacher, mit der Originalquelle zu synchronisieren? Jedes Ereignis, das an einer Börse eintritt, erhält einen Zeitstempel. Die Zeit an der Börse selbst wird mit einer Fehlermarge von Millisekunden mit der astronomischen Zeit synchronisiert. Während der Zeitpunkt des Eintreffens der Meldungen auf dem MT5-Server (der sich beim Broker befindet) bereits unterschiedlich ist, ist der Zeitpunkt des Versands eines Pakets an das Terminal der dritte, der Zeitpunkt des Eintreffens auf dem Terminal der vierte. Wenn Sie die Systemzeit mit der astronomischen Zeit auf dem lokalen Computer synchronisieren, wird dies immer funktionieren und die lokale Zeit wird mit der Zeit in den Börsen übereinstimmen. Es gibt mehrere hundert öffentliche (kostenlose) NTP-Server für die genaue Zeit. Diese leben und arbeiten jetzt zum Beispiel:

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

Die Zeit, die aus CopyTicks() entnommen wird, ist die Börsenzeit, es ist klar, dass es Verzögerungen bei der Lieferung gibt.

des Pakets zu meinem Computer, aber sie ist mit 4-6 ms recht gering.

Die genaue Zeit wird nichts geben, weil Exchange Zeit kann nicht mit ihm übereinstimmen, und wir torrent genau auf Exchange Zeit

und von MT5.

 
fxsaber:
Zu CopyTicks[0] wird ein Ping hinzugefügt.
Es ist unbedeutend (Millisekunden) und schwebt, ich glaube nicht, dass es "Wetter" machen wird.