Welcome Features News Download Registration Support FAQ Wish list Links
Advanced stock charting and analysis program

AFL Library

This is read-only version of AFL library entry. Ability to add user formulas and comment is only available from members-only area.

Details:

Formula name: Square of Nine Roadmap Charts
Author/Uploader: Lal - (email hidden)
Date/Time added: 2008-03-30 14:19:07
Origin:
Keywords: Square of Nine, Roadmap
Level: semi-advanced
Flags: indicator

DISCLAIMER: Most formulas present in AFL on-line library are submitted by the users and are provided here on an "as is" and "as available" basis. AmiBroker.com makes no representations or warranties of any kind to the contents or the operation of material presented here. We do not maintain nor provide technical support for 3rd party formulas.
Description:

Produces automatic trend channels based on a SINGLE bar.

Formula:


/******************************************************************************************
Name		: 	Square of Nine - Roadmap Charts (Amibroker implementation)
Coded by	:	Lal
Date		:	27th March 2008
Note		:	Grateful thanks to Peter Amaral of Tradingfives.com
				To gain an understanding of how these roadmap channels 
				work, read the article here:

				http://www.tradingfives.com/square-of-nine-in-excel.htm

				Thanks also to wavemechanic for his inputs.  

				Used properly, on the basis of a SINGLE  bar, Roadmap Charts
				will produce  channels that will pretty much define the overall
				future trend that can last anything from days to months or beyond.

				To use, select the bar that you suspect to be a possible high or low.
				Decide whether you want a bearish or a bullish channel.  Next choose
				an appropriate "Factor" (try starting with a value of 1) and a
"Multiplier."   
				For tickers that are greater than 3 digits, you may try a Multiplier 
				value of 0.10 and those below 3 digits, a value of 10.  Tickers with 
				with just 3 digits, leave the Multiplier at 1.  However, there are no
absolute
				rules here and experimentation is strongly encouraged.

				The Horizontal lines are support/resistance lines while the vertical lines
				are timing lines.  

				All the lines plotted by this script can extend beyond the last bar.  So
make sure
				you have enough blank bars in the right margin (set by Preferences).
***************************************************************************************************/

_SECTION_BEGIN("So9_Params");
Base_Factor		=	ParamList("Factor",
"0.015625|0.03125|0.0625|0.1250|0.1875|0.2500|0.3125|0.3750|0.4375|0.5|0.5625|0.6250|0.6875|0.8125|0.8750|0.9375|1.0|1.250|1.5|1.75|2.0|2.5|3.0|4.0",
16);
Multiplier			=	ParamList("Multiplier", "0.001|0.01|0.10|1|10|100|1000|10000",
3);
Auto_Price			=	ParamToggle("Auto-select Price field?", "No|Yes", 1);
Price_Field		=	ParamField("Use ");
Max_Hor_Lines	=	Param("Max Hor. Lines", 10, 2, 100, 1);
Plot_Half_Lines	=	ParamToggle("Hor. HalfLines?", "No|Yes");
Extend_Bars		=	Param("Extend Plot by", 20, 0, 50, 1);
Channel_Type		=	ParamList("Channel Type", "Bullish|Bearish|None", 0);
Max_Chanl_Lines =	Param("Max Channel Lines", 3, 1, 20, 1);
Show_Degrees	=	ParamToggle("Show Degrees?", "No|Yes", 1);
_SECTION_END();

_SECTION_BEGIN("Line Colours");
Bull_Line_Color	=	ParamColor("Bullish Horizontals", colorDarkGreen);
Bull_Half_Color	=	ParamColor("Bullish Horizontal Halfs", colorRed);
Bull_Vert_Color	=	ParamColor("Bullish Verticals", colorGrey50);
Bull_Chanl_Color	=	ParamColor("Bullish Channels", colorDarkGreen);

Bear_Line_Color	=	ParamColor("Bearish Horizontals", colorRed);
Bear_Half_Color	=	ParamColor("Bearish Horizontal Halfs", colorDarkGreen);
Bear_Vert_Color	=	ParamColor("Bearish Verticals", colorGrey50);
Bear_Chanl_Color	=	ParamColor("Bearish Channels", colorRed);
_SECTION_END();

SetChartBkGradientFill( ParamColor("BgTop", colorTeal),ParamColor("BgBottom",
colorLightGrey));
SetChartOptions(0,chartShowArrows|chartShowDates);
Plot( C, "Close", ParamColor("Color", colorBlack ), styleNoTitle |
ParamStyle("Style") | GetPriceStyle() ); 
SetBarsRequired(100000, 100000);

EnableTextOutput(False);

// Convert list-type parameters to numbers
Base_Factor_N 	= 	StrToNum(Base_Factor);
Multiplier_N		=	StrToNum(Multiplier);

Vertical =	0;

// Display various bits of info. in Interpretation window
printf("\nSquare of Nine Roadmap Channels\n");
printf("-----------------------------------------\n");
if(Channel_Type == "Bullish")
	printf("Channel Type: 	Bullish\n");
if(Channel_Type == "Bearish")
	printf("Channel Type: 	Bearish\n");
if(Channel_Type == "None")
	printf("Channel Type: 	NONE\n");
printf("Factor	: 	%g\n", Base_Factor_N);
printf("Multiplier:		%g\n", Multiplier_N);
printf("Origin Bar:	%g\n", SelectedValue(BarIndex()));

// Plot Bullish Channels with horizontal Support/Resistance
if(Channel_Type == "Bullish")
{
	// Select price for pivot low
	if(Auto_Price == 1)
	{
		Price_Field = L;
	}

	Bull_Hor_A[0] = SelectedValue(Price_field);		// 1st Horizontal is drawn from
the current bar

	for(i = 1; i <= Max_Hor_Lines-1; i++)
	{

		Bull_Hor	=	( sqrt(Price_Field * Multiplier_N) + (Base_Factor_N * i)) ^2;
		Degrees	=	180 * Base_Factor_N * i;
		Bull_Hor	=	Bull_Hor/Multiplier_N;		// Put value back to pre-multiplication
for plotting

		Start_Bar	=	SelectedValue(BarIndex());
		Start_Y	=	SelectedValue(Bull_Hor);
		End_Bar	=	BarCount - 1;
		End_Y		=	Start_Y;
		Hor_Plot	=	LineArray(Start_Bar - Extend_Bars, Start_Y, End_Bar, End_Y, 1);

		Plot(Hor_Plot, "", Bull_Line_Color, styleLine|styleNoRescale, Null, Null,
Extend_Bars);
		
		if(Show_Degrees)
		{
			PlotText("" + NumToStr(Degrees, 4, 1) + "", Start_bar+2, Start_Y + 1 ,
colorBlack);
		}

		if(i == 1)
		{
			// Plot the 1st Horizontal.  This is a one-time execution.
			Plot(LineArray(Start_Bar - Extend_Bars, SelectedValue(Price_Field), End_Bar,
SelectedValue(Price_Field), 0), "", Bull_Line_Color, styleLine|styleNoRescale,
Null, Null, Extend_Bars);
		}

		Bull_Hor_A[i] = SelectedValue(Bull_Hor);	// Store the next horizontal value
	
		// Plot the half-level horizontals conditionally
		if(Plot_Half_Lines)
		{
			Bull_Hor	=	(Bull_Hor_A[i-1] + Bull_Hor_A[i])/2;
			Start_Bar	=	SelectedValue(BarIndex());
			Start_Y	=	SelectedValue(Bull_Hor);
			End_Bar	=	BarCount - 1;
			End_Y		=	Start_Y;
			Hor_Plot	=	LineArray(Start_Bar - Extend_Bars, Start_Y, End_Bar, End_Y, 1);
			Plot(Hor_Plot, "", Bull_Half_Color, styleLine|styleNoRescale, Null, Null,
Extend_Bars);
		}
	
	}	// End loop for plotting horizontal lines

	// Plot Vertical Lines
	Vertical		=	 round(sqrt(Price_Field * Multiplier_N));
	Next_Vertical	=	SelectedValue(BarIndex() ) + Vertical;
	Plot(IIf(BarIndex()  >= SelectedValue(BarIndex( )),
(Cum(1)-SelectedValue(BarIndex()) - 1)%SelectedValue(Vertical) == 0, Null), "",
Bull_Vert_Color, styleHistogram| styleOwnScale|styleNoLabel);

	// DIsplay timing info
	printf("Timing Interval:	%g\n", Vertical);
	
	// Logic to plot at least one vertical bar BEYOND Barcount()
	Next_Vertical = SelectedValue(BarIndex()) +SelectedValue( Vertical);
	while(Next_Vertical < BarCount)
	{
		Next_Vertical  = Next_Vertical + SelectedValue(Vertical);
	}

	// Work out how many bars to shift the vertical to the right from current
selected bar
	Shift	=	Next_Vertical[0] - SelectedValue(BarIndex());
	Line1 = BarIndex() == SelectedValue(BarIndex());	// are we at current bar?
	Plot(Line1,"", colorRed, styleHistogram| styleOwnScale, Null, Null, Shift) ;
// Plot vertical with a forward shift

	// Plot channel lines 
	for(a = 0; a <= Max_Chanl_Lines - 1; a++)
	{
		Start_Bar	=	SelectedValue(BarIndex())  - Extend_Bars;
		Start_Y	=	Bull_Hor_A[a];
		End_Bar	=	Start_Bar + SelectedValue(Vertical);
		End_Y		=	Bull_Hor_A[a+1];
		Channel_Line	=	LineArray(Start_Bar - 0, Start_Y, End_Bar, End_Y, 1);
		Plot(Channel_line, "", Bull_Chanl_Color,
styleLine|styleNoRescale|styleNoLabel, Null, Null, Extend_Bars);
	}
}

// Plot Bearish Channels with horizontal Support/Resistance
if(Channel_Type == "Bearish")
{
	// Select price for pivot high
	if(Auto_Price == 1)
	{
		Price_Field = H;
	}

	Bear_Hor_A[0] = SelectedValue(Price_field);		// 1st Horizontal is drawn from
the current bar

	for(i = 1; i <= Max_Hor_Lines-1; i++)
	{
		Bear_Hor	=	( sqrt(Price_Field * Multiplier_N)  - (Base_Factor_N * i)) ^2;
		Degrees	=	180 * Base_Factor_N * i;
		Bear_Hor	=	Bear_Hor/Multiplier_N;		// Put value back to pre-multiplication
for plotting

		Start_Bar	=	SelectedValue(BarIndex());
		Start_Y	=	SelectedValue(Bear_Hor);
		End_Bar	=	BarCount - 1;
		End_Y		=	Start_Y;
		Hor_Plot	=	LineArray(Start_Bar - Extend_Bars, Start_Y, End_Bar, End_Y, 1);

		Plot(Hor_Plot, "", Bear_Line_Color, styleLine|styleNoRescale, Null, Null,
Extend_Bars);

		if(Show_Degrees)
		{
			PlotText("" + NumToStr(Degrees, 4, 1) + "", Start_bar+2, Start_Y + 1 ,
colorBlack);
		}

		if(i == 1)
		{
			// Plot the 1st Horizontal.  This is a one-time execution.
			Plot(LineArray(Start_Bar - Extend_Bars, SelectedValue(Price_Field), End_Bar,
SelectedValue(Price_Field), 0), "", Bear_Line_Color,
styleLine|styleThick|styleNoRescale, Null, Null, Extend_Bars);
		}

		Bear_Hor_A[i] = SelectedValue(Bear_Hor);	// Store the next horizontal value
	
		// Plot the half-level horizontals if asked
		if(Plot_Half_Lines)
		{
			Bear_Hor	=	(Bear_Hor_A[i-1] + Bear_Hor_A[i])/2;
			Start_Bar	=	SelectedValue(BarIndex());
			Start_Y	=	SelectedValue(Bear_Hor);
			End_Bar	=	BarCount - 1;
			End_Y		=	Start_Y;
			Hor_Plot	=	LineArray(Start_Bar - Extend_Bars, Start_Y, End_Bar, End_Y, 1);
			Plot(Hor_Plot, "", Bear_Half_Color, styleLine|styleNoRescale, Null, Null,
Extend_Bars);
		}
	
	}

	// Plot Vertical Lines
	Vertical	=	 round(sqrt(Price_Field * Multiplier_N));
	Next_Vertical	=	SelectedValue(BarIndex()) + Vertical;
	Plot(IIf(BarIndex() >= SelectedValue(BarIndex( )),
(Cum(1)-SelectedValue(BarIndex())-1)%SelectedValue(Vertical) == 0, Null), "",
Bear_Vert_Color, styleHistogram| styleOwnScale|styleNoLabel) ;

	// DIsplay timing info
	printf("Timing Interval:	%g\n", Vertical);

	// Logic to plot at least one vertical bar BEYOND Barcount()
	Next_Vertical = SelectedValue(BarIndex()) +SelectedValue( Vertical);
	while(Next_Vertical < BarCount)
	{
		Next_Vertical  = Next_Vertical + SelectedValue(Vertical);
	}

	// Work out how many bars to shift the vertical to the right from current
selected bar
	Shift	=	Next_Vertical[0] - SelectedValue(BarIndex());
	Line1 = BarIndex() == SelectedValue(BarIndex());	// are we at current bar?
	Plot(Line1,"", colorDarkGreen, styleHistogram| styleOwnScale|styleNoLabel,
Null, Null, Shift) ; // Plot vertical with a forward shift

	// Plot channel lines 
	//Extend_Bars = 0;
	for(a = 0; a <= Max_Chanl_Lines - 1; a++)
	{
		Start_Bar	=	SelectedValue(BarIndex()) - Extend_Bars;
		Start_Y	=	Bear_Hor_A[a];
		End_Bar	=	Start_Bar + SelectedValue(Vertical);
		End_Y		=	Bear_Hor_A[a+1];
		Channel_Line	=	LineArray(Start_Bar - 0, Start_Y, End_Bar, End_Y, 1);
		Plot(Channel_line, "", Bear_Chanl_Color,
styleLine|styleNoRescale|styleNoLabel, Null, Null, Extend_Bars);
	}

} // End bearish channels

Channel_Bull_Text	=	WriteIf(Channel_Type == "Bullish", "Bullish", "" );
Channel_Bear_Text	=	WriteIf(Channel_Type == "Bearish", "Bearish", "");
Channel_Null_Text	=	"";

Price_Info = StrFormat("{{NAME}} - {{INTERVAL}} {{DATE}} Open %g, Hi %g, Lo %g,
Close %g (%.1f%%) {{VALUES}}", O, H, L, C, SelectedValue( ROC( C, 1 ) ) );

Title  =		EncodeColor(colorBlack) +  Price_Info + "\n" +  
				EncodeColor(colorBlack) + "Channel Type: " + 
				EncodeColor(colorBlue) 	 + Channel_Bull_Text +
				EncodeColor(colorRed)	 + Channel_Bear_Text +
				EncodeColor(colorBlack) + Channel_Null_Text + "\n" +
				EncodeColor(colorBlack) + "Factor: " + EncodeColor(colorBlue) + Base_Factor
+ "\n" +  
				EncodeColor(colorBlack) + "Multiplier: " + EncodeColor(colorDarkGreen) +
Multiplier_N + "\n" + 
				EncodeColor(colorBlack) + "Origin Bar: " + EncodeColor(colorYellow) +
SelectedValue(BarIndex()) + "\n" +
				EncodeColor(colorBlack) + "Timing Interval: " + EncodeColor(colorDarkBlue)
+ Vertical;

Comments:

NIMISH
npgandhi [at] sancharnet.in
2008-04-01 21:28:51
this is very intersting indicater. Can any one help to develop golden sprial indicater for amibroker.
mrtq13
mrtq13 [at] gmail.com
2008-04-03 01:41:33
That's a nice indicator.Nice work! Thanks a lot for sharing................
Rafael Fuster
catorpega [at] yahoo.es
2008-04-03 10:40:22
I dont quiet understand how it works and what is supposed to show. but anyway,, it must be a brainstorm.
Lal

2008-04-03 14:15:53
Rafael, did you read the article mentioned in the note? If you'd like to see examples of the kind of channels this AFL can produce, click on the link "Gann Angles" on the page mentioned in the note.
Paul
paulradge[at]optusnet.com.au
2008-04-03 22:44:30
Hi Lal,
excellent work Sir ,
thank you
Paul

embasy

2008-04-04 12:24:32
Ln:148, col:58, Error 13. Endless loop detected in While loop.
How could I solve this?
Lal
lal [at] freeuk.com
2008-04-04 13:16:14
Embasy, don't know if it's your version of AB causing the problem...what version is it?

Please check you have copy/pasted the AFL in full and have not modified it in any way.
Santana
marcsmarts [at] yahoo.com
2008-04-05 02:31:31
Nice Job. I am studying it.
Lal
lal [at] freeuk.com
2008-04-05 04:20:43
Embasy, I've managed to recreate the condition that causes the "endless loop" error. Will post a fix some time today.
Lal

2008-04-05 10:36:30
Here's a fix for the "endless loop..." problem reported by Embasy.

Replace the line:

"while(Next_Vertical < BarCount)"

with:

"while(Next_Vertical < BarCount AND SelectedValue(Vertical) > 1)"

(drop the quotes while copying!)

There are two occurences of the while loop. So make sure you replace both.


rohit
rohit.patidar [at] yahoo.com
2008-05-05 14:29:39
probably missing semicolon at the end of previous line messege come
i am on last line of farmula

how can i solve this ?
Lal

2008-05-06 08:37:35
Rohit,

Try re-downloading the formula, copy and paste it entirely. That should resolve the problem.
khalid

2008-06-22 02:15:46
SetChartBkGradientFill( ParamColor("BgTop", colorTeal),ParamColor("BgBottom", colorLightGrey));

Ln:57,Col:Error23.Syntax error

How could I solve this?
Thomas

2008-06-22 19:02:17
Version 5.0 no problem.

What you amibroker version ?
Lal

2008-06-23 04:27:26
Khalid, Thomas is right - you probably have an old version of AB.


About | Privacy | Terms of Use | Contact information
Copyright © 2001 AMIBROKER.COM