In the interest of completeness, here's an updated version that corrects a bug in the calculation of "initialValue" , discovered during a paralell thread: http://finance. groups.yahoo. com/group/ amibroker/ message/145407 and adds a little better documentation in the form of the chart title.
baseColor = colorDarkRed;
boundaryColor = colorLightGrey;
years = Param( "Years", 3, 1, 15, 1 );
newYear = Year() != Ref( Year(), -1 );
avgROC = 0;
// Create dynamic variables for each year (excluding current)
for ( y = 1; y <= years; y++ )
{
initialValue = ValueWhen( newYear, Close, y + 1 );
barValue = Ref( Close, -252 * y );
runningROC = ( ( barValue / initialValue ) - 1 ) * 100;
VarSet( "Year" + y, runningROC );
avgROC += runningROC;
}
avgROC /= years;
// Plot zero line
Plot( 0, "", boundaryColor,
styleLine | StyleThick | StyleNoLabel );
// Plot vertical lines for new year markers
Plot( newYear, "", boundaryColor, styleHistogram | styleThick | styleOwnScale | styleNoLabel );
// Plot
current year with thick emphasis
initialValue = ValueWhen( newYear, Close, 1 );
barValue = Close;
runningROC = ( ( barValue / initialValue ) - 1 ) * 100;
Plot( runningROC, "ROC", baseColor, styleThick );
// Plot previous years with incrementing colors
titleStr = StrFormat( ", Bar %g, Current: %g, Initial: %g", BarIndex(), barValue, initialValue );
titleStr += StrFormat( "\n" + EncodeColor( baseColor ) + "This year: %2.1f%%", runningROC );
for ( y = 1; y <= years; y++ )
{
value = VarGet( "Year" + y );
titleStr += StrFormat( "\n" + EncodeColor( baseColor + y ) + y + " year" + WriteIf( y > 1, "s", "" ) + " ago: %2.1f%%",
value );
Plot( value, "" + y + " years ago", baseColor + y );
}
// Plot average as solid area
Plot( avgROC, "Avg.", baseColor + y, styleArea | styleNoLabel );
Title = NumToStr( DateTime(), formatDateTime ) + titleStr + StrFormat( "\n" + EncodeColor( baseColor + y ) + "Average: %2.1f%%", avgROC );
Mike
--- In amibroker@xxxxxxxxx ps.com, "Mike" <sfclimbers@x ..> wrote:
>
>
> Wow, formatting of that was terrible. Reposting from a different
> browser...
>
> years = Param("Years" , 3, 1, 15, 1);
> newYear = Year() != Ref(Year(), -1);
> avgROC = 0;
>
> // Create dynamic variables for each year (excluding current)
> for (y = 1; y <= years; y++) {
> initialValue = IIf(newYear, ValueWhen(newYear, Close, y),
> ValueWhen(newYear, Close, y + 1));
> barValue = Ref(Close, -252 * y);
> runningROC = (barValue / initialValue) - 1;
> VarSet("Year" + y, runningROC);
> avgROC += runningROC;
> }
>
> avgROC /= years;
>
> // Plot zero line
> Plot(0, "", colorLightGrey, styleLine | StyleThick | StyleNoLabel) ;
>
> // Plot vertical lines for new year markers
> Plot(newYear, "", colorLightGrey,
styleHistogram | styleThick |
> styleOwnScale | styleNoLabel) ;
>
> // Plot current year with thick emphasis
> initialValue = Iif(newYear, ValueWhen(newYear, Close, 0),
> ValueWhen(newYear, Close, 1));
> barValue = Close;
> runningROC = (barValue / initialValue) - 1;
> Plot(runningROC, "ROC", colorDarkRed, styleThick);
>
> // Plot previous years with incrementing colors
> for (y = 1; y <= years; y++) {
> Plot(VarGet( "Year" + y), "" + y + " Years Ago", colorDarkRed + y);
> }
>
> // Plot average as solid area
> Plot(avgROC, "Avg.", colorDarkRed + y, styleArea);
>
> Mike
>
>
> --- In amibroker@xxxxxxxxx ps.com, "Mike" sfclimbers@ wrote:
> >
> > Richard, I suspect that ROC(C, 1) would not reveal much. It might be
> > more interesting to plot a running ROC since the start of the
>
respective
> > years. I've altered the code to show running year to date rate of
> > return, including vertical bars delineating the first bar of each new
> > year. You will notice that at each year goal post, all values start
> over
> > at zero (plus or minus a bar or two due to 252 being an imprecise
> > measure of a year).
> > Hope that helps.
> > years = Param("Years" , 3, 1, 15, 1); newYear = Year() != Ref(Year(),
> > -1); avgROC = 0;
> > // Create dynamic variables for each year (excluding current) for (y =
> > 1; y <= years; y++) { initialValue = IIf(newYear, ValueWhen(newYear,
> > Close, y), ValueWhen(newYear, Close, y + 1)); barValue = Ref(Close,
> > -252 * y); runningROC = (barValue / initialValue) - 1;
> > VarSet("Year" + y, runningROC);
> > avgROC += runningROC; }
> > avgROC /= years;
> > //
Plot zero line Plot(0, "", colorLightGrey, styleLine | StyleThick |
> > StyleNoLabel) ;
> > // Plot vertical lines for new year markers Plot(newYear, "",
> > colorLightGrey, styleHistogram | styleThick | styleOwnScale |
> > styleNoLabel) ;
> > // Plot current year with thick emphasis initialValue = Iif(newYear,
> > ValueWhen(newYear, Close, 0), ValueWhen(newYear, Close, 1)); barValue
> =
> > Close; runningROC = (barValue / initialValue) - 1; Plot(runningROC,
> > "ROC", colorDarkRed, styleThick);
> > // Plot previous years with incrementing colors for (y = 1; y <=
> years;
> > y++) { Plot(VarGet( "Year" + y), "" + y + " Years Ago", colorDarkRed
> > + y); }
> > // Plot average as solid area Plot(avgROC, "Avg.", colorDarkRed + y,
> > styleArea);
> > Mike --- In amibroker@xxxxxxxxx ps.com, "Richard" richpach2@
wrote:
> > >
> > > Hello Mike,
> > >
> > > This is very clever piece of code. Thank you for sharing it with us.
> > > I would have used "for" loop to create a new "close" array for each
> > year with 1-252 index. I didn't know you can use build-in "Close"
> array
> > in that way. Now that we can see the result for each year, it looks to
> > me like we need to "normalize" the results so they can be compared on
> > relative basis. Calculating an average from absolute values does not
> > look right. Do you think that using ROC(C,1) would be an effective way
> > to compare all individual year's results?
> > >
> > > Regards
> > > Richard
> > >
> > > --- In amibroker@xxxxxxxxx ps.com, "Mike" sfclimbers@ wrote:
> > > >
> > > >
> > > > If
"quick and dirty" is good enough for you, you can just assume
> 252
> > > > trading days per trading year and then use Ref() with multiples of
> > that
> > > > number.
> > > >
> > > > e.g.
> > > > years = Param("Years" , 3, 1, 15, 1);
> > > > avgClose = 0;
> > > >
> > > > // Create dynamic variables for each year (excluding current)
> > > > for (y = 1; y <= years; y++) {
> > > > pastClose = Ref(Close, -252 * y);
> > > > VarSet("Year" + y, pastClose);
> > > > avgClose += pastClose;
> > > > }
> > > >
> > > > avgClose /= years;
> > > >
> > > > // Plot current year with thick emphasis
> > > > Plot(Close, "Close", colorDarkRed, styleThick);
> > > >
> >
> > // Plot previous years with incrementing colors
> > > > for (y = 1; y <= years; y++) {
> > > > Plot(VarGet( "Year" + y), "" + y + " Years Ago", colorDarkRed +
> > y);
> > > > }
> > > >
> > > > // Plot average as solid area
> > > > Plot(avgClose, "Avg.", colorDarkRed + y, styleArea);
> > > >
> > > > Note that the example assumes that the number of backyears (i.e.
> > years
> > > > variable) plus the base color (e.g. colorDarkRed) will not exceed
> > the
> > > > maximum color index found here:
> > > > http://www.amibroke r.com/guide/ a_language. html
> > > > <http://www.amibroke r.com/guide/ a_language.
html>
> > > >
> > > > Mike
> > > >
> > > >
> > > > --- In amibroker@xxxxxxxxx ps.com, "Rick_Miller_ 98" <rick300m@>
> > wrote:
> > > > >
> > > > > I removed the nested loops line and defined MonthPer=1 and
> managed
> > to
> > > > get a plot.
> > > > >
> > > > > However this is looking at a month to month ROC with only 12
> > > > datapoints. A seasonality chart needs to be daily, weekly at most.
> > > > >
> > > > > Ideally the chart would have each year's performnce plotted in
> the
> > > > background and the composite chart of all years plotted in the
> > > > foreground on a daily basis.
> > > > >
> > > > > This seams like quite
complicated coding. I would be willing to
> > > > contribute towards a properly functioning chart Afl if anyone has
> it
> > or
> > > > is willing to code it.
> > > > >
> > > > >
> > > > >
> > > > > --- In amibroker@xxxxxxxxx ps.com, "Richard" richpach2@ wrote:
> > > > > >
> > > > > > Thank you for posting this code.
> > > > > > Whitout <Nested_Includes. AFL> some values are not defined.
> > > > > > can you please advise what is the default value for MonthPer
> and
> > > > what is the ListMonths represent?
> > > > > >
> > > > > > Regards
> > > > > > Richard
> > > > > >
> > > > > > --- In amibroker@xxxxxxxxx ps.com, "vlanschot"
<vlanschot@>
> > wrote:
> > > > > > >
> > > > > > > Below is some old code of mine. May get you going though.
> > > > > > >
> > > > > > > PS
> > > > > > >
> > > > > > > #include_once <Nested_Includes. AFL>
> > > > > > >
> > > > > > > Maand = Month();
> > > > > > >
> > > > > > > JanRet = ValueWhen(Maand == 1 AND
> > > > Ref(Maand,1) ==2,ROC(C, MonthPer) );
> > > > > > > FebRet = ValueWhen(Maand == 2 AND
> > > > Ref(Maand,1) ==3,ROC(C, MonthPer) );
> > > > > > > MarRet = ValueWhen(Maand == 3 AND
> > > > Ref(Maand,1) ==4,ROC(C, MonthPer) );
> > > > > > > AprRet = ValueWhen(Maand == 4
AND
> > > > Ref(Maand,1) ==5,ROC(C, MonthPer) );
> > > > > > > MayRet = ValueWhen(Maand == 5 AND
> > > > Ref(Maand,1) ==6,ROC(C, MonthPer) );
> > > > > > > JunRet = ValueWhen(Maand == 6 AND
> > > > Ref(Maand,1) ==7,ROC(C, MonthPer) );
> > > > > > > JulRet = ValueWhen(Maand == 7 AND
> > > > Ref(Maand,1) ==8,ROC(C, MonthPer) );
> > > > > > > AugRet = ValueWhen(Maand == 8 AND
> > > > Ref(Maand,1) ==9,ROC(C, MonthPer) );
> > > > > > > SepRet = ValueWhen(Maand == 9 AND
> > > > Ref(Maand,1) ==10,ROC( C,MonthPer) );
> > > > > > > OctRet = ValueWhen(Maand == 10 AND
> > > > Ref(Maand,1) ==11,ROC( C,MonthPer) );
> > > > > > > NovRet = ValueWhen(Maand == 11 AND
> > > > Ref(Maand,1)
==12,ROC( C,MonthPer) );
> > > > > > > DecRet = ValueWhen(Maand == 12 AND
> > > > Ref(Maand,1) ==1,ROC(C, MonthPer) );
> > > > > > >
> > > > > > >
> > > > > > > SeasRet =
> > > > > > > IIf(Maand == 1, LastValue(Cum( JanRet)),
> > > > > > > IIf(Maand == 2, LastValue(Cum( FebRet)),
> > > > > > > IIf(Maand == 3, LastValue(Cum( MarRet)),
> > > > > > > IIf(Maand == 4, LastValue(Cum( AprRet)),
> > > > > > > IIf(Maand == 5, LastValue(Cum( MayRet)),
> > > > > > > IIf(Maand == 6, LastValue(Cum( JunRet)),
> > > > > > > IIf(Maand == 7, LastValue(Cum( JulRet)),
> > > > > > > IIf(Maand == 8, LastValue(Cum( AugRet)),
> > > > > > > IIf(Maand == 9,
LastValue(Cum( SepRet)),
> > > > > > > IIf(Maand == 10,LastValue( Cum(OctRet) ),
> > > > > > > IIf(Maand == 11,LastValue( Cum(NovRet) ),
> > > > > > > IIf(Maand == 12,LastValue( Cum(DecRet) ),0)))))) ))))));
> > > > > > >
> > > > > > > SeasRet = SeasRet/(BarCount- 1);
> > > > > > >
> > > > > > > KleurHist = IIf(SeasRet<0,
> > > > colorRed,IIf( SeasRet>0,colorGreen, colorLightGrey) );
> > > > > > >
> > > > > > > Plot(SeasRet, FullName( )+" Seasonal Return for
> > > > "+StrExtract( ListMonths, SelectedValue( Month()-1) ),KleurHist, 2+4);
> > > > > > > //Plot(OctRet, "ret",1,1) ;
> > > > > > > Title = "{{DATE}} -- {{INTERVAL}} \n{{VALUES} } ";
> > >
> > > >
> > > > > > > --- In amibroker@xxxxxxxxx ps.com, Rick Osborn <ricko@>
> wrote:
> > > > > > > >
> > > > > > > > I would be interested in that too
> > > > > > > >
> > > > > > > > Best Regards
> > > > > > > > Rick Osborn
> > > > > > > >
> > > > > > > >
> > > > > > > >
> > > > > > > >
> > > > > > > > ____________ _________ _________ __
> > > > > > > > From: Rick_Miller_ 98 <rick300m@>
> > > > > > > > To: amibroker@xxxxxxxxx ps.com
> > > > > > > > Sent: Mon, December 14, 2009 9:53:23 PM
> > > > > > > > Subject: [amibroker]
Seasonality Plot
> > > > > > > >
> > > > > > > >
> > > > > > > > I am looking for some code to overlay multiple years on
> the
> > same
> > > > Jan-Dec axis and to create a composite plot of all of those years
> to
> > > > identify seasonality trends.
> > > > > > > >
> > > > > > > > Please E-Mail me if you have it. I am willing to
> contribute
> > to
> > > > the cause.
> > > > > > > >
> > > > > > > > Thanks!
> > > > > > > >
> > > > > > >
> > > > > >
> > > > >
> > > >
> > >
> >
>