Wonder if anyone can help me with this
I have been trying to plot the Equity curve on the low
level graphics
The formula was posted by Tomasz and would like to put
the chart on it too
AFL below
Can anyone let me know how to go about doing it?
Thank you
SetBarsRequired(1000000,1000000);
eq = Foreign("~~Equity", "C" );
yr = Year();
mo = Month();
YearChange = yr
!= Ref( yr, -1 );
MonChange = mo !=
Ref( mo, -1 );
FirstYr = 0;
LastYr = 0;
startbar = 0;
////////////////////////////
// SKIP
non-trading bars
////////////////////////////
for( i = 0; i < BarCount;
i++ )
{
if( eq[ i ] )
{
startbar = i;
break;
}
}
////////////////////////////
// collect yearly
/ monthly changes in equity
// into dynamic
variables
////////////////////////////
LastYrValue = eq[
startbar ];
LastMoValue = eq[
startbar ];
MaxYrProfit =
MinYrProfit = 0;
MaxMoProfit =
MinMoProfit = 0;
for( i = startbar + 1; i < BarCount;
i++ )
{
if( YearChange[ i ]
|| i == BarCount - 1 )
{
Chg = 100 * ( -1 + eq[ i ] /
LastYrValue );
VarSet("ChgYear"+ yr[ i - 1 ], Chg );
MaxYrProfit = Max( MaxYrProfit, Chg );
MinYrProfit = Min( MinYrProfit, Chg );
if( FirstYr == 0 ) FirstYr = yr[
i - 1 ];
LastYr = yr[ i ];
LastYrValue = eq[ i ];
}
if( MonChange [ i ]
|| i == BarCount - 1 )
{
mon = mo[ i - 1 ];
Chg = 100 * ( -1 + eq[ i ] /
LastMoValue );
VarSet("ChgMon" + yr[ i - 1 ] + "-" + mon, Chg );
VarSet("SumChgMon"+ mon, Chg + Nz( VarGet("SumChgMon"+ mon ) ) );
VarSet("SumMon" + mon, 1 + Nz( VarGet("SumMon"+ mon ) ) );
MaxMoProfit = Max( MaxMoProfit, Chg );
MinMoProfit = Min( MinMoProfit, Chg );
LastMoValue = eq[ i ];
}
}
/////////////////////////////////////////////////
// Drawing code
& helper functions
////////////////////////////////////////////////
GfxSetOverlayMode(2);
CellHeight = (Status("pxheight")-1)/(LastYr -
FirstYr + 3 );
CellWidth = (Status("pxwidth")-1)/14;
GfxSelectFont( "TimesNewRoman", 11 );
GfxSetBkMode( 1 );
function PrintInCell(
string, row, Col )
{
Color
= ColorRGB( IIf( row == 0 || col == 0 || col == 13, 220, 255 ), 255, IIf( row % 2, 255, 220 ) );
GfxSelectSolidBrush(
Color );
GfxRectangle( Col *
CellWidth,
row * CellHeight, (Col + 1 ) * CellWidth + 1,
(row + 1 ) * CellHeight + 1);
GfxDrawText( string, Col * CellWidth
+ 1,
row * CellHeight + 1,
(Col + 1 ) * CellWidth, (row + 1 ) * CellHeight, 32+5 );
}
YOffset = 25;
XOffset = 15;
function DrawBar( text,
bar, numbars, y, Miny, Maxy )
{
BarWidth =
(Status("pxwidth") - 4 * XOffset )/(
numbars + 1 );
BarHeight =
Status("pxheight") - 2 * YOffset;
relpos = (
y - Miny ) / (Maxy - Miny );
xp =
XOffset + ( bar + 0.5 ) * BarWidth;
yp =
YOffset + BarHeight * ( 1 - relpos );
xe =
XOffset + ( bar + 1 ) * BarWidth;
ye =
YOffset + BarHeight * ( 1 - ( -miny )/( maxy - miny ) );
if( y > 0 )
{
GfxGradientRect( xp, yp,
xe , ye,
ColorHSB( 70, 255 * relpos, 255 ), ColorHSB( 70, 20, 255 ) );
}
else
{
GfxGradientRect( xp, ye,
xe , yp,
ColorHSB( 0, 20, 255 ), ColorHSB( 0, 255 * ( 1 - relpos ), 255 ) );
}
GfxTextOut( text, xp, ye );
GfxTextOut( StrFormat("%.2f", y ), xp, yp );
}
function DrawLevels(
Miny, Maxy )
{
range = Maxy
- Miny;
grid = 100;
if( range < 10 ) grid = 1;
else
if( range < 20 ) grid = 2;
else
if( range < 50 ) grid = 5;
else
if( range < 100 ) grid = 10;
else
if( range < 200 ) grid = 20;
else
if( range < 500 ) grid = 50;
_TRACE("grid =
"+grid
+"
range "+range );
width = Status("pxwidth") - 4 * XOffset;
height = Status("pxheight") - 2 * YOffset;
GfxSelectPen( colorBlack,
1, 2 );
for( y = grid * ceil( Miny / grid );
y <= grid * floor( Maxy / grid ); y += grid )
{
yp = YOffset + Height * ( 1 - ( y - Miny ) / (Maxy - Miny ) );
GfxMoveTo( XOffset, yp );
GfxLineTo( XOffset + width
, yp );
GfxTextOut( ""+ y, XOffset + 2 + width, yp );
}
GfxSelectPen( colorBlack,
1, 0 );
GfxMoveTo( XOffset,
YOffset );
GfxLineTo( XOffset +
width, YOffset );
GfxLineTo( XOffset +
width, YOffset + Height );
GfxLineTo( XOffset ,
YOffset + Height );
GfxLineTo( XOffset ,
YOffset );
}
MonthNames = "Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec";
function
DisplayProfitTable( )
{
Header = "Year,"+MonthNames+",Yr
Profit%";
for( Col = 0; (Colname = StrExtract( Header, Col ) )
!= ""; Col++ )
{
PrintInCell( ColName, 0, Col );
}
Row = 1;
for( y = FirstYr; y
<= LastYr; y++ )
{
PrintInCell( StrFormat("%g", y ), Row, 0 );
PrintInCell( StrFormat("%.1f%%", VarGet("ChgYear" + y ) ), Row, 13 );
for( m = 1; m <= 12; m++ )
{
Chg
= VarGet("ChgMon" + y + "-" + m);
if( Chg )
PrintInCell( StrFormat("%.1f%%", Chg ), Row, m );
else
PrintInCell( "N/A", Row, m );
}
Row++;
}
PrintInCell("Mon.
Avg", Row, 0 );
for( m = 1; m <= 12; m++ )
{
PrintInCell( StrFormat("%.1f%%", Nz( VarGet("SumChgMon" + m)/VarGet("SumMon" + m ) ) ), Row,
m );
}
}
function DisplayYearlyProfits()
{
Bar = 0;
for( y = FirstYr; y
<= LastYr; y++ )
{
Chg
= VarGet("ChgYear" + y );
DrawBar( ""+y, Bar++, ( LastYr - FirstYr + 1 ), Chg, MinYrProfit, MaxYrProfit
);
}
GfxTextOut("Yearly %
Profit chart", 10, 10 );
DrawLevels(
MinYrProfit, MaxYrProfit );
}
function
DisplayMonthlyProfits()
{
Bar = 0;
MinAvgProf
= MaxAvgProf = 0;
for( y = 1; y <= 12; y++ )
{
Chg
= VarGet("SumChgMon" + y ) / VarGet("SumMon" + y );
MinAvgProf = Min( MinAvgProf, Chg );
MaxAvgProf = Max( MaxAvgProf, Chg );
}
for( y = 1; y <= 12; y++ )
{
Chg
= VarGet("SumChgMon" + y ) / VarGet("SumMon" + y );
DrawBar( StrExtract(MonthNames, y-1 ), Bar++, 13, Chg, MinAvgProf , MaxAvgProf );
}
GfxTextOut("Avg.
Monthly % Profit chart", 10, 10 );
DrawLevels(
MinAvgProf , MaxAvgProf );
}
///////////////////////////
// This function
checks if currently selected symbol
// is portfolio
equity
//////////////////////////
function CheckSymbol()
{
if( Name() != "~~Equity" )
{
GfxSelectFont( "Tahoma", 14 );
GfxSetBkMode( 1);
GfxTextOut("
Equity", 290, 3 );
}
}
////////////////////////////
// Main program -
chart type switch
////////////////////////////
type = ParamList("Chart
Type", "Profit Table|Yearly Profits|Avg. Monthly Profits", 0 );
switch( type )
{
case "Profit
Table":
DisplayProfitTable();
break;
case "Yearly
Profits":
DisplayYearlyProfits();
break;
case "Avg.
Monthly Profits":
DisplayMonthlyProfits();
break;
}
CheckSymbol();
MarkK