//+------------------------------------------------------------------+
//|         NonLinearRegression_StdDev_Channels_StopLoss_Library.mq4 |
//|                                                      Version 1.0 |
//|------------------------------------------------------------------|
//|                    Copyright © 2011, Mr.WT && ANG3110 && kradio5 |
//|                                           http://www.wcs-sth.ru/ |
//+------------------------------------------------------------------+

#property copyright "Copyright © 2011, Mr.WT && ANG3110 && kradio5"
#property link      "http://www.wcs-sth.ru/"
//===========================================================================
#property library
#define PREFIX "_NLR_Mix_"
//===========================================================================
void Create_NLR(color& _Color[], double _NLR_Deviation_Fibo_Coef, double _Stop_Loss_Fibo_Coef, int _NLR_Period,
     int _NLR_Regression_Degree, bool _R_Z, bool _Stop_Loss_Is_Visible, bool _R_L, double& Support[], double& Resist[]) {

   string str = StringConcatenate(PREFIX, Time[_NLR_Period], _NLR_Period);
   int i,j,p,kt,te,te1,n,nn,k,z,trend;
   double fx,fx1,a[10,10],b[10],x[10],sx[20],sum,sum1,std,sq1,sq2,sq3,value,price;
   color _Border =  Silver; color _Alert =   0x000030; color _Warning = 0x300000;
   kt=Period()*60; p=_NLR_Period; sx[1]=p+1; nn=_NLR_Regression_Degree+1;
   for(i=1; i<=nn*2-2; i++) { sum=0.0; for(n=0; n<=p; n++) sum+=MathPow(n,i); sx[i+1]=sum; }
   for(i=1; i<=nn; i++) {sum=0.0; for(n=0; n<=p; n++) {if(i==1) sum+=Close[n]; else sum+=Close[n]*MathPow(n,i-1);} b[i]=sum;}
   for(j=1; j<=nn; j++) {for(i=1; i<=nn; i++) {k=i+j-1; a[i,j]=sx[k];}}
   af_Gauss(nn,a,b,x); std=0.0;
   for (n=p; n>=0; n--) {
      sum=0.0; for(k=1; k<=_NLR_Regression_Degree; k++) {sum+=x[k+1]*MathPow(n,k);} fx=x[1]+sum; std+=MathPow(Close[n]-fx,2);
   }
   std=MathSqrt(std/(p+1));

   if ( _Stop_Loss_Is_Visible ) {
      ArrayInitialize(Support,0); ArrayInitialize(Resist,0);
      for(z = p; z > 0; z--) {
         if (trend > 0) {
            if (Close[z] > price) price = Close[z];
            value = price - _Stop_Loss_Fibo_Coef * std;
            if (Close[z] < value) {
               price = Close[z];
               value = price + _Stop_Loss_Fibo_Coef * std;
               trend = -1;
            }
         } else {
            if (Close[z] < price) price = Close[z];
            value = price + _Stop_Loss_Fibo_Coef * std;
            if (Close[z] > value) {
               price = Close[z];
               value = price - _Stop_Loss_Fibo_Coef * std;
               trend = 1;
            }
         }
         if (trend > 0) Support[z] = value; else Resist[z] = value;
      }
      Support[0]=Support[1]; Resist[0]=Resist[1];
   }

if(_Color[0] != EMPTY && _Color[1] != EMPTY) {
    sq1=_NLR_Deviation_Fibo_Coef*std; sq2=1.5*sq1; sq3=2*sq1;
    for (n=p; n>=-p/2; n--) {
      sum=0.0; 
      sum1=0.0; 
      for(k=1; k<=_NLR_Regression_Degree; k++) {
        sum+=x[k+1]*MathPow(n,k); 
        sum1+=x[k+1]*MathPow(n+1,k);
      }  
      fx=x[1]+sum;
      fx1=x[1]+sum1;
      if (n>=0 && n<p) {
       if(_R_L) {
        ObjectCreate(str+"_WRC"+n,2,0,Time[n+1],fx1,Time[n],fx); 
        ObjectSet(str+"_WRC"+n,OBJPROP_RAY,0);
       }
        ObjectCreate(str+"_WRC+"+n,2,0,Time[n+1],fx1+sq1,Time[n],fx+sq1); 
        ObjectSet(str+"_WRC+"+n,OBJPROP_RAY,0);
        ObjectCreate(str+"_WRC-"+n,2,0,Time[n+1],fx1-sq1,Time[n],fx-sq1); 
        ObjectSet(str+"_WRC-"+n,OBJPROP_RAY,0);

      if ( _R_Z ) {
        ObjectCreate(str+"_WRC2+"+n,2,0,Time[n+1],fx1+sq2,Time[n],fx+sq2); 
        ObjectSet(str+"_WRC2+"+n,OBJPROP_RAY,0);
        ObjectCreate(str+"_WRC2-"+n,2,0,Time[n+1],fx1-sq2,Time[n],fx-sq2); 
        ObjectSet(str+"_WRC2-"+n,OBJPROP_RAY,0);
        ObjectCreate(str+"_WRC3+"+n,2,0,Time[n+1],fx1+sq3,Time[n],fx+sq3); 
        ObjectSet(str+"_WRC3+"+n,OBJPROP_RAY,0);
        ObjectCreate(str+"_WRC3-"+n,2,0,Time[n+1],fx1-sq3,Time[n],fx-sq3); 
        ObjectSet(str+"_WRC3-"+n,OBJPROP_RAY,0);
        ObjectCreate(str+"_F1_1+"+n,OBJ_TRIANGLE,0,Time[n+1],fx1+sq2,Time[n+1],fx1+sq1,Time[n],fx+sq1);
        ObjectCreate(str+"_F1_2+"+n,OBJ_TRIANGLE,0,Time[n],fx+sq2,Time[n],fx+sq1,Time[n+1],fx1+sq2);
        ObjectCreate(str+"_F1_1-"+n,OBJ_TRIANGLE,0,Time[n+1],fx1-sq2,Time[n+1],fx1-sq1,Time[n],fx-sq1);
        ObjectCreate(str+"_F1_2-"+n,OBJ_TRIANGLE,0,Time[n],fx-sq2,Time[n],fx-sq1,Time[n+1],fx1-sq2);
        ObjectSet(str+"_F1_1+"+n,OBJPROP_BACK,true);
        ObjectSet(str+"_F1_2+"+n,OBJPROP_BACK,true);
        ObjectSet(str+"_F1_1-"+n,OBJPROP_BACK,true);
        ObjectSet(str+"_F1_2-"+n,OBJPROP_BACK,true);
        ObjectCreate(str+"_F2_1+"+n,OBJ_TRIANGLE,0,Time[n+1],fx1+sq3,Time[n+1],fx1+sq2,Time[n],fx+sq2);
        ObjectCreate(str+"_F2_2+"+n,OBJ_TRIANGLE,0,Time[n],fx+sq3,Time[n],fx+sq2,Time[n+1],fx1+sq3);
        ObjectCreate(str+"_F2_1-"+n,OBJ_TRIANGLE,0,Time[n+1],fx1-sq3,Time[n+1],fx1-sq2,Time[n],fx-sq2);
        ObjectCreate(str+"_F2_2-"+n,OBJ_TRIANGLE,0,Time[n],fx-sq3,Time[n],fx-sq2,Time[n+1],fx1-sq3);
        ObjectSet(str+"_F2_1+"+n,OBJPROP_BACK,true);
        ObjectSet(str+"_F2_2+"+n,OBJPROP_BACK,true);
        ObjectSet(str+"_F2_1-"+n,OBJPROP_BACK,true);
        ObjectSet(str+"_F2_2-"+n,OBJPROP_BACK,true);
        ObjectSet(str+"_WRC+"+n,OBJPROP_COLOR,_Border);
        ObjectSet(str+"_WRC-"+n,OBJPROP_COLOR,_Border);
        ObjectSet(str+"_WRC2+"+n,OBJPROP_COLOR,_Border);
        ObjectSet(str+"_WRC2-"+n,OBJPROP_COLOR,_Border);
        ObjectSet(str+"_WRC3+"+n,OBJPROP_COLOR,_Border);
        ObjectSet(str+"_WRC3-"+n,OBJPROP_COLOR,_Border);
        ObjectSet(str+"_F1_1+"+n,OBJPROP_COLOR,_Warning);
        ObjectSet(str+"_F1_2+"+n,OBJPROP_COLOR,_Warning);
        ObjectSet(str+"_F1_1-"+n,OBJPROP_COLOR,_Warning);
        ObjectSet(str+"_F1_2-"+n,OBJPROP_COLOR,_Warning);
        ObjectSet(str+"_F2_1+"+n,OBJPROP_COLOR,_Alert);
        ObjectSet(str+"_F2_2+"+n,OBJPROP_COLOR,_Alert);
        ObjectSet(str+"_F2_1-"+n,OBJPROP_COLOR,_Alert);
        ObjectSet(str+"_F2_2-"+n,OBJPROP_COLOR,_Alert);
      }
      if (_R_L) {
         if (fx>fx1) {
            ObjectSet(str+"_WRC"+n,OBJPROP_COLOR,_Color[0]);
         } else {
            ObjectSet(str+"_WRC"+n,OBJPROP_COLOR,_Color[1]);
         }
      }
      if ( ! _R_Z ) {        
         if (fx>fx1) {
            ObjectSet(str+"_WRC+"+n,OBJPROP_COLOR,_Color[0]);
            ObjectSet(str+"_WRC-"+n,OBJPROP_COLOR,_Color[0]);
         } else {
            ObjectSet(str+"_WRC+"+n,OBJPROP_COLOR,_Color[1]);
            ObjectSet(str+"_WRC-"+n,OBJPROP_COLOR,_Color[1]);
         }
      }
      
      } else if (n < 0 ) {
          te=Time[0]-(n)*kt; 
          te1=Time[0]-(n+1)*kt;
          if(_R_L) {
           ObjectCreate(str+"_-WRC"+n,2,0,te1,fx1,te,fx); 
           ObjectSet(str+"_-WRC"+n,OBJPROP_RAY,0);
          }
          ObjectCreate(str+"_-WRC+"+n,2,0,te1,fx1+sq1,te,fx+sq1); 
          ObjectSet(str+"_-WRC+"+n,OBJPROP_RAY,0);
          ObjectCreate(str+"_-WRC-"+n,2,0,te1,fx1-sq1,te,fx-sq1); 
          ObjectSet(str+"_-WRC-"+n,OBJPROP_RAY,0);

      if ( _R_Z ) {
          ObjectCreate(str+"_-WRC2+"+n,2,0,te1,fx1+sq2,te,fx+sq2); 
          ObjectSet(str+"_-WRC2+"+n,OBJPROP_RAY,0);
          ObjectCreate(str+"_-WRC2-"+n,2,0,te1,fx1-sq2,te,fx-sq2); 
          ObjectSet(str+"_-WRC2-"+n,OBJPROP_RAY,0);
          ObjectCreate(str+"_-WRC3+"+n,2,0,te1,fx1+sq3,te,fx+sq3); 
          ObjectSet(str+"_-WRC3+"+n,OBJPROP_RAY,0);
          ObjectCreate(str+"_-WRC3-"+n,2,0,te1,fx1-sq3,te,fx-sq3); 
          ObjectSet(str+"_-WRC3-"+n,OBJPROP_RAY,0);
          ObjectCreate(str+"_-F1_1+"+n,OBJ_TRIANGLE,0,te1,fx1+sq2,te1,fx1+sq1,te,fx+sq1);
          ObjectCreate(str+"_-F1_2+"+n,OBJ_TRIANGLE,0,te,fx+sq2,te,fx+sq1,te1,fx1+sq2);
          ObjectCreate(str+"_-F1_1-"+n,OBJ_TRIANGLE,0,te1,fx1-sq2,te1,fx1-sq1,te,fx-sq1);
          ObjectCreate(str+"_-F1_2-"+n,OBJ_TRIANGLE,0,te,fx-sq2,te,fx-sq1,te1,fx1-sq2);
          ObjectSet(str+"_-F1_1+"+n,OBJPROP_BACK,true);
          ObjectSet(str+"_-F1_2+"+n,OBJPROP_BACK,true);
          ObjectSet(str+"_-F1_1-"+n,OBJPROP_BACK,true);
          ObjectSet(str+"_-F1_2-"+n,OBJPROP_BACK,true);
          ObjectCreate(str+"_-F2_1+"+n,OBJ_TRIANGLE,0,te1,fx1+sq3,te1,fx1+sq2,te,fx+sq2);
          ObjectCreate(str+"_-F2_2+"+n,OBJ_TRIANGLE,0,te,fx+sq3,te,fx+sq2,te1,fx1+sq3);
          ObjectCreate(str+"_-F2_1-"+n,OBJ_TRIANGLE,0,te1,fx1-sq3,te1,fx1-sq2,te,fx-sq2);
          ObjectCreate(str+"_-F2_2-"+n,OBJ_TRIANGLE,0,te,fx-sq3,te,fx-sq2,te1,fx1-sq3);
          ObjectSet(str+"_-F2_1+"+n,OBJPROP_BACK,true);
          ObjectSet(str+"_-F2_2+"+n,OBJPROP_BACK,true);
          ObjectSet(str+"_-F2_1-"+n,OBJPROP_BACK,true);
          ObjectSet(str+"_-F2_2-"+n,OBJPROP_BACK,true);
          ObjectSet(str+"_-WRC+"+n,OBJPROP_COLOR,_Border);
          ObjectSet(str+"_-WRC-"+n,OBJPROP_COLOR,_Border);
          ObjectSet(str+"_-WRC2+"+n,OBJPROP_COLOR,_Border);
          ObjectSet(str+"_-WRC2-"+n,OBJPROP_COLOR,_Border);
          ObjectSet(str+"_-WRC3+"+n,OBJPROP_COLOR,_Border);
          ObjectSet(str+"_-WRC3-"+n,OBJPROP_COLOR,_Border);
          ObjectSet(str+"_-F1_1+"+n,OBJPROP_COLOR,_Warning);
          ObjectSet(str+"_-F1_2+"+n,OBJPROP_COLOR,_Warning);
          ObjectSet(str+"_-F1_1-"+n,OBJPROP_COLOR,_Warning);
          ObjectSet(str+"_-F1_2-"+n,OBJPROP_COLOR,_Warning);
          ObjectSet(str+"_-F2_1+"+n,OBJPROP_COLOR,_Alert);
          ObjectSet(str+"_-F2_2+"+n,OBJPROP_COLOR,_Alert);
          ObjectSet(str+"_-F2_1-"+n,OBJPROP_COLOR,_Alert);
          ObjectSet(str+"_-F2_2-"+n,OBJPROP_COLOR,_Alert);
      }
      if (_R_L) {
         if (fx>fx1) {
            ObjectSet(str+"_-WRC"+n,OBJPROP_COLOR,_Color[0]);
         } else {
            ObjectSet(str+"_-WRC"+n,OBJPROP_COLOR,_Color[1]);
         }
      }
      if ( ! _R_Z ) {        
         if (fx>fx1) {
            ObjectSet(str+"_-WRC+"+n,OBJPROP_COLOR,_Color[0]);
            ObjectSet(str+"_-WRC-"+n,OBJPROP_COLOR,_Color[0]);
         } else {
            ObjectSet(str+"_-WRC+"+n,OBJPROP_COLOR,_Color[1]);
            ObjectSet(str+"_-WRC-"+n,OBJPROP_COLOR,_Color[1]);
         }
      }
     }
    }
}
}
//===========================================================================
void af_Gauss(int n, double& a[][],double& b[], double& x[]) {
  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);}}
}
//===========================================================================
void Deinit() {
   int i, ind, obj_total; string name, _tool = PREFIX;
   obj_total = ObjectsTotal();
   for(i = 0; i <= obj_total; i++) {
     name = ObjectName(i);
     ind = StringFind(name, _tool, 0);
     if ( ind != -1 ) { ObjectDelete(name); i--; }
   }
}
//===========================================================================
void Create_SDC(int _Point, color& _Color[], double _Fibo_C1, double _Fibo_C2, double _Fibo_C3) {
   int p; string desc; p = _Point;
   double LR0,LR1,StdDev;
   int n=p+1;
   double value=Close[0];
   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=Close[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;
   LR1=a;
   LR0=a+b*n;
   double median = sumy/p; StdDev = 0.0;
   for ( i = 1; i < n; i++ ) StdDev += MathPow ( Close[i] - median, 2);
   StdDev = MathSqrt(StdDev/n);
   desc = StringConcatenate(PREFIX, "_LRL_", Time[p], p);
   ObjectCreate (desc,OBJ_TREND,0,Time[p],LR0,Time[0],LR1);
   ObjectSet    (desc,OBJPROP_RAY,1);
   ObjectSet    (desc,OBJPROP_STYLE,STYLE_SOLID);
   ObjectSet    (desc,OBJPROP_COLOR,_Color[0]); 
   ObjectSet    (desc,OBJPROP_BACK,true);
   desc = StringConcatenate(PREFIX, "_STD_UP1_L_", Time[p], p);
   ObjectCreate (desc,OBJ_TREND,0,Time[p],LR0+_Fibo_C1*StdDev,Time[0],LR1+_Fibo_C1*StdDev);
   ObjectSet    (desc,OBJPROP_RAY,0);
   ObjectSet    (desc,OBJPROP_STYLE,STYLE_DASH);
   ObjectSet    (desc,OBJPROP_COLOR,_Color[0]); 
   ObjectSet    (desc,OBJPROP_BACK,true);
   desc = StringConcatenate(PREFIX, "_STD_UP2_L_", Time[p], p);
   ObjectCreate (desc,OBJ_TREND,0,Time[p],LR0+_Fibo_C2*StdDev,Time[0],LR1+_Fibo_C2*StdDev);
   ObjectSet    (desc,OBJPROP_RAY,0);
   ObjectSet    (desc,OBJPROP_STYLE,STYLE_DASH);
   ObjectSet    (desc,OBJPROP_COLOR,_Color[0]); 
   ObjectSet    (desc,OBJPROP_BACK,true);
   desc = StringConcatenate(PREFIX, "_STD_UP3_L_", Time[p], p);
   ObjectCreate (desc,OBJ_TREND,0,Time[p],LR0+_Fibo_C3*StdDev,Time[0],LR1+_Fibo_C3*StdDev);
   ObjectSet    (desc,OBJPROP_RAY,0);
   ObjectSet    (desc,OBJPROP_STYLE,STYLE_DASH);
   ObjectSet    (desc,OBJPROP_COLOR,_Color[0]); 
   ObjectSet    (desc,OBJPROP_BACK,true);
   desc = StringConcatenate(PREFIX, "_STD_DN1_L_", Time[p], p);
   ObjectCreate (desc,OBJ_TREND,0,Time[p],LR0-_Fibo_C1*StdDev,Time[0],LR1-_Fibo_C1*StdDev);
   ObjectSet    (desc,OBJPROP_RAY,0);
   ObjectSet    (desc,OBJPROP_STYLE,STYLE_DASH);
   ObjectSet    (desc,OBJPROP_COLOR,_Color[0]); 
   ObjectSet    (desc,OBJPROP_BACK,true);
   desc = StringConcatenate(PREFIX, "_STD_DN2_L_", Time[p], p);
   ObjectCreate (desc,OBJ_TREND,0,Time[p],LR0-_Fibo_C2*StdDev,Time[0],LR1-_Fibo_C2*StdDev);
   ObjectSet    (desc,OBJPROP_RAY,0);
   ObjectSet    (desc,OBJPROP_STYLE,STYLE_DASH);
   ObjectSet    (desc,OBJPROP_COLOR,_Color[0]); 
   ObjectSet    (desc,OBJPROP_BACK,true);
   desc = StringConcatenate(PREFIX, "_STD_DN3_L_", Time[p], p);
   ObjectCreate (desc,OBJ_TREND,0,Time[p],LR0-_Fibo_C3*StdDev,Time[0],LR1-_Fibo_C3*StdDev);
   ObjectSet    (desc,OBJPROP_RAY,0);
   ObjectSet    (desc,OBJPROP_STYLE,STYLE_DASH);
   ObjectSet    (desc,OBJPROP_COLOR,_Color[0]); 
   ObjectSet    (desc,OBJPROP_BACK,true);
}
//===========================================================================

