Linear Regression

Author: Copyright � 2006, tageiger, aka fxid10t@yahoo.com
Price Data Components
Series array that contains close prices for each bar
0 Views
0 Downloads
0 Favorites
Linear Regression
//+------------------------------------------------------------------+
//|                                            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);
}
//+------------------------------------------------------------------+

Comments

Markdown supported. Formatting help

Markdown Formatting Guide

Element Markdown Syntax
Heading # H1
## H2
### H3
Bold **bold text**
Italic *italicized text*
Link [title](https://www.example.com)
Image ![alt text](image.jpg)
Code `code`
Code Block ```
code block
```
Quote > blockquote
Unordered List - Item 1
- Item 2
Ordered List 1. First item
2. Second item
Horizontal Rule ---