Windows yerel saatinin MT5 sunucusuyla senkronizasyonu - sayfa 6

 
prostotrader :

Bu kodun neden zamanı doğru bir şekilde senkronize etmediğini biri açıklayabilir mi?

Ne de olsa, yeni bir sunucu (değişim) zamanı ile birlikte "taze" bir fiyat ön pazara gelir.

Aldığımı dene:

//+------------------------------------------------------------------+
//|                                                    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)],
           "" );
  }
//+------------------------------------------------------------------+


Ping, sunucu ve terminal gecikmeleri nedeniyle zaman dalgalanıyor. Ancak -10 içinde; +10; milisaniye senkronize olduğu ortaya çıkıyor.

Tiki de premarkete gelir.

 
Sergey Chalyshev :

Aldığımı dene:



Ping, sunucu ve terminal gecikmeleri nedeniyle zaman dalgalanıyor. Ancak -10 içinde; +10; milisaniye senkronize olduğu ortaya çıkıyor.

Tiki de premarkete gelir.

Teşekkürler, deneyeceğim.

Katma

Fena görünmüyor ama

1. Bu kod bir Uzman Danışmana eklenirse, aşağıdaki durumlarda Düzeltme Uzman Danışmanlar arasında nasıl senkronize edilir?

Bu EA birkaç gelecek üzerinde çalışıyor mu?

2. Kodunuzu ayrı bir uzmana yerleştirirseniz, OnTick'in geleceğinin garantisi nerede?

premarkette bu sembolde (gelmeyebilir)?

3. Premarkette OnTick() neden OnBookEvent()'ten daha iyi?

Ne doğru"

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

hariç

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

Teşekkürler, deneyeceğim.

Katma

Fena görünmüyor ama

1. Bu kod bir Uzman Danışmana eklenirse, aşağıdaki durumlarda Düzeltme Uzman Danışmanlar arasında nasıl senkronize edilir?

Bu EA birkaç gelecek üzerinde çalışıyor mu?

2. Kodunuzu ayrı bir uzmana yerleştirirseniz, OnTick'in geleceğinin garantisi nerede?

premarkette bu sembolde (gelmeyebilir)?

Expert Advisor'ı ayrı bir çizelgeye, en likit olanına, birbirine karışabilecekleri iki çizelgeye asmak daha iyidir.

Senkronize edildiğinde silmek daha iyidir, günde bir kez senkronize etmeniz yeterli olacaktır. Bir komisyoncunun, borsanın veya bilgisayarın saati çok fazla çalışamaz veya gecikmez.

Senkronize edildiğinde danışmanın kendisinin silinmesini sağlayabilirsiniz.

 
Sergey Chalyshev :

Expert Advisor'ı ayrı bir çizelgeye, en likit olanına, birbirine karışabilecekleri iki çizelgeye asmak daha iyidir.

Senkronize edildiğinde silmek daha iyidir, günde bir kez senkronize etmeniz yeterli olacaktır. Bir komisyoncunun, borsanın veya bilgisayarın saati çok fazla çalışamaz veya gecikemez.

Senkronize edildiğinde danışmanın kendisinin silinmesini sağlayabilirsiniz.

Ve üçüncü soru?
 

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

Ne doğru"

if (! SymbolInfoTick ( _Symbol ,tick)) { Yazdır (" SimgeInfoTick hatası ", GetLastError ()); dönüş ; }

hariç

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

Daha önce açıklamıştım, sipariş defteri değişim saatini alamıyoruz , terminalde böyle bir fonksiyon yok. Pazar Derinliği sadece sırasıyla Sor, Bid, Last değişiklikleri ve OnBookEvent() zamanı bilinmediğinde değişmez.

sadece kene zamanını alabilirsiniz.

OnTick(), OnBookEvent()'ten daha iyi değildir, tam tersi şekilde çalışmaz.


 

başka bir iş parçacığından:

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Duygu: Tslab + plaza 2 vs MT 5

Alexey Kozitsyn , 2017.01.17 12:02

Anlamadın. Kene yapısının farkındayım, bununla ilgili herhangi bir şikayet yok. DOM güncelleme olaylarına abone olunması durumunda bu olayın varış saatini almanın imkansız olduğu iddiaları var. cam varış zamanı yok! Senkronizasyon mümkün değil! Benzer şekilde, önceki gönderide verilen diğer döviz göstergeleri.

Ve benim sorum, DOM + OI gibi diğer hisse senedi göstergelerinin ne zaman ekleneceğiydi.


 
Sergey Chalyshev :

Daha önce açıklamıştım, sipariş defteri değişim saatini alamıyoruz, terminalde böyle bir fonksiyon yok. Pazar Derinliği sadece sırasıyla Sor, Bid, Last değişiklikleri ve OnBookEvent() zamanı bilinmediğinde değişmez.

sadece kene zamanını alabilirsiniz.

OnTick(), OnBookEvent()'ten daha iyi değildir, tam tersi şekilde çalışmaz.


Serezha!

Bak. Yeni bir teklif geldi, sipariş defteri değişti, bu yüzden OnBookEvent() olayı gelmeli,

bunu sadece bir OLAY olarak kullanıyoruz.

Ardından, kene bilgisini if (! SymbolInfoTick ( _Symbol ,tick)) { Print ("error SymbolInfoTick ", GetLastError ()); dönüş ; }

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

Ama benim yaklaşımımla sizinki arasındaki fark çok büyük.

Benim durumumda, düşük sıvılı bir enstrümanda (örneğin, UUAH) bir Uzman Danışman kullanarak TÜM vadeli işlemlerin sipariş defterlerini ekleyebilir ve

Terminaldeki diğer uzmanların çalışmalarını düşünmeden ön pazarda bir onay işareti almak GARANTİLİDİR.

Yani, tüm yeni teklifler ayrı bir Uzman Danışmana "gidecektir".

Katma

bu, kimseye müdahale etmeden yalnızca senkronizasyonla "ilgilenir".

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

Bu sadece bugün, saat 10:00'dan sonra (senkronizasyon ön pazardaydı)

yerel saat , Piyasa İzleme'deki saatten 7 saniye farklıydı. :(

 
prostotrader :

Serezha!

Bak. Yeni bir teklif geldi, sipariş defteri değişti , bu yüzden OnBookEvent() olayı gelmeli,

bunu sadece bir OLAY olarak kullanıyoruz.

Ardından, kene bilgisini if (! SymbolInfoTick ( _Symbol ,tick)) { Print ("error SymbolInfoTick ", GetLastError ()); dönüş ; }

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

Ama benim yaklaşımımla sizinki arasındaki fark çok büyük.

Benim durumumda, düşük sıvılı bir enstrümanda (örneğin, UUAH) bir Uzman Danışman kullanarak TÜM vadeli işlemlerin sipariş defterlerini ekleyebilir ve

Terminaldeki diğer uzmanların çalışmalarını düşünmeden ön pazarda bir onay işareti almak GARANTİLİDİR.

Yani, tüm yeni teklifler ayrı bir Uzman Danışmana "gidecektir".

Katma

bu, kimseye müdahale etmeden yalnızca senkronizasyonla "ilgilenir".

Yeni bir teklif geldi ve sipariş defteri değişti, bunlar farklı olaylar. Emir defterini değiştirirken, askın üstüne veya teklifin altına bir emir eklenirse (çıkarılırsa), OnBookEvent() olayı gelir, ancak bu yeni bir alıntı değildir ve tick geçmişine girmez, dolayısıyla bilinen son sunucu zamanı değişmez.

Başka nasıl açıklayacağımı bilmiyorum, dalga mı geçiyorsun? ))