Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
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 <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)],
"");
}
//+------------------------------------------------------------------+
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.
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"?
als
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.
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.
3. Почему OnTick() лучше, чем OnBookEvent() в премаркет?
Die "korrektere"
nicht
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.
Forum zum Thema Handel, automatische Handelssysteme und Testen von Handelsstrategien
Sanktion: Tslab + Platz 2 gegen MT 5
Renat Fatkhullin, 2017.01.17 14:01
Denken wir nachIch 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. :(
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? ))