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 © 2006, tageiger, aka fxid10t@yahoo.com |
//|                                        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=2;
extern int LR_length=34;   // bars back regression begins
extern color  LR_c=Orange;
extern double std_channel_1=0.618;        // 1st channel
extern color  c_1=Gray;
extern double std_channel_2=1.618;        // 2nd channel
extern color  c_2=Gray;
extern double std_channel_3=2.618;        // 3nd channel
extern color  c_3=Gray;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init(){return(0);}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
  int deinit()
  { ObjectDelete((string)period+"m "+(string)LR_length+" TL");
   ObjectDelete((string)period+"m "+(string)LR_length+" +"+(string)std_channel_1+"d"); ObjectDelete((string)period+"m "+(string)LR_length+" -"+(string)std_channel_1+"d");
   ObjectDelete((string)period+"m "+(string)LR_length+" +"+(string)std_channel_2+"d"); ObjectDelete((string)period+"m "+(string)LR_length+" -"+(string)std_channel_2+"d");
   ObjectDelete((string)period+"m "+(string)LR_length+" +"+(string)std_channel_3+"d"); ObjectDelete((string)period+"m "+(string)LR_length+" -"+(string)std_channel_3+"d");
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
  int start(){//refresh chart
   ObjectDelete((string)period+"m "+(string)LR_length+" TL");
   ObjectDelete((string)period+"m "+(string)LR_length+" +"+(string)std_channel_1+"d"); ObjectDelete((string)period+"m "+(string)LR_length+" -"+(string)std_channel_1+"d");
   ObjectDelete((string)period+"m "+(string)LR_length+" +"+(string)std_channel_2+"d"); ObjectDelete((string)period+"m "+(string)LR_length+" -"+(string)std_channel_2+"d");
   ObjectDelete((string)period+"m "+(string)LR_length+" +"+(string)std_channel_3+"d"); ObjectDelete((string)period+"m "+(string)LR_length+" -"+(string)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(-1);
   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((string)period+"m "+(string)LR_length+" TL",OBJ_TREND,0,iTime(Symbol(),period,start_bar),LR_price_1,Time[end_bar],LR_price_2);
   ObjectSet((string)period+"m "+(string)LR_length+" TL",OBJPROP_COLOR,LR_c);
   ObjectSet((string)period+"m "+(string)LR_length+" TL",OBJPROP_WIDTH,line_width);
   ObjectSet((string)period+"m "+(string)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((string)period+"m "+(string)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...
   ObjectCreate((string)period+"m "+(string)LR_length+" +"+(string)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((string)period+"m "+(string)LR_length+" +"+(string)std_channel_1+"d",OBJPROP_COLOR,c_1);
   ObjectSet((string)period+"m "+(string)LR_length+" +"+(string)std_channel_1+"d",OBJPROP_WIDTH,line_width);
   ObjectSet((string)period+"m "+(string)LR_length+" +"+(string)std_channel_1+"d",OBJPROP_RAY,false);
   ObjectCreate((string)period+"m "+(string)LR_length+" -"+(string)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((string)period+"m "+(string)LR_length+" -"+(string)std_channel_1+"d",OBJPROP_COLOR,c_1);
   ObjectSet((string)period+"m "+(string)LR_length+" -"+(string)std_channel_1+"d",OBJPROP_WIDTH,line_width);
   ObjectSet((string)period+"m "+(string)LR_length+" -"+(string)std_channel_1+"d",OBJPROP_RAY,false);
   ObjectCreate((string)period+"m "+(string)LR_length+" +"+(string)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((string)period+"m "+(string)LR_length+" +"+(string)std_channel_2+"d",OBJPROP_COLOR,c_2);
   ObjectSet((string)period+"m "+(string)LR_length+" +"+(string)std_channel_2+"d",OBJPROP_WIDTH,line_width);
   ObjectSet((string)period+"m "+(string)LR_length+" +"+(string)std_channel_2+"d",OBJPROP_RAY,false);
   ObjectCreate((string)period+"m "+(string)LR_length+" -"+(string)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((string)period+"m "+(string)LR_length+" -"+(string)std_channel_2+"d",OBJPROP_COLOR,c_2);
   ObjectSet((string)period+"m "+(string)LR_length+" -"+(string)std_channel_2+"d",OBJPROP_WIDTH,line_width);
   ObjectSet((string)period+"m "+(string)LR_length+" -"+(string)std_channel_2+"d",OBJPROP_RAY,false);
   ObjectCreate((string)period+"m "+(string)LR_length+" +"+(string)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((string)period+"m "+(string)LR_length+" +"+(string)std_channel_3+"d",OBJPROP_COLOR,c_3);
   ObjectSet((string)period+"m "+(string)LR_length+" +"+(string)std_channel_3+"d",OBJPROP_WIDTH,line_width);
   ObjectSet((string)period+"m "+(string)LR_length+" +"+(string)std_channel_3+"d",OBJPROP_RAY,false);
   ObjectCreate((string)period+"m "+(string)LR_length+" -"+(string)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((string)period+"m "+(string)LR_length+" -"+(string)std_channel_3+"d",OBJPROP_COLOR,c_3);
   ObjectSet((string)period+"m "+(string)LR_length+" -"+(string)std_channel_3+"d",OBJPROP_WIDTH,line_width);
   ObjectSet((string)period+"m "+(string)LR_length+" -"+(string)std_channel_3+"d",OBJPROP_RAY,false);
  return(0);
  }
//+------------------------------------------------------------------+

Comments