Problema com o indicador ZigZag

 

Olá,

Estou tentando desenvolver um especialista que escave os dados históricos (pico e fundo) para ser usado por meu principal especialista. Decidi usar o indicador ziguezague, pois é simples e encontra o alto/baixo facilmente.

Meu problema é que quando chamo o ZigZag.ex4 usando a função iCustom(), não consigo obter os valores altos e baixos corretos. Para evitar a repintura, usei o índice 20 do indicador iCustom() como uma proteção básica para a repintura.

Há dois buffers em código ZigZag (usando a versão de metacotas https://www.mql5.com/en/code/7796 ). Posso tomar os valores alto e baixo em sentido contrário, mas não importa muito no momento.

Alguns dos valores correspondem ao código que alguns não correspondem e, no Diário, posso ver tanto os valores altos como os baixos na mesma coluna, o que não pode ser possível.

ZigZag

Meu código está abaixo:

//+------------------------------------------------------------------+
//|                                                 ZigZagDigger_02  |
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+
/* 

*/

#include <stderror.mqh>
#include <stdlib.mqh>
    
int cnt=0;
double Zig_high[1000];
double Zig_low[1000];

int init()
  {
   ArrayInitialize(Zig_high,0);
   ArrayInitialize(Zig_low,0);
   return(0);
 } 
   
int deinit()
{ 
   return(0);
}

void start()
  {
  
   static datetime tmp;
  

   //  On every tick
   if (tmp!= Time[0]) 
  
   {  tmp =  Time[0];
   
      double zh=iCustom(Symbol(),0,"ZigZag.ex4",6,5,3,1,20);
      double zl=iCustom(Symbol(),0,"ZigZag.ex4",6,5,3,0,20);

      Zig_high[cnt]=zh;
      Zig_low[cnt]=zl;
      cnt=cnt+1;
   
      Alert(" Zig   zh=",zh,"  zl=",zl,"  cnt=",cnt-1);
   
  } // Every tick loop
         
   
  }

Será que estou usando o indicador ziguezague errado ou se cometi um erro no código? Não consegui encontrar o problema, por isso peço gentilmente sua ajuda para identificar meu problema.

Obrigado

 
aed71:

Olá,

Estou tentando desenvolver um especialista que escave os dados históricos (pico e fundo) para ser usado por meu principal especialista. Decidi usar o indicador ziguezague, pois é simples e encontra o alto/baixo facilmente.

Meu problema é que quando chamo o ZigZag.ex4 usando a função iCustom(), não consigo obter os valores altos e baixos corretos. Para evitar a repintura, usei o índice 20 do indicador iCustom() como uma proteção básica para a repintura.

Há dois buffers em código ZigZag (usando a versão de metacotas https://www.mql5.com/en/code/7796 ). Posso tomar os valores alto e baixo em sentido contrário, mas não importa muito no momento.

Alguns dos valores correspondem ao código que alguns não correspondem e, no Diário, posso ver tanto os valores altos como os baixos na mesma coluna, o que não pode ser possível.

Meu código está abaixo:

Será que estou usando o indicador ziguezague errado ou se cometi um erro no código? Não consegui encontrar o problema, por isso peço gentilmente sua ajuda para identificar meu problema.

Obrigado

Você pode dizer lendo o código MACD Amostra como funciona essa EA ??

Parece-me que você nunca tentou ....

o que você escreveu é como se eu fiz algo ..... não sei o que acontece Você pode me dizer o que eu fiz ???

Cada loop de tique-taque qual é seu loop de tique-taque ??

Este ???

   if (tmp!= Time[0]) 
  
   {  tmp =  Time[0];
   
      double zh=iCustom(Symbol(),0,"ZigZag.ex4",6,5,3,1,20);
      double zl=iCustom(Symbol(),0,"ZigZag.ex4",6,5,3,0,20);

      Zig_high[cnt]=zh;
      Zig_low[cnt]=zl;
      cnt=cnt+1;
   
      Alert(" Zig   zh=",zh,"  zl=",zl,"  cnt=",cnt-1);
   
  } // Every tick loop

sim então onde está o laço ??

não então explique linha por linha o que seu código significa...

 
aed71: Será que estou usando o indicador zig-zag errado ou se cometi um erro no código?
  1. Se você tivesse pesquisado o fórum, teria encontrado sua resposta.
  2.  double zl=iCustom(Symbol(),0,"ZigZag.ex4",6,5,3,0,20);
    
    ZigZag não preenche todos os elementos buffer (ele usa DRAW_SECTION.) Faça sua chamada em loop até encontrar o turno que tenha um valor diferente de zero.
 
WHRoeder:
  1. Se você tivesse pesquisado o fórum, teria encontrado sua resposta.
  2. ZigZag não preenche todos os elementos buffer (ele usa DRAW_SECTION.) Faça sua chamada em loop até encontrar o turno que tenha um valor diferente de zero.


Sim, eu sei que ele não preencherá todos os elementos tampão. Quero colocar todos os dados em um array incluindo zeros (se não houver altos e baixos) e também os valores altos e baixos. A razão para isso é que eu gostaria de ter outro processo dentro do deinit() para calcular a diferença de tick entre altos e baixos usando os arrays. Quero dizer, por exemplo, quantos ticks foram passados entre 2 altos e a diferença entre alto e baixo. Mas eu ainda não posso chegar a essa etapa.

Por que ambos retornam alto e baixo ao mesmo tempo que eu imaginava na foto (parte do diário com ???? marca ao lado?) E esses valores não correspondem a nenhum alto ou baixo... Este é o meu número principal...

Obrigado ...

 
deVries:

Você pode dizer lendo o código MACD Amostra como funciona essa EA ??

Parece-me que você nunca tentou ....

o que você escreveu é como se eu fiz algo ..... não sei o que acontece Você pode me dizer o que eu fiz ???

Cada loop de tique-taque qual é seu loop de tique-taque ??

Este ???

sim então onde está o laço ??

não então explique linha por linha o que seu código significa...

Acho que não tenho problemas com o loop, o loop funciona e imprime os resultados. ele verifica o prazo (15M no meu caso) e calcula os valores em ziguezague e as impressões. Por favor, verifique o retângulo verde como ele funciona a cada 15 minutos. A função Start() em si é um laço, não é?

A cada 15M

 
aed71:

Acho que não tenho problemas com o loop, o loop funciona e imprime os resultados. ele verifica o prazo (15M no meu caso) e calcula os valores em ziguezague e as impressões. Por favor, verifique o retângulo verde como ele funciona a cada 15 minutos. A função Start() em si é um laço, não é?



Você está certo que a função Start() em si é um loop

mas onde começa esse laço e onde termina a função Start() ??

está em outro lugar ...

as mensagens que você imprimiu não são repetidas a cada tick ....

Então o que você está fazendo ......??

Tente explicar as linhas de seu código ..... o máximo que puder

 
deVries:


Você está certo que a função Start() em si é um loop

mas onde começa esse loop e onde termina a função Start() ??

está em outro lugar ...

as mensagens que você imprimiu não são repetidas a cada tique ....

Então o que você está fazendo ......??

Tente explicar as linhas de seu código ..... o máximo que puder


Minhas desculpas se não consegui explicar corretamente.

Este especialista é para ser usado para o backtest e meu objetivo é encontrar altos e baixos históricos no gráfico de 15M. Vou então reprocessar os dados altos e baixos para calcular a fase e a amplitude do gráfico.

O que fiz; usei duas matrizes para armazenar o valor alto e baixo e um contador para contar os ticks. O tamanho da matriz 1000 é mais do que suficiente já que estou rodando por 2 dias no máximo (1440/15=96 carrapatos por dia).

int cnt=0;
double Zig_high[1000];
double Zig_low[1000];

na função init() estou preenchendo as matrizes com zero.

na função start(), estou verificando se um novo tick foi acionado com o código abaixo

 if (tmp!= Time[0]) 
  
   {  tmp =  Time[0];

   // the code here runs every 15M.

   }

Portanto, a função start() tem um loop contínuo até que o backtest (2 dias) seja finalizado.

Minha principal questão é chamar o ZigZag, penso eu. Abaixo eu estou chamando o indicador ziguezague. Normalmente, se houver um valor alto ou baixo, ele deve retornar com um valor diferente de zero. Mas no meu caso, às vezes ele retorna tanto baixo quanto alto com o mesmo valor, o que é impossível.


  double zh=iCustom(Symbol(),0,"ZigZag.ex4",6,5,3,1,20);
  double zl=iCustom(Symbol(),0,"ZigZag.ex4",6,5,3,0,20);

  Zig_high[cnt]=zh;
  Zig_low[cnt]=zl;
  cnt=cnt+1;

Talvez eu não tenha entendido as arrays usadas nas Metaquotas orginais do indicador ziguezague (veja abaixo). Meu entendimento é que estes são usados para armazenar valores altos e baixos.

//---- indicator buffers
double ExtMapBuffer[];
double ExtMapBuffer2[];

Obrigado

 

Leitura e aprendizagem

Isto também pode ajudá-lo um pouco

Explicação detalhada do iCustom

 
Também estou anexando meu código...
Arquivos anexados:
 
O que a Janela de Dados está exibindo ??
 
deVries:
O que a Janela de Dados está exibindo ??

O gráfico abaixo mostra o valor mínimo (tanto o valor do ponto do cursor, o valor da janela de dados e a saída é a mesma)

1o.

A parte mais alta do gráfico é a parte mais alta, 6 ticks depois. Tanto a janela de dados quanto os pontos de cursor são os mesmos, porém a saída não é a mesma e, além disso, retorna tanto o valor baixo quanto o alto.

2o.2o.

Eu verifiquei se o indicador iCustom() carrega corretamente. O valor baixo é o mesmo, mas o valor alto não é. Poderia ser relacionado com o indicador ZigZag?

O que estou fazendo de errado, eu realmente não consegui entender.

Razão: