Ticaret fırsatlarını kaçırıyorsunuz:
- Ücretsiz ticaret uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Kayıt
Giriş yap
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz
Hesabınız yoksa, lütfen kaydolun
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 <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)],
"" );
}
//+------------------------------------------------------------------+
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.
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"
hariç
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.
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.
3. Почему OnTick() лучше, чем OnBookEvent() в премаркет?
Ne doğru"
hariç
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.
Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum
Duygu: Tslab + plaza 2 vs MT 5
Renat Fatkhullin , 2017.01.17 14:01
DüşünelimDaha ö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ı. :(
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? ))