You are on page 1of 12

AFL PnF Inditraders

http://www.inditraders.com/amibroker/11094-help-regarding-point-figure-afl.html

/*P&F Chart based on closing prices.


Place entire code in Indicator Builder.
Box size has been set for different price ranges to allow more equitable chart
viewing over large data ranges.
The Price ranges are set at change values (cxx) and box values (bxx) below,
and are in values of cents. (eg c1000 is $10.00 and b1000 is $0.10 ) My chart
price axis is in cents as that is where most of my stock prices reside at
lower prices.
Box sizes are set to be eg b10 is for between c5 and c10.
They can be altered here to suit your overall chart values. (eg if you deal
more in larger priced stocks, or in $ price axis)
Graham Kavanagh 01/Feb/2003
*/
SetBarsRequired(100000,100000);
//Set the Price limits for change of box values
c5 = 5;
c10 = 10;
c20 = 20;
c50 = 50;
c100 = 100;
c200 = 200;
c500 = 500;
c1000 = 1000;
c2000 = 2000;
c3000 = 3000;
c4000 = 4000;
c5000 = 5000;
//Set box values Bx for the price up to Cx
b5 = 0.1;
b10 = 0.2;
b20 = 0.25;
b50 = 0.5;
b100 = 1;
b200 = 2;
b500 = 5;
b1000 = 10;
b2000 = 20;
binfinity = 40;

//Number of boxes in each price range


nb5 = c5/b5;
nb10 = nb5 + (c10-c5)/b10;
nb20 = nb10 + (c20-c10)/b20;
nb50 = nb20 + (c50-c20)/b50;
nb100 = nb50 + (c100-c50)/b100;
nb200 = nb100 + (c200-c100)/b200;
nb500 = nb200 + (c500-c200)/b500;
nb1000 = nb500 + (c1000-c500)/b1000;
nb2000 = nb1000 + (c2000-c1000)/b2000;
nb3000 = nb2000 + (c3000 - c2000)/binfinity;
nb4000 = nb3000 + (c4000 - c3000)/binfinity;
nb4000 = nb4000 + (c5000 - c4000)/binfinity;

//define box values for each price zone


box = IIf(C<=c5,b5,
IIf(C>c5 AND C<=c10, b10,
IIf(C>c10 AND C<=c20, b20,
IIf(C>c20 AND C<=c50, b50,
IIf(C>c50 AND C<=c100, b100,
IIf(C>c100 AND C<=c200, b200,
IIf(C>c200 AND C<=c500, b500,
IIf(C>c500 AND C<=c1000, b1000,
IIf(C>c1000 AND C<=c2000, b2000,
binfinity )))))))));

//Round the Close data into box equivalents


CF = ceil(C/box)*box;
CR = floor(C/box)*box;

//Rising chart values


CRB = IIf(CR<=c5, 0 + CR/b5,
IIf(CR>c5 AND CR<=c10, nb5+(CR-c5)/b10,
IIf(CR>c10 AND CR<=c20, nb10+(CR-c10)/b20,
IIf(CR>c20 AND CR<=c50, nb20+(CR-c20)/b50,
IIf(CR>c50 AND CR<=c100, nb50+(CR-c50)/b100,
IIf(CR>c100 AND CR<=c200, nb100+(CR-c100)/b200,
IIf(CR>c200 AND CR<=c500, nb200+(CR-c200)/b500,
IIf(CR>c500 AND CR<=c1000, nb500+(CR-c500)/b1000,
IIf(CR>c1000 AND CR<=c2000, nb1000+(CR-c1000)/b2000,
nb2000+(CR-c2000)/binfinity
)))))))));
//Falling chart values
CFB = IIf(CF<=c5, 0 + CF/b5,
IIf(CF>c5 AND CF<=c10, nb5+(CF-c5)/b10,
IIf(CF>c10 AND CF<=c20, nb10+(CF-c10)/b20,
IIf(CF>c20 AND CF<=c50, nb20+(CF-c20)/b50,
IIf(CF>c50 AND CF<=c100, nb50+(CF-c50)/b100,
IIf(CF>c100 AND CF<=c200, nb100+(CF-c100)/b200,
IIf(CF>c200 AND CF<=c500, nb200+(CF-c200)/b500,
IIf(CF>c500 AND CF<=c1000, nb500+(CF-c500)/b1000,
IIf(CF>c1000 AND CF<=c2000, nb1000+(CF-c1000)/b2000,
nb2000+(CF-c2000)/binfinity
)))))))));

//Jscript to produce the P&F chart


EnableScript("jscript");
<%

Close = VBArray( AFL( "Close" ) ).toArray();


CRB = VBArray( AFL( "CRB" ) ).toArray();
CFB = VBArray( AFL( "CFB" ) ).toArray();

PFO = new Array();


PFC = new Array();

Reverse = 3 ; // reversal requirement

// initialize first element


j = 0;
PFC[j] = CFB[0];
PFO[j] = CFB[0]+1;
down = 1; // By default the first bar is a down bar.
up = 0;
swap = 0;

// perform the loop that produces PF Chart


for( i = 1; i < Close.length; i++ )
{

if( CFB[i] <= PFC[j]-1 && down) //continue down


{
PFC[j] = CFB[i];
PFO[j] = CFB[i]+1;
}
else
{
if( CRB[i] >= PFC[j] + Reverse && down) //Change direction to up
{
j++;
swap = 1;
PFC[j] = CRB[i];
PFO[j] = CRB[i] - 1;
}
}
if( CRB[i] >= PFC[j] + 1 && up) //Continue up
{
PFC[j] = CRB[i];
PFO[j] = CRB[i] - 1;
}
else
{
if( CFB[i] <= PFC[j] - Reverse && up) //Change direction to down
{
j++;
PFC[j] = CRB[i];
PFO[j] = CRB[i]+1;
swap = 1;
}
}
if( swap )
{
swap = 0;
if( up )
{
up = 0;
down = 1;
}
else
{
up = 1;
down = 0;
}
}
}
delta = Close.length - j-1;

AFL.Var("PFO") = PFO;
AFL.Var("PFC") = PFC;
AFL.Var("delta") = delta;
AFL.Var("Reverse") = Reverse;
AFL.Var("j") = j;

%>

PFO = Ref( PFO, -delta );


PFC = Ref( PFC, -delta );

// High-Low range sets the height of the P&F bar


H = IIf(Ref(PFC,-1)>Ref(PFO,-1),Ref(HHV(PFC,1),-1)-1,Max(PFO,PFC));
L = IIf(Ref(PFC,-1)<Ref(PFO,-1),Ref(LLV(PFC,1),-1)+1,Min(PFO,PFC));
O = IIf(Ref(PFC,-1)>Ref(PFO,-1),Ref(HHV(PFC,1),-1)-1,IIf(Ref(PFC,-1)<Ref(PFO,-
1),Ref(LLV(PFC,1),-1)+
1,PFO));

// the difference between Open AND Close should be set to box size
// the sign decides if X or O are plotted
C = O + 1 * IIf( PFC > PFO, 1,-1);

//Colours of major gridlines at box values change points. Colours for easier
chart identification
Color5 = colorYellow ;
Color10 = colorBlue;
Color20 = colorBrown;
Color50 = colorIndigo;
Color100 = colorGreen;
Color200 = colorTan;
Color500 = colorOrange;
Color1000 = colorLightBlue;
Color2000 = colorLime;
Color3000 = colorRed;
Color4000 = colorBlack;
colorgrid = colorWhite; //colours of intermediate gridlines

GraphXSpace = 5;

Title = "PF Chart box varies, H:" + WriteVal(H,1.0)+ ", L:" + WriteVal(L,1.0)
+
".... White gridlines are spaced at 20% intervals betweenmain gridlines." +
"\n" + "Y-Axis values = " +
EncodeColor(color5) + WriteVal(C5,1.0) + "c@ " + WriteVal(nb5,1.0) + ", " +
EncodeColor(color10) + WriteVal(C10,1.0) + "c@ " + WriteVal(nb10,1.0) + ", " +
EncodeColor(color20) + WriteVal(C20,1.0) + "c@ " + WriteVal(nb20,1.0) + ", " +
EncodeColor(color50) + WriteVal(C50,1.0) + "c@ " + WriteVal(nb50,1.0) + ", " +
EncodeColor(color100) + "$" + WriteVal(C100/100,1.0) + "@ " +
WriteVal(nb100,1.0) + ", " +
EncodeColor(color200) + "$" + WriteVal(C200/100,1.0) + "@ " +
WriteVal(nb200,1.0) + ", " +
EncodeColor(color500) + "$" + WriteVal(C500/100,1.0) +"@ " +
WriteVal(nb500,1.0) + ", " +
EncodeColor(color1000)+",$"+WriteVal(C1000/100,1.0) + "@ " +
WriteVal(nb1000,1.0) + ", " +
EncodeColor(color2000) + "$" + WriteVal(C2000/100,1.0) + "@ " +
WriteVal(nb2000,1.0) + ", " +
EncodeColor(color3000) + "$" + WriteVal(C3000/100,1.0) + "@ " +
WriteVal(nb3000,1.0) + ", " +
EncodeColor(color4000) + "$" + WriteVal(C4000/100,1.0) + "@ " +
WriteVal(nb4000,1.0) +"\n"+
"Box Values (cents) = "+
EncodeColor(color5)+"below " +WriteVal(nb5,1.0) + "=" + WriteVal(b5,1.2) + ",
" +
EncodeColor(color10)+WriteVal(nb5,1.0)+"-"+WriteVal(nb10,1.0)+"="+WriteVal(b10
,1.2)+", "+
EncodeColor(color20)+WriteVal(nb10,1.0)+"-"+WriteVal(nb20,1.0)+"="+WriteVal(b2
0,1.2)+", "+
EncodeColor(color50)+WriteVal(nb20,1.0)+"-"+WriteVal(nb50,1.0)+"="+WriteVal(b5
0,1.2)+", "+
EncodeColor(color100)+WriteVal(nb50,1.0)+"-"+WriteVal(nb100,1.0)+"="+WriteVal(
b100,1.1)+", "+
EncodeColor(color200)+WriteVal(nb100,1.0)+"-"+WriteVal(nb200,1.0)+"="+WriteVal
(b200,1.0)+", "+
EncodeColor(color500)+WriteVal(nb200,1.0)+"-"+WriteVal(nb500,1.0)+"="+WriteVal
(b500,1.0)+", "+
EncodeColor(color1000)+WriteVal(nb500,1.0)+"-"+WriteVal(nb1000,1.0)+"="+WriteV
al(b1000,1.0)+", "+
EncodeColor(color2000)+WriteVal(nb1000,1.0)+"-"+WriteVal(nb2000,1.0)+"="+Write
Val(b2000,1.0)+", "+
EncodeColor(color3000 )+WriteVal(nb2000,1.0)+"&
above"+"="+WriteVal(binfinity,1.0);

Plot(C,"P&F Chart Close",IIf( PFC > PFO, colorBlue,


colorRed ),styleCandle+styleNoLabel+stylePointAndFigure);

PlotGrid( nb5, color5 );


PlotGrid( nb10, color10 );
PlotGrid( nb20, color20 );
PlotGrid( nb50, color50 );
PlotGrid( nb100, color100 );
PlotGrid( nb200, color200 );
PlotGrid( nb500, color500 );
PlotGrid( nb1000, color1000 );
PlotGrid( nb2000, color2000 );
PlotGrid( nb3000, color3000 );
PlotGrid( nb4000, color4000 );

PlotGrid(nb5*0.2,colorgrid);
PlotGrid(nb5*0.4,colorgrid);
PlotGrid(nb5*0.6,colorgrid);
PlotGrid(nb5*0.8,colorgrid);
PlotGrid(nb5+(nb10-nb5)*0.2,colorgrid);
PlotGrid(nb5+(nb10-nb5)*0.4,colorgrid);
PlotGrid(nb5+(nb10-nb5)*0.6,colorgrid);
PlotGrid(nb5+(nb10-nb5)*0.8,colorgrid);
PlotGrid(nb10+(nb20-nb10)*0.2,colorgrid);
PlotGrid(nb10+(nb20-nb10)*0.4,colorgrid);
PlotGrid(nb10+(nb20-nb10)*0.6,colorgrid);
PlotGrid(nb10+(nb20-nb10)*0.8,colorgrid);
PlotGrid(nb20+(nb50-nb20)*0.2,colorgrid);
PlotGrid(nb20+(nb50-nb20)*0.4,colorgrid);
PlotGrid(nb20+(nb50-nb20)*0.6,colorgrid);
PlotGrid(nb20+(nb50-nb20)*0.8,colorgrid);
PlotGrid(nb50+(nb100-nb50)*0.2,colorgrid);
PlotGrid(nb50+(nb100-nb50)*0.4,colorgrid);
PlotGrid(nb50+(nb100-nb50)*0.6,colorgrid);
PlotGrid(nb50+(nb100-nb50)*0.8,colorgrid);
PlotGrid(nb100+(nb200-nb100)*0.2,colorgrid);
PlotGrid(nb100+(nb200-nb100)*0.4,colorgrid);
PlotGrid(nb100+(nb200-nb100)*0.6,colorgrid);
PlotGrid(nb100+(nb200-nb100)*0.8,colorgrid);
PlotGrid(nb200+(nb500-nb200)*0.2,colorgrid);
PlotGrid(nb200+(nb500-nb200)*0.4,colorgrid);
PlotGrid(nb200+(nb500-nb200)*0.6,colorgrid);
PlotGrid(nb200+(nb500-nb200)*0.8,colorgrid);
PlotGrid(nb500+(nb1000-nb500)*0.2,colorgrid);
PlotGrid(nb500+(nb1000-nb500)*0.4,colorgrid);
PlotGrid(nb500+(nb1000-nb500)*0.6,colorgrid);
PlotGrid(nb500+(nb1000-nb500)*0.8,colorgrid);
PlotGrid(nb1000+(nb2000-nb1000)*0.2,colorgrid);
PlotGrid(nb1000+(nb2000-nb1000)*0.4,colorgrid);
PlotGrid(nb1000+(nb2000-nb1000)*0.6,colorgrid);
PlotGrid(nb1000+(nb2000-nb1000)*0.8,colorgrid);
PlotGrid(nb2000+(nb3000-nb2000)*0.2,colorgrid);
PlotGrid(nb2000+(nb3000-nb2000)*0.4,colorgrid);
PlotGrid(nb2000+(nb3000-nb2000)*0.6,colorgrid);
PlotGrid(nb2000+(nb3000-nb2000)*0.8,colorgrid);
PlotGrid(nb3000+(nb4000-nb3000)*0.2,colorgrid);
PlotGrid(nb3000+(nb4000-nb3000)*0.4,colorgrid);
PlotGrid(nb3000+(nb4000-nb3000)*0.6,colorgrid);
PlotGrid(nb3000+(nb4000-nb3000)*0.8,colorgrid);

NEXT

_SECTION_BEGIN( "Point & Figure w Values adj" );

GraphXSpace = 5;

SetChartBkColor( ParamColor( "BackGroundColor", colorBlack) );

//GraphColor = ParamColor("GarphColor",colorLightGrey);

GridColor = ParamColor( "GridColor", colorLightGrey );

Scaling = ParamList( "Scaling Method", "Traditional|Percentage|AVG True


Range" );

if ( scaling == "Traditional" )

Box = Param( "Box", 1, 0.2, 10, 0.1 );

else

if ( scaling == "Percentage" )

Box = Param( "Box ", 1, 0.2, 10, 0.1 ) / 100 * LastValue( C );

else

if ( scaling == "AVG True Range" )

Box = Param( "Box", 1, 0.3, 5, 0.1 ) * LastValue( ATR ( 20 ) );

shiftChart = 0;

shiftLastClose = 1;

shiftGrid = 7;

shiftPriceAxis = 2;
Reverse = Param( "Reverse", 3, 1, 5 );

j = 0;

PFL[0] = Box * ceil( Low[0] / Box ) + Box;

PFH[0] = Box * floor( High[0] / Box );

direction = 0;

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

if ( direction[j] == 0 )

if ( Low[i] <= PFL[j] - Box )

PFL[j] = Box * ceil( Low[i] / Box );

else

if ( High[i] >= PFL[j] + Reverse*Box )

j++;

direction[j] = 1;

PFH[j] = Box * floor( High[i] / Box );

PFL[j] = PFL[j - 1] + Box;

else

if ( High[i] >= PFH[j] + Box )


{

PFH[j] = Box * floor( High[i] / Box );

else

if ( Low[i] <= PFH[j] - Reverse * Box )

j++;

direction[j] = 0;

PFH[j] = PFH[j - 1] - Box;

PFL[j] = Box * ceil( Low[i] / Box );

delta = BarCount - j - 1;

direction = Ref( direction, - delta );

Hi = Ref( PFH, -delta ) + Box / 2;

Lo = Ref( PFL, -delta ) - Box / 2;

Cl = IIf( direction == 1, Hi, Lo );

Op = IIf( direction == 1, Cl - Box, Cl + Box );

Graphcolor = IIf( direction == 1, ParamColor( "X_Color",


colorBrightGreen),

ParamColor( "O_Color", colorRed ) );

PlotOHLC( Op, Hi, Lo, Cl, "", GraphColor ,

stylePointAndFigure | styleNoLabel, 0, 0 , shiftChart );

PlotOHLC( Op, Hi, Lo, Cl, "", GraphColor , stylePointAndFigure |


styleNoLabel, 0, 0 , shiftChart );
Last = Ref( LastValue( C ), -( BarCount - 1 ) );

Plot( Last, "", colorRed, styleNoLine | styleDots, 0 , 0,


shiftLastClose );

// selected value

Value = IIf( direction > 0, SelectedValue( Hi ) - box / 2,


SelectedValue( Lo ) + box / 2 );

//-----------------------------------------------------------------------

// GRID CONSTRUCTION

//----------------------------------------------------------------------

PlotGridLines = ParamToggle( "PlotdGrid", "Yes! |No", 1 ) ;

if ( PlotGridLines )

begin = SelectedValue( BarIndex() );

end = LastValue( BarIndex() );

period = end - begin + 1;

if ( begin < end )

ScreenHigh = LastValue( HHV( cl, period ) );

ScreenLow = LastValue( LLV( Cl, period ) );

top = LineArray( begin - shiftGrid, screenHigh, end, screenhigh, 0 , 1);

Bot = LineArray( begin - shiftGrid, screenlow, end, screenLow, 0, 1 );

Plot( top, "", gridColor, styleLine | styleNoLabel , 0, 0, shiftGrid );

//Plot( bot, "", gridColor,styleLine|styleNoLabel, 0 , 0 , shiftGrid);

VerticalGrid = IIf ( BarIndex() >= begin, IIf( direction == 1,screenHigh,


screenLow ), Null );

Plot ( VerticalGrid, "", gridColor, styleStaircase | styleNoLabel, 0, 0, 1


);
format = 8.2;

for ( n = LastValue( bot ); n < LastValue( top ) - 0.5*box; n = n + box );

Plot( bot , "", gridColor, styleLine | styleNoLabel, 0, 0 , shiftGrid );

text = NumToStr( LastValue( bot ) + 0.5 * box, format );

xposition = BarCount + shiftPriceaxis;

yPosition = LastValue( bot ) + 0.27 * box;

PlotText( text, xPosition , yPosition, colorBlue );

bot = bot + box;

Graphcolor = IIf( direction == 1, ParamColor( "X_Color", colorBrightGreen


),

ParamColor( "O_Color", colorRed ) );

PlotOHLC( Op, Hi, Lo, Cl, "", GraphColor ,

stylePointAndFigure | styleNoLabel, 0, 0 , shiftChart );

//---------------------------------------------------------------------

// TITLE

//----------------------------------------------------------------------

Title = "\n" +

" Instrument : " + Name() + FullName() + "\n " +

"Formula : " + " Point & Figure (High/Low Range)" + "\n " +

"Box : " + NumToStr( Box, 4.4 ) + " " +

"Reverse : " + NumToStr( Reverse, 2.0 ) + "\n " +

"ATR : " + WriteVal( LastValue( ATR( 100 ) ), format = 4.4 );


_SECTION_END();

You might also like