// Downloaded From https://www.WiseStockTrader.com


_SECTION_BEGIN("Price ");

SetBarsRequired(10000,10000); 
GraphXSpace = 3;


SetChartBkColor(ParamColor("Background Colour",colorWhite));
Plot( C, "Close", ParamColor("Color", colorDefault ), styleNoTitle | ParamStyle("Style") | GetPriceStyle() ); 

Chartscale=ParamToggle("Chart Scale","Linear|Logarithmic",0);

if( ChartScale == 0 )
	SetChartOptions(1,chartShowDates);  
else
	SetChartOptions(1,chartShowDates|chartLogarithmic ); 


/////  GFX Functions  ///////


function GetVisibleBarCount()
{
    lvb = Status( "lastvisiblebar" );
    fvb = Status( "firstvisiblebar" );

    return Min( Lvb - fvb, BarCount - fvb );
}
function GfxConvertValueToPixelY( Value )
{
    local Miny, Maxy, pxchartbottom, pxchartheight;

    Miny = Status( "axisminy" );
    Maxy = Status( "axismaxy" );

    pxchartbottom = Status( "pxchartbottom" );
    pxchartheight = Status( "pxchartheight" );

    return pxchartbottom - floor( 0.5+ ( Value - Miny ) * pxchartheight / ( Maxy - Miny ) );
}



function GfxConvertValueToPixelYlog( Value )
{
    local Miny, Maxy, pxchartbottom, pxchartheight;

    pxchartheight = Status( "pxchartheight" );
    pxchartbottom = Status( "pxchartbottom" );

    Miny = Status( "axisminy" );
    Maxy = Status( "axismaxy" );

    x = log( Value / Miny ) / log( Maxy / Miny );
    return pxchartbottom - round( pxchartheight * x);
}



_SECTION_BEGIN( "Support and Resistance" );

// AFL code by Edward Pottasch, Jan 2013
procedure alternate_proc(pk,tr,sumpk,sumtr)
{
global pkg;
global trg;

pkg=pk;trg=tr;
idxpk=0;
idxtr=0;
flgtr=0;
flgpk=0;

for(i=1;i<BarCount;i++)
{
	if(pk[i] AND sumpk[i]==1 AND !tr[i] AND flgpk==0)
	{
		idxpk=i;
		flgtr=0;
	}
	else if( (pk[i] AND sumpk[i]>1 AND !tr[i]) OR (pk[i] AND flgpk==1) )
	{
		if(H[i]>=H[idxpk])
		{
			pkg[idxpk]=0;
			idxpk=i;
			flgpk=0;
		}
		else if(H[i]<H[idxpk])
		{
			pkg[i]=0;
			flgpk=0;
		}
	}
	else if(tr[i] AND sumtr[i]==1 AND !pk[i] AND flgtr==0)
	{
		idxtr=i;
		flgpk=0;
	}
	else if( (tr[i] AND sumtr[i]>1 AND !pk[i]) OR (tr[i] AND flgtr==1) )
	{
		if(L[i]<=L[idxtr])
		{
			trg[idxtr]=0;
			idxtr=i;
			flgtr=0;
		}
		else if(L[i]>L[idxtr])
		{
			trg[i]=0;
			flgtr=0;
		}
	}
	else if(pk[i] AND tr[i])
	{
		if(sumpk[i-1]>sumtr[i-1])
		{
			pkg[i]=0;
			flgtr=1;
			idxtr=i;
		}
		else if(sumtr[i-1]>sumpk[i-1])
		{
			trg[i]=0;
			flgpk=1;
			idxpk=i;
		}
	}
}
}
procedure calculatePivots(tfrm,PivotSymmetry,nbar,CleanPivots,x)
{
TimeFrameSet(tfrm);

global tr;global pk;global px0;global px1;global px2;global ph0;global ph1;global ph2;
global trl;global pkh;global tx0;global tx1;global tx2;global tl0;global tl1;global tl2;
global fact;
if(PivotSymmetry)
{
	fc=1;
	pk=H>Ref(HHV(H,nbar*fc),-1) AND Ref(HHV(H,nbar),nbar)<=H;
	tr=L<Ref(LLV(L,nbar*fc),-1) AND Ref(LLV(L,nbar),nbar)>=L;
}
else
{
	fc=2;
	pk=H>Ref(HHV(H,nbar*fc),-1) AND Ref(HHV(H,nbar),nbar)<=H;
	tr=L<Ref(LLV(L,nbar*fc),-1) AND Ref(LLV(L,nbar),nbar)>=L;
}

px0=ValueWhen(pk,x,0); tx0=ValueWhen(tr,x,0);
px1=ValueWhen(pk,x,1); tx1=ValueWhen(tr,x,1);
px2=ValueWhen(pk,x,2); tx2=ValueWhen(tr,x,2);
ph0=ValueWhen(pk,H,0); tl0=ValueWhen(tr,L,0);
ph1=ValueWhen(pk,H,1); tl1=ValueWhen(tr,L,1);
ph2=ValueWhen(pk,H,2); tl2=ValueWhen(tr,L,2);

sumpk=Sum(pk,BarsSince(tr));sumtr=Sum(tr,BarsSince(pk));
if(CleanPivots)
{
	alternate_proc(pk,tr,sumpk,sumtr);
	pk=pkg;
	tr=trg;
	
	px0=ValueWhen(pk,x,0); tx0=ValueWhen(tr,x,0);
	px1=ValueWhen(pk,x,1); tx1=ValueWhen(tr,x,1);
	px2=ValueWhen(pk,x,2); tx2=ValueWhen(tr,x,2);
	px3=ValueWhen(pk,x,3); tx3=ValueWhen(tr,x,3);	
	ph0=ValueWhen(pk,H,0); tl0=ValueWhen(tr,L,0);
	ph1=ValueWhen(pk,H,1); tl1=ValueWhen(tr,L,1);
	ph2=ValueWhen(pk,H,2); tl2=ValueWhen(tr,L,2);
	ph3=ValueWhen(pk,H,3); tl3=ValueWhen(tr,L,3);	
}
pkh=IIf(pk,H,Null);
trl=IIf(tr,L,Null);
TimeFrameRestore();
fact=Nz(Max(tfrm/60,Interval()/60)/(Interval()/60));
if(fact==0)fact=1;
Lkbk=Nz(tfrm/Interval());
if(Lkbk>1)
{
	pk=TimeFrameExpand(pk,tfrm,expandFirst);
	pkh=TimeFrameExpand(pkh,tfrm,expandFirst);
	pkhs=IIf(!IsEmpty(pkh),1,0);pkhs=pkhs-Ref(pkhs,-1);
	pk=pk AND H==pkh;
	cond1=Sum(pk,BarsSince(pkhs==1)+1)==1 AND pk;
	pk=pk AND cond1;
	
	tr=TimeFrameExpand(tr,tfrm,expandFirst);	
	trl=TimeFrameExpand(trl,tfrm,expandFirst);
	trls=IIf(!IsEmpty(trl),1,0);trls=trls-Ref(trls,-1);
	tr=tr AND L==trl;
	cond1=Sum(tr,BarsSince(trls==1)+1)==1 AND tr;
	tr=tr AND cond1;
	
	px0=ValueWhen(pk,x,0); tx0=ValueWhen(tr,x,0);
	px1=ValueWhen(pk,x,1); tx1=ValueWhen(tr,x,1);
	px2=ValueWhen(pk,x,2); tx2=ValueWhen(tr,x,2);
	px3=ValueWhen(pk,x,3); tx3=ValueWhen(tr,x,3);
	ph0=ValueWhen(pk,H,0); tl0=ValueWhen(tr,L,0);
	ph1=ValueWhen(pk,H,1); tl1=ValueWhen(tr,L,1);
	ph2=ValueWhen(pk,H,2); tl2=ValueWhen(tr,L,2);
	ph3=ValueWhen(pk,H,3); tl3=ValueWhen(tr,L,3);
}
}




function displayLines(pk,tr,lnColorRes,lnColorSup,lnWidthRes,lnWidthSup)
{

pxchartright=Status("pxchartright"); 
AllVisibleBars=GetVisibleBarCount();

for(i=0;i<BarCount;i++) 
{
	DisplayRes=1;
	DisplaySup=1;
	if(pk[i])
	{
	
		
			hval=H[i];
			for(j=i;j<BarCount;j++)
			{
				if(H[j]>hval)
				{
					DisplayRes=0;
					break;
				}
			}
		
		if(DisplayRes)
		{
			x0=i;
                  y0=H[i];
                  x1=BarCount;
                  y1=H[i];
			Plot(LineArray(x0,y0,x1,y1,1),"",lnColorRes,styleLine|styleNoRescale|styleNoLabel,0,0,0,0,lnWidthRes); 	

                  if(Chartscale==0) YPos=GfxConvertValueToPixelY(y1);
                  else  YPos=GfxConvertValueToPixelYLog(y1); 
                 
                  GfxSetTextAlign(0);
                  GfxSetBkColor(colorWhite);
                  GfxSelectFont("Tahoma",8,650);
                  YValue = StrRight( NumToStr( y1, 4.3,0 ), 9 );
                  GfxSetTextColor(colorLightGrey);
			//GfxTextOut(""+YValue,pxchartright-60,YPos-12);
                  RequestTimedRefresh( 0.1 );     
          
		}
	}
	if(tr[i])
	{
		
		
			lval=L[i];
			for(j=i;j<BarCount;j++)
			{
				if(L[j]<lval)
				{
					DisplaySup=0;
					break;
				}
			}
			
		if(DisplaySup)
		{	
			x0=i;
                  y0=L[i];
                  x1=BarCount;
                  y1=L[i];
			Plot(LineArray(x0,y0,x1,y1,1),"",lnColorSup,styleLine|styleNoRescale|styleNoLabel,0,0,0,0,lnWidthSup);	

                  if(Chartscale==0) YPos=GfxConvertValueToPixelY(y1);
                  else  YPos=GfxConvertValueToPixelYLog(y1); 
                  
                  GfxSetTextAlign(0);
                  GfxSetBkColor(colorWhite);
                  GfxSelectFont("Tahoma",8,650);
                  YValue = StrRight( NumToStr( y1, 4.3,0 ), 9 );
                  GfxSetTextColor(colorLightGrey);
			//GfxTextOut(""+YValue,pxchartright-60,YPos-12);
                  RequestTimedRefresh( 0.1 );                

	
		}
	}	
}
}


xx=BarIndex();
x=xx;
Lx=LastValue(x);

nbar=Param("N Pivot Bars",2,2,50,1); 
CleanPivots=ParamToggle("Use Clean Pivots","Off|On",0);
PivotSymmetry=ParamToggle("Use Symmetric Pivots","Off|On",1);

WeeklyTF=(Nz(StaticVarGet("ToggleButtonON_104")));  
weeklyLineColorRes=ParamColor("WEEKLY Line Color (resistance)",colorLightGrey); 
weeklyLineColorSup=ParamColor("WEEKLY Line Color (support)",colorLightGrey);
weeklyLineWidth=Param("WEEKLY Line Width",1,1,10,1);

// setup for weekly

calculatePivots(inWeekly,PivotSymmetry,nbar,CleanPivots,x);
displayLines(pk,tr,weeklyLineColorRes,weeklyLineColorSup,weeklyLineWidth,weeklyLineWidth);

_SECTION_END();