MT5 서버와 Windows 현지 시간 동기화 - 페이지 6

 
prostotrader :

이 코드가 시간을 정확하게 동기화하지 않는 이유를 설명할 수 있는 사람이 있습니까?

결국 새로운 서버(교환) 시간과 함께 "신선한" 견적이 사전 출시됩니다.

내가 얻은 것을 시도하십시오 :

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


핑, 서버 및 터미널 지연으로 인해 시간이 유동적입니다. 그러나 -10 이내; +10; 밀리초는 동기화하는 것으로 나타났습니다.

티키도 프리마켓에 옵니다.

 
Sergey Chalyshev :

내가 얻은 것을 시도하십시오 :



핑, 서버 및 터미널 지연으로 인해 시간이 유동적입니다. 그러나 -10 이내; +10; 밀리초는 동기화하는 것으로 나타났습니다.

티키도 프리마켓에 옵니다.

감사합니다.

추가됨

나쁘지 않아 보이지만

1. 이 코드가 Expert Advisor에 삽입된 경우 Expert Advisors 간에 수정 사항을 동기화하는 방법은 다음과 같습니다.

이 EA는 여러 미래에 작동합니까?

2. 별도의 전문가에게 코드를 배치하면 OnTick이 올 것이라는 보장은 어디에 있습니까?

시판 전의 이 기호(오지 않을 수도 있음)?

3. 시판 전 OnTick()이 OnBookEvent()보다 나은 이유는 무엇입니까?

"올바른"이란 무엇입니까?

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

~보다

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

감사합니다.

추가됨

나쁘지 않아 보이지만

1. 이 코드가 Expert Advisor에 삽입된 경우 Expert Advisors 간에 수정 사항을 동기화하는 방법은 다음과 같습니다.

이 EA는 여러 미래에 작동합니까?

2. 별도의 전문가에게 코드를 배치하면 OnTick이 올 것이라는 보장은 어디에 있습니까?

시판 전의 이 기호(오지 않을 수도 있음)?

Expert Advisor를 서로 간섭할 수 있는 두 개의 차트에 가장 유동적인 차트인 별도의 차트에 걸어두는 것이 좋습니다.

동기화되면 삭제하는 것이 좋으며 하루에 한 번이면 동기화하기에 충분합니다. 브로커, 거래소 또는 컴퓨터의 시계는 그렇게 많이 실행되거나 지연될 수 없습니다.

어드바이저가 동기화되면 어드바이저 자체를 삭제하도록 할 수 있습니다.

 
Sergey Chalyshev :

Expert Advisor를 서로 간섭할 수 있는 두 개의 차트에 가장 유동적인 차트인 별도의 차트에 걸어두는 것이 좋습니다.

동기화되면 삭제하는 것이 좋으며 하루에 한 번이면 동기화하기에 충분합니다. 브로커, 거래소 또는 컴퓨터의 시계는 그렇게 많이 실행되거나 지연될 수 없습니다.

어드바이저가 동기화되면 어드바이저 자체를 삭제하도록 할 수 있습니다.

그리고 세 번째 질문은?
 

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

"올바른"이란 무엇입니까?

if (! SymbolInfoTick ( _Symbol ,tick)) { Print ("오류 SymbolInfoTick ", GetLastError ()); 반환 ; }

~보다

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

이미 설명했지만 주문서 변경 시간 을 알 수 없으며 터미널에는 그러한 기능이 없습니다. 시장의 깊이는 Ask, Bid, Last가 각각 변하고 OnBookEvent()의 시간을 알 수 없을 때만 변하는 것이 아닙니다.

틱 시간 만 얻을 수 있습니다.

OnTick()은 OnBookEvent()보다 좋지 않으며, 다른 방식으로 작동하지 않습니다.


 

다른 스레드에서:

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

감성: Tslab + plaza 2 vs MT 5

알렉세이 코지친 , 2017.01.17 12:02

당신은 이해하지 못했습니다. 나는 진드기 구조를 알고 있으며 그것에 대한 불만은 없습니다. DOM 업데이트 이벤트를 구독하는 경우 이 이벤트의 도착 시간을 얻을 수 없다는 주장이 있습니다. 유리 도착 시간이 없습니다! 동기화가 불가능합니다! 이전 게시물에서 제공된 다른 교환 지표와 유사합니다.

그리고 내 질문은 DOM + OI와 같은 기타 주식 지표가 언제 추가되는지였습니다.


 
Sergey Chalyshev :

이미 설명했지만 주문서 변경 시간을 알 수 없으며 터미널에는 그러한 기능이 없습니다. 시장의 깊이는 Ask, Bid, Last가 각각 변하고 OnBookEvent()의 시간을 알 수 없을 때만 변하는 것이 아닙니다.

틱 시간 만 얻을 수 있습니다.

OnTick()은 OnBookEvent()보다 좋지 않으며, 다른 방식으로 작동하지 않습니다.


세레자!

바라보다. 새 견적이 도착했고 주문서가 변경되었으므로 OnBookEvent() 이벤트가 발생해야 합니다.

우리는 단지 EVENT로 사용합니다.

그런 다음 if (! SymbolInfoTick ( _Symbol ,tick)) { Print ("error SymbolInfoTick ", GetLastError ()); 반환 ; }

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

그러나 나와 당신의 접근 방식의 차이는 큽니다.

제 경우에는 저유동성 상품(예: UUAH)에 대한 Expert Advisor를 사용하여 모든 선물의 주문서를 추가할 수 있습니다.

터미널에서 다른 전문가의 작업에 대해 생각하지 않고 사전 시장에서 틱을 얻을 보장.

즉, 모든 새 견적은 별도의 전문가 고문에게 "이동"됩니다.

추가됨

누구와도 간섭하지 않고 동기화만 "처리"합니다.

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

바로, 오늘 10시 이후 (동기화는 사전 판매 중이었습니다)

현지 시간 은 Market Watch의 시간과 7초 차이가 났습니다. :(

 
prostotrader :

세레자!

바라보다. 새 견적이 도착했고 주문서가 변경 되었으므로 OnBookEvent() 이벤트가 발생해야 합니다.

우리는 단지 EVENT로 사용합니다.

그런 다음 if (! SymbolInfoTick ( _Symbol ,tick)) { Print ("error SymbolInfoTick ", GetLastError ()); 반환 ; }

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

그러나 나와 당신의 접근 방식의 차이는 큽니다.

제 경우에는 저유동성 상품(예: UUAH)에 대한 Expert Advisor를 사용하여 모든 선물의 주문서를 추가할 수 있습니다.

터미널에서 다른 전문가의 작업에 대해 생각하지 않고 사전 시장에서 틱을 얻을 보장.

즉, 모든 새 견적은 별도의 전문가 고문에게 "이동"됩니다.

추가됨

누구와도 간섭하지 않고 동기화만 "처리"합니다.

새로운 견적이 나왔고 주문서가 변경되었습니다. 이것은 다른 이벤트입니다. 오더북 변경 시 매도 위 또는 매도 아래에 주문이 추가(제거)되면 OnBookEvent() 이벤트가 발생하지만 이것은 새로운 견적이 아니며 틱 히스토리에 들어가지 않으므로 마지막으로 알려진 서버 시간 변하지 않는다.

어떻게 더 설명해야 할지 모르겠어, 장난해? ))

사유: