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" <oceanchi...@...> 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(); >
