Hi,
I'm not sure this is exactly what you want, however TJ posted this on the 
Knowledge Base and some smart types have modified some. I think this is almost 
the same as the original and give ideas to solve you requirement.
F

// Yearly/monthly profit chart

/* 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 the following charts:

   1. yearly/monthly profit table
   2. yearly profit bar chart
   3. monthly profit bar chart 
   4. 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).
*/
FixedEq = ParamToggle("Equity or Capital?","Open|Fixed",1);

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
//////////////////////////////////////////////
RefYrValue              = Eq[ Startbar ];
RefMoValue              = Eq[ startbar ];

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 )
  {
    if( !FixedEq ) { RefYrValue = LastYrValue; }
    else { RefYrValue = Eq[startbar]; }//keeps Initial Equity

    Chg = 100 * ( Eq[i] - LastYrValue ) / RefYrValue;
    VarSet("ChgYear"+ yr[i-1], Chg );//year chg each year

    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];

    if( !FixedEq ) { RefMoValue = LastMoValue; }
    else { RefMoValue = Eq[startbar]; }//keeps Initial Equity

    Chg = 100 * ( Eq[i] - LastMoValue )/ RefMoValue;

    VarSet("ChgMon" + yr[i-1] + "-" + mon, Chg );//month chg each year
    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);

YOffset = 25;
XOffset = 10;//15;

width           = Status("pxwidth") - 4 * XOffset;
height          = Status("pxheight") - 2 * YOffset;

//--------------------------------------------------------------------------------
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 ); 
} 

//--------------------------------------------------------------------------------
function DrawBar( text, txtLabel, 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) ); 
 }
 //draw bar labels along x-axis
 GfxSetTextColor(colorGreen);
 GfxTextOut( text, xp, ye );

 //draw bar% values
 if( y<0 )
 {
  GfxSetTextColor(colorRed);
  GfxTextOut( StrFormat("%.2f", y ), xp, yp );
 }
 else
 {
  GfxTextOut( StrFormat("%.2f", y ), xp, yp-YOffset/2 );
 }

 //draw X-label along the very bottom underneath boxed area
 if( txtLabel != "" )
 {
  GfxSelectFont( "Tahoma", 10, 580 );
  GfxSetTextColor(colorGreen);
  GfxTextOut( txtLabel, xp, XOffset + Height + YOffset);
  GfxSelectFont( "Tahoma", 8.5 );
 }
}    

//--------------------------------------------------------------------------------
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 );
  
  GfxSelectPen( colorWhite, 1, 2 );
  //draws the grid lines
  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 );
  }
  //draws the box around the chart area
  GfxSelectPen( colorWhite, 1, 0 );
  GfxMoveTo( XOffset, YOffset );                                                
//move to top/left
  GfxLineTo( XOffset + width, YOffset );                                //line 
to top/right
  GfxLineTo( XOffset + width, YOffset + Height );       //line to bottom/right
  GfxLineTo( XOffset , YOffset + Height );                      //line to 
bottom/left
  GfxLineTo( XOffset , YOffset );                                               
//line to top/left
}

//--------------------------------------------------------------------------------
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);
 }
 GfxSelectFont( "Tahoma", 12, 580 );
 GfxTextOut("Yearly % Profit chart", 10, 0 );
 GfxSelectFont( "Tahoma", 8.5 );

 DrawLevels( MinYrProfit, MaxYrProfit ); 
}

//--------------------------------------------------------------------------------
function DisplayMonthlyProfits(YrOff, NumYrs)
{
 Bar = 0;
 MoXLbl = "";
 dspStartYr     = Min(FirstYr + YrOff, LastYr);
 dspEndYr               = Min(FirstYr + YrOff + NumYrs - 1, LastYr);

 //determine monthly min/max for the displayed range
 MinMoProfit = MaxMoProfit = 0;
 for( y = dspStartYr; y <= dspEndYr; y++ )
 {
  for( m=1; m<=12; m++ )
  {
   Chg = VarGet("ChgMon" + y + "-" + m);

   if( abs( Nz(Chg) ) > 0 )
   { MaxMoProfit = Max( MaxMoProfit, Chg ); 
     MinMoProfit = Min( MinMoProfit, Chg ); }
  }
 }

 for( y = dspStartYr; y <= dspEndYr; y++ )
 {
  for( m=1; m<=12; m++ )
  {
   if( m==1 ) { YrXLbl = "" + y; } else { YrXLbl = ""; }

   MoXLbl = StrLeft( StrExtract(MonthNames, m-1 ), 3*(3/(NumYrs)) );
   TotMos       = 12*(dspEndYr - dspStartYr + 1);

   Chg = VarGet("ChgMon" + y + "-" + m);
   DrawBar( MoXLbl, YrXLbl, Bar++, TotMos, Chg, MinMoProfit , MaxMoProfit );
  }
 }
 GfxSelectFont( "Tahoma", 12, 580 );
 GfxSetTextColor( colorGreen );
 GfxTextOut("Monthly % Profit chart", 10, 0 );
 GfxSelectFont( "Tahoma", 8.5 );

 DrawLevels( MinMoProfit , MaxMoProfit ); 
}

//--------------------------------------------------------------------------------
function DisplayAvgMonthlyProfits()
{
 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,"");
 }
 GfxSelectFont( "Tahoma", 12, 580 );
 GfxTextOut("Avgerage Monthly % Profit chart", 10, 0 );
 GfxSelectFont( "Tahoma", 8.5 );

 DrawLevels( MinAvgProf , MaxAvgProf ); 
}

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

////////////////////////////
// Main program - chart type switch
////////////////////////////
type = ParamList( "Chart Profit Type", "Table|Yearly|Monthly|Avg. Monthly", 1 );
dspStart        = Param( "Shift Display #Yrs later", 0, 0, 30, 1 );
dspBars = Param( "NumberOfYrs displayed", 1, 1, 30, 1 );

switch( type )
{
 case "Table": 
         DisplayProfitTable();  
         break;
 case "Yearly": 
         DisplayYearlyProfits();
         break;
 case "Monthly": 
         DisplayMonthlyProfits(dspStart, dspBars);
         break;
 case "Avg. Monthly": 
         DisplayAvgMonthlyProfits();
         break;
}

CheckSymbol();




Reply via email to