IsNewBar com resultados diferentes VPS e Local

 

Olá pessoal,

To batendo cabeça aqui e preciso de uma ajudinha.

Eu tenho a IsNewBar que já conhecemos deste artigo aqui:  https://www.mql5.com/pt/articles/159

A Classe foi criada lá no OnInit(), apenas copiei e colei. Depois carrego no OnTick() como abaixo:

void OnTick()
{
  
if(!simbolo.RefreshRates())
      
return;
      
//INI: Barra-em-Barra
  
int period_seconds=PeriodSeconds(_Period);                     // Number of seconds in current chart period
  
datetime new_time=TimeCurrent()/period_seconds*period_seconds; // Time of bar opening on current chart
  
if(current_chart.isNewBar(new_time))               // When new bar appears - launch the NewBar event handler
   {

      
if(SemPosicao() && !SemOrdem())
         PendingOrderDelete();

      
if(HorarioEntrada() && !HorarioFechamento())
      {
        
int Resultado_IndicadorEI=IndicadorEI();
        
if(Resultado_IndicadorEI==1)
         {
            Compra();
            VMin=horario_atual.min;
         }
        
        
if(Resultado_IndicadorEI==-1)
         {
            Venda();
            VMin=horario_atual.min;
         }
      }

Até aqui parece tudo em ordem.

Rodando em conta REAL na VPS ele lê corretamente o código no tempo certo, ou seja, na hora que muda a barra, exatamente onde eu quero. E a Abertura da Ordem  e Venda idem, abre exatamente na sequencia do código de acordo com o que meu IndicadorEI() apontar.

Por outro lado, em conta local em outra corretora eu tenho o mesmo EA rodando e ele lê o código, entra no IndicadorEI, mas ao voltar para o OnTick() ele só executa a Abertura da Ordem de Compra ou Venda depois que abre um novo Candle. É como se perdesse o time nesse meio do caminho e só continuasse a leitura na próxima vez que entra no IsNewBar.

Resumindo, a leitura do IndicadorEI() ocorre idêntico tanto no VPS quanto na Local, mas a continuidade do IsNewBar  que é justamente o momento da Abertura da Ordem de Venda ocorre com um atraso de 1 barra na conexão Local.

Vejam na imagem a seguir, a Abertura deveria ser onde tracei a linha azul. Linha em circulo azul representa a leitura que o IndicadorEI fez (rates[1] e rates[2]...). E na VPS Abre a Venda corretamente exatamente nessa linha azul. Mas a conexão Local que é a do print abaixo só Abre no barra seguinte (circulo vermelho).

 

O que eu já tentei e não deram certo:

+ Passei o RefreshRates para o OnTick()... nada mudou...

+ Passei o RefreshRates para dentro da cadeia do if(...isnewbar...) e nada...

+ Tentei rodar a chamada da Compra() e Venda() dentro do IndicadorEI() para ver se o problema estava dentro do IndicadorEI ou no retorno da condicional, e nada...

Não sei o que faço para não dar essa diferença. Espero um delay de apenas alguns milesegundos/pontinhos, mas 1 barra inteira me quebra as pernas.

Handler de evento "nova barra"
Handler de evento "nova barra"
  • www.mql5.com
Os autores dos indicadores e especialistas sempre estiveram interessados em escrever o código compacto em termos de tempo de execução. Você pode resolver este problema a partir de diferentes ângulos. A partir deste amplo tópico neste artigo, cobriremos o problema, que aparentemente foi solucionado: verifique por uma nova barra. Este é um meio...
 
Ruy Christian Hoffmann:


Oi Ruy,

bom vou dar um chute aqui:  Certifique que as Builds nas duas máquinas são iguais e se não forem sugiro compilar o MESMO fonte nas duas máquinas

 
Rogerio Giannetti Torres:

Oi Ruy,

bom vou dar um chute aqui:  Certifique que as Builds nas duas máquinas são iguais e se não forem sugiro compilar o MESMO fonte nas duas máquinas

Oi Rogério, são idênticas. Mas obrigado pela tentativa :)

 

Boa noite Ruy.


A minha verificação não é nem de longe a mais inteligente, mas vou disponibilizar aqui, caso você queira testar:

//=== Global internal variables
datetime PREVTIME;

//+--------------------------------------------------------------------------------------------------------------------+
//| Expert initialization function                                                                                     |
//+--------------------------------------------------------------------------------------------------------------------+
int OnInit()
  {
   //--- Initializes variables
   PREVTIME = 0;


   return(INIT_SUCCEEDED);
  }
//+--------------------------------------------------------------------------------------------------------------------+
//| Expert tick function                                                                                               |
//+--------------------------------------------------------------------------------------------------------------------+
void OnTick()
  {
   //=== CHECKS IF IS A NEW BAR...
   if(PREVTIME != iTime(NULL, PERIOD_CURRENT, 0) && TimeCurrent() < (iTime(NULL, PERIOD_CURRENT, 0) + 180))
     {
      //...
      //...
      //...


      PREVTIME = iTime(NULL, PERIOD_CURRENT, 0);
     }
  }
Abraço.
 
Vinicius de Oliveira:

Boa noite Ruy.


A minha verificação não é nem de longe a mais inteligente, mas vou disponibilizar aqui, caso você queira testar:

Abraço.

Vinícius meu amigo!!!

Vou testar mais tarde ou amanhã. Agora preciso sair com minha amada esposa e não sei se vou voltar sóbrio suficiente para testá-lo.

Obrigado e grande abraço,

 
Vinicius de Oliveira:

Boa noite Ruy.


A minha verificação não é nem de longe a mais inteligente, mas vou disponibilizar aqui, caso você queira testar:

Abraço.

Vinícius, funcionou perfeitamente,

Deixei hoje em conta real e nenhuma vez "pulou" a leitura.

Simples e funcional.

Hein, me tira uma dúvida, porque você coloca ...&& TimeCurrent() < (iTime(NULL, PERIOD_CURRENT, 0) + 180) ?

Eu não coloquei, me pareceu redundante para a minha necessidade aqui. Mas fiquei curioso.

Obrigado e grande abraço,

 
Ruy Christian Hoffmann:

Vinícius, funcionou perfeitamente,

Deixei hoje em conta real e nenhuma vez "pulou" a leitura.

Simples e funcional.

Hein, me tira uma dúvida, porque você coloca ...&& TimeCurrent() < (iTime(NULL, PERIOD_CURRENT, 0) + 180) ?

Eu não coloquei, me pareceu redundante para a minha necessidade aqui. Mas fiquei curioso.

Obrigado e grande abraço,

Opa Ruy, beleza, desculpe a demora, estive ausente ontem.


Eu trabalho com timeframes maiores (H1, H4) e no meu código algumas vezes o "return" pode ser acionado quando algum comando não for devidamente executado, então utilizo esses 180 segundos (3 minutos) para o EA tentar finalizar a execução dos comandos, e também quando o EA for anexado ao gráfico ele só executa o código se a barra estiver no início (máximo 3 minutos), para evitar abrir posição fora do tempo (no final da barra).


Não sei se me fiz entender...


Abraço.

 
Vinicius de Oliveira:

Opa Ruy, beleza, desculpe a demora, estive ausente ontem.


Eu trabalho com timeframes maiores (H1, H4) e no meu código algumas vezes o "return" pode ser acionado quando algum comando não for devidamente executado, então utilizo esses 180 segundos (3 minutos) para o EA tentar finalizar a execução dos comandos, e também quando o EA for anexado ao gráfico ele só executa o código se a barra estiver no início (máximo 3 minutos), para evitar abrir posição fora do tempo (no final da barra).


Não sei se me fiz entender...


Abraço.

Foi o que eu imaginei, legal,

Obrigado e grande abraço.

Razão: