Line Arrays from Past Peaks and Troughs

#1
Hi Guys,

I found Edward Pottasch's AFL on Peaks and Troughs (thanks to him for great work he has provided).

Attaching his code below, but first this question. How to add "line arrays - for horizontal lines" to 'n' number of peaks and troughs (value of 'n' to be set in parameter window). Adding a screenshot for illustration. The lines were drawn manually.

::IMPORTANT::
Lines are drawn from 6 Peaks and 6 Troughs WHICH ARE CLOSEST TO current PRICE.
(this aspect is open for discussion if "closest to current price" should be considered or should it be "Last 6 Peaks and Last 6 Troughs".)


Illustration below:



::About the Code::
AFAIK, the values of "ph0,ph1,ph2" and "tl0,tl1,tl2" represent peaks and troughs respectively. (might be wrong.. i am not good with coding).

Someone please guide here on how to add those "n" line arrays.


PHP:
// Fractals
// AFL code by Edward Pottasch, Apr 2013
//RequestTimedRefresh(0.1,True); 
xx=BarIndex();x=xx;Lx=LastValue(x);
rightStrength=Param("Fractal Pivot Right side Strength",5,2,50,1); 
leftStrength=Param("Fractal Pivot Left side Strength",10,2,50,1); 
tf=Param("Time Frame (min)",1,1,1440,1);tfrm=in1Minute*tf;
CleanPivots=ParamToggle("Force Pivots to Alternate","Off|On",1);
Cttop=Param("Code Title Top",15,1,250,1); 
Ctspac=Param("Code Title Spacing",15,1,250,1);
dispLabels=ParamToggle("Display Labels","Off|On",1);
LabelColor=ParamColor("Label Color",colorBlack);
GfxSetTextColor(ParamColor("Code Title Color",colorDarkGrey));
//backGroundColor=ParamColor("Chart Background Color",GetChartBkColor());
 
TimeFrameSet(tfrm); 
pk=H>Ref(HHV(H,leftStrength),-1) AND Ref(HHV(H,rightStrength),rightStrength)<=H;
tr=L<Ref(LLV(L,leftStrength),-1) AND Ref(LLV(L,rightStrength),rightStrength)>=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);
 
if(CleanPivots)
{
    pk=IIf((ph0>=ph1 AND tx0>px0 AND px0!=px1) 
    OR (ph1<ph2 AND px2>tx1)
    OR (ph0>=ph1 AND tx0<px0 AND tx0==tx1 AND px0!=px1)
    ,False,pk);
    tr=IIf((tl0<=tl1 AND px0>tx0 AND tx0!=tx1) 
    OR (tl1>tl2 AND tx2>px1)
    OR (tl0<=tl1 AND px0<tx0 AND px0==px1 AND tx0!=tx1)
    ,False,tr);
}
 
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);
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);   
 
ll=tr AND tl1<tl2;
hl=tr AND tl1>tl2;
hh=pk AND ph1>ph2;
lh=pk AND ph1<ph2;
dt=pk AND ph1==ph2;
db=tr AND tl1==tl2;
 
//GraphXSpace=5;SetChartBkColor(backGroundColor);SetChartOptions(0,chartShowDates);
//SetBarFillColor(IIf(C>O,colorGreen,IIf(C<=O,colorRed,colorDarkGrey)));
//Plot(C,"Price",IIf(C>O,colorDarkGreen,IIf(C<=O,colorDarkRed,colorDarkGrey)),64,0,0,0,0);
Plot(pkh,"",colorRed,styleThick,0,0,0,-1);
Plot(trl,"",colorBrightGreen,styleThick,0,0,0,-1);
PlotShapes(shapeSmallCircle*tr,IIf(Lx-ValueWhen(tr,x)>=rightStrength*fact,ColorRGB(0,100,0),colorBlack),0,L,- Param("Offset",10,0,100,0.001));
PlotShapes(shapeSmallCircle*pk,IIf(Lx-ValueWhen(pk,x)>=rightStrength*fact,ColorRGB(255,0,0),colorBlack),0,H,Param("Offset",10,0,100,0.001));
 
qq=Interval()/60;
if(qq < 60){tf=" min";tt=qq;}
else if(qq >= 60 AND qq < 1440){tf=" hrs";tt=qq/60;}
else if(qq >= 1440){tf=" days";tt=(qq/60)/24;}
qq=Max(tfrm/60,Interval()/60);
if(qq < 60){tfa=" min";tta=qq;}
else if(qq >= 60 AND qq < 1440){tfa=" hrs";tta=qq/60;}
else if(qq >= 1440){tfa=" days";tta=(qq/60)/24;}
 
GfxSetOverlayMode(0);
GfxSetBkMode(1);
GfxSelectFont("Tahoma",11,200);
GfxTextOut("Right Strenght: "+rightStrength,5,Cttop);
GfxTextOut("Left Strenght: "+leftStrength,5,Cttop+Ctspac);
GfxTextOut("Chart Timeframe: "+tt+""+tf,5,Cttop+Ctspac*2);
GfxTextOut("Pivot Timeframe: "+tta+""+tfa,5,Cttop+Ctspac*3);
 
abcdy_up=27;
abcdy_dn=15;
function GetVisibleBarCountq() 
{
    lvb=Status("lastvisiblebar");
    fvb=Status("firstvisiblebar");
    return Min(lvb-fvb,BarCount-fvb);
} 
function GfxConvertPixelToValueYq(Pixels) 
{
    local Miny,Maxy,pxchartbottom,pxchartheight;
    Miny=Status("axisminy");
    Maxy=Status("axismaxy");
    pxchartbottom=Status("pxchartbottom");
    pxchartheight=Status("pxchartheight");
    fac=pxchartheight/Pixels;
    Value=(Maxy-Miny)/fac;
    return Nz(Value);
} 
function GfxConvertBarToPixelXq(bar) 
{ 
    lvb=Status("lastvisiblebar"); 
    fvb=Status("firstvisiblebar"); 
    pxchartleft=Status("pxchartleft"); 
    pxchartwidth=Status("pxchartwidth"); 
    return Nz(pxchartleft+bar*pxchartwidth/(lvb-fvb+1)); 
} 
function GfxConvertValueToPixelYq(value) 
{
    local Miny,Maxy,pxchartbottom,pxchartheight; 
    Miny=Status("axisminy");
    Maxy=Status("axismaxy");
    pxchartbottom=Status("pxchartbottom");
    pxchartheight=Status("pxchartheight");
    return Nz(pxchartbottom-floor(0.5+(Value-Miny)*pxchartheight/(Maxy-Miny))); 
} 
AllVisibleBars=GetVisibleBarCountq();
fvb=Status("firstvisiblebar");
abcdy_up=GfxConvertPixelToValueYq(abcdy_up);
abcdy_dn=GfxConvertPixelToValueYq(abcdy_dn);
 
for(i=0;i<AllVisibleBars;i++) 
{
    GfxSelectFont("Tahoma",8,500);GfxSetBkMode(1); 
    if(ll[i+fvb] AND dispLabels)
    {
        lvix=i+fvb;
        GfxSetTextColor(LabelColor);GfxTextOut("LL",
        GfxConvertBarToPixelXq(i)-3,GfxConvertValueToPixelYq(L[lvix]-abcdy_dn)); 
    }
    if(hl[i+fvb] AND dispLabels)
    {
        lvix=i+fvb;
        GfxSetTextColor(LabelColor);GfxTextOut("HL",
        GfxConvertBarToPixelXq(i)-3,GfxConvertValueToPixelYq(L[lvix]-abcdy_dn)); 
    }   
    if(db[i+fvb] AND dispLabels)
    {
        lvix=i+fvb;
        GfxSetTextColor(LabelColor);GfxTextOut("DB",
        GfxConvertBarToPixelXq(i)-3,GfxConvertValueToPixelYq(L[lvix]-abcdy_dn)); 
    }       
    if(hh[i+fvb] AND dispLabels)
    {
        lvix=i+fvb;
        GfxSetTextColor(LabelColor);GfxTextOut("HH",
        GfxConvertBarToPixelXq(i)-5,GfxConvertValueToPixelYq(H[lvix]+abcdy_up)); 
    }   
    if(lh[i+fvb] AND dispLabels)
    {
        lvix=i+fvb;
        GfxSetTextColor(LabelColor);GfxTextOut("LH",
        GfxConvertBarToPixelXq(i)-5,GfxConvertValueToPixelYq(H[lvix]+abcdy_up)); 
    }   
    if(dt[i+fvb] AND dispLabels)
    {
        lvix=i+fvb;
        GfxSetTextColor(LabelColor);GfxTextOut("DT",
        GfxConvertBarToPixelXq(i)-5,GfxConvertValueToPixelYq(H[lvix]+abcdy_up)); 
    }
}
 

cloudTrader

Well-Known Member
#3
Can anybody please help !?
What I understand from your post , I am posting this code , maybe it can be of help to you...

This code has been developed by casoni , a Traderji member. If you want further help you may search his ID and send pm to him for further things.

Code:
_SECTION_BEGIN("Higher TF SR");


tf=Param("Time Frame (min)",60,1,10000,1);
tfrm=in1Minute*tf;
H1=TimeFrameGetPrice("H",TFRM);
L1=TimeFrameGetPrice("L",TFRM);

function GetXSupport(L1, Percentage, Back)
{
return ((BarCount - 1) - LastValue(TroughBars(L1, Percentage,Back)));
}
function GetYSupport(L1, Percentage, Back)
{
return (LastValue(Trough(L1, Percentage, back)));
}
function GetXResistance(H1, Percentage, Back)
{
return ((BarCount - 1) -LastValue(PeakBars(H1, Percentage, Back)));
}
function GetYResistance(H1, Percentage, Back)
{
return (LastValue(Peak(H1, Percentage, Back)));
}

Plot(C,"",3,64);
ShowSR	 = ParamToggle("Show Vert S/R","No|Yes", 1);
SRPer	 = Param("S/R Percentage", 0.3, 0.1,5,0.1);
SRBack	 = Param("S/R Back", 5, 1,15,1);



if(ShowSR)
{
for(i=1; i<=SRBack; i++)
{
x0 = GetXSupport(L1, SRPer, i);
x1 = BarCount-1;
y0 = GetYSupport(L1, SRPer, i);
x = LineArray(x0, y0, x1, y0, 0);
Plot(x, "", IIf(LastValue(C) > x, colorCustom12,colorCustom11),
styleLine);
x0 = GetXResistance(H1, SRPer, i);
y0 = GetYResistance(H1, SRPer, i);
x = LineArray(x0, y0, x1, y0, 0);
Plot(x, "", IIf(LastValue(C) > x, colorCustom12,colorCustom11),
styleLine);

}
}
_N(Title = StrFormat("{{NAME}} - {{INTERVAL}} {{DATE}} Open %g, Hi %g, Lo %g, Close %g (%.1f%%) ", O, H, L, C ));
_SECTION_END();
Good Times.
 

sr114

Well-Known Member
#4
Hi Guys,

I found Edward Pottasch's AFL on Peaks and Troughs (thanks to him for great work he has provided).

Attaching his code below, but first this question. How to add "line arrays - for horizontal lines" to 'n' number of peaks and troughs (value of 'n' to be set in parameter window). Adding a screenshot for illustration. The lines were drawn manually.

::IMPORTANT::
Lines are drawn from 6 Peaks and 6 Troughs WHICH ARE CLOSEST TO current PRICE.
(this aspect is open for discussion if "closest to current price" should be considered or should it be "Last 6 Peaks and Last 6 Troughs".)


Illustration below:



::About the Code::
AFAIK, the values of "ph0,ph1,ph2" and "tl0,tl1,tl2" represent peaks and troughs respectively. (might be wrong.. i am not good with coding).

Someone please guide here on how to add those "n" line arrays.


i think u r looking for this. He wrote this for OzTrader in Jan 2013

cheers
 
Last edited:
#5
Hi Sr114,

Sorry for the late reply. I guess it is close to the concept i posted. Do you have the afl for this one ? Or where to look for it ?

EDIT:
Going to try the below one now.. will get back
Got this one from wisestocktrader after searching:

PHP:
// AFL code by Edward Pottasch, Jan 2013
// Oz weekly pivots: http://i1145.photobucket.com/albums/o515/Austtrade/SupRes_zpsbebc3ab9.png
RequestTimedRefresh(0.1,True); 
xx=BarIndex();x=xx;Lx=LastValue(x);
nbar=Param("N Pivot Bars",5,2,50,1); 
tf=Param("Time Frame (min)",inWeekly/60,1,inWeekly/60,1);tfrm=in1Minute*tf;
CleanPivots=ParamToggle("Use Clean Pivots","Off|On",1);
PivotSymmetry=ParamToggle("Use Symmetric Pivots","Off|On",0);
displayMode=ParamToggle("Display Mode","Classic|Alternative",1);

procedure alternate1_proc(pk,tr,px0,px1,px2,ph0,ph1,ph2,tx0,tx1,tx2,tl0,tl1,tl2)
{
	global pkh;
	global trh;
	
	pk=IIf((px0==px1 AND px2>tx1 AND ph1<ph2) 
	OR (tx0==tx1 AND px1<px0 AND px1>tx0 AND ph1<=ph0)
	OR (px0>px1 AND px1<tx0 AND px2>tx1 AND ph1<ph2)
	OR (px0>px1 AND px0<tx0 AND px1>tx1 AND ph1<ph0)
	OR (ph1==ph2 AND px2>tx1)
	OR (px1==tx1 AND px2>tx2),False,pk);

	tr=IIf((tx0==tx1 AND tx2>px1 AND tl1>tl2) 
	OR (px0==px1 AND tx1<tx0 AND tx1>px0 AND tl1>=tl0)
	OR (tx0>tx1 AND tx1<px0 AND tx2>px1 AND tl1>tl2)
	OR (tx0>tx1 AND tx0<px0 AND tx1>px1 AND tl1>tl0)
	OR (tl1==tl2 AND tx2>px1)
	OR (px1==tx1 AND tx2>px2),False,tr);
	
	pkh=pk;trh=tr;
}

TimeFrameSet(tfrm); 
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);
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);

if(CleanPivots)
{
	alternate1_proc(pk,tr,px0,px1,px2,ph0,ph1,ph2,tx0,tx1,tx2,tl0,tl1,tl2);
	pk=pkh;tr=trh;
	
	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);	
	
	alternate1_proc(pk,tr,px0,px1,px2,ph0,ph1,ph2,tx0,tx1,tx2,tl0,tl1,tl2);
	pk=pkh;tr=trh;
	
	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);
}

GraphXSpace=5;SetChartBkColor(ColorRGB(0,0,0));SetChartOptions(0,chartShowDates);
SetBarFillColor(IIf(C>O,colorGreen,IIf(C<=O,colorRed,colorLightGrey)));
Plot(C,"Price",IIf(C>O,colorDarkGreen,IIf(C<=O,colorDarkRed,colorLightGrey)),64,0,0,0,0);
Plot(pkh,"",colorRed,styleThick,0,0,0,-1);
Plot(trl,"",colorBrightGreen,styleThick,0,0,0,-1);
PlotShapes(shapeSmallCircle*tr,IIf(Lx-ValueWhen(tr,x)>nbar*fact,ColorRGB(0,100,0),colorWhite),0,L,-10);
PlotShapes(shapeSmallCircle*pk,IIf(Lx-ValueWhen(pk,x)>nbar*fact,ColorRGB(255,0,0),colorWhite),0,H,10);

qq=Interval()/60;
if(qq < 60){tf=" min";tt=qq;}
else if(qq >= 60 AND qq < 1440){tf=" hrs";tt=qq/60;}
else if(qq >= 1440){tf=" days";tt=(qq/60)/24;}
qq=Max(tfrm/60,Interval()/60);
if(qq < 60){tfa=" min";tta=qq;}
else if(qq >= 60 AND qq < 1440){tfa=" hrs";tta=qq/60;}
else if(qq >= 1440){tfa=" days";tta=(qq/60)/24;}

Title = Name() + 
"\nNbar: " + nbar + 
"\nChart TF: " + tt + tf + 
"\nTrend TF: " + tta + tfa;

function GetVisibleBarCount() 
{
	lvb=Status("lastvisiblebar");
	fvb=Status("firstvisiblebar");
	return Min(lvb-fvb,BarCount-fvb);
} 
function GfxConvertBarToPixelX(bar) 
{ 
	lvb=Status("lastvisiblebar"); 
	fvb=Status("firstvisiblebar"); 
	pxchartleft=Status("pxchartleft"); 
	pxchartwidth=Status("pxchartwidth"); 
	return Nz(pxchartleft+bar*pxchartwidth/(lvb-fvb+1)); 
} 
function GfxConvertValueToPixelY(value) 
{
	local Miny,Maxy,pxchartbottom,pxchartheight; 
	Miny=Status("axisminy");
	Maxy=Status("axismaxy");
	pxchartbottom=Status("pxchartbottom");
	pxchartheight=Status("pxchartheight");
	return Nz(pxchartbottom-floor(0.5+(Value-Miny)*pxchartheight/(Maxy-Miny))); 
} 
AllVisibleBars=GetVisibleBarCount();
fvb=Status("firstvisiblebar");

for(i=0;i<AllVisibleBars;i++) 
{
	GfxSetBkMode(1);
	DisplayRes=1;
	DisplaySup=1;
	lvix=i+fvb;
	if(pk[lvix])
	{
		if(displayMode)
		{
			hval=H[lvix];
			for(j=i;j<AllVisibleBars;j++)
			{
				lvjx=j+fvb;
				if(H[lvjx]>hval)
				{
					DisplayRes=0;
					break;
				}
			}
		}
		if(DisplayRes)
		{
			GfxSelectPen(ColorRGB(100,0,0),3,0);
			GfxMoveTo(GfxConvertBarToPixelX(i),GfxConvertValueToPixelY(H[lvix]));
			GfxLineTo(GfxConvertBarToPixelX(BarCount-1),GfxConvertValueToPixelY(H[lvix]));
		}
	}
	if(tr[lvix])
	{
		if(displayMode)
		{
			lval=L[lvix];
			for(j=i;j<AllVisibleBars;j++)
			{
				lvjx=j+fvb;
				if(L[lvjx]<lval)
				{
					DisplaySup=0;
					break;
				}
			}
		}	
		if(DisplaySup)
		{	
			GfxSelectPen(ColorRGB(0,0,100),3,0);
			GfxMoveTo(GfxConvertBarToPixelX(i),GfxConvertValueToPixelY(L[lvix]));
			GfxLineTo(GfxConvertBarToPixelX(BarCount-1),GfxConvertValueToPixelY(L[lvix]));
		}
	}	
}
 
#6
Hey Leonid,

I already have the one you provided. It works good, with a few deficiencies. During day trading recent pivots get left out but price reacts to them.

Thanks anyways.

Pls do post if you have something else that suits the concept i posted.
 
#8
My thoughts wrt to concept i created this post for, on the above afl of Edward Pottasch. (2nd afl)

1. The AFL doesn't look for next "n" peaks and troughs
2. Neither does AFL looks for closest "n" peaks and troughs
3. Once price crosses a level, the line on that level disappears (rather that line is closest to price so should stay on chart

i guess it requires serious coding work to "identify - 'n' closest peaks and troughs"
or the other case of "last 'n' peaks and troughs".

Here, i am providing a youtube link to the concept which Andrew Wilson has developed already. (Sadly, it is not available in public domain)

This video should make things more clear.

The video is NOT in english but understandable.

https://www.youtube.com/watch?v=Y0bLZ-umZMs
 

sr114

Well-Known Member
#9
Sr114, could you pls post your afl as well (the one shown in your pic) ?
the code by Ed Pottasch

Code:
// AFL code by Edward Pottasch, Jan 2013
procedure alternate1_proc(pk,tr,px0,px1,px2,ph0,ph1,ph2,tx0,tx1,tx2,tl0,tl1,tl2)
{
	global pkh;
	global trh;
	
	pk=IIf((px0==px1 AND px2>tx1 AND ph1<ph2) 
	OR (tx0==tx1 AND px1<px0 AND px1>tx0 AND ph1<=ph0)
	OR (px0>px1 AND px1<tx0 AND px2>tx1 AND ph1<ph2)
	OR (px0>px1 AND px0<tx0 AND px1>tx1 AND ph1<ph0)
	OR (ph1==ph2 AND px2>tx1)
	OR (px1==tx1 AND px2>tx2),False,pk);

	tr=IIf((tx0==tx1 AND tx2>px1 AND tl1>tl2) 
	OR (px0==px1 AND tx1<tx0 AND tx1>px0 AND tl1>=tl0)
	OR (tx0>tx1 AND tx1<px0 AND tx2>px1 AND tl1>tl2)
	OR (tx0>tx1 AND tx0<px0 AND tx1>px1 AND tl1>tl0)
	OR (tl1==tl2 AND tx2>px1)
	OR (px1==tx1 AND tx2>px2),False,tr);
	
	pkh=pk;trh=tr;
}
//procedure calculatePivots(tfrm,PivotSymmetry,nbar,CleanPivots,x)
procedure calculatePivots(tfrm,nbar,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);

//if(CleanPivots)
{
	alternate1_proc(pk,tr,px0,px1,px2,ph0,ph1,ph2,tx0,tx1,tx2,tl0,tl1,tl2);
	pk=pkh;tr=trh;
	
	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);
	
	alternate1_proc(pk,tr,px0,px1,px2,ph0,ph1,ph2,tx0,tx1,tx2,tl0,tl1,tl2);
	pk=pkh;tr=trh;
	
	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);
}

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 GetVisibleBarCount() 
{
	lvb=Status("lastvisiblebar");
	fvb=Status("firstvisiblebar");
	return Min(lvb-fvb,BarCount-fvb);
} 
function GfxConvertBarToPixelX(bar) 
{ 
	lvb=Status("lastvisiblebar"); 
	fvb=Status("firstvisiblebar"); 
	pxchartleft=Status("pxchartleft"); 
	pxchartwidth=Status("pxchartwidth"); 
	return Nz(pxchartleft+bar*pxchartwidth/(lvb-fvb+1)); 
} 
function GfxConvertValueToPixelY(value) 
{
	local Miny,Maxy,pxchartbottom,pxchartheight; 
	Miny=Status("axisminy");
	Maxy=Status("axismaxy");
	pxchartbottom=Status("pxchartbottom");
	pxchartheight=Status("pxchartheight");
	return Nz(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 Nz(pxchartbottom-round(pxchartheight*x));
}
function displayLines(pk,tr,bkColorRes,bkColorSup,lnColorRes,lnColorSup,lnWidthRes,lnWidthSup,displayMode,logscale)
{
AllVisibleBars=GetVisibleBarCount();
fvb=Status("firstvisiblebar");
for(i=0;i<AllVisibleBars;i++) 
{
	DisplayRes=1;
	DisplaySup=1;
	lvix=i+fvb;
	if(pk[lvix])
	{
		if(displayMode)
		{
			hval=H[lvix];
			for(j=i;j<AllVisibleBars;j++)
			{
				lvjx=j+fvb;
				if(H[lvjx]>hval)
				{
					DisplayRes=0;
					break;
				}
			}
		}
		if(DisplayRes)
		{
			if(logscale) vh=GfxConvertValueToPixelYLog(H[lvix]); 
			else vh=GfxConvertValueToPixelY(H[lvix]);
			GfxSelectPen(lnColorRes,lnWidthRes,0);
			GfxMoveTo(GfxConvertBarToPixelX(i),vh);
			GfxLineTo(GfxConvertBarToPixelX(AllVisibleBars-1),vh);
			GfxSelectFont("Tahoma",8,650);GfxSetBkColor(bkColorRes);GfxSetTextColor(colorWhite);
			GfxTextOut(""+H[lvix],GfxConvertBarToPixelX(AllVisibleBars+1),vh);			
		}
	}
	if(tr[lvix])
	{
		if(displayMode)
		{
			lval=L[lvix];
			for(j=i;j<AllVisibleBars;j++)
			{
				lvjx=j+fvb;
				if(L[lvjx]<lval)
				{
					DisplaySup=0;
					break;
				}
			}
		}	
		if(DisplaySup)
		{	
			if(logscale) vl=GfxConvertValueToPixelYLog(L[lvix]); 
			else vl=GfxConvertValueToPixelY(L[lvix]);		
			GfxSelectPen(lnColorSup,lnWidthSup,0);
			GfxMoveTo(GfxConvertBarToPixelX(i),vl);
			GfxLineTo(GfxConvertBarToPixelX(AllVisibleBars-1),vl);
			GfxSelectFont("Tahoma",8,650);GfxSetBkColor(bkColorSup);GfxSetTextColor(colorWhite);
			GfxTextOut(""+L[lvix],GfxConvertBarToPixelX(AllVisibleBars+1),vl);
		}
	}	
}
}
function plotPivots(pkh,trl,pk,tr,Lx,nbar,fact,x)
{
	Plot(pkh,"",colorRed,styleThick,0,0,0,-1);
	Plot(trl,"",colorBrightGreen,styleThick,0,0,0,-1);
	PlotShapes(shapeSmallCircle*tr,IIf(Lx-ValueWhen(tr,x)>nbar*fact,colorBrightGreen,colorWhite),0,L,-10);
	PlotShapes(shapeSmallCircle*pk,IIf(Lx-ValueWhen(pk,x)>nbar*fact,colorRed,colorWhite),0,H,10);
}

_SECTION_BEGIN("Background_Setting");
SetChartBkGradientFill( ParamColor("BgTop", colorBlack),
ParamColor("BgBottom", colorDarkGrey),ParamColor("TitleBack",colorGrey40)); 
SetChartBkColor(ParamColor("Outer Panel",colorPaleBlue));
SetChartOptions(0,chartShowArrows|chartShowDates);
_SECTION_END();

_SECTION_BEGIN("Candle color");

SetBarFillColor(IIf(C>O,ParamColor("Candle UP Color", colorGreen),IIf(C<=O,ParamColor("Candle Down Color", colorRed),colorLightGrey)));
Plot(C,"Close",IIf(C > Ref(C,-1),ParamColor("Wick UP Color", colorDarkGreen),IIf(C < Ref(C,-1),ParamColor("Wick Down Color", colorDarkRed),colorLightGrey)),64,0,0,0,0);

grid_year = IIf(Year()!=Ref(Year(),-1),1,0); 
Plot(grid_year,"",colorDarkGrey,styleHistogram|styleDots|styleNoLabel|styleOwnScale);
_SECTION_END();

// MAIN code
RequestTimedRefresh(0.1,True); 
xx=BarIndex();x=xx;Lx=LastValue(x);
nbar=Param("N Pivot Bars",5,2,50,1); 
CleanPivots=ParamToggle("Use Clean Pivots","Off|On",1);
PivotSymmetry=ParamToggle("Use Symmetric Pivots","Off|On",0);
displayMode=ParamToggle("Display Mode","Classic|Alternative",1);
logscale=ParamToggle("Axis type","Linear|Logarithmic",0);
weeklyTF=ParamToggle("WEEKLY timeframe","Off|On",1);
weeklyLineColorRes=ParamColor("WEEKLY Line Color (resistance)",ColorRGB(150,0,0)); 
weeklyLineColorSup=ParamColor("WEEKLY Line Color (support)",ColorRGB(0,0,150));
weeklyBackColorRes=ParamColor("WEEKLY Back Color (resistance)",ColorRGB(250,0,0)); 
weeklyBackColorSup=ParamColor("WEEKLY Back Color (support)",ColorRGB(0,0,250));
weeklyLineWidth=Param("WEEKLY Line Width",6,1,10,1); 

dailyTF=ParamToggle("DAILY timeframe","Off|On",1);
dailyLineColorRes=ParamColor("DAILY Line Color (resistance)",ColorRGB(50,0,0)); 
dailyLineColorSup=ParamColor("DAILY Line Color (support)",ColorRGB(0,0,50));
dailyBackColorRes=ParamColor("DAILY Back Color (resistance)",ColorRGB(250,0,0)); 
dailyBackColorSup=ParamColor("DAILY Back Color (support)",ColorRGB(0,0,250));
dailyLineWidth=Param("DAILY Line Width",2,1,10,1); 

if(logscale) SetChartOptions(2,chartLogarithmic,chartGridMiddle|chartGridMargins); 
else SetChartOptions(3,chartLogarithmic,!(chartGridMiddle|chartGridMargins));  

GraphXSpace=5;

// setup for weekly
if(weeklyTF)
{
calculatePivots(inWeekly,nbar,x);
displayLines(pk,tr,weeklyBackColorRes,weeklyBackColorSup,weeklyLineColorRes,weeklyLineColorSup,weeklyLineWidth,weeklyLineWidth,displayMode,logscale);
plotPivots(pkh,trl,pk,tr,Lx,nbar,fact,x);
}
// setup for daily
if(dailyTF)
{
calculatePivots(inDaily,nbar,x);
displayLines(pk,tr,dailyBackColorRes,dailyBackColorSup,dailyLineColorRes,dailyLineColorSup,dailyLineWidth,dailyLineWidth,displayMode,logscale);
plotPivots(pkh,trl,pk,tr,Lx,nbar,fact,x);
}

Title = Name() +  "  -  " + Date() + "  -  Close = " + WriteVal(C,0.2);
rgds
 

cloudTrader

Well-Known Member
#10
Hey Leonid,

I already have the one you provided. It works good, with a few deficiencies. During day trading recent pivots get left out but price reacts to them.

Thanks anyways.

Pls do post if you have something else that suits the concept i posted.
You are absolutely correct that the AFL has some deficiencies. I am also in search of a better version the kind of which you have mentioned in your post.

I wish you that you may be able to develop the afl with the required conditions. Please share if you come up with the better afl.

I am not at all into coding etc. so can't really try my hands at it but I always keep my search on through the good hearted people who share their hard work.

Thanks.
 

Similar threads