Swing volume plotted as line thickness

Hoping someone might help me code the accumulated volume on each swing, and then represent that in the thickness of the swing line. The more volume, the thicker the line. Thanks very much.

Base code below is Ed’s.

// AFL code by Edward Pottasch, Feb 2013

SetChartOptions(0,chartShowArrows|chartShowDates);
_N(Title = StrFormat("{{NAME}} - {{INTERVAL}} {{DATE}} Open %g, Hi %g, Lo %g, Close %g (%.1f%%) {{VALUES}}", O, H, L, C, SelectedValue( ROC( C, 1 ) ) ));
Plot( C, "Close", ParamColor("Color", colorBlack ), styleNoTitle | ParamStyle("Style") | GetPriceStyle() ); 
SetChartBkGradientFill(ColorRGB(200,202,200),ColorRGB(200,200,210));



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;
		}
	}
}
}

//SetBarsRequired(sbrAll,sbrAll);
//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)",5,1,1440,1);tfrm=in1Minute*tf;
CleanPivots=ParamToggle("Use Clean Pivots","Off|On",1);
PivotSymmetry=ParamToggle("Use Symmetric Pivots","Off|On",0);
dispLabels=ParamToggle("Display Labels","Off|On",1);

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);

sumpk=Sum(pk,BarsSince(tr));"sumpk: " +WriteVal(Sumpk);
sumtr=Sum(tr,BarsSince(pk));"sumtr: " +WriteVal(Sumtr);

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);
}

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;

ll_h=IIf(ll,1,0);
hl_h=IIf(hl,2,0);
hh_h=IIf(hh,3,0);
lh_h=IIf(lh,4,0);
dt_h=IIf(dt,5,0);
db_h=IIf(db,6,0);

combi=ll_h+hl_h+lh_h+hh_h+dt_h+db_h;

t0=ValueWhen(combi,combi,0);
t1=ValueWhen(combi,combi,1);
t2=ValueWhen(combi,combi,2);
t3=ValueWhen(combi,combi,3);
t4=ValueWhen(combi,combi,4);
t5=ValueWhen(combi,combi,5);

//at pk
pAx=ValueWhen(pk,tx1);pAy=ValueWhen(pk,tl1);
pBx=ValueWhen(pk,px1);pBy=ValueWhen(pk,ph1);
// at tr
tAx=ValueWhen(tr,px1);tAy=ValueWhen(tr,ph1);
tBx=ValueWhen(tr,tx1);tBy=ValueWhen(tr,tl1);

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,"",colorWhite,styleThick,0,0,0,-1);
Plot(trl,"",colorWhite,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;

abcdy_up=27;
abcdy_dn=15;
function GetVisibleBarCount() 
{
	lvb=Status("lastvisiblebar");
	fvb=Status("firstvisiblebar");
	return Min(lvb-fvb,BarCount-fvb);
} 
function GfxConvertPixelsToBarX(Pixels)
{
	lvb=Status("lastvisiblebar");
	fvb=Status("firstvisiblebar");
	pxchartleft=Status("pxchartleft");
	pxchartwidth=Status("pxchartwidth");
	fac=pxchartwidth/Pixels;
	bar=(lvb-fvb)/fac;
	return Nz(bar);
} 
function GfxConvertPixelToValueY(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 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");
abcdy_up=GfxConvertPixelToValueY(abcdy_up);
abcdy_dn=GfxConvertPixelToValueY(abcdy_dn);

for(i=0;i<AllVisibleBars;i++) 
{
	if(ll[i+fvb] AND dispLabels)
	{
		lvix=i+fvb;GfxSelectFont("Tahoma",8,500); GfxSetBkMode(1); 
		GfxSetTextColor(colorYellow);GfxTextOut("LL",GfxConvertBarToPixelX(i)-3,GfxConvertValueToPixelY(L[lvix]-abcdy_dn)); 
		GfxSetTextColor(colorYellow);GfxTextOut(""+L[lvix],GfxConvertBarToPixelX(i)-3,GfxConvertValueToPixelY(L[lvix]-2*abcdy_dn)); 
	}
	if(hl[i+fvb] AND dispLabels)
	{
		lvix=i+fvb;GfxSelectFont("Tahoma",8,500); GfxSetBkMode(1); 
		GfxSetTextColor(colorYellow);GfxTextOut("HL",GfxConvertBarToPixelX(i)-3,GfxConvertValueToPixelY(L[lvix]-abcdy_dn)); 
		GfxSetTextColor(colorYellow);GfxTextOut(""+L[lvix],GfxConvertBarToPixelX(i)-3,GfxConvertValueToPixelY(L[lvix]-2*abcdy_dn)); 
	}	
	if(db[i+fvb] AND dispLabels)
	{
		lvix=i+fvb;GfxSelectFont("Tahoma",8,500); GfxSetBkMode(1); 
		GfxSetTextColor(colorYellow);GfxTextOut("DB",GfxConvertBarToPixelX(i)-3,GfxConvertValueToPixelY(L[lvix]-abcdy_dn)); 
		GfxSetTextColor(colorYellow);GfxTextOut(""+L[lvix],GfxConvertBarToPixelX(i)-3,GfxConvertValueToPixelY(L[lvix]-2*abcdy_dn)); 
	}		
	if(hh[i+fvb] AND dispLabels)
	{
		lvix=i+fvb;GfxSelectFont("Tahoma",8,500); GfxSetBkMode(1); 
		GfxSetTextColor(colorYellow);GfxTextOut("HH",GfxConvertBarToPixelX(i)-5,GfxConvertValueToPixelY(H[lvix]+abcdy_up)); 
		GfxSetTextColor(colorYellow);GfxTextOut(""+H[lvix],GfxConvertBarToPixelX(i)-5,GfxConvertValueToPixelY(H[lvix]+1.57*abcdy_up)); 
	}	
	if(lh[i+fvb] AND dispLabels)
	{
		lvix=i+fvb;GfxSelectFont("Tahoma",8,500); GfxSetBkMode(1); 
		GfxSetTextColor(colorYellow);GfxTextOut("LH",GfxConvertBarToPixelX(i)-5,GfxConvertValueToPixelY(H[lvix]+abcdy_up));
		GfxSetTextColor(colorYellow);GfxTextOut(""+H[lvix],GfxConvertBarToPixelX(i)-5,GfxConvertValueToPixelY(H[lvix]+1.57*abcdy_up));
	}	
	if(dt[i+fvb] AND dispLabels)
	{
		lvix=i+fvb;GfxSelectFont("Tahoma",8,500); GfxSetBkMode(1); 
		GfxSetTextColor(colorYellow);GfxTextOut("DT",GfxConvertBarToPixelX(i)-5,GfxConvertValueToPixelY(H[lvix]+abcdy_up)); 
		GfxSetTextColor(colorYellow);GfxTextOut(""+H[lvix],GfxConvertBarToPixelX(i)-5,GfxConvertValueToPixelY(H[lvix]+1.57*abcdy_up)); 
	}		
	if(pk[i+fvb])
	{
		lvix=i+fvb;
		Plot(LineArray(pAx[lvix],pAy[lvix],pBx[lvix],pBy[lvix],0,True ),"",ColorRGB(0,0,200),styleThick);
	}
	if(tr[i+fvb])
	{
		a = SAR(.19,.2); aa=Cross(C,a); aaa = ValueWhen(aa,a);
		lvix=i+fvb;
		Plot(LineArray(tAx[lvix],tAy[lvix],tBx[lvix],tBy[lvix],0,True ),"",ColorRGB(200,0,0),styleThick);
	}	
}
_SECTION_END();


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);

G'day @C_M. Please use the code tags when posting an AFL.

(edit: thanks for editing and adding the tags. :slight_smile: )

Read the "Enter the AFL code properly" section in the link below:

1 Like

I found a simpler code online. I added a few things. Could someone tell me why this line is not achieving the desired outcome?

linethickness = iif( pk[ i+1 ] AND CumVolume[ i ]/1000>10,10,2); // if mark up volume>10 then draw thick line.

function SumSince2( condition, array )

{

CumA = Cum( array );

return CumA - ValueWhen( condition, CumA ) + ValueWhen( condition, array ) ;

}
     
z = Param("1",.0001,.0001,5,.0001)            ;

    // count bars since last peak or trough

pkb = PeakBars( c, z );

trb = TroughBars( c, z );

                   
// identify peaks

pk = pkb == 1;

tr = trb == 1;

color = IIf( Ref(pkb < trb,-1), colorRed, colorGreen );

cumVolume = SumSince2( pk OR tr, Volume);

Plot( cumVolume, "cumulated Volume", color, styleHistogram | styleOwnScale, 2 );

dist = ATR(10)*1.5;

for( i = 0; i < BarCount-1; i++ )

{

if( tr[ i+1 ] ) PlotText( NumToStr(CumVolume[ i ]/1000,1,1) +"k", i, L[ i ] - dist[i], colorRed );

if( pk[ i+1 ] ) PlotText( NumToStr(CumVolume[ i ]/1000,1,1) +"k", i, L[ i ] + dist[i], colorgreen );

linethickness = iif(  pk[ i+1 ]  AND CumVolume[ i ]/1000>10,10,2); // if mark up volume>10 then draw thick line.           

}

_SECTION_BEGIN("Price");
SetChartOptions(0,chartShowArrows|chartShowDates);
_N(Title = StrFormat("{{NAME}} - {{INTERVAL}} {{DATE}} Open %g, Hi %g, Lo %g, Close %g (%.1f%%) {{VALUES}}", O, H, L, C, SelectedValue( ROC( C, 1 ) ) ));
Plot( C, "Close", ParamColor("Color", colorDefault ), styleNoTitle | ParamStyle("Style") | GetPriceStyle() ); 
_SECTION_END();

Plot( Zig(Close,z), "Zig", colorBlue, styleThick,Null,Null,0,0,linethickness);

@C_M I believe the 9th argument of the Plot() function requires a NUMBER and will not accept an ARRAY.

I did not look for errors in the rest of your code, just your Plot line.

1 Like

I see, thanks pb.

I don’t know how to fix that. Any ideas?

@C_M One simple thing I can think of, you could use different colors. The color argument accepts arrays and you can vary a line’s color.

1 Like

I tried the following. Still not getting the chart I want. Any suggestions very welcome.

u = IIf( pk AND CumVolume[ i ]/ 1000<80,colorrgb(200,10,10),colorrgb(10,400,10));