Indicador que está se corrompendo - página 6

 
Rosh:
Ok, vou esperar

Após mais de 20 horas, o indicador funciona corretamente. Não sei o que dizer.


 

Rosh, Zoom in/Out, rolar para a esquerda/direita. Qual plataforma você está testando em 64/32 bit?

 
AnkaSoftware:

Rosh, Zoom in/Out, rolar para a esquerda/direita. Qual plataforma você está testando em 64/32 bit?

Eu posso replicar a questão geral em 32 bits. A única maneira em que o O/S parece ser relevante é a questão de por que seu sistema de 64 bits parece estar periodicamente obtendo novos dados no início ou no meio de seu histórico de barras, enquanto seu sistema de 32 bits (e o sistema de 64 bits do RaptorUK) não estão. Independentemente disso, você parece ter a intenção de dar seu indicador a outras pessoas, e mudanças no histórico de barras são questões que você definitivamente encontrará na vida real, quanto mais não seja por causa de seus usuários sofrerem desconexões de corretores que levam à inserção de barras ausentes no meio do histórico na religação.

Como eu já tentei explicar, é discutível se este "bug" está em seu código ou no MT4. Há uma expectativa de como os indicadores se comportarão no MT4, e seu indicador não se comporta dessa forma. Por exemplo, quando você cria um novo indicador usando o MetaEditor, ele insere para você a linha "int counted_bars=IndicatorCounted();". Você está removendo isto e ignorando o IndicatorCounted().

Posso replicar a questão geral usando o seguinte indicador que simplesmente desenha uma linha entre os últimos 10 bar-altos quando ele começa a funcionar:

#property indicator_chart_window
#property indicator_color1 Red
#property indicator_buffers 1

double indicatorvalues[];

void init()
{
   SetIndexBuffer(0, indicatorvalues);
}

void start()
{
   static bool IsFirstCall = true;
   if (IsFirstCall) {
      IsFirstCall = false;
      for (int i = 0; i < 10; i++) {
         indicatorvalues[i] = High[i];      
      }
   }
}

Você pode então replicar o mesmo tipo de problema, fazendo o seguinte:

* Abra um gráfico para qualquer símbolo

* Adicionar o indicador ao gráfico

* Desligar "Chart autoscroll" (apenas para facilitar os seguintes passos; não porque tenha qualquer impacto sobre a questão)

* Vá para o início da tabela, pressionando Home

* Pressione Page Up para forçar um download de dados extras. (N.B. Não há problema, a menos que alguns dados extras sejam realmente adicionados ao gráfico neste ponto).

* Vá até o final do gráfico, pressionando Fim. A linha vermelha entre os máximos estará agora fora de posição. Ela terá sido movida para trás no tempo.

[Tudo isto é apenas o que o RaptorUK já identificou].

 

OK, você pode confirmar, IndicatorCounted() irá retornar um número -ve, neste caso de barras ausentes / indicadores corruptos? Deixe-me tentar reinicializar as matrizes de indicadores e redesenhar os movimentos a partir da barra de observação.

 
AnkaSoftware:

OK, você pode confirmar, IndicatorCounted() irá retornar um número -ve, neste caso de barras ausentes / indicadores corruptos?

Não, o que acontece - como eu já disse na página 5, e como você pode facilmente testar por si mesmo - é que o MT4 redefine o IndicatorCounted() para zero quando novas barras são adicionadas no início da história usando um método como o acima. Isto fará com que um indicador normal redesenha todos os seus valores históricos, pois normalmente utilizará a diferença entre Barras e IndicatorCounted() para determinar quais barras estão "sujas" e precisam ser atualizadas. Se o IndicatorCounted() for zero, o indicador recalcula cada barra histórica, ou seja, porque Barras - 0 = Barras.

A documentação do IndicatorCounted()(https://docs.mql4.com/customind/IndicatorCounted) fornece um exemplo de como fazer isso, e há versões alternativas, como https://www.mql5.com/en/forum/132447, que visam melhorar muito marginalmente o desempenho porque o código padrão em https://docs.mql4.com/customind/IndicatorCounted recalcula desnecessariamente uma barra que está "limpa".
 

Adicionar IndicatorCounted() verifica e reinicializa os indicadores quando o IndicatorCounted() retorna o valor 0, resolve o problema de mudança de indicadores que são causados quando o histórico ou barras adicionais são inseridos.

Entretanto, há outro problema de corrupção de indicadores, que parece não ser causado pela inserção de barras do histórico. Exemplo de código incluído para reproduzir o problema, você precisa executá-lo por 10+hrs, até pelo menos duas reinicializações dos indicadores, ou seja, IndicatorCounted() retorna o valor 0 (pós-início do indicador).

Arquivos anexados: