Synchronisierung der Windows-Ortszeit mit dem MT5-Server - Seite 6

 
prostotrader:

Kann jemand erklären, warum dieser Code die Zeit nicht genau synchronisiert?

Schließlich erhält der vorbörsliche Markt eine "frische" Notierung mit der neuen Server-(Börsen-)Zeit.

Versuchen Sie, was ich habe:

//+------------------------------------------------------------------+
//|                                                    Sync_Time.mq5 |
//|                                         Copyright 2016, Serj_Che |
//|                           https://www.mql5.com/ru/users/serj_che |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Serj_Che"
#property link      "https://www.mql5.com/ru/users/serj_che"
#property version   "1.00"

input bool info=true;
input int precision = 50;
//+------------------------------------------------------------------+
struct _SYSTEMTIME
  {
   short             year;
   short             mon;
   short             day_of_week;
   short             day;
   short             hour;
   short             min;
   short             sec;
   short             msc;
  };

_SYSTEMTIME loc_time;

#import "kernel32.dll"
void GetLocalTime(_SYSTEMTIME &sys_time);
bool SetLocalTime(_SYSTEMTIME &sys_time);
#import
//---
MqlTick tick;
MqlDateTime sv_time;
int tick_msc,ping,time_server,time_local,delta=0,mdelta[20],n=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   Comment("");
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   loc_time.year=0;
   GetLocalTime(loc_time);
   if(loc_time.year>0)
     {
      if(!SymbolInfoTick(_Symbol,tick)) { Print("error SymbolInfoTick",GetLastError()); return; }
      ping=TerminalInfoInteger(TERMINAL_PING_LAST)/1000;
      tick_msc=int(tick.time_msc%1000);
      TimeToStruct(tick.time,sv_time);

      time_server=(sv_time.sec+sv_time.min*60)*1000+tick_msc;
      time_local=(loc_time.sec+loc_time.min*60)*1000+loc_time.msc;

      delta=AvgDelta(time_server-time_local);

      if(info) Comments();
      
      if(MathAbs(delta)>1000)
        {
         loc_time.sec=(short)sv_time.sec;
         loc_time.min=(short)sv_time.min;
         CorrectTime(loc_time);
         return;
        }
      if(delta>precision && loc_time.min<58)
        {
         loc_time.msc+=(short)delta;
         if(loc_time.msc>=1000) { loc_time.msc-=1000; loc_time.sec+=1; }
         if(loc_time.sec>=60) { loc_time.sec-=60; loc_time.min+=1; }
         CorrectTime(loc_time);
        }
      if(delta<-precision && loc_time.min>1)
        {
         loc_time.msc+=(short)delta;
         if(loc_time.msc<0) { loc_time.msc+=1000; loc_time.sec-=1; }
         if(loc_time.sec<0) { loc_time.sec+=60; loc_time.min-=1; }
         CorrectTime(loc_time);
        }
     }
   else
     {
      Print("error GetLocalTime");
     }
  }
//+------------------------------------------------------------------+
int AvgDelta(int d)
  {
   int avgd=0;
   mdelta[n]=d;
   n++; if(n>=20) n=0;
   for(int i=0;i<20;i++) avgd+=mdelta[i];
   return(avgd/20);
  }
//+------------------------------------------------------------------+
void CorrectTime(_SYSTEMTIME &ltime)
  {
   if(SetLocalTime(ltime))
     {
      ArrayInitialize(mdelta,0);
      Print("Local time sync -- is done, Sync min = ",ltime.min,
            " Sync sec = ",ltime.sec,"  delta ms = ",delta);
     }
   else Print("error SetLocalTime");
  }
//+------------------------------------------------------------------+
void Comments()
  {
   Comment(
           "\n time server: ",sv_time.hour,": ",sv_time.min,": ",sv_time.sec,": ",tick_msc,
           "\n time server: ",loc_time.hour,": ",loc_time.min,": ",loc_time.sec,": ",loc_time.msc,
           "\n ping : ",ping,
           "\n time_server : ",time_server,
           "\n time___local : ",time_local,
           "\n delta : ",delta,
           "\n min max delta: ",mdelta[ArrayMaximum(mdelta)]," : ",mdelta[ArrayMinimum(mdelta)],
           "");
  }
//+------------------------------------------------------------------+


Die Zeit schwankt aufgrund von Ping-, Server- und Terminalverzögerungen. Aber innerhalb von -10; +10; Millisekunden funktioniert es.

Im vorbörslichen Handel kommen auch Zecken.

 
Sergey Chalyshev:

Versuchen Sie, was ich habe:



Die Zeit schwankt aufgrund von Ping-, Server- und Terminalverzögerungen. Aber innerhalb von -10; +10; Millisekunden funktioniert es.

Im vorbörslichen Handel kommen auch die Zecken.

Danke, ich werde es ausprobieren.

Hinzugefügt

Sieht nicht schlecht aus, aber.

1. Wenn dieser Code in einen Trading Expert Advisor eingefügt wird, wie kann die Korrektur zwischen Expert Advisors synchronisiert werden, wenn

mein Expert Advisor für mehrere Futures funktioniert?

2. Wenn Sie Ihren Code in einen separaten EA einfügen, gibt es keine Garantie, dass der OnTick

in dieses Symbol im vorbörslichen Handel (es darf nicht kommen)?

3. Warum ist OnTick() besser als OnBookEvent() in der Vorbörse?

Wie ist es "korrekt"?

if(!SymbolInfoTick(_Symbol,tick)) { Print("error SymbolInfoTick",GetLastError()); return; }

als

if(CopyTicks(symbol,curr_tick,COPY_TICKS_INFO,0,1)==1)
 
prostotrader:

Danke, ich werde es ausprobieren.

Hinzugefügt

Es sieht nicht schlecht aus, aber

1. Wenn dieser Code in einen Trading Expert Advisor eingefügt wird, wie kann die Korrektur zwischen Expert Advisors synchronisiert werden, wenn

mein Expert Advisor für mehrere Futures funktioniert?

2. Wenn Sie Ihren Code in einen separaten EA einfügen, gibt es keine Garantie, dass der OnTick

in dieses Symbol im vorbörslichen Handel (darf nicht kommen)?

Der Expert Advisor sollte besser an einen separaten Chart angehängt werden, den liquidesten, da sich zwei Charts gegenseitig stören können.

Wenn die Synchronisierung besser zu entfernen ist, sollte eine einmalige tägliche Synchronisierung ausreichen. Die Uhr des Brokers, der Börse oder des Computers kann nicht so sehr nachlaufen oder sich verzögern.

Sie können den Expert Advisor dazu bringen, sich selbst zu löschen, wenn er synchronisiert wird.

 
Sergey Chalyshev:

Es ist besser, den Berater auf ein separates, möglichst liquides Diagramm zu setzen, da sich zwei Diagramme gegenseitig stören können.

Wenn sie synchronisiert sind, ist es besser, sie zu entfernen; eine einmalige tägliche Synchronisierung sollte ausreichen. Die Uhr des Brokers, der Börse oder des Computers kann nicht so sehr nachlaufen oder nachhinken.

Wir können den Expert Advisor dazu bringen, sich selbst zu löschen, wenn er synchronisiert wird.

Und die dritte Frage?
 

3. Почему OnTick() лучше, чем OnBookEvent() в премаркет? 

Die "korrektere"

if(!SymbolInfoTick(_Symbol,tick)) {Print("FehlerSymbolInfoTick",GetLastError());return; }

nicht

if(CopyTicks(symbol,curr_tick,COPY_TICKS_INFO,0,1)==1)

wie ich bereits erklärt habe, können wir den Zeitpunkt des Wechsels des Sticks nicht abfragen, eine solche Funktion gibt es im Terminal nicht. Die Änderung der Tasse erfolgt nicht nur, wenn Ask, Bid, Last geändert werden, bzw. der Zeitpunkt von OnBookEvent() unbekannt ist.

können Sie nur den Zeitpunkt der Zecke erfahren.

OnTick() ist nicht besser als OnBookEvent(), es funktioniert einfach nicht anders.


 

Aus einem benachbarten Thread:

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Sanktion: Tslab + Platz 2 gegen MT 5

Alexey Kozitsyn, 2017.01.17 12:02

Du verstehst es nicht. Ich bin mir der Zeckenstruktur bewusst, es gibt keine Beschwerden darüber. Die Beschwerde ist, dass im Falle des Abonnements von Update-Ereignissen, ist es unmöglich, die Ankunftszeit dieses Ereignisses zu erhalten, entsprechend, wenn ich Ticks erhalten und dann den Status der Tasse wissen wollen - ich kann dies nicht tun, da es keine Ankunftszeit der Tasse ist! Eine Synchronisierung ist unmöglich! Ähnlich verhält es sich mit anderen Aktienindikatoren, die ich im vorigen Beitrag zitiert habe.

Und meine Frage war, wann die Ankunftszeit der Tasse und andere Aktienindikatoren wie OI hinzugefügt werden.


 
Sergey Chalyshev:

Ich habe bereits erklärt, dass wir den Zeitpunkt des Tassenwechsels nicht abfragen können, da es keine solche Funktion im Terminal gibt. Der Wechsel der Tasse erfolgt nicht nur, wenn Ask, Bid, Last geändert werden, bzw. der Zeitpunkt von OnBookEvent() unbekannt ist.

können Sie nur den Zeitpunkt der Zecke erfahren.

OnTick() ist nicht besser als OnBookEvent(), man kann es nur nicht anders machen.


Sergej!

Sehen Sie. Eine neue Notierung ist eingetroffen und der Markt hat sich verändert, daher sollte das Ereignis OnBookEvent() empfangen werden,

die wir einfach als EVENT verwenden.

Dann macht es keinen Unterschied, wie Sie Informationen über den Tick durchif(!SymbolInfoTick(_Symbol,tick)) erhalten{Print("FehlerSymbolInfoTick",GetLastError());return; }

oderif(CopyTicks(symbol,curr_tick,COPY_TICKS_INFO,0,1)==1)

Aber es gibt einen großen Unterschied zwischen meinem und Ihrem Ansatz.

In meinem Fall, mit EA auf illiquide Instrument (zum Beispiel UUAH) können Sie Stapel von ALL Futures und hinzufügen

ist es GARANTIERT, einen Tick im Vormarkt zu erhalten, ohne sich um die Arbeit der anderen Expert Advisors im Terminal zu kümmern.

D.h. alle neuen Zitate werden in einen separaten EA "gehen".

Hinzugefügt von

Der Hauptzweck dieses EA besteht darin, sich nur mit der Synchronisierung zu befassen und die Arbeit anderer nicht zu stören.

 
//+------------------------------------------------------------------+
//|                                              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.01"
//---
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;
string   symb_rts;
string   symb_si;
string   symb_gold;
string   symb_br;
string   symb_gazr;
string   symb_sbrf;
datetime last_time;
//
input string BrInstr="BR-2.17"; //Brent
//+------------------------------------------------------------------+
//| Expert set second symbol function                                |
//+------------------------------------------------------------------+
string SetSecSymbol(const string a_symbol,const string prefix)
  {
   int str_tire=0;
   ushort let_symbol;
   int str_size=StringLen(a_symbol);

   for(int i=0; i<str_size; i++)
     {
      let_symbol=StringGetCharacter(a_symbol,i);

      if(let_symbol=='-')
        {
         str_tire=i;
         break;
        }
     }
   if(str_tire>0)
     {
      return(prefix + StringSubstr(a_symbol, str_tire, str_size - str_tire));
     }
   return("");
  }
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   last_time=TimeCurrent();
   is_sync=false;
   MarketBookAdd(Symbol());
//---  
   symb_rts=SetSecSymbol(Symbol(),"RTS");
   if(!SymbolSelect(symb_rts,true))
     {
      MessageBox(symb_rts+" not found in the Market watch!","Error",MB_OK|MB_ICONERROR);
      return(INIT_FAILED);
     }
   else MarketBookAdd(symb_rts);
//---  
   symb_si=SetSecSymbol(Symbol(),"Si");
   if(!SymbolSelect(symb_si,true))
     {
      MessageBox(symb_si+" not found in the Market watch!","Error",MB_OK|MB_ICONERROR);
      return(INIT_FAILED);
     }
   else MarketBookAdd(symb_si);
//---
   symb_gold=SetSecSymbol(Symbol(),"GOLD");
   if(!SymbolSelect(symb_gold,true))
     {
      MessageBox(symb_gold+" not found in the Market watch!","Error",MB_OK|MB_ICONERROR);
      return(INIT_FAILED);
     }
   else MarketBookAdd(symb_gold);
//---
   symb_gazr=SetSecSymbol(Symbol(),"GAZR");
   if(!SymbolSelect(symb_gazr,true))
     {
      MessageBox(symb_gazr+" not found in the Market watch!","Error",MB_OK|MB_ICONERROR);
      return(INIT_FAILED);
     }
   else MarketBookAdd(symb_gazr);
//---
   symb_sbrf=SetSecSymbol(Symbol(),"SBRF");
   if(!SymbolSelect(symb_sbrf,true))
     {
      MessageBox(symb_sbrf+" not found in the Market watch!","Error",MB_OK|MB_ICONERROR);
      return(INIT_FAILED);
     }
   else MarketBookAdd(symb_sbrf);
//---
   symb_br=BrInstr;
   if(!SymbolSelect(symb_br,true))
     {
      MessageBox(symb_br+" not found in the Market watch!","Error",MB_OK|MB_ICONERROR);
      return(INIT_FAILED);
     }
   else MarketBookAdd(symb_br);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   MarketBookRelease(Symbol());
   MarketBookRelease(symb_rts);
   MarketBookRelease(symb_br);
   MarketBookRelease(symb_si);
   MarketBookRelease(symb_gold);
   MarketBookRelease(symb_gazr);
   MarketBookRelease(symb_sbrf);
  }
//+------------------------------------------------------------------+
//| Expert Convert To Time function                                  |
//+------------------------------------------------------------------+
bool ConvertToTime(const long n_value,_SYSTEMTIME  &a_time)
  {
   a_time.wMilliseconds=ushort(n_value%1000);
   ulong new_time=ulong(double(n_value)/1000);
   MqlDateTime cur_time = {0};
   TimeToStruct(datetime(new_time),cur_time);
   if(cur_time.year>0)
     {
      a_time.wDay=ushort(cur_time.day);
      a_time.wDayOfWeek=ushort(cur_time.day_of_week);
      a_time.wHour=ushort(cur_time.hour);
      a_time.wMinute= ushort(cur_time.min);
      a_time.wMonth = ushort(cur_time.mon);
      a_time.wSecond= ushort(cur_time.sec);
      a_time.wYear=ushort(cur_time.year);
      return(true);
     }
   return(false);
  }  
//+------------------------------------------------------------------+
//| Expert On book event 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_INFO,0,1)==1)
           {
            MqlDateTime sv_time;
            TimeToStruct(curr_tick[0].time,sv_time);
            if(!is_sync)
              {
               if((loc_time.wDayOfWeek==ushort(sv_time.day_of_week)) &&
                  (loc_time.wHour==ushort(sv_time.hour)))
                 {
                  long last_ping=long(NormalizeDouble((double(TerminalInfoInteger(TERMINAL_PING_LAST))/1000)/2,0));
                  long mls_time=long(curr_tick[0].time_msc%1000);
                  if((mls_time+last_ping)>999)
                    {
                     mls_time=long(curr_tick[0].time_msc)+last_ping;
                     if(!ConvertToTime(mls_time, loc_time)) return;
                    }
                  else
                    {
                     loc_time.wMinute = ushort(sv_time.min);
                     loc_time.wSecond = ushort(sv_time.sec);
                     loc_time.wMilliseconds=ushort(mls_time);
                    }
                  if(SetLocalTime(loc_time))
                    {
                     is_sync=true;
                     Print("Local time sync is done. Symbol = ", symbol, " Sync min = ", loc_time.wMinute,
                           " Sync sec = ", loc_time.wSecond, " Sync ms = ", loc_time.wMilliseconds);
                    }
                 }
              }
           }
        }
      else is_sync=false;
     }
  }
//+------------------------------------------------------------------+
 

Nur heute, nach 10:00 Uhr (die Synchronisierung erfolgte vorbörslich)

DieOrtszeit weicht um 7 Sekunden von der Zeit in der Market Watch ab. :(

 
prostotrader:

Sergej!

Sehen Sie. Ein neuer Kurs ist eingetroffen, der Markt hat sich verändert, daher muss das Ereignis OnBookEvent() empfangen werden,

die wir einfach als EVENT verwenden.

Dann macht es keinen Unterschied, wie Sie Informationen über den Tick durchif(!SymbolInfoTick(_Symbol,tick)) erhalten{Print("FehlerSymbolInfoTick",GetLastError());return; }

oderif(CopyTicks(symbol,current_tick,COPY_TICKS_INFO,0,1)==1)

Aber es gibt einen großen Unterschied zwischen meinem und Ihrem Ansatz.

In meinem Fall, mit EA auf illiquide Instrument (zum Beispiel UUAH) können Sie Stapel von ALL Futures und hinzufügen

ist es GARANTIERT, einen Tick im Vormarkt zu erhalten, ohne sich um die Arbeit anderer Expert Advisors im Terminal zu kümmern.

D.h. alle neuen Zitate werden in einen separaten EA "gehen".

Hinzugefügt von

Es wird sich nur mit der Synchronisierung befassen und die Arbeit der anderen nicht beeinträchtigen.

Ein neues Angebot ist gekommen und die Markttiefe hat sich verändert - das sind unterschiedliche Ereignisse. Wenn ein Gebot oder Angebot, das höher oder niedriger als die Nachfrage ist, hinzugefügt (entfernt) wird, tritt das OnBookEvent()-Ereignis ein, aber es handelt sich nicht um ein neues Angebot und es wird nicht in die Tick-Historie aufgenommen, weshalb sich die letzte bekannte Serverzeit nicht ändert.

Ich weiß nicht, wie ich es sonst erklären soll, machen Sie Witze? ))

Grund der Beschwerde: