HoursChannel_v1

Download script
Author: Copyright � 2006, Forex-TSD.com
HoursChannel_v1

This script is designed to analyze historical price action on a financial chart to identify and project potential price boundaries. Rather than relying on simple averages, it uses a mathematical approach to understand the trend and volatility over a specific period defined by the user.

Core Functional Logic

1. Trend Line Calculation (Linear Regression) The script first examines the closing prices over a set number of bars (determined by the Hours input). It applies a linear regression formula to calculate the "best fit" line for this data. This helps the script understand the overall direction and slope of the market movement during that specific timeframe.

2. Volatility Assessment Once the trend is established, the script analyzes how much the price fluctuates above and below that trend line. It specifically looks at the distance between the highest highs and lowest lows relative to the regression line. It splits this analysis into two halves of the time period to ensure it captures both historical behavior and more recent momentum.

3. Dynamic Boundary Identification The script determines whether the market is currently characterized by "high-side" volatility (resistance-oriented) or "low-side" volatility (support-oriented). It does this by comparing the deviations in the first half of the period against the second half. Depending on which side shows more significant deviation, the script chooses a primary logic path:

  • Scenario A: Focuses on the upper limits (highs) to project a channel based on resistance.
  • Scenario B: Focuses on the lower limits (lows) to project a channel based on support.

4. Projection and Visualization After determining the dominant behavior, the script calculates three distinct price levels. It takes the calculated "extreme" points and projects them forward onto the chart. This results in three parallel lines:

  • A primary boundary line.
  • A median "center" line.
  • An outer boundary line.

These are drawn as visual channels on your chart, providing a graphical representation of where the market is likely to move based on the statistical distribution of past price action over the user-defined timeframe.

11 Views
0 Downloads
0 Favorites
HoursChannel_v1
//+------------------------------------------------------------------+
//|                                              HoursChannel_v1.mq4 |
//|                                  Copyright © 2006, Forex-TSD.com |
//|             Corrected by Igorad and thanks Emmarice for the idea |   
//|            http://finance.groups.yahoo.com/group/TrendLaboratory |                                      
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, Forex-TSD.com "
#property link      "http://www.forex-tsd.com/"

#property indicator_chart_window
//---- input parameters
extern int Hours=1080;
extern color col=LimeGreen;
//------------------
double lr,lr0,lrp;
double sx,sy,sxy,sx2,aa,bb;
int p,sName,fs;
int f,f0,f1;
double dh,dl,dh_1,dl_1,dh_2,dl_2;
int num,ai_1,ai_2,bi_1,bi_2;
double hai,lai,dhi,dli,dhm,dlm,ha0,hap,la0,lap;
double price_p1,price_p0,price_p2,price_01,price_00,price_02;
int p1,p0,p2,fp;
//*****************************************

void ObjDel()
{
//p=Hours*60/Period();
//if (fs==0) {sName=CurTime(); fs=1;}
ObjectDelete("1"+sName);
ObjectDelete("0"+sName);
ObjectDelete("2"+sName);
}

int init() {
//p=Hours*60/Period();
//if (fs==0) {sName=CurTime(); fs=1;}
//sName=Hours;
//ObjDel();
return(0);}
//*******************************
int deinit() {
   ObjDel();
   Comment("");
   return(0);
 }
//*******************************
int start() {
int i,n;
//------------------------------------------------------------------------------

p=Hours*60/Period();
//if (fs==0) {sName=CurTime(); fs=1;}
sName=Hours;
//ObjDel();


if (f==1) {
p1=iBarShift(Symbol(),Period(),ObjectGet("1"+sName ,OBJPROP_TIME1));
p0=iBarShift(Symbol(),Period(),ObjectGet("0"+sName ,OBJPROP_TIME1));
p2=iBarShift(Symbol(),Period(),ObjectGet("2"+sName ,OBJPROP_TIME1));
if (fp==0 && p!=p1) {p=p1; fp=1;}
if (fp==0 && p!=p0) {p=p0; fp=1;}
if (fp==0 && p!=p2) {p=p2; fp=1;}
}
//================================================== ==
sx=0; sy=0; sxy=0; sx2=0;
for (n=0; n<=p; n++) {sx+=n; sy+=Close[n]; sxy+=n*Close[n]; sx2+=MathPow(n,2);}
aa=(sx*sy-(p+1)*sxy)/(MathPow(sx,2)-(p+1)*sx2); bb=(sy-aa*sx)/(p+1);
//----------------------------------------------------
for (i=0; i<=p; i++) {
lr=bb+aa*i;
dh=High[i]-lr; dl=Low[i]-lr;
//----------------------------------------------------
if (i<p/2) {if (i==0) {dh_1=0.0; dl_1=0.0; ai_1=i; bi_1=i;}
if (dh>=dh_1) {dh_1=dh; ai_1=i;}
if (dl<=dl_1) {dl_1=dl; bi_1=i;}}
//----------------------------------------------------
if (i>=p/2) {if (i==p/2) {dh_2=0.0; dl_2=0.0; ai_2=i; bi_2=i;}
if (dh>=dh_2) {dh_2=dh; ai_2=i;}
if (dl<=dl_2) {dl_2=dl; bi_2=i;}}}
//-------------------------------------
lr0=bb; lrp=bb+aa*(i+p);
//================================================== =
if (MathAbs(ai_1-ai_2)>MathAbs(bi_1-bi_2)) f=1;
if (MathAbs(ai_1-ai_2)<MathAbs(bi_1-bi_2)) f=2;
if (MathAbs(ai_1-ai_2)==MathAbs(bi_1-bi_2)) {if (MathAbs(dh_1-dh_2)<MathAbs(dl_1-dl_2)) f=1; if (MathAbs(dh_1-dh_2)>=MathAbs(dl_1-dl_2)) f=2;}
//=================================================
if (f==1) {
for (n=0; n<=20; n++) { f1=0;
for (i=0; i<=p; i++) {hai=High[ai_1]*(i-ai_2)/(ai_1-ai_2)+High[ai_2]*(i-ai_1)/(ai_2-ai_1);
if (i==0 || i==p/2) dhm=0.0;
if (High[i]-hai>dhm && i<p/2) {ai_1=i; f1=1;}
if (High[i]-hai>dhm && i>=p/2) {ai_2=i; f1=1;} }
if (f==0) break;}
//----------------------------
for (i=0; i<=p; i++) {hai=High[ai_1]*(i-ai_2)/(ai_1-ai_2)+High[ai_2]*(i-ai_1)/(ai_2-ai_1);
dli=Low[i]-hai;
if (i==0) dlm=0.0; if (dli<dlm) dlm=dli;}
ha0=High[ai_1]*(0-ai_2)/(ai_1-ai_2)+High[ai_2]*(0-ai_1)/(ai_2-ai_1);
hap=High[ai_1]*(p-ai_2)/(ai_1-ai_2)+High[ai_2]*(p-ai_1)/(ai_2-ai_1);
//----------------------------
price_p1=hap;
price_p0=hap+dlm/2;
price_p2=hap+dlm;
price_01=ha0;
price_00=ha0+dlm/2;
price_02=ha0+dlm;
}
//=================================================
if (f==2) {
for (n=0; n<=20; n++) { f1=0;
for (i=0; i<=p; i++) {lai=Low[bi_1]*(i-bi_2)/(bi_1-bi_2)+Low[bi_2]*(i-bi_1)/(bi_2-bi_1);
if (i==0 || i==p/2) dlm=0.0;
if (Low[i]-lai<dlm && i<p/2) {bi_1=i; f1=1;}
if (Low[i]-lai<dlm && i>=p/2) {bi_2=i; f1=1;}}
if (f==0) break;}
//----------------------------
for (i=0; i<=p; i++) {lai=Low[bi_1]*(i-bi_2)/(bi_1-bi_2)+Low[bi_2]*(i-bi_1)/(bi_2-bi_1);
dhi=High[i]-lai;
if (i==0) dhm=0.0; if (dhi>dhm) dhm=dhi;}
la0=Low[bi_1]*(0-bi_2)/(bi_1-bi_2)+Low[bi_2]*(0-bi_1)/(bi_2-bi_1);
lap=Low[bi_1]*(p-bi_2)/(bi_1-bi_2)+Low[bi_2]*(p-bi_1)/(bi_2-bi_1);
//----------------------------------------------------------------
price_p1=lap;
price_p0=lap+dhm/2;
price_p2=lap+dhm;
price_01=la0;
price_00=la0+dhm/2;
price_02=la0+dhm;
}
//================================================== =================================
ObjectCreate("1"+sName,2, 0,Time[p],price_p1,Time[0],price_01);
ObjectCreate("0"+sName,2, 0,Time[p],price_p0,Time[0],price_00);
ObjectCreate("2"+sName,2, 0,Time[p],price_p2,Time[0],price_02);
//-----------------------------------------------------------------
ObjectSet("1"+sName,OBJPROP_COLOR,col);
ObjectSet("0"+sName,OBJPROP_COLOR,col);
ObjectSet("0"+sName,OBJPROP_STYLE,STYLE_DOT);
ObjectSet("2"+sName,OBJPROP_COLOR,col);
//---------------------------------------------
}

Comments