3X_ParabolicRegression

Author: Copyright � 2007, Mr.WT, Senior Linux Hacker
0 Views
0 Downloads
0 Favorites
3X_ParabolicRegression
//+------------------------------------------------------------------+
//|                                       3X_ParabolicRegression.mq5 |
//|                     Copyright © 2007, Mr.WT, Senior Linux Hacker |
//|                                     http://w-tiger.narod.ru/wk2/ |
//+------------------------------------------------------------------+
//---- author of the indicator
#property copyright "Copyright © 2007, Mr.WT, Senior Linux Hacker"
//---- link to the website of the author
#property link      "http://w-tiger.narod.ru/wk2/"
//---- indicator version
#property version   "2.01"
//---- drawing the indicator in the main window
#property indicator_chart_window 
#property indicator_buffers  0
#property indicator_plots    0
//+-----------------------------------+
//|  Declaration of enumeration       |
//+-----------------------------------+  
enum WIDTH
  {
   Width_1=1, // 1
   Width_2,   // 2
   Width_3,   // 3
   Width_4,   // 4
   Width_5    // 5
  };
//+-----------------------------------+
//|  Declaration of enumeration       |
//+-----------------------------------+
enum STYLE
  {
   SOLID_,      // Solid line
   DASH_,       // Dashed line
   DOT_,        // Dotted line
   DASHDOT_,    // Dot-dash line
   DASHDOTDOT_  // Dot-dash line with double dots
  };
//+----------------------------------------------+
//|  Indicator input parameters                  |
//+----------------------------------------------+
//---- curvelinear channel parameters
input uint RegressionDegree_=5;
input double KNL_Dev=2.72;
input color RegressionColor1 = SpringGreen; // Regression color 1
input color RegressionColor2 = Red;         // Regression color 2
input color RegressionColor3 = BlueViolet;  // Regression color 3
input color RegressionColor4 = Magenta;     // Regression color 4
input STYLE linesStyle=DASH_;               // Lines style
input WIDTH linesWidth=Width_1;             // Lines width
//---- standard deviations channels 1 parameters
input color channelColor1=Blue;             // Channel color 1
input STYLE channelStyle1=DASH_;            // Channel style 1
input WIDTH channelWidth1=Width_1;          // Channel lines width 1
//---- standard deviations channels 2 parameters
input color channelColor2=Gold;             // Channel color 2
input STYLE channelStyle2=SOLID_;           // Channel style 2
input WIDTH channelWidth2=Width_1;          // Channel lines width 2
//+----------------------------------------------+
//---- declaration of global variables
double fx,fx1;
double a[10][10],b[10],x[10],sx[20];
double sum,sum1,sq;
int p,p1,p2,nn,kt;
//----
datetime te,te1,tp,t0;
int i0,ip,pn,i0n,ipn,RegressionDegree;
string str;
//+------------------------------------------------------------------+
//| init                                                             |
//+------------------------------------------------------------------+
bool init(int RatesTotal,const datetime &Time[])
  {
//---- too small history
   if(p>RatesTotal)
     {
      Comment("\n\n                    ERROR - TOO SMALL HISTORY, RETURN NOW!");
      return(false);
     }

//---- ar
   kt=PeriodSeconds();
   nn=RegressionDegree+1;
//----------------------
   t0=Time[0];
   i0=0;
   ip=i0+p;
   tp=Time[ip];
   pn=p;
//---- LR
   ObjectCreate(0,"LR1",OBJ_REGRESSION,0,Time[0],0,Time[0],0);
   ObjectSetInteger(0,"LR1",OBJPROP_COLOR,channelColor1);
   ObjectSetInteger(0,"LR1",OBJPROP_RAY,true);
   ObjectSetInteger(0,"LR1",OBJPROP_RAY_RIGHT,true);
   ObjectSetInteger(0,"LR1",OBJPROP_STYLE,channelStyle1);
   ObjectSetInteger(0,"LR1",OBJPROP_WIDTH,Width_1);
//---- ar
   ObjectCreate(0,"LR2",OBJ_REGRESSION,0,Time[0],0,Time[0],0);
   ObjectSetInteger(0,"LR2",OBJPROP_COLOR,channelColor2);
   ObjectSetInteger(0,"LR2",OBJPROP_RAY,true);
   ObjectSetInteger(0,"LR2",OBJPROP_RAY_RIGHT,true);
   ObjectSetInteger(0,"LR2",OBJPROP_STYLE,channelStyle2);
   ObjectSetInteger(0,"LR2",OBJPROP_WIDTH,Width_2);

   for(int j=-p/2; j<p; j++)
     {
      string sJ=str+")"+string(j);

      int r=i0+j;
      if(r<0) r=0;
      ObjectCreate(0,"_ar("+sJ,OBJ_TREND,0,Time[r+1],0,Time[r],0);
      ObjectSetInteger(0,"_ar("+sJ,OBJPROP_RAY,false);
      ObjectSetInteger(0,"_ar("+sJ,OBJPROP_STYLE,linesStyle);
      ObjectSetInteger(0,"_ar("+sJ,OBJPROP_WIDTH,linesWidth);

      ObjectCreate(0,"_arH("+sJ,OBJ_TREND,0,Time[r+1],0,Time[r],0);
      ObjectSetInteger(0,"_arH("+sJ,OBJPROP_RAY,false);
      ObjectSetInteger(0,"_arH("+sJ,OBJPROP_STYLE,linesStyle);
      ObjectSetInteger(0,"_arH("+sJ,OBJPROP_WIDTH,linesWidth);

      ObjectCreate(0,"_arL("+sJ,OBJ_TREND,0,Time[r+1],0,Time[r],0);
      ObjectSetInteger(0,"_arL("+sJ,OBJPROP_RAY,false);
      ObjectSetInteger(0,"_arL("+sJ,OBJPROP_STYLE,linesStyle);
      ObjectSetInteger(0,"_arL("+sJ,OBJPROP_WIDTH,linesWidth);
     }
//----
   return(true);
  }
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+  
void OnInit()
  {
//----  
   switch(Period())
     {
      case  PERIOD_MN1: p=0;  p1=21;  p2=5;  break;
      case  PERIOD_W1:  p=21; p1=55;  p2=21; break;
      case  PERIOD_D1:  p=21; p1=89;  p2=21; break;
      case  PERIOD_H12: p=24; p1=110; p2=24; break;
      case  PERIOD_H8:  p=31; p1=120; p2=31; break;
      case  PERIOD_H6:  p=32; p1=130; p2=32; break;
      case  PERIOD_H4:  p=34; p1=144; p2=34; break;
      case  PERIOD_H3:  p=34; p1=144; p2=34; break;
      case  PERIOD_H2:  p=34; p1=144; p2=34; break;
      case  PERIOD_H1:  p=34; p1=144; p2=34; break;
      //----
      default: p=34; p1=144; p2=34;
     }
//---- initializations of a variable for the indicator short name
   str="";
   StringConcatenate(str,",",RegressionDegree,",",DoubleToString(KNL_Dev,3));
   IndicatorSetString(INDICATOR_SHORTNAME,"3X Parabolic Regression_v1.3.2("+str+")");

   RegressionDegree=int(RegressionDegree_);
   if(RegressionDegree>8) RegressionDegree=8;

//---- determination of accuracy of displaying the indicator values
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//---- create labels to display in DataWindow 
//---- and a name for displaying in a separate sub-window and in a tooltip
   IndicatorSetString(INDICATOR_SHORTNAME,"Parabolic Regression");
//----
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+    
void OnDeinit(const int reason)
  {
//----
   for(int j=p; j>=-p/2; j--)
     {
      string sJ=str+")"+string(j);
      ObjectDelete(0,"_ar("+sJ);
      ObjectDelete(0,"_arH("+sJ);
      ObjectDelete(0,"_arL("+sJ);
     }

   ObjectDelete(0,"LR1");
   ObjectDelete(0,"LR2");
   Comment("");
//----
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,    // number of bars in history at the current tick
                const int prev_calculated,// amount of history in bars at the previous tick
                const datetime &Time[],
                const double &Open[],
                const double& high[],     // price array of maximums of price for the calculation of indicator
                const double& low[],      // price array of minimums of price for the calculation of indicator
                const double &Close[],
                const long &Tick_volume[],
                const long &Volume[],
                const int &Spread[])
  {
//---- 
   if(rates_total<p+1) return(0);
   if(rates_total==prev_calculated) return(rates_total);

//---- indexing elements in arrays as time series  
   ArraySetAsSeries(Time,true);
   ArraySetAsSeries(Close,true);

   for(int j=p; j>=-p/2; j--)
     {
      string sJ=str+")"+string(j);
      ObjectDelete(0,"_ar("+sJ);
      ObjectDelete(0,"_arH("+sJ);
      ObjectDelete(0,"_arL("+sJ);
     }

   if(!init(rates_total,Time)) return(0);
//---- 
   ObjectMove(0,"LR1",0,Time[p1],0);
   ObjectMove(0,"LR1",1,Time[1],0);

   if(p2)
     {
      ObjectMove(0,"LR2",0,Time[p2],0);
      ObjectMove(0,"LR2",1,Time[1],0);
     }
//----
   int i,j,n,k;
//---- 
   if(i0n!=i0 || ipn!=ip)
     {
      p=ip-i0;
      i0n=ip;
      ipn=ip;

      if(pn<p)
        {
         for(j=pn; j<=p; j++)
           {
            string sJ=str+")"+string(j);
            ObjectCreate(0,"_ar("+sJ,OBJ_TREND,0,Time[i0+1+j],0,Time[i0+j],0);
            ObjectSetInteger(0,"_ar("+sJ,OBJPROP_RAY,false);
            ObjectSetInteger(0,"_ar("+sJ,OBJPROP_STYLE,linesStyle);
            ObjectSetInteger(0,"_ar("+sJ,OBJPROP_WIDTH,linesWidth);

            ObjectCreate(0,"_arH("+sJ,OBJ_TREND,0,Time[i0+1+j],0,Time[i0+j],0);
            ObjectSetInteger(0,"_arH("+sJ,OBJPROP_RAY,false);
            ObjectSetInteger(0,"_arH("+sJ,OBJPROP_STYLE,linesStyle);
            ObjectSetInteger(0,"_arH("+sJ,OBJPROP_WIDTH,linesWidth);

            ObjectCreate(0,"_arL("+sJ,OBJ_TREND,0,Time[i0+1+j],0,Time[i0+j],0);
            ObjectSetInteger(0,"_arL("+sJ,OBJPROP_RAY,false);
            ObjectSetInteger(0,"_arL("+sJ,OBJPROP_STYLE,linesStyle);
            ObjectSetInteger(0,"_arL("+sJ,OBJPROP_WIDTH,linesWidth);
           }

         for(j=-pn/2; j>=-p/2; j--)
           {
            string sJ=str+")"+string(j);
            ObjectCreate(0,"_ar("+sJ,OBJ_TREND,0,Time[i0+1+j],0,Time[i0+j],0);
            ObjectSetInteger(0,"_ar("+sJ,OBJPROP_RAY,false);
            ObjectSetInteger(0,"_ar("+sJ,OBJPROP_STYLE,linesStyle);
            ObjectSetInteger(0,"_ar("+sJ,OBJPROP_WIDTH,linesWidth);

            ObjectCreate(0,"_arH("+sJ,OBJ_TREND,0,Time[i0+1+j],0,Time[i0+j],0);
            ObjectSetInteger(0,"_arH("+sJ,OBJPROP_RAY,false);
            ObjectSetInteger(0,"_arH("+sJ,OBJPROP_STYLE,linesStyle);
            ObjectSetInteger(0,"_arH("+sJ,OBJPROP_WIDTH,linesWidth);

            ObjectCreate(0,"_arL("+sJ,OBJ_TREND,0,Time[i0+1+j],0,Time[i0+j],0);
            ObjectSetInteger(0,"_arL("+sJ,OBJPROP_RAY,false);
            ObjectSetInteger(0,"_arL("+sJ,OBJPROP_STYLE,linesStyle);
            ObjectSetInteger(0,"_arL("+sJ,OBJPROP_WIDTH,linesWidth);
           }

         pn=p;
        }

      if(pn>p)
        {
         for(j=pn; j>=p; j--)
           {
            string sJ=str+")"+string(j);
            ObjectDelete(0,"_ar("+sJ);
            ObjectDelete(0,"_arH("+sJ);
            ObjectDelete(0,"_arL("+sJ);
           }

         for(j=-p/2; j>=-pn/2; j--)
           {
            string sJ=str+")"+string(j);
            ObjectDelete(0,"_ar("+sJ);
            ObjectDelete(0,"_arH("+sJ);
            ObjectDelete(0,"_arL("+sJ);
           }
         pn=p;
        }
     }

//---- PR
   sx[1]=p+1;

//---- sx
   for(i=1; i<=nn*2-2; i++)
     {
      sum=0.0;
      for(n=i0; n<=i0+p; n++) sum+=MathPow(n,i);
      sx[i+1]=sum;
     }

//---- syx
   for(i=1; i<=nn; i++)
     {
      sum=0.0;
      for(n=i0; n<=i0+p; n++)
        {
         if(i==1) sum+=Close[n];
         else
            sum+=Close[n]*MathPow(n,i-1);
        }
      b[i]=sum;
     }

//---- Matrix
   for(j=1; j<=nn; j++) for(i=1; i<=nn; i++) {k=i+j-1; a[i][j]=sx[k];}

//---- Gauss
   af_Gauss(nn);

//---- SQ
   sq=0.0;
   for(n=p; n>=0; n--)
     {
      sum=0.0;
      for(k=1; k<=RegressionDegree; k++)
        {
         sum+=x[k+1]*MathPow(i0+n,k);
         sum1+=x[k+1]*MathPow(i0+n+1,k);
        }

      fx=x[1]+sum;
      sq+=MathPow(Close[n+i0]-fx,2);
     }
   sq=KNL_Dev*MathSqrt(sq/(p+1));
//----

   for(n=p; n>=-p/2; n--)
     {
      sum=0.0;
      sum1=0.0;
      string sN=str+")"+string(n);

      for(k=1; k<=RegressionDegree; k++)
        {
         sum+=x[k+1]*MathPow(i0+n,k);
         sum1+=x[k+1]*MathPow(i0+n+1,k);
        }
      fx=x[1]+sum;
      fx1=x[1]+sum1;

      if(n>=0 && n<p)
        {
         ObjectMove(0,"_ar("+sN,0,Time[n+i0+1],fx1);
         ObjectMove(0,"_ar("+sN,1,Time[n+i0],fx);
         ObjectMove(0,"_arH("+sN,0,Time[n+i0+1],fx1+sq);
         ObjectMove(0,"_arH("+sN,1,Time[n+i0],fx+sq);
         ObjectMove(0,"_arL("+sN,0,Time[n+i0+1],fx1-sq);
         ObjectMove(0,"_arL("+sN,1,Time[n+i0],fx-sq);

         if(fx>fx1)
           {
            ObjectSetInteger(0,"_ar("+sN,OBJPROP_COLOR,RegressionColor1);
            ObjectSetInteger(0,"_arH("+sN,OBJPROP_COLOR,RegressionColor1);
            ObjectSetInteger(0,"_arL("+sN,OBJPROP_COLOR,RegressionColor1);
           }
         if(fx<fx1)
           {
            ObjectSetInteger(0,"_ar("+sN,OBJPROP_COLOR,RegressionColor2);
            ObjectSetInteger(0,"_arH("+sN,OBJPROP_COLOR,RegressionColor2);
            ObjectSetInteger(0,"_arL("+sN,OBJPROP_COLOR,RegressionColor2);
           }
        }

      if(n<0)
        {
         if((n+i0)>=0)
           {
            ObjectMove(0,"_ar("+sN,0,Time[n+i0+1],fx1);
            ObjectMove(0,"_ar("+sN,1,Time[n+i0],fx);
            ObjectMove(0,"_arH("+sN,0,Time[n+i0+1],fx1+sq);
            ObjectMove(0,"_arH("+sN,1,Time[n+i0],fx+sq);
            ObjectMove(0,"_arL("+sN,0,Time[n+i0+1],fx1-sq);
            ObjectMove(0,"_arL("+sN,1,Time[n+i0],fx-sq);
           }
         if((n+i0)<0)
           {
            te=Time[0]-(n+i0)*kt;
            te1=Time[0]-(n+i0+1)*kt;
            ObjectMove(0,"_ar("+sN,0,te1,fx1);
            ObjectMove(0,"_ar("+sN,1,te,fx);
            ObjectMove(0,"_arH("+sN,0,te1,fx1+sq);
            ObjectMove(0,"_arH("+sN,1,te,fx+sq);
            ObjectMove(0,"_arL("+sN,0,te1,fx1-sq);
            ObjectMove(0,"_arL("+sN,1,te,fx-sq);
           }

         if(fx>fx1)
           {
            ObjectSetInteger(0,"_ar("+sN,OBJPROP_COLOR,RegressionColor3);
            ObjectSetInteger(0,"_arH("+sN,OBJPROP_COLOR,RegressionColor3);
            ObjectSetInteger(0,"_arL("+sN,OBJPROP_COLOR,RegressionColor3);
           }
         if(fx<fx1)
           {
            ObjectSetInteger(0,"_ar("+sN,OBJPROP_COLOR,RegressionColor4);
            ObjectSetInteger(0,"_arH("+sN,OBJPROP_COLOR,RegressionColor4);
            ObjectSetInteger(0,"_arL("+sN,OBJPROP_COLOR,RegressionColor4);
           }
        }
     }
//----
   ChartRedraw(0);
//----   
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Custom indicator af_Gauss function                               |
//+------------------------------------------------------------------+    
void af_Gauss(int n)
  {
//----
   int i,j,k,l;
   double q,m,t;

   for(k=1; k<=n-1; k++)
     {
      l=0;
      m=0;
      for(i=k; i<=n; i++)
        {
         if(MathAbs(a[i][k])>m) {m=MathAbs(a[i][k]); l=i;}
        }
      if(l==0) return;

      if(l!=k)
        {
         for(j=1; j<=n; j++)
           {
            t=a[k][j];
            a[k][j]=a[l][j];
            a[l][j]=t;
           }
         t=b[k];
         b[k]=b[l];
         b[l]=t;
        }

      for(i=k+1;i<=n;i++)
        {
         q=a[i][k]/a[k][k];
         for(j=1;j<=n;j++)
           {
            if(j==k) a[i][j]=0;
            else
               a[i][j]=a[i][j]-q*a[k][j];
           }
         b[i]=b[i]-q*b[k];
        }
     }

   x[n]=b[n]/a[n][n];

   for(i=n-1;i>=1;i--)
     {
      t=0;
      for(j=1;j<=n-i;j++)
        {
         t=t+a[i][i+j]*x[i+j];
         x[i]=(1/a[i][i])*(b[i]-t);
        }
     }
//----
  }
//+------------------------------------------------------------------+

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 ---