Bibliotecas: iBarShift - página 3

 
angevoyageur:

Obrigado, mas preciso corrigir meu código também quando exact é true, pois não entendi direito esse parâmetro. A documentação em inglês do iBarShift está errada.

Acho que esse também é meu erro, o iBarShift deve retornar a barra que contém o horário especificado (não com o horário exato de abertura).

Posso usar sua função em minha biblioteca (com seus direitos autorais, é claro)? Se ela for mais rápida e correta, por que eu deveria reinventar a roda?)

 
komposter:

Acho que esse também é o meu erro, iBarShift deve retornar a barra que contém o tempo especificado (não com o tempo exato de abertura).

Posso usar sua função em minha biblioteca (com seus direitos autorais, é claro)? Se ela for mais rápida e correta, por que eu deveria reinventar a roda?)

É claro que sim.
 
O código corrigido, levando em conta o parâmetro "exato", foi publicado.
 
angevoyageur:

Obrigado, mas preciso corrigir meu código também quando exact é true, pois não entendi direito esse parâmetro. A documentação em inglês do iBarShift está errada.

O erro do mql5 está na função Bars(), e eu o relatei ao Service Desk.

Parece que o erro Bars() foi corrigido no build 880.
 
A versão 880 corrigiu o erro em Bars(), e tudo está funcionando bem agora.
 
angevoyageur:
A versão 880 corrigiu o erro em Bars(), e tudo está funcionando bem agora.
 

em m2 com m1, os valores em trudy, por algum motivo, têm valores diferentes de -1, e na barra zero há um retorno à primeira barra.

 

A função está incorreta em pelo menos dois pontos:

1) if(time>LastBar)

return(0);

Se exact=true, a lógica deve retornar -1 caso o tempo não pertença explicitamente à última barra, ou seja, se time>LastBar+PeriodSeconds(timeframe).

2) if(CopyTime(symbol,timeframe,time,1,checkcandle)==1)

...

return(-1);

Novamente, se exact=false, a barra mais próxima deve ser retornada, nesse caso Bars(symbol,timeframe)-1.

 

Acho que há um pequeno erro em seu código:

//--- se o tempo > LastBar, sempre retornamos 0
   if(time>LastBar)
      return(0);

Se o último tick "abrir" uma nova barra, então if(time>LastBar) se tornará falso - porque agora time == LastBar

E mais tarde chegamos aqui:

 if(checkcandle[0]==time)
         return(shift-1);

E agora shift == 0, que retorna -1 em vez de 0!

Portanto, acho que isso:

//--- se o tempo > LastBar, sempre retornamos 0
   if(time>LastBar)
      return(0);

deve ser alterado para

//--- se o tempo > LastBar, sempre retornamos 0
   if(time>=LastBar)
      return(0);

Calli

 
Carl Schreiber:

Acho que há um pequeno erro em seu código:

Se o último tique "abrir" uma nova barra, então if(time>LastBar) se tornará falso - porque agora time == LastBar

Não tem certeza do que quer dizer? Acho que o "último tick" é irrelevante. Quando você usa a função, o tempo=LastBar ou não.

E mais tarde chegamos aqui:

E agora shift == 0 , que retorna -1 em vez de 0!

se time==Lastbar, então shift=1 e não 0. Portanto, não há nenhum erro (shift vem de Bars(), que é a contagem de barras, por isso retornamos 'shift-1').

Portanto, acho que isso:

deve ser alterado para

Calli

Sua correção também funcionaria, mas o caso 'time==LastBar' é processado como um caso "normal".

A declaração

 if(time>LastBar)

foi adicionada como uma correção de erro se o tempo for maior que o tempo da barra atual 0.