amibroker

HomeKnowledge Base

Low-level gfx example: Yearly/monthly profit chart

The code below is an little bit more complex example of Low Level Graphics functions (see http://www.amibroker.com/guide/a_lowlevelgfx.html)

It allows to display three kinds of charts:

  1. yearly/monthly profit table
  2. yearly profit bar chart
  3. average monthly profit bar chart

The type of chart is switchable from Parameters dialog.

It should be applied to ~~~EQUITY – portfolio equity symbol (so it only produces output if you run backtest before using it).



SetBarsRequired(1000000,1000000);
eq Foreign("~~~EQUITY""C" );

yr Year();
mo Month();

YearChange yr != Refyr, -);
MonChange mo != Refmo, -);

FirstYr 0;
LastYr 0;

startbar 0;

////////////////////////////
// SKIP non-trading bars
////////////////////////////
for( 0BarCounti++ )
{
  if( eq] )
  {
    startbar i;
    break;
  } 
}

////////////////////////////
// collect yearly / monthly changes in equity
// into dynamic variables
////////////////////////////

LastYrValue eqstartbar  ];
LastMoValue eqstartbar  ];

MaxYrProfit MinYrProfit 0;
MaxMoProfit MinMoProfit 0;

for( startbar 1BarCounti++ )
{
  if( YearChange] || == BarCount )
  {
    Chg 100 * ( -eq] / LastYrValue );
    VarSet("ChgYear"yr], Chg );

    MaxYrProfit MaxMaxYrProfitChg );
    MinYrProfit MinMinYrProfitChg );

    if( FirstYr == FirstYr yr];
    LastYr yr];

    LastYrValue eq];
  }

  if( MonChange ] || == BarCount )
  {
    mon mo];

    Chg 100 * ( -eq] / LastMoValue );

    VarSet("ChgMon" yr] + "-" monChg );
    VarSet("SumChgMon"monChg NzVarGet("SumChgMon"mon ) ) );
    VarSet("SumMon" monNzVarGet("SumMon"mon ) ) );
 
    MaxMoProfit MaxMaxMoProfitChg );
    MinMoProfit MinMinMoProfitChg );

    LastMoValue eq];
  }
}

/////////////////////////////////////////////////
// Drawing code & helper functions
////////////////////////////////////////////////

GfxSetOverlayMode);

CellHeight = (Status("pxheight")-1)/(LastYr FirstYr ); 
CellWidth = (Status("pxwidth")-1)/14GfxSelectFont"Tahoma"8.5 ); 

GfxSetBkMode);

function PrintInCellstringrowCol ) 
{
 Color =  ColorRGBIIfrow == || col == || col == 13220255 ), 255IIfrow 2255220 ) );
 GfxSelectSolidBrushColor   );
 GfxRectangleCol CellWidth, 
                    row CellHeight, (Col ) * CellWidth 1, 
                    (row ) * CellHeight  1); 
 GfxDrawTextstringCol CellWidth 1, 
                    row CellHeight 1, 
                    (Col ) * CellWidth, (row ) * CellHeight32+); 
} 


YOffset 25;
XOffset 15;

function DrawBartextbarnumbarsyMinyMaxy )
{
 BarWidth = (Status("pxwidth") - XOffset )/( numbars ); 
 BarHeight Status("pxheight") - YOffset;
 relpos = ( Miny ) / (Maxy Miny );

 xp XOffset + ( bar 0.5 ) * BarWidth;
 yp YOffset BarHeight * ( relpos );
 xe XOffset + ( bar ) * BarWidth;
 ye YOffset BarHeight * ( - ( -miny )/( maxy miny ) );
  
 if( )
 {
 GfxGradientRectxpyp, 
                  xe ye,
                  ColorHSB70255 relpos255 ), ColorHSB7020255 ) ); 
 }
 else
 {
 GfxGradientRectxpye, 
                  xe yp,
                  ColorHSB020255 ), ColorHSB0255 * ( relpos ), 255 ) ); 
 }
 GfxTextOuttextxpye );
 GfxTextOutStrFormat("%.2f"), xpyp );
}    

function DrawLevelsMinyMaxy )
{
  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") - XOffset;
  height Status("pxheight") - YOffset;

  GfxSelectPencolorBlack1);
  for( grid ceilMiny grid ); <= grid floorMaxy grid ); += grid )
  {
    yp =  YOffset Height * ( -  ( Miny ) / (Maxy Miny ) );

    GfxMoveToXOffsetyp );
    GfxLineToXOffset width yp );
    GfxTextOut""yXOffset widthyp );
  }

  GfxSelectPencolorBlack1);
  GfxMoveToXOffsetYOffset );
  GfxLineToXOffset widthYOffset );
  GfxLineToXOffset widthYOffset Height );
  GfxLineToXOffset YOffset Height );
  GfxLineToXOffset 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 StrExtractHeaderCol ) ) != ""Col++ )
 {
  PrintInCellColName0Col );
 }

 Row 1;
 for( FirstYr<= LastYry++ )
 {
  PrintInCellStrFormat("%g"), Row); 
  PrintInCellStrFormat("%.1f%%"VarGet("ChgYear" ) ), Row13 ); 
  for( 1<= 12m++ )
  { 
   Chg VarGet("ChgMon" "-" m);
   if( Chg ) 
     PrintInCellStrFormat("%.1f%%"Chg ), Row);
   else
     PrintInCell"N/A"Row);
  }
  Row++;
 } 

 PrintInCell("Mon. Avg"Row);
 for( 1<= 12m++ )
 { 
   PrintInCellStrFormat("%.1f%%",  NzVarGet("SumChgMon" m)/VarGet("SumMon" ) ) ), Row);
 }

}

function DisplayYearlyProfits()
{
 Bar 0;
 for( FirstYr<= LastYry++ )
 {
   Chg VarGet("ChgYear" );
   DrawBar""+yBar++, ( LastYr FirstYr ), ChgMinYrProfitMaxYrProfit );
 }
 GfxTextOut("Yearly % Profit chart"1010 );

 DrawLevelsMinYrProfitMaxYrProfit ); 
}

function DisplayMonthlyProfits()
{
 Bar 0;
 
 MinAvgProf MaxAvgProf 0;
 for( 1<= 12y++ )
 {
   Chg VarGet("SumChgMon" ) / VarGet("SumMon" );
   MinAvgProf MinMinAvgProfChg );
   MaxAvgProf MaxMaxAvgProfChg );
 }

 for( 1<= 12y++ )
 {
   Chg VarGet("SumChgMon" ) / VarGet("SumMon" );
   DrawBarStrExtract(MonthNamesy-), Bar++, 13ChgMinAvgProf MaxAvgProf );
 }
 GfxTextOut("Avg. Monthly % Profit chart"1010 );

 DrawLevelsMinAvgProf MaxAvgProf ); 
}

///////////////////////////
// This function checks if currently selected symbol
// is portfolio equity
//////////////////////////
function CheckSymbol()
{
 if( Name() != "~~~EQUITY" )
 {
  GfxSelectFont"Tahoma"20 ); 
  GfxSetBkMode);
  GfxTextOut("For accurate results switch to ~~~EQUITY symbol"1010 );
 }
}

////////////////////////////
// Main program - chart type switch
////////////////////////////
type ParamList("Chart Type""Profit Table|Yearly Profits|Avg. Monthly Profits");

switch( type )
{
 case "Profit Table": 
         DisplayProfitTable();  
         break;
 case "Yearly Profits": 
         DisplayYearlyProfits();
         break;
 case "Avg. Monthly Profits": 
         DisplayMonthlyProfits();
         break;
}

CheckSymbol();


Figure 1. Profit chart in table mode

Profit chart example 2

Figure 2. Profit chart in yearly mode

Profit chart example 3

Figure 3. Profit chart in monthly mode

Profit chart example 4

No comments yet. Be the first.

Leave a reply