// Downloaded From https://www.WiseStockTrader.com
//Gann level Plotter
//Abnash Singh 5-11-2011
//abnash1978@yahoo.co.uk
//You can do any of the following:
//Suppress candle or bar plotting
//Choose to plot candle or bar
//Show the Gann angle projections from Highs, Lows or Peaks and Troughs 
//(the latter can be delayed in appearance because of the Amibroker fn limitation)
//Extend the Gann angle range by changing the Gann Range
// Current settings will work for scrips that are in the range of the Nifty
//Show the Angle number from 0 - 6. Useful for you to decide your trading rules.

//Gann logic begin
SetBarsRequired( 5000, 0 );  

showcandlechart=ParamList("Show Candle chart","YES|NO");
stylecndl=ParamList("Bar/Candle chart","BAR|CANDLE");
SHowGann=ParamList("Show Gann Angles","No|Yes",1);
SHowGannlev=ParamList("Show Gann Angles Level","No|Yes");
MArkpktr=ParamList("Mark the Highs/Lows","No|Yes");

Gann=ParamList("GannAngles","High|Low|Peak|Trough");
gannrange=Param("Gann Range",25,1,200,1);
pkno=Param("Peak Number",1,1,100,1);
perchange=Param("Zig change %",0.2,0.1,1,0.01);
BarColor		= IIf(Close > Open, colorGreen, colorRed);
SetBarFillColor(BarColor);
if (stylecndl=="BAR")stylec=styleBar;
else stylec=styleCandle;
if (showcandlechart=="YES")
{
	
	Plot(C, "Close", colorWhite, styleNoTitle | stylec); 
}

avp=(O+C)/2;
tn=TimeNum();
Datex=DateNum();
Dayhigh=Daylow=Dayopen=Dayclose=0;
Minlow=Minhigh=mint=intvl=0;
gline0=gline1=gline2=gline3=gline4=gline5=gline6=gline7=gline8=0;

pk=Peak(H,perchange,1);
pkbars=PeakBars(H,perchange,1);
Tr=Trough(L,perchange,1);
trbars=TroughBars(L,perchange,1);
intvl=Interval()/60;
Clevel=0;
Hv=HHV(H,pkno);
Lv=LLV(L,pkno);
Hvbars=BarsSince(Hv==H);
Lvbars=BarsSince(Lv==L);
pi=3.1415926;
Mint=DayOfYear()*10000+Hour()*60+Minute();
entryprice=0;
for (i=1;i<BarCount;i++)
{


//day high low
	if (Datex[i]!=Datex[i-1])
	{
		Dayhigh[i]=H[i];
		Daylow[i]=L[i];
		Minlow[i]=Mint[i];
		Minhigh[i]=Mint[i];
	}
	else 
	{
		Dayhigh[i]=Dayhigh[i-1];
		Daylow[i]=Daylow[i-1];
		Minlow[i]=Minlow[i-1];
		Minhigh[i]=Minhigh[i-1];

		if (H[i]>Dayhigh[i])
		{
			Dayhigh[i]=H[i];
			Minhigh[i]=Mint[i];
		}
		if (L[i]<Daylow[i])
		{
			Daylow[i]=L[i];
			Minlow[i]=Mint[i];
		}
	}
//Gan Fan analysis
if (pkbars[i]==0 AND gann!="Low" AND Gann!="High")gann="Peak";
if (trbars[i]==0 AND gann!="Low" AND gann!="High")gann="Trough";

Minsincehi=int(Mint[i]/intvl)*intvl-Minhigh[i];
Minsincelo=int(Mint[i]/intvl)*intvl-Minlow[i];
dh=Dayhigh[i];
dl=daylow[i];
if (gann=="Peak")
{
	dh=pk[i];
	Minsincehi=intvl*pkbars[i];
}
else if (gann=="Trough")
{
	dl=tr[i];
	Minsincelo=intvl*trbars[i];
}

if (MArkpktr=="Yes")
{
	if (dh==H[i] AND (gann=="High" OR gann=="Peak"))PlotText("P",i,H[i]+5,colorOrange);
	if (dl==L[i] AND (gann=="Low" OR gann=="Trough"))PlotText("T",i,L[i]-5,colorOrange);
}


if ((gann=="High" OR gann=="Peak") AND Minsincehi>0)
{
	gline0[i]=dh-((minsincehi)*tan(0*90*pi/180));
	gline1[i]=dh-((minsincehi)*tan(0.125*90*pi/180));
	gline2[i]=dh-((minsincehi)*tan(0.25*90*pi/180));
	gline3[i]=dh-((minsincehi)*tan(0.382*90*pi/180));
	gline4[i]=dh-((minsincehi)*tan(0.5*90*pi/180));
	gline5[i]=dh-((minsincehi)*tan(0.618*90*pi/180));
	gline6[i]=dh-((minsincehi)*tan(0.75*90*pi/180));
	gline7[i]=dh-((minsincehi)*tan(0.875*90*pi/180));
	gline8[i]=dh-((minsincehi)*tan(1*90*pi/180));
	if (gline1[i]<dh-gannrange)gline1[i]=Null;
	if (gline2[i]<dh-gannrange)gline2[i]=Null;
	if (gline3[i]<dh-gannrange)gline3[i]=Null;
	if (gline4[i]<dh-gannrange)gline4[i]=Null;
	if (gline5[i]<dh-gannrange)gline5[i]=Null;
	if (gline6[i]<dh-gannrange)gline6[i]=Null;
	if (gline7[i]<dh-gannrange)gline7[i]=Null;
	if (gline8[i]<dh-gannrange)gline8[i]=Null;
}
else if ((gann=="Low" OR gann=="Trough") AND Minsincelo>0)
{
	gline0[i]=dl+((minsincelo)*tan(0*90*pi/180));
	gline1[i]=dl+((minsincelo)*tan(0.125*90*pi/180));
	gline2[i]=dl+((minsincelo)*tan(0.25*90*pi/180));
	gline3[i]=dl+((minsincelo)*tan(0.382*90*pi/180));
	gline4[i]=dl+((minsincelo)*tan(0.5*90*pi/180));
	gline5[i]=dl+((minsincelo)*tan(0.618*90*pi/180));
	gline6[i]=dl+((minsincelo)*tan(0.75*90*pi/180));
	gline7[i]=dl+((minsincelo)*tan(0.875*90*pi/180));
	gline8[i]=dl+((minsincelo)*tan(1*90*pi/180));
	if (gline1[i]>dl+gannrange)gline1[i]=Null;
	if (gline2[i]>dl+gannrange)gline2[i]=Null;
	if (gline3[i]>dl+gannrange)gline3[i]=Null;
	if (gline4[i]>dl+gannrange)gline4[i]=Null;
	if (gline5[i]>dl+gannrange)gline5[i]=Null;
	if (gline6[i]>dl+gannrange)gline6[i]=Null;
	if (gline7[i]>dl+gannrange)gline7[i]=Null;
	if (gline8[i]>dl+gannrange)gline8[i]=Null;
}
else 
{
gline0[i]=gline1[i]=gline2[i]=gline3[i]=gline4[i]=gline5[i]=gline6[i]=gline7[i]=gline8[i]=Null;
}


x=0;
if (gline0[i]>gline2[i])
	if (C[i]<gline0[i])
		if (C[i]<gline1[i])
			if (C[i]<gline2[i])
				if (C[i]<gline3[i])
					if (C[i]<gline4[i])
						if (C[i]<gline5[i])
							if (C[i]<gline6[i])
								if (gline0[i]>0)x=6;
								else x=1; 
							else if (gline0[i]>0)x=5;
								else x=1;
						else if (gline0[i]>0)x=4;
							else x=1;	
				else if (gline0[i]>0)x=3;
						else x=1;
			else if (gline0[i]>0)x=2;
					else x=1;
		else if (gline0[i]>0)x=1;

if (gline2[i]>gline0[i])
	if (C[i]>gline0[i])
		if (C[i]>gline1[i])
			if (C[i]>gline2[i])
				if (C[i]>gline3[i])
					if (C[i]>gline4[i])
						if (C[i]>gline5[i])
							if (C[i]>gline6[i])
								if (gline0[i]>0)x=6;
								else x=1;
							else if (gline0[i]>0)x=5;
								else x=1;
						else if (gline0[i]>0)x=4;
							else x=1;	
				else if (gline0[i]>0)x=3;
						else x=1;
			else if (gline0[i]>0)x=2;
					else x=1;
		else if (gline0[i]>0)x=1;

if (x==1)
{
	entryprice[i]=gline1[i];
	Clevel[i]=1+(abs(gline1[i]-C[i]))/(abs(gline1[i]-gline2[i]));
}
if (x==2)
{
	entryprice[i]=gline2[i];
	Clevel[i]=2+(abs(gline2[i]-C[i]))/(abs(gline2[i]-gline3[i]));

}
if (x==3)
{
	entryprice[i]=gline3[i];
	Clevel[i]=3+(abs(gline3[i]-C[i]))/(abs(gline3[i]-gline4[i]));
}
if (x==4)
{	
	entryprice[i]=gline4[i];
	Clevel[i]=4+(abs(gline4[i]-C[i]))/(abs(gline4[i]-gline5[i]));

}
if (x==5)
{
	entryprice[i]=gline5[i];
	Clevel[i]=5+(abs(gline5[i]-C[i]))/(abs(gline5[i]-gline6[i]));

}
if (x==6)
{
	entryprice[i]=gline6[i];
	Clevel[i]=6+(abs(gline6[i]-C[i]))/(abs(gline6[i]-gline7[i]));
}
if (showgannlev=="Yes")
{

if (x==0 AND 
			(((gann=="High" OR gann=="peak") AND C[i]<gline0[i]) OR
			 ((gann=="Low" OR gann=="Trough") AND C[i]>gline0[i])) )PlotText("0",i,H[i]+25,colorWhite);
if (x==1)PlotText("1",i,H[i]+25,colorWhite);
if (x==2)PlotText("2",i,H[i]+25,colorWhite);
if (x==3)PlotText("3",i,H[i]+25,colorWhite);
if (x==4)PlotText("4",i,H[i]+25,colorWhite);
if (x==5)PlotText("5",i,H[i]+25,colorWhite);
if (x==6)PlotText("6",i,H[i]+25,colorWhite);

}


}//Gan fan analysis end

Colorpnk=ColorRGB(150,75,75);
Colorblu=ColorRGB(25,100,150);
Colorylo=ColorRGB(150,150,50);


if (showgann=="Yes")
{
	Plot(gline0,"0 deg",Colorpnk,styleLine|styleNoLabel);
	Plot(gline1,"12.5 deg",Colorblu,styleLine|styleNoLabel);
	Plot(gline2,"25 deg",Colorylo,styleLine|styleNoLabel);
	Plot(gline3,"38.2 deg",Colorblu,styleLine|styleNoLabel);
	Plot(gline4,"45 deg",Colorpnk,styleLine|styleNoLabel);
	Plot(gline5,"61.8 deg",Colorblu,styleLine|styleNoLabel);
	Plot(gline6,"75 deg",Colorylo,styleLine|styleNoLabel);
	Plot(gline7,"87.5 deg",Colorblu,styleLine|styleNoLabel);
}