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