Problema com o indicador ZigZag - página 2

 
Esqueci de destacar os valores indicadores, o mínimo corresponde, mas o máximo não corresponde como tentei mostrar no 2º gráfico...
 
aed71:

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)

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.

Verifiquei se o indicador de carga iCustom() está correto. 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.


Eu vejo apenas um valor vindo de seu indicador ZigZag

este valor o que é ??

 
aed71:

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)

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.

Verifiquei se o indicador de carga iCustom() está correto. 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.

Você está usando o ZigZag incorretamente em seu exemplo iCustom. O ZigZag padrão por MetQuotes tem TRÊS (não dois) Buffers (Modos ou Índice de Linha no iCustom)

  1. Modo = 0: Mantenha os pontos ZigZag alto e baixo.
  2. Mode = 1: Pontos altos mas não necessariamente apenas pontos ZigZag (pois também detém pontos de repintura).
  3. Mode = 2: Pontos baixos, mas não necessariamente apenas pontos ZigZag (pois também detém pontos de repintura).

Você precisará comparar o primeiro buffer (Modo 0) com os outros 2 buffers para decidir se é um ponto alto ou um ponto baixo (por exemplo, se ambos Buffer 1 e Buffer 3 têm o mesmo valor, então é um ponto baixo ZigZag, e se ambos Buffer 1 e Buffer 2 são o mesmo, então é um ponto alto).

Além disso, para entender melhor como funciona um ZigZag e como ele pinta novamente, sugiro brincar com meu indicador ZigZagZug. Entretanto, em seu código, use o MetaQuotes ZigZag, pois ele é mais rápido. Minha versão faz mais processamento por causa das características extras e é, portanto, mais lenta.

PS! Se o Buffer 1 (Modo = 0) tem um valor de 0,0, mas os outros buffers têm valores não zero, então eles são pontos de repintura mais antigos e NÃO pontos ZigZag.

Em seu código você está usando o Buffer Mode 0 como o Buffer Baixo e o Buffer Mode 1 como o Alto. Isso é totalmente incorreto.

 
FMIC:

Você está usando o ZigZag incorretamente em seu exemplo iCustom. O ZigZag padrão por MetQuotes tem TRÊS (não dois) Buffers (Modos ou Índice de Linha no iCustom)

  1. Modo = 0: Mantenha os pontos ZigZag alto e baixo.
  2. Mode = 1: Pontos altos mas não necessariamente apenas pontos ZigZag (pois também detém pontos de repintura).
  3. Mode = 2: Pontos baixos mas não necessariamente apenas pontos ZigZag (pois também detém pontos de repintura).

Você precisará comparar o primeiro buffer (Modo 0) com os outros 2 buffers para decidir se é um ponto alto ou um ponto baixo (por exemplo, se ambos Buffer 1 e Buffer 3 têm o mesmo valor, então é um ponto baixo ZigZag, e se ambos Buffer 1 e Buffer 2 são o mesmo, então é um ponto alto).

Além disso, para entender melhor como funciona um ZigZag e como ele pinta novamente, sugiro brincar com meu indicador ZigZagZug. Entretanto, em seu código, use o MetaQuotes ZigZag, pois ele é mais rápido. Minha versão faz mais processamento por causa das características extras e é, portanto, mais lenta.

PS! Se o Buffer 1 (Modo = 0) tem um valor de 0,0, mas os outros buffers têm valores não zero, então eles são pontos de repintura mais antigos e NÃO pontos ZigZag.

Em seu código você está usando o Buffer Mode 0 como o Buffer Baixo e o Buffer Mode 1 como o Alto. Isso é totalmente incorreto.


Veja aqui https://www.mql5.com/en/forum/149492/page2#912747 outsidebars é um problema para o antigo código Zigzag

A linha amarela está dando uma maneira melhor de como o ziguezague tem que ser exibido.

 
deVries:


Veja aqui https://www.mql5.com/en/forum/149492/page2#912747 outsidebars é um problema para o antigo código Zigzag

A linha amarela está dando uma maneira melhor de como o ziguezague tem que ser exibido


Os bares externos não têm nada a ver com o atual dilema do "aed71's". Seu uso do ZigZag é simplesmente incorreto.

Por favor, não se desvie do problema atual, pois você só vai confundir a situação.

Além disso, eu também dei um link para meu código ZigZagZug que não tem esse problema.

 
FMIC:

Você está usando o ZigZag incorretamente em seu exemplo iCustom. O ZigZag padrão por MetQuotes tem TRÊS (não dois) Buffers (Modos ou Índice de Linha no iCustom)

  1. Modo = 0: Mantenha os pontos ZigZag alto e baixo.
  2. Mode = 1: Pontos altos mas não necessariamente apenas pontos ZigZag (pois também detém pontos de repintura).
  3. Mode = 2: Pontos baixos, mas não necessariamente apenas pontos ZigZag (pois também detém pontos de repintura).

Você precisará comparar o primeiro buffer (Modo 0) com os outros 2 buffers para decidir se é um ponto alto ou um ponto baixo (por exemplo, se ambos Buffer 1 e Buffer 3 têm o mesmo valor, então é um ponto baixo ZigZag, e se ambos Buffer 1 e Buffer 2 são o mesmo, então é um ponto alto).

Além disso, para entender melhor como funciona um ZigZag e como ele pinta novamente, sugiro brincar com meu indicador ZigZagZug. Entretanto, em seu código, use o MetaQuotes ZigZag, pois ele é mais rápido. Minha versão faz mais processamento por causa das características extras e, portanto, é mais lenta.

PS! Se Buffer 1 (Modo = 0) tem um valor 0, mas os outros buffers têm valores, então eles são pontos de repintura mais antigos.


Ótimo, obrigado pelas dicas importantes! Agora eu entendi porque não funciona...

Acho que o código original do Metaquotes ZigZag não está correto, uma vez que ele tem apenas 2 buffers. Portanto, eu estava pensando que um deles deveria ser alto e o outro baixo.

De fato, o título também não coincide, eu vi recentemente. Alguém deveria verificá-lo!

Estou me referindo ao código aqui https://www.mql5.com/en/code/7796

//+------------------------------------------------------------------+
//|                                        Custom Moving Average.mq4 |
//|                      Copyright © 2005, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net/"

#property indicator_chart_window
#property indicator_buffers 1
#property  indicator_color1 Red
//---- indicator parameters
extern int ExtDepth=12;
extern int ExtDeviation=5;
extern int ExtBackstep=3;
//---- indicator buffers
double ExtMapBuffer[];
double ExtMapBuffer2[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   IndicatorBuffers(2);
//---- drawing settings
   SetIndexStyle(0,DRAW_SECTION);
//---- indicator buffers mapping
   SetIndexBuffer(0,ExtMapBuffer);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexEmptyValue(0,0.0);
//---- indicator short name
   IndicatorShortName("ZigZag("+ExtDepth+","+ExtDeviation+","+ExtBackstep+")");
//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   int    shift, back,lasthighpos,lastlowpos;
   double val,res;
   double curlow,curhigh,lasthigh,lastlow;

   for(shift=Bars-ExtDepth; shift>=0; shift--)
     {
      val=Low[Lowest(NULL,0,MODE_LOW,ExtDepth,shift)];
      if(val==lastlow) val=0.0;
      else 
        { 
         lastlow=val; 
         if((Low[shift]-val)>(ExtDeviation*Point)) val=0.0;
         else
           {
            for(back=1; back<=ExtBackstep; back++)
              {
               res=ExtMapBuffer[shift+back];
               if((res!=0)&&(res>val)) ExtMapBuffer[shift+back]=0.0; 
              }
           }
        } 
      ExtMapBuffer[shift]=val;
      //--- high
      val=High[Highest(NULL,0,MODE_HIGH,ExtDepth,shift)];
      if(val==lasthigh) val=0.0;
      else 
        {
         lasthigh=val;
         if((val-High[shift])>(ExtDeviation*Point)) val=0.0;
         else
           {
            for(back=1; back<=ExtBackstep; back++)
              {
               res=ExtMapBuffer2[shift+back];
               if((res!=0)&&(res<val)) ExtMapBuffer2[shift+back]=0.0; 
              } 
           }
        }
      ExtMapBuffer2[shift]=val;
     }

   // final cutting 
   lasthigh=-1; lasthighpos=-1;
   lastlow=-1;  lastlowpos=-1;

   for(shift=Bars-ExtDepth; shift>=0; shift--)
     {
      curlow=ExtMapBuffer[shift];
      curhigh=ExtMapBuffer2[shift];
      if((curlow==0)&&(curhigh==0)) continue;
      //---
      if(curhigh!=0)
        {
         if(lasthigh>0) 
           {
            if(lasthigh<curhigh) ExtMapBuffer2[lasthighpos]=0;
            else ExtMapBuffer2[shift]=0;
           }
         //---
         if(lasthigh<curhigh || lasthigh<0)
           {
            lasthigh=curhigh;
            lasthighpos=shift;
           }
         lastlow=-1;
        }
      //----
      if(curlow!=0)
        {
         if(lastlow>0)
           {
            if(lastlow>curlow) ExtMapBuffer[lastlowpos]=0;
            else ExtMapBuffer[shift]=0;
           }
         //---
         if((curlow<lastlow)||(lastlow<0))
           {
            lastlow=curlow;
            lastlowpos=shift;
           } 
         lasthigh=-1;
        }
     }
  
   for(shift=Bars-1; shift>=0; shift--)
     {
      if(shift>=Bars-ExtDepth) ExtMapBuffer[shift]=0.0;
      else
        {
         res=ExtMapBuffer2[shift];
         if(res!=0.0) ExtMapBuffer[shift]=res;
        }
     }
  }
 
aed71:


Ótimo, obrigado pelas dicas importantes! Agora eu entendi porque não funciona...

Acho que o código original do Metaquotes ZigZag não é correto, uma vez que ele tem apenas 2 buffers. Portanto, eu estava pensando que um deles deveria ser alto e o outro baixo.

De fato, o título também não coincide, eu vi recentemente. Alguém deveria verificá-lo!

Estou me referindo ao código aqui https://www.mql5.com/en/code/7796


Não use esse Código! Isso é Antigo!

Use o código que está sendo empurrado atualmente através do LiveUpdates. Use a versão atual de 600+ ou pelo menos a versão 509.

PS! NB! Use também apenas "ZigZag" no Nome e não "ZigZag.ex4" no iCustom.

 
FMIC:


Não use esse Código! Isso é Antigo!

Use o código que está sendo empurrado atualmente através do LiveUpdates. Use a versão atual de 600+ ou pelo menos a versão 509.

PS! NB! Use também apenas "ZigZag" no Nome e não "ZigZag.ex4" no iCustom.


Olá FMIC,

Obrigado pelas dicas. Eu estava adicionando ex4 no final do arquivo para não esquecer de compilá-lo. Infelizmente, meu novo build 610 ZigZag foi substituído pelo antigo.

Decidi usar o seu, já que o tempo não é um problema para mim. Eu também enfrento alguns problemas aqui, eu apreciaria se você pudesse me orientar.

Usei o mesmo código indicado acima, apenas mudei o nome do arquivo com sua versão. Estou usando os parâmetros 6,5,3; essa é a única diferença em relação às suas configurações padrão.

O que eu enfrentei alguns problemas:

Primeiramente o indicador carrega cada vez em cada tick para ler os valores zh,zl. E no final ele libera todas as cargas no final (que você não pode ver na figura) dizendo algo como "2014.02.22 09:35:09.171 2013.11.01 22:55 Indicador personalizado ZigZagZug EURUSD,M15: removido". Favor consultar o arquivo de log que anexei. Isso causa algum problema de memória mais tarde?

Em segundo lugar no diário, o contador cnt saltou de cnt8 para cnt84, o que é estranho. Nos registros, ele não pula. Acho que eu deveria considerar os logs como valores corretos.

O terceiro e mais crítico é que ele encontrou dois pontos baixos, conseqüentemente, o que não deveria. Na figura eu quero obter os valores altos e baixos das linhas ziguezague cinzas, mas quando escrevo todos os altos e baixos no tronco, eles são exatamente os mesmos com seus pontos de cor rosa e ciano. Entretanto, preciso apenas dos valores em ziguezague. Verifiquei os outros amortecedores, mas não trouxe os valores corretos. Alguma sugestão? Ou devo ir com o clássico ziguezague (para build 610?)

Obrigado.

ZigZagZug

 
aed71:


Olá FMIC,

Obrigado pelas dicas. Eu estava adicionando ex4 no final do arquivo para não esquecer de compilá-lo. Infelizmente, meu novo build 610 ZigZag foi substituído pelo antigo.

Decidi usar o seu, já que o tempo não é um problema para mim. Eu também enfrento alguns problemas aqui, eu apreciaria se você pudesse me orientar.

Usei o mesmo código indicado acima, apenas mudei o nome do arquivo com sua versão. Estou usando os parâmetros 6,5,3; essa é a única diferença em relação às suas configurações padrão.

Alguma sugestão? Ou devo ir com o clássico ziguezague (para build 610?)

Obrigado.

Não há nada de errado em usar o novo 610 ZigZag. Na verdade, eu o encorajo a usar isso em vez disso para que seja compatível com construções futuras. Não use o antigo ou mesmo o meu.

Meu indicador ZigZagZug usa parâmetros extras e em uma ordem e tipo diferentes, portanto você não pode simplesmente usar um iCustom similar ao que você está usando agora. Ele é completamente diferente.

Também utilizo 7 buffers no indicador para as características extras. Ele deve ser usado como ferramenta de aprendizagem visual para entender o ZigZag e não realmente para uso em um EA.

PS! É normal ter um indicador de carga e descarga várias vezes durante um back-test de um EA usando o iCustom. Tudo depende de como o EA e o Indicador são codificados. Para evitar isso e para tornar uma EA mais rápida, normalmente recodifico apenas o código essencial na própria EA para não depender de indicadores externos, mas essa é outra questão não diretamente relacionada ao seu caso. Apenas uma sugestão para seus futuros EA.

 
aed71:


Olá FMIC,

... Quero obter os valores altos e baixos das linhas em ziguezague cinzento, mas quando escrevo todos os altos e baixos no tronco, eles são exatamente os mesmos com seus pontos de cor rosa e ciano. Entretanto, preciso apenas dos valores em ziguezague. ...

Obrigado.


Como explicado anteriormente em um post anterior, você não pode usar apenas o buffer Alto e Baixo para obter pontos ZigZag, pois eles também incluem pontos repintados (círculos aqua e magenta em ZigZagZug). No ZigZag padrão também é assim, mas você simplesmente não os vê. É por isso que meu indicador os mostra para que você possa entendê-los melhor.

Você tem que comparar os amortecedores Alto e Baixo com o primeiro que contém AMBOS Baixo e Alto a fim de filtrar APENAS os pontos ZigZag.

NB! Você terá que comparar o primeiro buffer (Modo 0) com os outros 2 buffers para decidir se é um Ponto Alto ou um Ponto Baixo (por exemplo, se ambos Buffer 1 e Buffer 3 têm o mesmo valor, então é um ponto ZigZag baixo, e se ambos Buffer 1 e Buffer 2 são o mesmo, então é um ponto Alto).

Se você quiser, anexe seu arquivo a um post, e eu o corrigirei para que você possa ver como usá-lo corretamente ( ATTACH it, não use SRC para não ser um post longo ).

Razão: