inputbool info= true ; inputint precision = 50 ; //+------------------------------------------------------------------+ struct _SYSTEMTIME { short year; short mon; short day_of_week; short day; short hour; short min; short sec; short msc; };
당신은 이해하지 못했습니다. 나는 진드기 구조를 알고 있으며 그것에 대한 불만은 없습니다. DOM 업데이트 이벤트를 구독하는 경우 이 이벤트의 도착 시간을 얻을 수 없다는 주장이 있습니다. 유리 도착 시간이 없습니다! 동기화가 불가능합니다! 이전 게시물에서 제공된 다른 교환 지표와 유사합니다.
바라보다. 새 견적이 도착했고 주문서가 변경 되었으므로 OnBookEvent() 이벤트가 발생해야 합니다.
우리는 단지 EVENT로 사용합니다.
그런 다음 if(!SymbolInfoTick(_Symbol,tick)) {Print("errorSymbolInfoTick",GetLastError());반환; }
또는 if(CopyTicks(symbol,curr_tick,COPY_TICKS_INFO,0,1)==1)
그러나 나와 당신의 접근 방식의 차이는 큽니다.
제 경우에는 저유동성 상품(예: UUAH)에 대한 Expert Advisor를 사용하여 모든 선물의 주문서를 추가할 수 있습니다.
터미널에서 다른 전문가의 작업에 대해 생각하지 않고 사전 시장에서 틱을 얻을 보장.
즉, 모든 새 견적은 별도의 전문가 고문에게 "이동"됩니다.
추가됨
누구와도 간섭하지 않고 동기화만 "처리"합니다.
새로운 견적이 나왔고 주문서가 변경되었습니다. 이것은 다른 이벤트입니다. 오더북 변경 시 매도 위 또는 매도 아래에 주문이 추가(제거)되면 OnBookEvent() 이벤트가 발생하지만 이것은 새로운 견적이 아니며 틱 히스토리에 들어가지 않으므로 마지막으로 알려진 서버 시간 변하지 않는다.
이 코드가 시간을 정확하게 동기화하지 않는 이유를 설명할 수 있는 사람이 있습니까?
결국 새로운 서버(교환) 시간과 함께 "신선한" 견적이 사전 출시됩니다.
내가 얻은 것을 시도하십시오 :
//| 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 <ime)
{
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; 밀리초는 동기화하는 것으로 나타났습니다.
티키도 프리마켓에 옵니다.
내가 얻은 것을 시도하십시오 :
핑, 서버 및 터미널 지연으로 인해 시간이 유동적입니다. 그러나 -10 이내; +10; 밀리초는 동기화하는 것으로 나타났습니다.
티키도 프리마켓에 옵니다.
감사합니다.
추가됨
나쁘지 않아 보이지만
1. 이 코드가 Expert Advisor에 삽입된 경우 Expert Advisors 간에 수정 사항을 동기화하는 방법은 다음과 같습니다.
이 EA는 여러 미래에 작동합니까?
2. 별도의 전문가에게 코드를 배치하면 OnTick이 올 것이라는 보장은 어디에 있습니까?
시판 전의 이 기호(오지 않을 수도 있음)?
3. 시판 전 OnTick()이 OnBookEvent()보다 나은 이유는 무엇입니까?
"올바른"이란 무엇입니까?
~보다
감사합니다.
추가됨
나쁘지 않아 보이지만
1. 이 코드가 Expert Advisor에 삽입된 경우 Expert Advisors 간에 수정 사항을 동기화하는 방법은 다음과 같습니다.
이 EA는 여러 미래에 작동합니까?
2. 별도의 전문가에게 코드를 배치하면 OnTick이 올 것이라는 보장은 어디에 있습니까?
시판 전의 이 기호(오지 않을 수도 있음)?
Expert Advisor를 서로 간섭할 수 있는 두 개의 차트에 가장 유동적인 차트인 별도의 차트에 걸어두는 것이 좋습니다.
동기화되면 삭제하는 것이 좋으며 하루에 한 번이면 동기화하기에 충분합니다. 브로커, 거래소 또는 컴퓨터의 시계는 그렇게 많이 실행되거나 지연될 수 없습니다.
어드바이저가 동기화되면 어드바이저 자체를 삭제하도록 할 수 있습니다.
Expert Advisor를 서로 간섭할 수 있는 두 개의 차트에 가장 유동적인 차트인 별도의 차트에 걸어두는 것이 좋습니다.
동기화되면 삭제하는 것이 좋으며 하루에 한 번이면 동기화하기에 충분합니다. 브로커, 거래소 또는 컴퓨터의 시계는 그렇게 많이 실행되거나 지연될 수 없습니다.
어드바이저가 동기화되면 어드바이저 자체를 삭제하도록 할 수 있습니다.
3. Почему OnTick() лучше, чем OnBookEvent() в премаркет?
"올바른"이란 무엇입니까?
~보다
이미 설명했지만 주문서 변경 시간 을 알 수 없으며 터미널에는 그러한 기능이 없습니다. 시장의 깊이는 Ask, Bid, Last가 각각 변하고 OnBookEvent()의 시간을 알 수 없을 때만 변하는 것이 아닙니다.
틱 시간 만 얻을 수 있습니다.
OnTick()은 OnBookEvent()보다 좋지 않으며, 다른 방식으로 작동하지 않습니다.
다른 스레드에서:
거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼
감성: Tslab + plaza 2 vs MT 5
알렉세이 코지친 , 2017.01.17 12:02
당신은 이해하지 못했습니다. 나는 진드기 구조를 알고 있으며 그것에 대한 불만은 없습니다. DOM 업데이트 이벤트를 구독하는 경우 이 이벤트의 도착 시간을 얻을 수 없다는 주장이 있습니다. 유리 도착 시간이 없습니다! 동기화가 불가능합니다! 이전 게시물에서 제공된 다른 교환 지표와 유사합니다.
그리고 내 질문은 DOM + OI와 같은 기타 주식 지표가 언제 추가되는지였습니다.
거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼
감성: Tslab + plaza 2 vs MT 5
레나트 팻쿨린 , 2017.01.17 14:01
생각 해봐이미 설명했지만 주문서 변경 시간을 알 수 없으며 터미널에는 그러한 기능이 없습니다. 시장의 깊이는 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초 차이가 났습니다. :(
세레자!
바라보다. 새 견적이 도착했고 주문서가 변경 되었으므로 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() 이벤트가 발생하지만 이것은 새로운 견적이 아니며 틱 히스토리에 들어가지 않으므로 마지막으로 알려진 서버 시간 변하지 않는다.
어떻게 더 설명해야 할지 모르겠어, 장난해? ))