Thanks a lot! Now it works 
To get a nicer chart you may also 6 to 5 in the following line (if your markets never trade on more than 5 days per week):
DrawBar( StrExtract(DayNames, y-1 ), Bar++, 6, Chg, MinAvgProf , MaxAvgProf );
Well, in the original monthly example is a 13 instead of a 12 - that's why I'd choosen the 13. But you're right. 12.
Now I've tried to go a step further. But there is anywhere a mistake... For example: I want to display the %-profit / loss in basis points (easy: %-profit / loss * 100) but it doesn't work. The hourly profit also contains a bug. What's wrong?
/*
Initial_Equity = Param("Initial Equity", 100000, 1000, 10000000, 1) ;
Risk = Param("Risk %", 0.1, 0.0001, 100, 0.0001) ;
Risk_absolut = Initial_Equity * (Risk / 100) ;
*/
SetBarsRequired(1000000,1000000);
eq = Foreign("~~~EQUITY", "C" );
yr = Year();
YearChange = yr != Ref( yr, -1 );
FirstYr = 0;
LastYr = 0;
week = Ref(DayOfWeek(), -1) >= 3 AND DayOfWeek() <= 3 ;
WeekChange = Week != Ref( Week, -1 );
DayOfW = DayOfWeek() ;
ho = Hour();
DailyChange = DayofW != Ref(DayofW, -1 );
DailyChange_BP = DailyChange ;
DayOfW_BP = DayOfW ;
HourlyChange = ho != Ref( ho, -1 );
startbar = 0;
////////////////////////////
// SKIP non-trading bars
////////////////////////////
for( i = 0; i < BarCount; i++ )
{
if( eq[ i ] )
{
startbar = i;
break;
}
}
////////////////////////////
// collect Daily / Hourly changes in equity
// into dynamic variables
////////////////////////////
LastYrValue = eq[ startbar ];
LastDayValue = eq[ startbar ];
LastDayValue_BP = eq[ startbar ];
LastHourValue = eq[ startbar ];
MaxYrProfit = MinYrProfit = 0;
MaxDailyProfit = MinDailyProfit = 0;
MaxDailyProfit_BP = MinDailyProfit_BP = 0;
MaxHourlyProfit = MinHourlyProfit = 0;
for( i = startbar + 1; i < BarCount; i++ )
{
if( YearChange[ i ] || i == BarCount - 1 )
{
Chg = 100 * ( -1 + eq[ i ] / LastYrValue );
VarSet("ChgYear"+ yr[ i - 1 ], Chg );
MaxYrProfit = Max( MaxYrProfit, Chg );
MinYrProfit = Min( MinYrProfit, Chg );
if( FirstYr == 0 ) FirstYr = yr[ i - 1 ];
LastYr = yr[ i ];
LastYrValue = eq[ i ];
}
if( DailyChange [ i ] || i == BarCount - 1 )
{
DayOfWoche = DayOfW[ i - 1 ]; // "DayOfWeek" als Name GEHT NICHT, da es ja schon eine Funktion ist
Chg = 100 * ( -1 + eq[ i ] / LastDayValue );
// Chg_absolut = eq[i] - LastDayValue ;
VarSet("SumChgDayOfWeek"+ DayOfWoche, Chg + Nz( VarGet("SumChgDayOfWeek"+ DayOfWoche ) ) );
// wenn Perf == 0,000000 ,dann wird die nicht beachtet --> nz
VarSet("SumDayOfWeek" + DayOfWoche, 1 + Nz( VarGet("SumDayOfWeek"+ DayOfWoche ) ) );
MaxDailyProfit = Max( MaxDailyProfit, Chg );
MinDailyProfit = Min( MinDailyProfit, Chg );
LastDayValue = eq[ i ];
}
if( DailyChange_BP [ i ] || i == BarCount - 1 )
{
DayOfWoche_BP = DayOfW_BP[ i - 1 ]; // "DayOfWeek" als Name GEHT NICHT, da es ja schon eine Funktion ist
Chg_BP = 100 * ( -1 + eq[ i ] / LastDayValue ) * 100 ;
// Chg_absolut = eq[i] - LastDayValue ;
VarSet("SumChgDayOfWeek_BP"+ DayOfWoche_BP, Chg_BP + Nz( VarGet("SumChgDayOfWeek_BP"+ DayOfWoche_BP ) ) );
// wenn Perf == 0,000000 ,dann wird die nicht beachtet --> nz
VarSet("SumDayOfWeek_BP" + DayOfWoche_BP, 1 + Nz( VarGet("SumDayOfWeek_BP"+ DayOfWoche_BP ) ) );
MaxDailyProfit_BP = Max( MaxDailyProfit_BP, Chg_BP );
MinDailyProfit_BP = Min( MinDailyProfit_BP, Chg_BP );
LastDayValue_BP = eq[ i ];
}
if( HourlyChange [ i ] || i == BarCount - 1 )
{
Hourly = ho[ i - 1 ]; // "DayOfWeek" als Name GEHT NICHT, da es ja schon eine Funktion ist
Chg = 100 * ( -1 + eq[ i ] / LastHourValue );
VarSet("SumChgHour"+ Hourly, Chg + Nz( VarGet("SumChgHour"+ Hourly ) ) );
// wenn Perf == 0,000000 ,dann wird die nicht beachtet --> nz
VarSet("SumHour" + Hourly, 1 + Nz( VarGet("SumHour"+ Hourly ) ) );
MaxHourlyProfit = Max( MaxHourlyProfit, Chg );
MinHourlyProfit = Min( MinHourlyProfit, Chg );
LastHourValue = eq[ i ];
}
}
/////////////////////////////////////////////////
// Drawing code & helper functions
/////////////////////////////////////////////////
GfxSetOverlayMode( 2 );
GfxFillSolidRect( 0, 0, Status( "pxwidth" ), Status( "pxheight" ), colorWhite );
CellHeight = (Status("pxheight")-1)/(LastYr - FirstYr + 3 );
CellWidth = (Status("pxwidth")-1)/14;
GfxSelectFont( "Tahoma", 8.5 );
GfxSetBkMode( 1 );
YOffset = 25;
XOffset = 15;
function DrawBar( text, 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 ) );
}
GfxTextOut( text, xp, ye );
GfxTextOut( StrFormat("%.4f", y ), xp, yp ); // hier kann man die NACHKOMMASTELLEN einstellen (aktuell auf 4)
}
function DrawLevels( Miny, Maxy )
{
range = Maxy - Miny;
grid = 100;
if( range < 0.00001 ) grid = 0.000001;
else
if( range < 0.00002 ) grid = 0.000002;
else
if( range < 0.00005 ) grid = 0.000005;
else
if( range < 0.0001 ) grid = 0.00001;
else
if( range < 0.0002 ) grid = 0.00002;
else
if( range < 0.0005 ) grid = 0.00005;
else
if( range < 0.001 ) grid = 0.0001;
else
if( range < 0.002 ) grid = 0.0002;
else
if( range < 0.005 ) grid = 0.0005;
else
if( range < 0.01 ) grid = 0.001;
else
if( range < 0.02 ) grid = 0.002;
else
if( range < 0.05 ) grid = 0.005;
else
if( range < 0.1 ) grid = 0.01;
else
if( range < 0.2 ) grid = 0.02;
else
if( range < 0.5 ) grid = 0.05;
else
if( range < 1 ) grid = 0.1;
else
if( range < 2 ) grid = 0.2;
else
if( range < 5 ) grid = 0.5;
else
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") - 4 * XOffset;
height = Status("pxheight") - 2 * YOffset;
GfxSelectPen( colorBlack, 1, 2 );
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 );
}
GfxSelectPen( colorBlack, 1, 0 );
GfxMoveTo( XOffset, YOffset );
GfxLineTo( XOffset + width, YOffset );
GfxLineTo( XOffset + width, YOffset + Height );
GfxLineTo( XOffset , YOffset + Height );
GfxLineTo( XOffset , YOffset );
}
DayNames = "Monday,Tuesday,Wednesday,Thursday,Friday";
Hourly_Selection = ParamList("Hour_Select", "24h|8-22") ;
switch ( Hourly_Selection )
{
case "24h":
HourNames = "0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23" ;
abcdefg = 24 ;
break;
case "8-22":
HourNames = "8,9,10,11,12,13,14,15,16,17,18,19,20,21" ;
abcdefg = 14 ;
break;
default:
break ;
}
function DisplayYearlyProfits()
{
Bar = 0;
for( y = FirstYr; y <= LastYr; y++ )
{
Chg = VarGet("ChgYear" + y );
DrawBar( ""+y, Bar++, ( LastYr - FirstYr + 1 ), Chg, MinYrProfit, MaxYrProfit );
}
GfxTextOut("Yearly % Profit chart", 10, 10 );
DrawLevels( MinYrProfit, MaxYrProfit );
}
function DisplayDailyProfits()
{
Bar = 0;
MinAvgProf = MaxAvgProf = 0;
for( y = 1; y <= 5; y++ )
{
Chg = VarGet("SumChgDayOfWeek" + y ) / VarGet("SumDayOfWeek" + y );
MinAvgProf = Min( MinAvgProf, Chg );
MaxAvgProf = Max( MaxAvgProf, Chg );
}
for( y = 1; y <= 5; y++ )
{
Chg = VarGet("SumChgDayOfWeek" + y ) / VarGet("SumDayOfWeek" + y );
DrawBar( StrExtract(DayNames, y-1 ), Bar++, 5, Chg, MinAvgProf , MaxAvgProf );
}
GfxTextOut("Avg. Daily % Profit chart", 10, 10 );
DrawLevels( MinAvgProf , MaxAvgProf );
}
function DisplayDailyProfits_inBasisPoints()
{
Bar = 0;
MinAvgProf_BP = MaxAvgProf_BP = 0;
for( y = 1; y <= 5; y++ )
{
Chg_BP = VarGet("SumChgDayOfWeek_BP" + y ) / VarGet("SumDayOfWeek_BP" + y ) ;
MinAvgProf_BP = Min( MinAvgProf_BP, Chg_BP );
MaxAvgProf_BP = Max( MaxAvgProf_BP, Chg_BP );
}
for( y = 1; y <= 5; y++ )
{
Chg_BP = VarGet("SumChgDayOfWeek_BP" + y ) / VarGet("SumDayOfWeek_BP" + y ) ;
DrawBar( StrExtract(DayNames, y-1 ), Bar++, 5, Chg_BP, MinAvgProf_BP , MaxAvgProf_BP );
}
GfxTextOut("Avg. Daily BASIS POINTS Profit chart", 10, 10 );
DrawLevels( MinAvgProf_BP , MaxAvgProf_BP );
}
function DisplayHourlyProfits()
{
Bar = 0;
MinAvgProf = MaxAvgProf = 0;
for( y = 1; y <= abcdefg; y++ )
{
Chg = VarGet("SumChgHour" + y ) / VarGet("SumHour" + y );
MinAvgProf = Min( MinAvgProf, Chg );
MaxAvgProf = Max( MaxAvgProf, Chg );
}
for( y = 1; y <= abcdefg; y++ )
{
Chg = VarGet("SumChgHour" + y ) / VarGet("SumHour" + y );
DrawBar( StrExtract(HourNames, y-1 ), Bar++, abcdefg, Chg, MinAvgProf , MaxAvgProf );
}
GfxTextOut("Avg. Hourly % Profit chart", 10, 10 );
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 Type", "Yearly Profits|Avg. Daily Profits|Avg. Daily Profits in BASIS POINTS|Avg. Hourly Profits", 0 );
switch( type )
{
case "Yearly Profits":
DisplayYearlyProfits();
break;
case "Avg. Daily Profits":
DisplayDailyProfits();
break;
case "Avg. Daily Profits in BASIS POINTS":
DisplayDailyProfits_inBasisPoints();
break;
case "Avg. Hourly Profits":
DisplayHourlyProfits();
break;
}
CheckSymbol();
/*
//////////////////////////////////
Filter = 1 ; // all symbols and quotes accepted //
Open_Mon = ValueWhen(DayOfWeek() == 1 AND Ref(DayOfWeek(), -1) >= 2, C) ;
Close_Mon = ValueWhen(DayOfWeek() == 1 AND Ref(DayOfWeek(), 1) >= 2, C) ;
Open_Tue = ValueWhen(DayOfWeek() == 2 AND Ref(DayOfWeek(), -1) == 1 OR Ref(DayOfWeek(), -1) >= 3, C) ;
Close_Tue = ValueWhen(DayOfWeek() == 2 AND Ref(DayOfWeek(), 1) >= 3 OR Ref(DayOfWeek(), 1) == 1, C) ;
Open_Wed = ValueWhen(DayOfWeek() == 3 AND Ref(DayOfWeek(), -1) <= 2 OR Ref(DayOfWeek(), -1) >= 4, C) ;
Close_Wed = ValueWhen(DayOfWeek() == 3 AND Ref(DayOfWeek(), 1) >= 4 OR Ref(DayOfWeek(), 1) <= 2, C) ;
Open_Thur = ValueWhen(DayOfWeek() == 4 AND Ref(DayOfWeek(), -1) <= 3 OR Ref(DayOfWeek(), -1) >= 5, C) ;
Close_Thur = ValueWhen(DayOfWeek() == 4 AND Ref(DayOfWeek(), 1) >= 5 OR Ref(DayOfWeek(), 1) <= 3, C) ;
Open_Fr = ValueWhen(DayOfWeek() == 5 AND Ref(DayOfWeek(), -1) <= 4 OR Ref(DayOfWeek(), -1) >= 6, C) ;
Close_Fr = ValueWhen(DayOfWeek() == 5 AND Ref(DayOfWeek(), 1) >= 6 OR Ref(DayOfWeek(), 1) <= 4, C) ;
Perf_Mon_OpenToClose = (Close_Mon - Open_Mon) / Open_Mon ;
Perf_Tue_OpenToClose = (Close_Tue - Open_Tue) / Open_Tue ;
Perf_Wed_OpenToClose = (Close_Wed - Open_Wed) / Open_Wed ;
Perf_Thur_OpenToClose = (Close_Thur - Open_Thur) / Open_Thur ;
Perf_Fr_OpenToClose = (Close_Fr - Open_Fr) / Open_Fr ;
Perf_Mon_CloseToClose = (Close_Mon - Close_Fr) / Close_Fr ;
Perf_Tue_CloseToClose = (Close_Tue - Close_Mon) / Close_Mon ;
Perf_Wed_CloseToClose = (Close_Wed - Close_Tue) / Close_Tue ;
Perf_Thur_CloseToClose = (Close_Thur - Close_Wed) / Close_Wed ;
Perf_Fr_CloseToClose = (Close_Fr - Close_Thur) / Close_Thur ;
// pchng_Mon = IIf( DayOfWeek() == 1, ((C - O) / O), 0) ;
AddColumn(Perf_Mon_OpenToClose, "Perf_Mon_OpenToClose", format = 1.5 );
AddColumn(Perf_Tue_OpenToClose, "Perf_Tue_OpenToClose", format = 1.5 );
AddColumn(Perf_Wed_OpenToClose, "Perf_Wed_OpenToClose", format = 1.5 );
AddColumn(Perf_Thur_OpenToClose, "Perf_Thur_OpenToClose", format = 1.5 );
AddColumn(Perf_Fr_OpenToClose, "Perf_Fr_OpenToClose", format = 1.5 );
AddColumn(Perf_Mon_CloseToClose, "Perf_Mon_CloseToClose", format = 1.5 );
AddColumn(Perf_Tue_CloseToClose, "Perf_Tue_CloseToClose", format = 1.5 );
AddColumn(Perf_Wed_CloseToClose, "Perf_Wed_CloseToClose", format = 1.5 );
AddColumn(Perf_Thur_CloseToClose, "Perf_Thur_CloseToClose", format = 1.5 );
AddColumn(Perf_Fr_CloseToClose, "Perf_Fr_CloseToClose", format = 1.5 );
AddColumn(DayofWeek() == 1, "Number of Mondays", format = 1.0) ;
AddColumn(DayofWeek() == 2, "Number of Tuesdays", format = 1.0) ;
AddColumn(DayofWeek() == 3, "Number of Wednesdays", format = 1.0) ;
AddColumn(DayofWeek() == 4, "Number of Thursdays", format = 1.0) ;
AddColumn(DayofWeek() == 5, "Number of Fridays", format = 1.0) ;
AddSummaryRows( 2, 1.7);
*/