TimeCurrent() e iTime() bug/problema - página 2

 
RaptorUK:
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.

Sim, é isto que eu quero dizer.
 
É um indicador, por que você se importa com o que o TimeCurrent é. Faça seu laço de contagem de indicador e desenhe nas barras. Não olhe para o TimeCurrent, não olhe para o Bid.
 
Estou traçando certos horários em um gráfico que corresponde ao GMT, por isso é muito importante quando se tenta obter a compensação entre o horário do servidor MT4 e o GMT.
 

Paul_B:
I'm plotting certain times on a chart which match to GMT, so it matters a great deal when trying to get the offset between MT4 server time and GMT.

<g> Acho que você ainda não está a par da cultura deste fórum. A seqüência de respostas dos moderadores e outros usuários de longo prazo do fórum é sempre "Você está fazendo algo errado" seguido de "Por que você quer fazer isso?" quando se descobre que você não está fazendo algo errado.

Se eu fosse você, eu sairia das chamadas para começar() se IsConnected() for falso. Ou você poderia manter uma contagem de tick em uma variável estática e ignorar o tick #1, mas isso atrasaria desnecessariamente a partida em circunstâncias normais.

 
Obrigado pelo ciclops993 de entrada, tenho-o funcionando atualmente, mas o que tenho não me parece uma solução ideal ou particularmente robusta. Vou explorar a IsConnected() um pouco mais.
 
Paul_B: Estou traçando certos horários em um gráfico que corresponde ao GMT, por isso é muito importante quando se tenta obter a compensação entre o horário do servidor MT4 e o GMT.
Agora entendemos o porquê. (Por que você não se explicou no OP?) Exatamente como meu código
      nextAutoUpdate = timeSrv + HR2400;
      if(Srvr_To_UTC_Auto) if(
         IsDllsAllowed()){                            // Complained @ init
         int      srvrToUTC         = LocalTimeToUTC() - TimeCurrent();
         double   nearestHalfHour   = MathRound(srvrToUTC / 1800.);
         Srvr_To_UTC_Hours          = nearestHalfHour / 2.; // Update external
      }

Vou segundo a sugestão do RaptorUK, para um indicador Ignorar o primeiro tick e atualizar todas as barras no segundo.

Também não é completamente inesperado. Como o Indicador não pode dormir, se um EA carrega um indicador no seu init via iCustom, a chamada não pode retornar um valor de buffer até que o indicador execute seu init AND start.

 
Paul_B:
Obrigado pelo ciclops993 de entrada, tenho-o funcionando atualmente, mas o que tenho não me parece uma solução ideal ou particularmente robusta. Vou explorar o IsConnected() um pouco mais.

Acho que você não tem muita escolha. O MT4 gera uma chamada fictícia para iniciar() a fim de fazer com que os indicadores sejam preenchidos em gráficos off-line, e porque, de modo mais geral, ele quer que os indicadores (re)apareçam nos gráficos assim que o MT4 é carregado, sem esperar que uma conexão seja estabelecida.

Se você quiser aumentar a certeza de que há uma conexão devidamente estabelecida e um TimeCurrent() válido, então você também pode procurar AccountNumber() != 0 e AccountBalance() > 0. Ou você pode simplesmente esperar pelo segundo tick, ao custo de atrasos de múltiplos segundos em símbolos com pouca liquidez.

 

Obrigado pessoal, vou programar o indicador para esperar até que o segundo tick seja recebido.

A propósito, acabei de explorar a possibilidade IsConnected(), mas eu ainda estava recebendo o "errado" TimeCurrent() mesmo quando IsConnected() foi relatado como verdadeiro.

 
cyclops993:

<g> Acho que você ainda não está a par da cultura deste fórum. A seqüência de respostas dos moderadores e outros usuários de longo prazo do fórum é sempre "Você está fazendo algo errado" seguido de "Por que você quer fazer isso?" quando se descobre que você não está fazendo algo errado.

Se eu fosse você, eu sairia das chamadas para começar() se IsConnected() for falso. Ou você poderia manter uma contagem de tick em uma variável estática e ignorar o tick #1, mas isso atrasaria desnecessariamente a partida em circunstâncias normais.

Se um usuário não fornecer um código de teste para demonstrar o problema, é um pouco difícil dar uma ajuda específica e muitas vezes a melhor suposição que pode ser feita é a de um erro no código . . talvez você deva simplesmente assumir e responder a todas e quaisquer perguntas e pedidos de ajuda. Isso resolveria todos os seus problemas, então você não precisaria ter uma escavação para aqueles que estão apenas tentando ajudar . . .
 
RaptorUK:
Se um usuário não fornecer um código de teste para demonstrar o problema [...]

Não havia nada de errado ou faltava no OP. Ficou claro que Paul_B estava assumindo, perfeitamente razoável a partir da documentação MT4, que o início() só é chamado em resposta a novos tiquetaques.(Porque ele queria verificar a TimeCurrent() não faz diferença, e não é de fato nenhum de nossos negócios).

Sua resposta foi basicamente uma boa versão do RTFM, apesar do fato de que o manual é claramente inexistente nesta área [o que eu vou enfatizar é incomum; a qualidade da documentação do MT4 é muito boa]. A resposta da Angevoyageur foi descrever isto como uma confusão, que parece fazer parte de um padrão de respostas patologicamente sensíveis a qualquer crítica ao MT4 de qualquer tipo, por mais branda que seja. WHRoeder, em seguida, foi lascado com "você não quer fazer isso", seguido pela cópia e colagem de algum código que era claramente irrelevante porque Paul_B já sabia claramente como calcular uma compensação GMT.