I wrote an Exploration version without all the graphics code using Tomasz's 
exact calculation logic. Progster modified it for end of month to end of month. 
The end result can be found here:

http://www.codefortraders.com/phpBB3/viewtopic.php?f=60&t=190

Mike

--- In [email protected], "bh.hicks" <bh.hi...@...> wrote:
>
> Oceanchimes,
> I did see that when researching everything but it seemed overly complex for 
> what I thought was an easy task but I will revisit it. I think I just need to 
> come back at this when fresh.  Long day and I am spent.  Thank you.
> 
> 
> 
> 
> 
> --- In [email protected], "oceanchimes" <oceanchimes@> wrote:
> >
> > 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