CalendarValueHistory problema de fuso horário

 

Pessoal, estou usando o CalendarValueHistory, para o robo não operar quando há noticias relevantes (impacto alto). Mas estou identificando um problema. 


Por exemplo hoje (02/08/19), tem as 9:30 o Payroll não agricola

no MT5 logado no Forex, na aba calendário, apresenta como horário das 15:30 (no metatrader logado para o indice aparece 9:30), porém a função me retorno as 12:30 e com isso ele filtra o horário errado. A função identifica certinho o indicador, porém com alguma questão de fuso.


if(CalendarValueHistory(values,hora1,hora2,NULL,moeda1)) 

 Values é o array

hora1 = inicio

hora 2 = fim

pais = NULL

moeda1 =USD


não vi na função algo que indique o fuso, pensei que fosse o pais, porém quando coloco ai ele não traz nada (coloando estados unidos, europa, brasil...etc)


alguem tem essa função implementada que poderia me ajudar?


Obrigado!

 
Gilberto Beltrao Dupita:


Boa tarde,

o que você chama de fuso é a hora GMT e a função TimeGmt() é  hora GMT.  Para você calcular a hora local a partir de uma hora expressa como hora GMT tem que subtrair deslocamento entre as horas, e a função TimeGMTOffset() é esse deslocamento, então:

    Print(TimeToString(values[i].time - TimeGMTOffset()) vai mostrar a hora local do evento. 

 
Rogerio Giannetti Torres:

Boa tarde,

o que você chama de fuso é a hora GMT e a função TimeGmt() é  hora GMT.  Para você calcular a hora local a partir de uma hora expressa como hora GMT tem que subtrair deslocamento entre as horas, e a função TimeGMTOffset() é esse deslocamento, então:

    Print(TimeToString(values[i].time - TimeGMTOffset()) vai mostrar a hora local do evento. 

Obrigado Rogério! vou testar.


Em um primeiro momento coloquei um paramentro de diferença de fuso. Para forex -3 horas, brasil +3 horas. Agora está filtrando as noticias certinho, mas vou testar a função!

 
Gilberto Beltrao Dupita:

Obrigado Rogério! vou testar.


Em um primeiro momento coloquei um parametro de diferença de fuso. Para forex -3 horas, brasil +3 horas. Agora está filtrando as noticias certinho, mas vou testar a função!

Gilberto, 

não é bem assim. O  mqlCalendarValue.time  está em hora GMT,  então se  mqlCalendarValue.time = 05:30:00  aqui é 02:30:00, mas no horário de verão aqui é 03:30:00.  Então deixar fixo 3 hora no programa é uma furada, Assim sendo, use o TimeGMTOffset() que já fica ajustado para 02:00:00 horas durante o horário de verão.

Se você quer calcular a hora da notícia em  relação ao servidor Forex o cálculo é: 

1) Ajuste a hora do evento para hora local ==>  horaEvento =  mqlCalendarValue.time - TimeGTMOffSet();

2) Em seguida ajuste para o horário do evento em função da hora do servidor ==>  horaEvento = horaEvento + (TimeTradeServer() - TimeLocal());

Mas tem um problema, como o TimeLocal() é a hora do PC  vai ter que confiar que a hora do PC está correta.

Razão: