You are on page 1of 3

// Indicador: ZigZag Lines - TT

// v1.0: release
// Tonny Matos Siqueira - tmsiqueira@gmail.com
// Telegram: @tmsiqueira

// Parametros de configuracao //
// Colocar zero para ativar o ATR
// Ou colocar o valor de desvio
double deviation = 0;

// Parametros de configuracao do ATR


def ATRsmoothing = 20;
def ATRmultiplicador = 1.2;

// Fim Parametros de configuracao //


// -------------------------------//

def cds = newLineData();


def size = size();
def cl = close();
def bufS = new double[size];
def bufT = new double[size];
def dir = new double[size]; //buffer de direcao do zigzag 0-desce 1-sobe
def center = new double[size];
def lasthigh = new int[size];
def lastlow = new int[size];
def atr = ATR(ATRsmoothing,0);
double dev = 0;
dir[0]=0; //inicializa com zero.
center[0]=cl.value(0);

//inicializa
for (int i=0; i<size ; i++)
{
bufS[i]=0;
bufT[i]=0;
}
for ( int i = ATRsmoothing; i < size; i++ )
{
if (deviation == 0) dev = atr.value(i-ATRsmoothing+1)*ATRmultiplicador; else dev
= deviation;
dir[i]=dir[i-1];
center[i]=center[i-1];

if ((cl.value(i)-center[i])>=dev) dir[i]=1;
else if ((cl.value(i)-center[i])<=-dev) dir[i]=-1;

lasthigh[i]=lasthigh[i-1];
lastlow[i]=lastlow[i-1];

def restart;
switch(dir[i])
{
case 1: //subindo
if (cl.value(i)>center[i]) center[i]=cl.value(i);
switch(dir[i-1])
{
case 1: //estava subindo, continuacao
for (restart=lastlow[i]+1;restart<=i;restart++)
{
bufS[restart]=cl.value(i)-cl.value(lastlow[i]);
bufT[restart]=i-lastlow[i];
}
if(cl.value(i)>cl.value(lasthigh[i]))
{
lasthigh[i]=i;
}
break;

case -1: //estava descendo, reversao


//corrige a descida anterior
for (restart=lasthigh[i]+1;restart<=lastlow[i];restart++)
{
bufS[restart]=cl.value(lasthigh[i])-cl.value(lastlow[i]);
bufT[restart]=lastlow[i]-lasthigh[i];
dir[restart]=-1;
}
//corrige a subida atual
for(restart=lastlow[i]+1;restart<=i;restart++)
{
dir[restart]=1;
}
lasthigh[i]=i;
break;
}
break;
case -1: //descendo
if (cl.value(i)<center[i]) center[i]=cl.value(i);
switch(dir[i-1])
{
case -1: //estava descendo, continuacao
for (restart=lasthigh[i]+1;restart<=i;restart++)
{
bufS[restart]=cl.value(lasthigh[i])-cl.value(i);
bufT[restart]=i-lasthigh[i];
}
if(cl.value(i)<cl.value(lastlow[i]))
{
lastlow[i]=i;
}
break;
case 1: //estava subindo, reversao
//corrige a subida anterior
for (restart=lastlow[i]+1;restart<=lasthigh[i];restart++)
{
bufS[restart]=cl.value(lasthigh[i])-cl.value(lastlow[i]);
bufT[restart]=lasthigh[i]-lastlow[i];
dir[restart]=1;
}
//corrige a descida atual
for(restart=lasthigh[i]+1;restart<=i;restart++)
{
dir[restart]=-1;
}
lastlow[i]=i;
break;
}
break;
}
}

double ax, bx;


int ix;
int i;
for (i=1; i<size-1 ; i++)
{
ax = dir[i]*bufS[i]/bufT[i];
if (dir[i]!=dir[i-1]) // mudança do sentido
{
bx = cl.value(i-1);
ix = i-1;
}

if ((dir[i]==-1 && dir[i+1]==-1) || (dir[i]==1 && dir[i+1]==-1)) cds.add(ax*(i-


ix)+bx,255,0,0);
// if ((dir[i]==-1)) cds.add(ax*(i-ix)+bx,255,0,0);
else cds.add(ax*(i-ix)+bx,0,255,0);
}
cds.add(ax*(i-ix)+bx);

r = cds;

You might also like