PureBytes Links
Trading Reference Links
|
Hello,
Please always provide original reference:
http://www.amibroker.com/kb/2007/10/11/low-level-gfx-example-yearlymonthly-profit-chart/
I discourage posting copies of codes here when they are available on Knowledge Base or UKB.
Best regards,
Tomasz Janeczko
amibroker.com
----- Original Message -----
From: "Gordon Sutherland" <gosuth@xxxxxxxxxx>
To: <amibroker@xxxxxxxxxxxxxxx>
Sent: Saturday, March 22, 2008 12:15 AM
Subject: RE: [amibroker] Monthly returns report
> Here is the AFL code that adds more Backtester Chart Pane Reports. Watch out
> for word wrap, as usual, with the under mentioned code. I attach the AFL for
> those who receive direct emails. Remember to use the Parameters pop-up
> window to select the various Reports. Enjoy - courtesy of Tomasz.
>
> Cheers,
>
> Gordon Sutherland
>
> // Filed by Tomasz Janezco 12th October 2007 as example of using low-level
> // graphics functions
> // This example shows the Profit from ~~~Equity Symbol after a system test.
> // Use Parameters to change the type of graph dispayed. Gordon Sutherland
> // (GBS)
>
> 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( "Tahoma", 8.5 );
>
> 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", 16 ); // Changed from 20 by GBS
> GfxSetTextColor(colorRed); // Added this function GBS (for a
> dash of colour!)
> GfxSetBkMode( 2 );
> GfxTextOut("For accurate results switch to ~~~EQUITY symbol (after running
> a System Test)", 200, 01 ); // Tweaked by GBS
> }
> }
>
> ////////////////////////////
> // 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();
>
> -----Original Message-----
> From: amibroker@xxxxxxxxxxxxxxx [mailto:amibroker@xxxxxxxxxxxxxxx] On Behalf
> Of droskill
> Sent: Saturday, 22 March 2008 11:50 a.m.
> To: amibroker@xxxxxxxxxxxxxxx
> Subject: [amibroker] Monthly returns report
>
> I've been looking everywhere on the site for a monthly report from the
> backtester - I know I saw it somewhere. Can someone point me to the code?
>
> Thanks!
>
>
> ------------------------------------
>
> Please note that this group is for discussion between users only.
>
> To get support from AmiBroker please send an e-mail directly to
> SUPPORT {at} amibroker.com
>
> For NEW RELEASE ANNOUNCEMENTS and other news always check DEVLOG:
> http://www.amibroker.com/devlog/
>
> For other support material please check also:
> http://www.amibroker.com/support.html
> Yahoo! Groups Links
>
>
>
>
> ------------------------------------
>
> Please note that this group is for discussion between users only.
>
> To get support from AmiBroker please send an e-mail directly to
> SUPPORT {at} amibroker.com
>
> For NEW RELEASE ANNOUNCEMENTS and other news always check DEVLOG:
> http://www.amibroker.com/devlog/
>
> For other support material please check also:
> http://www.amibroker.com/support.html
> Yahoo! Groups Links
>
>
>
>
------------------------------------
Please note that this group is for discussion between users only.
To get support from AmiBroker please send an e-mail directly to
SUPPORT {at} amibroker.com
For NEW RELEASE ANNOUNCEMENTS and other news always check DEVLOG:
http://www.amibroker.com/devlog/
For other support material please check also:
http://www.amibroker.com/support.html
Yahoo! Groups Links
<*> To visit your group on the web, go to:
http://groups.yahoo.com/group/amibroker/
<*> Your email settings:
Individual Email | Traditional
<*> To change settings online go to:
http://groups.yahoo.com/group/amibroker/join
(Yahoo! ID required)
<*> To change settings via email:
mailto:amibroker-digest@xxxxxxxxxxxxxxx
mailto:amibroker-fullfeatured@xxxxxxxxxxxxxxx
<*> To unsubscribe from this group, send an email to:
amibroker-unsubscribe@xxxxxxxxxxxxxxx
<*> Your use of Yahoo! Groups is subject to:
http://docs.yahoo.com/info/terms/
|