TimeCurrent() e iTime() bug/problema

 

Oi, pessoal,

Basta encontrar um problema/bug interessante e não ter certeza se ele foi identificado antes ou mesmo se é específico do corretor.

Tente usar o seguinte em algum código indicador, tenha o indicador rodando na inicialização e anote os valores quando executar o MT4 pela primeira vez (certifique-se de que o MT4 não esteja rodando há pelo menos 10 minutos antes de reiniciar).

Print(TimeToStr(TimeCurrent(),TIME_DATE|TIME_MINUTES));
Print(TimeToStr(iTime(NULL,PERIOD_M1,0),TIME_DATE|TIME_MINUTES));

Você notará que os tempos retornados são na verdade o tempo em que o MT4 esteve rodando pela última vez.

Para contornar isto, tive que introduzir um atraso em meu código, o que não é ideal para um indicador.

Estava me perguntando se alguém tem mais soluções eloqüentes. Eu idealmente não gostaria que o tempo correto do servidor MT4 voltasse sempre na inicialização.

Atenciosamente

PaulB

 
Paul_B:

Oi, pessoal,

Basta encontrar um problema/bug interessante e não ter certeza se ele foi identificado antes ou mesmo se é específico do corretor.

Tente usar o seguinte em algum código indicador, tenha o indicador rodando na inicialização e anote os valores quando executar o MT4 pela primeira vez (certifique-se de que o MT4 não esteja rodando há pelo menos 10 minutos antes de reiniciar).

Você notará que os tempos retornados são na verdade o tempo em que o MT4 esteve rodando pela última vez.

Para contornar isto, tive que introduzir um atraso em meu código, o que não é ideal para um indicador.

Estava me perguntando se alguém tem soluções mais eloqüentes. Eu idealmente não gostaria que o tempo correto do servidor MT4 voltasse sempre na inicialização.

Atenciosamente

PaulB


Este ???
Print(TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS));
 

Olá deVries,

você poderia usar TIME_SECONDS também, não importa realmente, desde que o código esteja init{} ou no início do início{}.

A questão é que você obtém a última vez que o MT4 foi executado, o que poderia ser horas ou dias atrás.

 
Paul_B:

Oi, pessoal,

Basta encontrar um problema/bug interessante e não ter certeza se ele foi identificado antes ou mesmo se é específico do corretor.

Tente usar o seguinte em algum código indicador, tenha o indicador rodando na inicialização e anote os valores quando executar o MT4 pela primeira vez (certifique-se de que o MT4 não esteja rodando há pelo menos 10 minutos antes de reiniciar).

Você notará que os tempos retornados são na verdade o tempo em que o MT4 esteve rodando pela última vez.

Para contornar isto, tive que introduzir um atraso em meu código, o que não é ideal para um indicador.

Estava me perguntando se alguém tem soluções mais eloqüentes. Eu idealmente não gostaria que o tempo correto do servidor MT4 voltasse sempre na inicialização.

Atenciosamente

PaulB

A documentação não é 100% clara neste ponto? "Retorna o último tempo conhecido do servidor (hora de entrada da última cotação), conforme o número de segundos decorridos de 00:00 de 1 de janeiro de 1970". se o último tick foi há 10 minutos, então o TimeCurrent() retornará uma data baseada nesse tempo...
 
RaptorUK:
A documentação não é 100% clara sobre este ponto ?

Na verdade, não, não é.

Há uma distinção importante entre EAs e indicadores que não está coberta na documentação: Os EAs só recebem uma chamada para começar() se houver uma conexão de corretor e um novo tick, enquanto os indicadores sempre recebem uma chamada inicial para começar() antes ou sem que uma conexão de corretor seja estabelecida. Portanto, o TimeCurrent() pode ter significados diferentes em EAs e indicadores.

Se você quiser um valor definitivamente-refresco para TimeCurrent() em um indicador, então você provavelmente pode usar IsConnected() para verificar se o TimeCurrent() pode se referir ao último tempo conhecido em uma sessão anterior.

 

Como um ponto adicional, eu tentei até

https://docs.mql4.com/windows/RefreshRates

antes de chamar a TimeCurrent() e isso não fez diferença. Certamente é algo a se ter em mente.

Estou usando-o como parte de algum código para obter a compensação entre a hora do servidor MT4 e o GMT, e está lançando os cálculos subsequentes para fora.

 
cyclops993:

Na verdade, não, não é.

Há uma distinção importante entre EAs e indicadores que não está coberta na documentação: Os EAs só recebem uma chamada para começar() se houver uma conexão de corretor e um novo tick, enquanto os indicadores sempre recebem uma chamada inicial para começar() antes ou sem que uma conexão de corretor seja estabelecida. Portanto, o TimeCurrent() pode ter significados diferentes em EAs e indicadores.

Não vejo isso como sendo relevante tendo em mente o que diz a documentação . ... se você verificar o TimeCurrent() antes que um novo tick chegue, você recebe a hora do último tick. Não é isso que diz a documentação?
 
RaptorUK:
Não vejo isso como sendo relevante tendo em mente o que diz a documentação . ... se você verificar TimeCurrent() antes que um novo tick chegue, você obtém a hora do último tick. Não é isso que diz a documentação?

Ainda é enganador, mas se você quisesse ser pedante, poderia dizer que o problema não está na definição de TimeCurrent(), mas sim na definição em https://docs.mql4.com/runtime/start. Isso diz "Na entrada de novas citações, a função start() dos especialistas anexos e indicadores personalizados será executada". Há uma clara implicação de que start() só é chamado em relação a novos ticks, como é o caso dos EAs, e que, implicitamente, o TimeCurrent(), portanto, não pode retornar o tempo do último tick em uma sessão anterior de utilização do software MT4.

[Novamente, uma resposta a tudo isso é ignorar chamadas para iniciar() em um indicador se IsConnected() retorna falso.]

 
cyclops993:

Ainda é enganoso, mas se você quisesse ser pedante [...]

Sendo ainda mais pedante, se você tiver uma nova instalação MT4, e copiar para ela um arquivo de gráficos com um indicador anexado antes de iniciar o MT4 pela primeira vez, então presumivelmente o indicador receberia uma chamada para iniciar() com o TimeCurrent() reportado como 1/1/1970. Portanto, a documentação do TimeCurrent() deve dizer "...a última hora conhecida do servidor, ou 1/1/1970 se não houver conexão com o servidor".

 
cyclops993:

Sendo ainda mais pedante, se você tiver uma nova instalação MT4, e copiar para ela um arquivo de gráficos com um indicador anexado antes de iniciar o MT4 pela primeira vez, então presumivelmente o indicador receberia uma chamada para iniciar() com o TimeCurrent() reportado como 1/1/1970. Portanto, a documentação do TimeCurrent() deve dizer "...a última hora conhecida do servidor, ou 1/1/1970 se não houver conexão com o servidor".

Não há necessidade de fazer alarde. Basta esperar o primeiro/próximo sinal, o TimeCurrent() está atualizado e tudo está bem. Um indicador apenas sobre os preços do histórico é inútil.
 
angevoyageur:
Não há necessidade de fazer alarde. Basta esperar o primeiro/próximo sinal, o TimeCurrent() está atualizado e tudo está bem. Um indicador apenas sobre os preços do histórico é inútil.
Acho que a questão é que a primeira vez que se inicia() é chamado para um Indicador pode não ser como resultado de um novo tick . . nesse caso, o TimeCurrent() irá relatar o tempo incorreto. Eu não verifiquei isto . . .

Neste caso, eu simplesmente ignoraria o primeiro tick . . . e continuaria normalmente a partir do tick 2.
Razão: