O que as funções mais baixas e mais altas retornam - página 4

 
Vou tentar experimentar o código dado pelo compositor na primeira página. Talvez algo funcione.
 
nen:
Correto, ele é calculado. O número da célula é encontrado. Desta célula (série temporal) é tomado o valor do máximo ou mínimo da barra. Considera-se que o máximo foi encontrado nesta barra. Este valor é então colocado no buffer indicador com o número encontrado. O máximo do indicador deve corresponder ao máximo na barra. Em meu código, o máximo também é tirado da matriz (série de tempos) com o mesmo número encontrado e comparado com o valor de val. É verificado para ver se estamos fazendo a coisa certa: colocamos o número val no buffer com este número. Também deve ser igual ao máximo da barra. A comparação de números tirados do mesmo lugar é bastante correta.

Parece-me que a comparação ...==val, é perigosa porque é o número de célula que pode mudar de tique para tique. Especialmente em pequenos períodos de tempo, onde há muita combinação de Baixo e Alto. No entanto, devemos pensar bem, talvez nos referamos a momentos diferentes.
 
nen, você gostaria de testar este ziguezague? Na verdade, este é um pedido a todos que têm experiência no uso do ziguezague e sabem o que ele quer do ziguezague. Talvez você possa fazer algo útil a partir deste protótipo?
//+------------------------------------------------------------------+
//|                                                      CZigZag.mq4 |
//|                                         Copyright © 2006, Candid |
//|                                                   likh@yandex.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, Candid"
#property link      "likh@yandex.ru"

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Blue

//---- indicator parameters
extern int ExtDepth=12;
extern int ExtDeviation=5;
//extern int ExtBackstep=3;

int    shift;
double res;
int i;
int fBar;
double CurMax,CurMin;
int CurMaxPos,CurMinPos;
int CurMaxBar,CurMinBar;
double hPoint;
double mhPoint;
double EDev;
int MaxDist,MinDist;
bool FirstRun;
bool AfterMax,AfterMin;

//---- indicator buffers
double ZigZag[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init() {
//---- indicators
   SetIndexStyle(0,DRAW_SECTION);
//---- indicator buffers mapping
   SetIndexBuffer(0,ZigZag);
   SetIndexEmptyValue(0,0.0);
//---- indicator short name
   IndicatorShortName("CZigZag("+ExtDepth+","+ExtDeviation+")");
   
   FirstRun = true;
//----
  return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit() {
//----
   
//----
  return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start() {
  int counted_bars=IndicatorCounted();
  
  if (FirstRun) {
    hPoint = 0.5*Point;
    mhPoint = -hPoint;
//    EDev = ExtDeviation*Point;
    EDev = (ExtDeviation+0.5)*Point;
    AfterMax = true;
    AfterMin = true;
    fBar = Bars-1;
    CurMax = High[fBar];
    CurMaxBar = 1;
    CurMin = Low[fBar];
    CurMinBar = 1;
    MaxDist = 0;
    MinDist = 0;
    FirstRun = false;
  }
//----
  fBar = Bars-counted_bars-1;
  if (fBar > Bars-2) fBar = Bars-2;
  for(shift=fBar; shift>=0; shift--) {
    if (AfterMax) {
//      res = Low[shift]-CurMin-hPoint;
      res = Low[shift]-CurMin;
//      if (res < 0) {
      if (res < mhPoint) {
        ZigZag[Bars-CurMinBar] = 0;
        CurMin = Low[shift];
        CurMinBar = Bars-shift; 
        ZigZag[Bars-CurMinBar] = CurMin;
      } else {  //  if (res < 0)
//        if (res > 0 ) {
        if (res > hPoint ) {
          MaxDist = Bars-CurMaxBar-shift+1;
          MinDist = Bars-CurMinBar-shift+1;
          if ((MaxDist>ExtDepth && MinDist>ExtDepth) || res > EDev) {
            AfterMax = false;
            AfterMin = true;
            CurMaxBar = CurMinBar+1;
            CurMaxPos = Bars-CurMaxBar;
            CurMax = High[CurMaxPos];
            for (i=CurMaxPos-1;i>=shift;i--) {
              if (High[i] > CurMax+hPoint) {
                CurMaxBar = Bars-i;
                CurMax = High[i];
              }
            }  //  for (i=CurMaxPos-1;i>=shift;i--)
            ZigZag[Bars-CurMaxBar] = CurMax;
          }  //  if ((MaxDist>ExtDepth && MinDist>ExtDepth) || res > EDev)
        }  //  if (res > 0 )
      }  // else if (res < 0)
    }  //  if (AfterMax) 
    if (AfterMin) {
//      res = CurMax-High[shift]-hPoint;
      res = CurMax-High[shift];
//      if (res < 0) {
      if (res < mhPoint) {
        ZigZag[Bars-CurMaxBar] = 0;
        CurMax = High[shift];
        CurMaxBar = Bars-shift; 
        ZigZag[Bars-CurMaxBar] = CurMax;
      } else {  //  if (res < 0)
//        if (res > 0 ) {
        if (res > hPoint ) {
          MaxDist = Bars-CurMaxBar-shift+1;
          MinDist = Bars-CurMinBar-shift+1;
          if ((MaxDist>ExtDepth && MinDist>ExtDepth) || res > EDev) {
            AfterMin = false;
            AfterMax = true;
            CurMinBar = CurMaxBar+1;
            CurMinPos = Bars-CurMinBar;
            CurMin = Low[CurMinPos];
            for (i=CurMinPos-1;i>=shift;i--) {
              if (Low[i] < CurMin-hPoint) {
                CurMinBar = Bars-i;
                CurMin = Low[i];
              }
            }  //  for (i=CurMinPos-1;i>=shift;i--)
            ZigZag[Bars-CurMinBar] = CurMin;
          }  //  if ((MaxDist>ExtDepth && MinDist>ExtDepth) || res > EDev)
        }  //  if (res > 0 )
      }  // else if (res < 0)
    }  //  if (AfterMin) 
  }  //  for(shift=fBar; shift>=0; shift--)
//----
  return(0);
}
//+------------------------------------------------------------------+


Favor observar que embora os nomes dos parâmetros sejam mantidos, eles funcionam de maneira diferente.


 
Aqui também, confira meu ZigZag, talvez ajude a chegar ao fundo do assunto ....

//+------------------------------------------------------------------+
//|                                                        DT_ZZ.mq4 |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, klot."
#property link      "klot@mail.ru"

#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Aqua
#property indicator_color2 Blue
#property indicator_color3 Red
//---- indicator parameters
extern int ExtDepth=12;
//---- indicator buffers
double zzL[];
double zzH[];
double zz[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
 //  IndicatorBuffers(3);
//---- drawing settings
   SetIndexStyle(2,DRAW_ARROW);
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexStyle(0,DRAW_SECTION);
   SetIndexArrow(2,159);
   SetIndexArrow(1,159);
//---- indicator buffers mapping
   SetIndexBuffer(0,zz);
   SetIndexBuffer(1,zzH);
   SetIndexBuffer(2,zzL);
   SetIndexEmptyValue(0,0.0);
   SetIndexEmptyValue(1,0.0);
   SetIndexEmptyValue(2,0.0);
     
//---- indicator short name
   IndicatorShortName("DT_ZZ("+ExtDepth+")");
//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   int    i,shift,pos,lasthighpos,lastlowpos,curhighpos,curlowpos;
   double curlow,curhigh,lasthigh,lastlow;
   double min, max;
   ArrayInitialize(zz,0.0);
   ArrayInitialize(zzL,0.0);
   ArrayInitialize(zzH,0.0);
   
   lasthighpos=Bars; lastlowpos=Bars;
   lastlow=Low[Bars];lasthigh=High[Bars];
  for(shift=Bars-ExtDepth; shift>=0; shift--)
    {
      curlowpos=Lowest(NULL,0,MODE_LOW,ExtDepth,shift);
      curlow=Low[curlowpos];
      curhighpos=Highest(NULL,0,MODE_HIGH,ExtDepth,shift);
      curhigh=High[curhighpos];
      //------------------------------------------------
      if( curlow>=lastlow ) { lastlow=curlow; }
      else
         { 
            //идем вниз
            if( lasthighpos>curlowpos  ) 
            { 
            zzL[curlowpos]=curlow;
              ///*
              min=100000; pos=lasthighpos;
               for(i=lasthighpos; i>=curlowpos; i--)
                  { 
                    if (zzL[i]==0.0) continue;
                    if (zzL[i]<min) { min=zzL[i]; pos=i; }
                    zz[i]=0.0;
                  } 
               zz[pos]=min;
               //*/
            } 
          lastlowpos=curlowpos;
          lastlow=curlow; 
         }
      //--- high
      if( curhigh<=lasthigh )  { lasthigh=curhigh;}
      else
         {  
            // идем вверх
            if( lastlowpos>curhighpos ) 
            {  
            zzH[curhighpos]=curhigh;
           ///*
               max=-100000; pos=lastlowpos;
               for(i=lastlowpos; i>=curhighpos; i--)
                  { 
                    if (zzH[i]==0.0) continue;
                    if (zzH[i]>max) { max=zzH[i]; pos=i; }
                    zz[i]=0.0;
                  } 
               zz[pos]=max;
           //*/     
            }  
         lasthighpos=curhighpos;
         lasthigh=curhigh;    
         }       
    //----------------------------------------------------------------------
    }
 return(0);
}
//+------------------------------------------------------------------+



 
nen você gostaria de testar este ziguezague? Na verdade, este é um pedido a qualquer pessoa que tenha experiência com ziguezague e saiba o que quer de um ziguezague. Talvez você possa fazer algo útil a partir deste protótipo?
Tenha em mente que, embora os nomes dos parâmetros sejam os mesmos, eles funcionam de forma diferente.


Candidato. Vou dar uma olhada nisso. A primeira vez que o instalei, tive a seguinte observação.
Há vários bares consecutivos com os mesmos altos. Sua variante do ziguezague desenha uma pausa (topo) na última barra. Ou seja, a barra mais próxima a zero. Idealmente, o intervalo deveria ser traçado na primeira barra, que é a mais distante da barra zero. O primeiro vértice que aparece é significativo. O mesmo se passa com os parceiros. Posso citar várias fontes (da literatura), onde é necessário fazê-lo.
 
klot , obrigado. Seguindo a idéia de seu DT-ZigZag, agora fiz meu indicador para trabalhar com dados de alto prazo. Mas eu só deixei a idéia. Eu fiz meu próprio algoritmo. Ontem eu fiz mais algumas reparações em ziguezague. Agora eu o carreguei para testes coletivos. Tentarei certamente sua variante. Aqui está a descrição do indicador que causou toda a confusão: http://onix-trade.net/forum/index.php?showtopic=373. Observe que o modo DT-ZigZag utiliza o ziguezague externo que está incluído com o indicador. E este ziguezague externo às vezes falha na primeira viga. Uma nova versão do ziguezague externo está sendo testada.
 
klot Obrigado. Seguindo a idéia de seu DT-ZigZag, agora fiz meu indicador para trabalhar com dados de prazos mais altos. Mas eu deixei apenas a idéia. Eu fiz meu próprio algoritmo. Ontem eu fiz mais algumas reparações em ziguezague. Agora eu o carreguei para testes coletivos. Tentarei certamente sua variante. Aqui está a descrição do indicador que causou toda a confusão: http://onix-trade.net/forum/index.php?showtopic=373. Observe que o modo DT-ZigZag utiliza o ziguezague externo que está incluído com o indicador. E este ziguezague externo às vezes falha na primeira viga. Uma nova versão do ziguezague externo está sendo testada.

Sim, eu notei :) apenas uma idéia :) . Agora estou usando minha ZZ em todos os lugares (código no post acima) Funciona mais estável com outros dados TF.
 
nen:
Na primeira instalação, a seguinte observação surgiu imediatamente.
Há vários bares consecutivos com os mesmos altos. Sua opção em ziguezague faz uma pausa (topo) na última barra.
Aha, então eu escolhi a "opção" errada. Agora vou editar o código no posto de origem. O sinal das mudanças são as linhas comentadas da "opção" errada.
 
Candidato, agora está tudo bem.
Klot, opção interessante.

Se suas variantes em ziguezague mostram resultados interessantes, posso aplicá-las em meu desenvolvimento?
 
Se suas variantes em zig-zag mostram resultados interessantes, você pode aplicá-las em seu projeto?
Sim, é claro. Se o resultado do teste for positivo, vou até tentar adicioná-lo à Base de Código.
Razão: