Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
Alguém pode explicar por que este código não sincroniza o tempo com precisão?
Afinal, o pré-mercado recebe uma cotação "fresca", com o novo servidor (troca) de tempo.
Tente o que eu tenho:
//| 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)],
"");
}
//+------------------------------------------------------------------+
O tempo flutua devido ao ping, servidor e atrasos nos terminais. Mas dentro de -10; +10; milissegundos funciona.
No pré-mercado também vêm os carrapatos.
Tente o que eu tenho:
O tempo flutua devido ao ping, servidor e atrasos nos terminais. Mas dentro de -10; +10; milissegundos funciona.
No pré-mercado, os carrapatos também vêm.
Obrigado, vou tentar.
Adicionado
Não parece ruim, mas.
1. Se este código for inserido em um Expert Advisor comercial, como sincronizar a correção entre os Expert Advisors, se
meu consultor especializado trabalha em vários futuros?
2. Se você colocar seu código em uma EA separada, não há garantia de que o OnTick venha
para este símbolo no pré-mercado (ele pode não vir)?
3. Por que OnTick() é melhor do que OnBookEvent() no pré-mercado?
Como é "correto"?
do que
Obrigado, vou tentar.
Adicionado
Não parece ruim, mas
1. Se este código for inserido em um Expert Advisor comercial, como sincronizar a correção entre os Expert Advisors, se
meu consultor especializado trabalha em vários futuros?
2. Se você colocar seu código em uma EA separada, não há garantia de que o OnTick venha
para este símbolo no pré-mercado (pode não vir)?
O Conselheiro Especialista deve ser melhor anexado a um gráfico separado, o mais líquido, em dois gráficos pode interferir um com o outro.
Quando a sincronização é melhor remover, uma vez por dia a sincronização deve ser suficiente. O relógio do corretor, da troca ou do computador não pode funcionar ou atrasar tanto assim.
Você pode fazer o Expert Advisor apagar a si mesmo quando ele se sincroniza.
É melhor colocar o assessor em uma tabela separada mais líquida, dois gráficos podem interferir um com o outro.
Quando se sincroniza é melhor removê-lo, uma vez por dia a sincronização deve ser suficiente. O relógio do corretor, da bolsa de valores ou do computador não pode funcionar ou atrasar tanto assim.
Podemos fazer com que o Expert Advisor apague a si mesmo quando ele se sincroniza.
3. Почему OnTick() лучше, чем OnBookEvent() в премаркет?
O mais "correto
não
como já expliquei, não podemos ter a hora da troca do bastão, tal funcionalidade não existe no terminal. A mudança do copo não ocorre apenas quando Ask, Bid, Last são alterados, respectivamente a hora do OnBookEvent() é desconhecida.
você só pode ter o tempo do tique.
OnTick() não é melhor do que OnBookEvent(), simplesmente não funciona de outra forma.
A partir de um fio vizinho:
Fórum sobre comércio, sistemas automatizados de comércio e testes de estratégia comercial
Sanção: Tslab + plaza 2 vs MT 5
Alexey Kozitsyn, 2017.01.17 12:02
Você não entendeu. Estou ciente da estrutura do carrapato, não há reclamações sobre ele. A queixa é que, no caso de assinar eventos de atualização, é impossível obter a hora de chegada deste evento, de acordo, se eu recebi carrapatos e depois quero saber o status do copo - não posso fazer isso, pois não há hora de chegada do copo! A sincronização é impossível! Da mesma forma, com outros indicadores de estoque que citei no post anterior.
E minha pergunta foi quando será adicionado o horário de chegada do evento da taça + outros indicadores de estoque como o OI.
Fórum sobre comércio, sistemas comerciais automatizados e estratégias comerciais de teste
Sanção: Tslab + plaza 2 vs MT 5
Renat Fatkhullin, 2017.01.17 14:01
Vamos pensarJá expliquei, não podemos ter a hora da troca do copo, não existe tal funcionalidade no terminal. A mudança do copo não acontece somente quando Ask, Bid, Last são mudados, respectivamente o tempo de OnBookEvent() é desconhecido.
você só pode ter o tempo do tique.
OnTick() não é melhor do que OnBookEvent(), você simplesmente não pode fazer de outra forma.
Sergei!
Veja. Uma nova cotação chegou e o mercado mudou, consequentemente, o evento OnBookEvent() deve ser recebido,
que usamos simplesmente como EVENTO.
Então, não faz diferença como você obtém informações sobre o tick através doif(!SymbolInfoTick(_Symbol,tick)){Imprimir("erroSymbolInfoTick",GetLastError());retornar; }
ouse(CopyTicks(symbol,curr_tick,COPY_TICKS_INFO,0,1)===1)
Mas há uma enorme diferença na minha abordagem e na sua.
No meu caso, usando EA em instrumento ilíquido (por exemplo UUAH) você pode adicionar pilhas de TODOS os futuros e
é GARANTIDO obter um carrapato no pré-mercado, sem se preocupar com o trabalho de outros Expert Advisors no terminal.
Ou seja, todas as novas citações "vão" para uma EA separada.
Adicionado por
O objetivo principal deste EA é "lidar" apenas com a sincronização, não interferir com o trabalho de ninguém mais.
//| 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;
}
}
//+------------------------------------------------------------------+
Somente hoje, depois das 10:00 horas (a sincronização estava em pré-mercado)
Ahora local diferiu da hora na Market Watch em 7 segundos. :(
Sergei!
Veja. Uma nova cotação chegou, o mercado mudou, portanto o evento OnBookEvent() deve ser recebido,
que simplesmente usamos como EVENTO.
Então, não faz diferença como você obtém informações sobre o tick através doif(!SymbolInfoTick(_Symbol,tick)){Imprimir("erroSymbolInfoTick",GetLastError());retornar; }
ouse(CopyTicks(symbol,curr_tick,COPY_TICKS_INFO,0,1)===1)
Mas há uma enorme diferença na minha abordagem e na sua.
No meu caso, usando EA em instrumento ilíquido (por exemplo UUAH) você pode adicionar pilhas de TODOS os futuros e
é GARANTIDO obter um carrapato no pré-mercado, sem se preocupar com o trabalho de outros Expert Advisors no terminal.
Ou seja, todas as novas citações "irão" para uma EA separada.
Adicionado por
Ele "tratará" apenas da sincronização e não interferirá com o trabalho de ninguém mais.
Chegou uma nova cotação e a profundidade do mercado mudou - estes são eventos diferentes. Se uma oferta ou oferta superior ou inferior ao pedido for adicionada (removida), o evento OnBookEvent() ocorre, mas não é uma nova cotação e não chega ao histórico do tick e, portanto, o último tempo conhecido do servidor não muda.
Não sei como explicar de outra forma, você está brincando? ))