//+------------------------------------------------------------------+ //| Linear Regression.mq4 | //| Copyright © 2008, //| http://www.metaquotes.net | //+------------------------------------------------------------------+ #property copyright "Copyright © 2006, tageiger, aka fxid10t@yahoo.com" #property link "http://www.metaquotes.net" #property indicator_chart_window extern int period=0; /*default 0 means the channel will use the open time from "x" bars back on which ever time period the indicator is attached to. one can change to 1,5,15,30,60...etc to "lock" the start time to a specific period, and then view the "locked" channels on a different time period...*/ extern int line.width=1; extern int LR.length=60; // bars back regression begins extern color LR.c=Orange; extern double std.channel.1=3; // 1st channel extern color c.1=Red; extern double std.channel.2=0; // 2nd channel extern color c.2=Gray; extern double std.channel.3=0; // 3nd channel extern color c.3=Gray; //added double ULR1 ; double LLR1 ; double ULR2 ; double LLR2 ; double ULR3 ; double LLR3 ; string tULR1 = "ULR1" ; string tLLR1 = "LLR1" ; string tULR2 = "ULR2" ; string tLLR2 = "LLR2" ; string tULR3 = "ULR3" ; string tLLR3 = "LLR3" ; //end add int init(){return(0);} int deinit(){ ObjectDelete(period+"m "+LR.length+" TL"); ObjectDelete(period+"m "+LR.length+" +"+std.channel.1+"d"); ObjectDelete(period+"m "+LR.length+" -"+std.channel.1+"d"); ObjectDelete(period+"m "+LR.length+" +"+std.channel.2+"d"); ObjectDelete(period+"m "+LR.length+" -"+std.channel.2+"d"); ObjectDelete(period+"m "+LR.length+" +"+std.channel.3+"d"); ObjectDelete(period+"m "+LR.length+" -"+std.channel.3+"d"); //added ObjectDelete("U_LR"); ObjectDelete("M_LR"); ObjectDelete("L_LR"); ObjectDelete("L_LR"); ObjectDelete(tULR1); ObjectDelete(tLLR1); ObjectDelete(tULR2); ObjectDelete(tLLR2); ObjectDelete(tULR3); ObjectDelete(tLLR3); //end add return(0);} int start(){//refresh chart ObjectDelete(period+"m "+LR.length+" TL"); ObjectDelete(period+"m "+LR.length+" +"+std.channel.1+"d"); ObjectDelete(period+"m "+LR.length+" -"+std.channel.1+"d"); ObjectDelete(period+"m "+LR.length+" +"+std.channel.2+"d"); ObjectDelete(period+"m "+LR.length+" -"+std.channel.2+"d"); ObjectDelete(period+"m "+LR.length+" +"+std.channel.3+"d"); ObjectDelete(period+"m "+LR.length+" -"+std.channel.3+"d"); //linear regression calculation int start.bar=LR.length, end.bar=0; int n=start.bar-end.bar+1; //---- calculate price values double value=iClose(Symbol(),period,end.bar); double a,b,c; double sumy=value; double sumx=0.0; double sumxy=0.0; double sumx2=0.0; for(int i=1; i<n; i++) { value=iClose(Symbol(),period,end.bar+i); sumy+=value; sumxy+=value*i; sumx+=i; sumx2+=i*i; } c=sumx2*n-sumx*sumx; if(c==0.0) return; b=(sumxy*n-sumx*sumy)/c; a=(sumy-sumx*b)/n; double LR.price.2=a; double LR.price.1=a+b*n; //---- maximal deviation calculation (not used) double max.dev=0; double deviation=0; double dvalue=a; for(i=0; i<n; i++) { value=iClose(Symbol(),period,end.bar+i); dvalue+=b; deviation=MathAbs(value-dvalue); if(max.dev<=deviation) max.dev=deviation; } //Linear regression trendline ObjectCreate(period+"m "+LR.length+" TL",OBJ_TREND,0,iTime(Symbol(),period,start.bar),LR.price.1,Time[end.bar],LR.price.2); ObjectSet(period+"m "+LR.length+" TL",OBJPROP_COLOR,LR.c); ObjectSet(period+"m "+LR.length+" TL",OBJPROP_WIDTH,line.width); ObjectSet(period+"m "+LR.length+" TL",OBJPROP_RAY,false); //...standard deviation... double x=0,x.sum=0,x.avg=0,x.sum.squared=0,std.dev=0; for(i=0; i<start.bar; i++) { x=MathAbs(iClose(Symbol(),period,i)-ObjectGetValueByShift(period+"m "+LR.length+" TL",i)); x.sum+=x; if(i>0) { x.avg=(x.avg+x)/i; x.sum.squared+=(x-x.avg)*(x-x.avg); std.dev=MathSqrt(x.sum.squared/(start.bar-1)); } } //Print("LR.price.1 ",LR.price.1," LR.Price.2 ",LR.price.2," std.dev ",std.dev); //...standard deviation channels... //added ULR1 = LR.price.2+std.dev*std.channel.1 ; LLR1 = LR.price.2-std.dev*std.channel.1 ; ULR2 = LR.price.2+std.dev*std.channel.2 ; LLR2 = LR.price.2-std.dev*std.channel.2 ; ULR3 = LR.price.2+std.dev*std.channel.3 ; LLR3 = LR.price.2-std.dev*std.channel.3 ; //end added ObjectCreate(period+"m "+LR.length+" +"+std.channel.1+"d",OBJ_TREND,0,iTime(Symbol(),period,start.bar),LR.price.1+std.dev*std.channel.1, Time[end.bar],LR.price.2+std.dev*std.channel.1); ObjectSet(period+"m "+LR.length+" +"+std.channel.1+"d",OBJPROP_COLOR,c.1); ObjectSet(period+"m "+LR.length+" +"+std.channel.1+"d",OBJPROP_WIDTH,line.width); ObjectSet(period+"m "+LR.length+" +"+std.channel.1+"d",OBJPROP_RAY,false); ObjectCreate(period+"m "+LR.length+" -"+std.channel.1+"d",OBJ_TREND,0,iTime(Symbol(),period,start.bar),LR.price.1-std.dev*std.channel.1, Time[end.bar],LR.price.2-std.dev*std.channel.1); ObjectSet(period+"m "+LR.length+" -"+std.channel.1+"d",OBJPROP_COLOR,c.1); ObjectSet(period+"m "+LR.length+" -"+std.channel.1+"d",OBJPROP_WIDTH,line.width); ObjectSet(period+"m "+LR.length+" -"+std.channel.1+"d",OBJPROP_RAY,false); ObjectCreate(period+"m "+LR.length+" +"+std.channel.2+"d",OBJ_TREND,0,iTime(Symbol(),period,start.bar),LR.price.1+std.dev*std.channel.2, Time[end.bar],LR.price.2+std.dev*std.channel.2); ObjectSet(period+"m "+LR.length+" +"+std.channel.2+"d",OBJPROP_COLOR,c.2); ObjectSet(period+"m "+LR.length+" +"+std.channel.2+"d",OBJPROP_WIDTH,line.width); ObjectSet(period+"m "+LR.length+" +"+std.channel.2+"d",OBJPROP_RAY,false); ObjectCreate(period+"m "+LR.length+" -"+std.channel.2+"d",OBJ_TREND,0,iTime(Symbol(),period,start.bar),LR.price.1-std.dev*std.channel.2, Time[end.bar],LR.price.2-std.dev*std.channel.2); ObjectSet(period+"m "+LR.length+" -"+std.channel.2+"d",OBJPROP_COLOR,c.2); ObjectSet(period+"m "+LR.length+" -"+std.channel.2+"d",OBJPROP_WIDTH,line.width); ObjectSet(period+"m "+LR.length+" -"+std.channel.2+"d",OBJPROP_RAY,false); ObjectCreate(period+"m "+LR.length+" +"+std.channel.3+"d",OBJ_TREND,0,iTime(Symbol(),period,start.bar),LR.price.1+std.dev*std.channel.3, Time[end.bar],LR.price.2+std.dev*std.channel.3); ObjectSet(period+"m "+LR.length+" +"+std.channel.3+"d",OBJPROP_COLOR,c.3); ObjectSet(period+"m "+LR.length+" +"+std.channel.3+"d",OBJPROP_WIDTH,line.width); ObjectSet(period+"m "+LR.length+" +"+std.channel.3+"d",OBJPROP_RAY,false); ObjectCreate(period+"m "+LR.length+" -"+std.channel.3+"d",OBJ_TREND,0,iTime(Symbol(),period,start.bar),LR.price.1-std.dev*std.channel.3, Time[end.bar],LR.price.2-std.dev*std.channel.3); ObjectSet(period+"m "+LR.length+" -"+std.channel.3+"d",OBJPROP_COLOR,c.3); ObjectSet(period+"m "+LR.length+" -"+std.channel.3+"d",OBJPROP_WIDTH,line.width); ObjectSet(period+"m "+LR.length+" -"+std.channel.3+"d",OBJPROP_RAY,false); //added display price if( std.channel.1 != 0 ) { if (ObjectFind(tULR1) != 0) { ObjectCreate(tULR1,OBJ_ARROW,0,Time[0],ULR1); ObjectSet(tULR1,OBJPROP_ARROWCODE,SYMBOL_RIGHTPRICE); ObjectSet(tULR1,OBJPROP_COLOR,c.1); } else { ObjectMove(tULR1,0,Time[0],ULR1); } if (ObjectFind(tLLR1) != 0) { ObjectCreate(tLLR1,OBJ_ARROW,0,Time[0],LLR1); ObjectSet(tLLR1,OBJPROP_ARROWCODE,SYMBOL_RIGHTPRICE); ObjectSet(tLLR1,OBJPROP_COLOR,c.1); } else { ObjectMove(tLLR1,0,Time[0],LLR1); } } // if( std.channel.1 != 0 ) if( std.channel.2 != 0 ) { if (ObjectFind(tULR2) != 0) { ObjectCreate(tULR2,OBJ_ARROW,0,Time[0],ULR2); ObjectSet(tULR2,OBJPROP_ARROWCODE,SYMBOL_RIGHTPRICE); ObjectSet(tULR2,OBJPROP_COLOR,c.2); } else { ObjectMove(tULR2,0,Time[0],ULR2); } if (ObjectFind(tLLR2) != 0) { ObjectCreate(tLLR2,OBJ_ARROW,0,Time[0],LLR2); ObjectSet(tLLR2,OBJPROP_ARROWCODE,SYMBOL_RIGHTPRICE); ObjectSet(tLLR2,OBJPROP_COLOR,c.2); } else { ObjectMove(tLLR2,0,Time[0],LLR2); } } // if( std.channel.2 != 0 ) if( std.channel.3 != 0 ) { if (ObjectFind(tULR3) != 0) { ObjectCreate(tULR3,OBJ_ARROW,0,Time[0],ULR3); ObjectSet(tULR3,OBJPROP_ARROWCODE,SYMBOL_RIGHTPRICE); ObjectSet(tULR3,OBJPROP_COLOR,c.3); } else { ObjectMove(tULR3,0,Time[0],ULR3); } if (ObjectFind(tLLR3) != 0) { ObjectCreate(tLLR3,OBJ_ARROW,0,Time[0],LLR3); ObjectSet(tLLR3,OBJPROP_ARROWCODE,SYMBOL_RIGHTPRICE); ObjectSet(tLLR3,OBJPROP_COLOR,c.3); } else { ObjectMove(tLLR3,0,Time[0],LLR3); } } // if( std.channel.3 != 0 ) if (ObjectFind("M_LR") != 0) { ObjectCreate("M_LR",OBJ_ARROW,0,Time[0],LR.price.2); ObjectSet("M_LR",OBJPROP_ARROWCODE,SYMBOL_RIGHTPRICE); ObjectSet("M_LR",OBJPROP_COLOR,LR.c); } else { ObjectMove("M_LR",0,Time[0],LR.price.2); } return(0); } //+------------------------------------------------------------------+
Sample
Analysis
Market Information Used:
Series array that contains close prices for each bar
Series array that contains open time of each bar
Indicator Curves created:
Indicators Used:
Custom Indicators Used:
Order Management characteristics:
Other Features: