// Downloaded From https://www.WiseStockTrader.com
// COG: Center of Gravity indicator
// AFL code by E.M.Pottasch, 2011
// added extend bars, Nov 2014
// code based on: chartstudio.whselfinvest.com/files/CenterGravity_0.ctl
 
sx=Null;b=Null;ai=Null;x=Null;
reg=regext=x1=x2=x3=z1=z2=z3=Null; 
rega=x1a=x2a=x3a=z1a=z2a=z3a=Null;  
     
bi=BarIndex();  
eb=LastValue(bi);   
order=Param("n-th Order",3,1,8,1);  
bars=Param("Lookback Period",100,50,500,1);
extend=Param("Extend Fit (Bars)",10,0,20,1); 
sv=ParamToggle("Use Selected Value","Off|On",1);
alt=ParamToggle("Error Levels","Fibonacci|Standard",1);
ecart=1.61803399;
   
if(sv)
{
    eb=SelectedValue(bi);
    bb=Max(0,eb-bars);
    xshift=extend;
}
else
{
    bb=Max(0,eb-bars);
    xshift=extend;
}
fin=eb;
nn=order+1;
sx[1]=bars+1;
 
if(fin>bars)
{
	for(mi=1;mi<=2*nn-2;mi++)
	{
		suml=0;
		for(n=0;n<=bars;n++)
		{
			suml=suml+n^mi;
		}
		sx[mi+1]=suml;
	}
	for(mi=1;mi<=nn;mi++)
	{
		suml=0;
		for(n=0;n<=bars;n++)
		{
			if (mi==1)
				suml=suml+Close[fin-n];
			else
				suml=suml+Close[fin-n]*n^(mi-1);
				b[mi]=suml;
		}
	}
	for(jj=1;jj<=nn;jj++)
	{
		for(ii=1;ii<=nn;ii++)
		{
			kk=ii+jj-1;
			ai[(ii-1)*nn+jj]=sx[kk];
		}
	}
	for(kk=1;kk<=nn-1;kk++)
	{
		ll=0;
		mm=0;
		for(ii=kk;ii<=nn;ii++)
		{
			if(abs(ai[(ii-1)*nn+kk])>mm)
			{
				mm=abs(ai[(ii-1)*nn+kk]);
				ll=ii;
			}
		}
		if(ll==0) break;
		if(ll!=kk)
		{
			for(jj=1;jj<=nn;jj++)
			{
				tt=ai[(kk-1)*nn+jj];
				ai[(kk-1)*nn+jj]=ai[(ll-1)*nn+jj];
				ai[(ll-1)*nn+jj]=tt;
			}
			tt=b[kk];
			b[kk]=b[ll];
			b[ll]=tt;
		}
		for(ii=kk+1;ii<=nn;ii++)
		{
			qq=ai[(ii-1)*nn+kk]/ai[(kk-1)*nn+kk];
			for(jj=1;jj<=nn;jj++)
			{
				if(jj==kk)
					ai[(ii-1)*nn+jj]=0;
				else
					ai[(ii-1)*nn+jj]=ai[(ii-1)*nn+jj]-qq*ai[(kk-1)*nn+jj];
			}
			b[ii]=b[ii]-qq*b[kk];
		}
	}
	x[nn]=b[nn]/ai[nn*nn];
	for(kk=1;kk<=nn-1;kk++)
	{
		tt=0;
		ii=nn-kk;
		for(jj=1;jj<=nn-ii;jj++)
		{
			tt=tt+ai[(ii-1)*nn+ii+jj]*x[ii+jj];
			if(ai[(ii-1)*nn+ii]!=0)
				x[ii]=(b[ii]-tt)/ai[(ii-1)*nn+ii];
		}
	}
	for(n=0;n<=bars;n++)
	{
		suml=0;
		for(kk=1;kk<=order;kk++)
		{
			suml=suml+x[kk+1]*n^kk;
		}
		reg[fin-n]=x[1]+suml;
	}
	for(n=-0;n>=-extend;n--)
	{
		suml=0;
		for(kk=1;kk<=order;kk++)
		{
			suml=suml+x[kk+1]*n^kk;
		}
		if((fin-n-extend)>=BarCount) break;
		regext[fin-n-extend]=x[1]+suml;
	}
}

//SetChartOptions(0,chartShowDates);
SetChartOptions(0,chartShowDates,chartGridMiddle,0,0,extend); 
Title = "Symbol: "+ Name()+ "\nPoly Order: "+order;
if(alt)
{
dev=StDev(Close-reg,bars);
sd=dev[fin];
x1a=reg+sd*1;//68%
x2a=reg+sd*2;//95%
x3a=reg+sd*3;//99.83%
z1a=reg-sd*1;
z2a=reg-sd*2;
z3a=reg-sd*3;
x1aext=regext+sd*1;//68%
x2aext=regext+sd*2;//95%
x3aext=regext+sd*3;//99.83%
z1aext=regext-sd*1;
z2aext=regext-sd*2;
z3aext=regext-sd*3;
Plot(C, "Close",colorLightGrey,styleCandle);
Plot(reg,"reg",colorBlue,1);
Plot(x3a,"x3a",ColorRGB(255,0,0),styleThick);
Plot(x2a,"x2a",ColorRGB(255,100,100),styleDashed);
Plot(x1a,"x1a",ColorRGB(255,200,200),styleDashed);
Plot(z3a,"z3a",ColorRGB(0,255,0),styleThick);
Plot(z2a,"z2a",ColorRGB(100,255,100),styleDashed);
Plot(z1a,"z1a",ColorRGB(200,255,200),styleDashed);
Plot(regext,"reg",colorBlue,styleDashed|styleNoLabel,Null,Null,xshift,0,1);
Plot(x3aext,"x3a",ColorRGB(255,0,0),styleDashed|stylenolabel,Null,Null,xshift,0,1);
Plot(x2aext,"x2a",ColorRGB(255,100,100),styleDashed|styleNoLabel,Null,Null,xshift,0,1);
Plot(x1aext,"x1a",ColorRGB(255,200,200),styleDashed|styleNoLabel,Null,Null,xshift,0,1);
Plot(z3aext,"z3a",ColorRGB(0,255,0),styledashed|styleNoLabel,Null,Null,xshift,0,1);
Plot(z2aext,"z2a",ColorRGB(100,255,100),styleDashed|styleNoLabel,Null,Null,xshift,0,1);
Plot(z1aext,"z1a",ColorRGB(200,255,200),styleDashed|styleNoLabel,Null,Null,xshift,0,1);
//PlotOHLC(x3a,x3a,x1a,x1a,"",ColorRGB(30,0,0),styleCloud|styleNoLabel,0,0,0,-1); 
//PlotOHLC(z1a,z1a,z3a,z3a,"",ColorRGB(0,30,0),styleCloud|styleNoLabel,0,0,0,-1); 
}
else
{
dev=StDev(Close,bars);
sd=ecart*dev[fin];
x1=reg+sd/(1.382*1.618);
x2=reg+sd/1.382;
x3=reg+sd;
z1=reg-sd/(1.382*1.618);
z2=reg-sd/1.382;
z3=reg-sd;
x1ext=regext+sd/(1.382*1.618);
x2ext=regext+sd/1.382;
x3ext=regext+sd;
z1ext=regext-sd/(1.382*1.618);
z2ext=regext-sd/1.382;
z3ext=regext-sd;
Plot(C, "Close",colorLightGrey,styleCandle);
Plot(reg,"reg",colorBlue,1);
Plot(x3,"x3",ColorRGB(255,0,0),styleThick);
Plot(x2,"x2",ColorRGB(255,100,100),styleDashed);
Plot(x1,"x1",ColorRGB(255,200,200),styleDashed);
Plot(z3,"z3",ColorRGB(0,255,0),styleThick);
Plot(z2,"z2",ColorRGB(100,255,100),styleDashed);
Plot(z1,"z1",ColorRGB(200,255,200),styleDashed);
Plot(regext,"reg",colorBlue,styledashed|styleNoLabel,Null,Null,xshift,0,1);
Plot(x3ext,"x3",ColorRGB(255,0,0),styledashed|styleNoLabel,Null,Null,xshift,0,1);
Plot(x2ext,"x2",ColorRGB(255,100,100),styleDashed|styleNoLabel,Null,Null,xshift,0,1);
Plot(x1ext,"x1",ColorRGB(255,200,200),styleDashed|styleNoLabel,Null,Null,xshift,0,1);
Plot(z3ext,"z3",ColorRGB(0,255,0),styledashed|styleNoLabel,Null,Null,xshift,0,1);
Plot(z2ext,"z2",ColorRGB(100,255,100),styleDashed|styleNoLabel,Null,Null,xshift,0,1);
Plot(z1ext,"z1",ColorRGB(200,255,200),styleDashed|styleNoLabel,Null,Null,xshift,0,1);
//PlotOHLC(x3,x3,x2,x2,"",ColorRGB(30,0,0),styleCloud|styleNoLabel,0,0,0,-1); 
//PlotOHLC(z2,z2,z3,z3,"",ColorRGB(0,30,0),styleCloud|styleNoLabel,0,0,0,-1); 
}