PureBytes Links
Trading Reference Links
|
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 amibroker@xxxxxxxxxxxxxxx, "oceanchimes" <oceanchimes@xxx> 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();
>
------------------------------------
**** IMPORTANT PLEASE READ ****
This group is for the discussion between users only.
This is *NOT* technical support channel.
TO GET TECHNICAL SUPPORT send an e-mail directly to
SUPPORT {at} amibroker.com
TO SUBMIT SUGGESTIONS please use FEEDBACK CENTER at
http://www.amibroker.com/feedback/
(submissions sent via other channels won't be considered)
For NEW RELEASE ANNOUNCEMENTS and other news always check DEVLOG:
http://www.amibroker.com/devlog/
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/
|