iK_Dserg-LinReg

Price Data Components
Series array that contains open time of each bar
Miscellaneous
Implements a curve of type %1It issuies visual alerts to the screen
0 Views
0 Downloads
0 Favorites
iK_Dserg-LinReg
//+------------------------------------------------------------------+
//|                                                                  |
//|       Èíäèêàòîð äëÿ àâòîìàòè÷åñêîãî ïîñòðîåíèÿ ñóæåíèÿ           |
//|       êàíàëîâ ëèíåéíîé ðåãðåññèè(äîðàáîòàí È.Êàöêî               |
//|                               http://www.mql4.com/ru/users/Dserg |
//+------------------------------------------------------------------+
#property  copyright "Dserg, 2010"
#property  link      "Ivan Katsko: ICQ:372739628"

//---- indicator settings
#property  indicator_chart_window
#property  indicator_buffers 8
#property indicator_color1 DeepSkyBlue
#property indicator_color2 DeepSkyBlue
#property indicator_color3 FireBrick
#property indicator_color4 DeepSkyBlue
#property indicator_color5 DeepSkyBlue
#property indicator_color6 Yellow
#property indicator_color7 HotPink
#property indicator_color8 LawnGreen 

//---- buffers
double B0[];
double B1[];
double Stop[];
double B3[];
double B4[];
double Up[];
double Dn[];
double Target[];

extern string S3="Öåëü ïðè ïðîáîå îòí. øèðèíû êàíàëà";
extern double t0=2.618;
extern string S4="Èñïîëüçîâàòü äëÿ ðàñ÷¸òà Close";
extern bool useClose=true;
extern string StartTime = "23:00";  //Íà÷àëî ðàáîòû
extern string FinishTime = "07:00"; //Êîíåö ðàáîòû

bool FindR0, isChannel, Msg;
datetime chEnd;
double a0;
double b0;
double range0;
int R0, r0, Nlin, Nbars;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- 3additional buffers are used for counting.
   FindR0=false;
   Msg=true;
   Nbars=1380/Period();
   Nlin=(StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+FinishTime)
        -StrToTime(TimeToStr(TimeCurrent()-86400, TIME_DATE)+" "+StartTime))
        /60/Period();
//---- drawing settings

   SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,2);
   SetIndexBuffer(0, B0);      
   SetIndexStyle(1,DRAW_LINE,STYLE_SOLID,2);
   SetIndexBuffer(1, B1);      
   SetIndexStyle(2,DRAW_ARROW,0,2);
   SetIndexBuffer(2, Stop);      
   SetIndexStyle(3,DRAW_LINE,STYLE_DOT);
   SetIndexBuffer(3, B3);      
   SetIndexStyle(4,DRAW_LINE,STYLE_DOT);
   SetIndexBuffer(4, B4);      

   SetIndexStyle(5,DRAW_ARROW,0,1);
   SetIndexBuffer(5, Up);      
   SetIndexArrow(5, 233);        
   SetIndexStyle(6,DRAW_ARROW,0,1);
   SetIndexBuffer(6, Dn);      
   SetIndexArrow(6, 234);        
   SetIndexStyle(7,DRAW_ARROW,0,1);
   SetIndexBuffer(7, Target);      
   SetIndexArrow(7, 231);        

   SetIndexEmptyValue(0,0.0);   
   SetIndexEmptyValue(1,0.0);   
   SetIndexEmptyValue(2,0.0);   
   SetIndexEmptyValue(3,0.0);   
   SetIndexEmptyValue(4,0.0);   
   SetIndexEmptyValue(5,0.0);   
   SetIndexEmptyValue(6,0.0);   
   SetIndexEmptyValue(7,0.0);   

   SetIndexLabel(0,"Channel Low");
   SetIndexLabel(1,"Channel High");
   SetIndexLabel(3,"Channel Low Extended");
   SetIndexLabel(4,"Channel High Extended");
   SetIndexLabel(5,"BUY Signal");
   SetIndexLabel(6,"SELL Signal");
   SetIndexLabel(2,"Stop/Reverse");
   SetIndexLabel(7,"Target");

   isChannel=false;

   return(0);
  } 

int deinit()
  {
  Comment("");
  } 

int start()

  {
 
     if(Bars-IndicatorCounted()==0) return(0);
      int loopbegin = Nbars;
    
      int i,j,k;
      double a,b,c,
             sumy=0.0,
             sumx=0.0,
             sumxy=0.0,
             sumx2=0.0,
             h=0.0,l=0.0,
             range0 = 0.0,
             range = 0.0;
  if(Time[0]==StrToTime(TimeToStr(Time[0], TIME_DATE)+" "+StartTime)) FindR0=false;
  if(Time[0]==StrToTime(TimeToStr(Time[0], TIME_DATE)+" "+FinishTime) && !FindR0) {  
    for(k = 100; k < 500; k++) {
      r0=k;
      
      isChannel=false;
      for(i = loopbegin; i >= 0; i--) {
         B0[i]=0;
         B1[i]=0;
         B3[i]=0;
         B4[i]=0;
         Up[i]=0;
         Dn[i]=0;
         Stop[i]=0;
         Target[i]=0;
      }
      for(i = loopbegin; i >= 0; i--) {
/**/         //ó íàñ óæå åñòü êàíàë, æä¸ì, ïîêà åãî ïðîáü¸ò
         if (isChannel) {
            double up0=a0*i+b0+range0;
            double dn0=a0*i+b0-range0;
            B3[i]=up0;
            B4[i]=dn0;
            
            if(StartTime!="00:00"
              && B3[i]>0 
                 && iTime(NULL,0,i)<StrToTime(TimeToStr(iTime(NULL,0,i), TIME_DATE)+" "+FinishTime))
              continue;                                  // Âûõîä èç for
            //ïðîâåðÿåì ïðîáèòèå
            //ââåðõ
            if (Open[i]>up0) {
               Up[i]=NormalizeDouble(Open[i],Digits);
               Stop[i]=NormalizeDouble(Open[i]-(up0-dn0),Digits);
               Target[i]=NormalizeDouble(Open[i]+(up0-dn0)*(t0-1),Digits);
               isChannel=false;
            }
            //âíèç
            if (Open[i]<dn0) {
               Dn[i]=NormalizeDouble(Open[i],Digits);
               Stop[i]=NormalizeDouble(Open[i]+(up0-dn0),Digits);
               Target[i]=NormalizeDouble(Open[i]-(up0-dn0)*(t0-1),Digits);
               isChannel=false;
            }
            continue;
         }            
            else
            if(StartTime!="00:00"
                 && iTime(NULL,0,i)<StrToTime(TimeToStr(iTime(NULL,0,i), TIME_DATE)+" "+StartTime)
                 && iTime(NULL,0,i)>StrToTime(TimeToStr(iTime(NULL,0,i), TIME_DATE)+" "+FinishTime))
              continue; 
/**/         
         bool flag=false;
         for (j=0;j<Nlin+1;j++) {
            if (B3[i+j]>0.0&&!isChannel) {
               flag=true;
            }
         }
         if (flag) continue;
         
         
         a=0.0;b=0.0;c=0.0;
         sumx=0.0;sumy=0.0;
         sumxy=0.0;sumx2=0.0;
         h=0.0;l=0.0;
         
         //ñ÷èòàåì êàíàë ëèíåéíîé ðåãðåññèè îò i+Nlin äî i 
         for(j=0; j<Nlin; j++) {
            sumy+=Open[i+j];
            sumxy+=Open[i+j]*(i+j);
            sumx+=(i+j);
            sumx2+=(i+j)*(i+j);
         }
         c=sumx2*Nlin-sumx*sumx;
         if(c==0.0) {
            Alert("Error in linear regression!");
            return(-1);
         }
         a=(sumxy*Nlin-sumx*sumy)/c;
         b=(sumy-sumx*a)/Nlin;
         
         //îïðåäåëÿåì ãðàíèöû êàíàëà
         for(j=0;j<Nlin;j++) {
           double LR=a*(i+j)+b;
           if (useClose) {
             if(Close[j+i]-LR > h) h = Close[i+j]-LR;
             if(LR - Close[i+j]> l) l = LR - Close[i+j];
           } else {
             if(High[j+i]-LR > h) h = High[i+j]-LR;
             if(LR - Low[i+j]> l) l = LR - Low[i+j];
           }           
         }  
         range = MathMax(l,h);
         if(range0==0) Comment("Range=",range/Point);
         
         //ïðîâåðêà øèðèíû êàíàëà
         if (range<r0*Point) {
            //åñòü êàíàë, ñîõðàíÿåì
            isChannel=true;
            a0=a;
            b0=b;
            chEnd=iTime(NULL,0,i);
            range0=range;
            FindR0=true;
            R0=(StrToTime(TimeToStr(chEnd, TIME_DATE)+" "+FinishTime)-chEnd)/60/Period();
            for (j=0;j<Nlin;j++) {
               B3[i+j]=a*(i+j)+b+range;
               B4[i+j]=a*(i+j)+b-range;
               B0[i+j]=a*(i+j)+b+range;
               B1[i+j]=a*(i+j)+b-range;
            }
         }
      }
      if(range0>0) break;
    }
  } 
  else 
  if(FindR0){
      for(i = loopbegin; i >= 0; i--) {
         B0[i]=0;
         B1[i]=0;
         B3[i]=0;
         B4[i]=0;
         Up[i]=0;
         Dn[i]=0;
         Stop[i]=0;
         Target[i]=0;
      }
      for(i = loopbegin; i >= 0; i--) {
         //ó íàñ óæå åñòü êàíàë, æä¸ì, ïîêà åãî ïðîáü¸ò
         if (isChannel) {
            up0=a0*i+b0+range0;
            dn0=a0*i+b0-range0;
            B3[i]=up0;
            B4[i]=dn0;
            
            if(StartTime!="00:00"
              && B3[i]>0 
                 && iTime(NULL,0,i)<StrToTime(TimeToStr(iTime(NULL,0,i), TIME_DATE)+" "+FinishTime))
              continue;                                  // Âûõîä èç for
            //ïðîâåðÿåì ïðîáèòèå
            //ââåðõ
            if (Open[i]>up0) {
               Up[i]=NormalizeDouble(Open[i],Digits);
               Stop[i]=NormalizeDouble(Open[i]-(up0-dn0),Digits);
               Target[i]=NormalizeDouble(Open[i]+(up0-dn0)*(t0-1),Digits);
               isChannel=false;
               if(range0>0) Comment("Range=",range0/Point,", TP=",(Target[i]-Up[i])/Point,", SL=",(Up[i]-Stop[i])/Point);
            }
            //âíèç
            if (Open[i]<dn0) {
               Dn[i]=NormalizeDouble(Open[i],Digits);
               Stop[i]=NormalizeDouble(Open[i]+(up0-dn0),Digits);
               Target[i]=NormalizeDouble(Open[i]-(up0-dn0)*(t0-1),Digits);
               isChannel=false;
               if(range0>0) Comment("Range=",range0/Point,", TP=",(Dn[i]-Target[i])/Point,", SL=",(Stop[i]-Dn[i])/Point);
            }
            continue;
         }            
            else
            if(StartTime!="00:00"
                 && iTime(NULL,0,i)<StrToTime(TimeToStr(iTime(NULL,0,i), TIME_DATE)+" "+StartTime)
                 && iTime(NULL,0,i)>StrToTime(TimeToStr(iTime(NULL,0,i), TIME_DATE)+" "+FinishTime))
              continue; 
         
         flag=false;
         for (j=0;j<Nlin+1;j++) {
            if (B3[i+j]>0.0&&!isChannel) {
               flag=true;
            }
         }
         if (flag) continue;
         
         
         a=0.0;b=0.0;c=0.0;
         sumx=0.0;sumy=0.0;
         sumxy=0.0;sumx2=0.0;
         h=0.0;l=0.0;
         
         //ñ÷èòàåì êàíàë ëèíåéíîé ðåãðåññèè îò i+Nlin äî i 
         for(j=0; j<Nlin; j++) {
            sumy+=Open[i+j];
            sumxy+=Open[i+j]*(i+j);
            sumx+=(i+j);
            sumx2+=(i+j)*(i+j);
         }
         c=sumx2*Nlin-sumx*sumx;
         if(c==0.0) {
            Alert("Error in linear regression!");
            return(-1);
         }
         a=(sumxy*Nlin-sumx*sumy)/c;
         b=(sumy-sumx*a)/Nlin;
         
         //îïðåäåëÿåì ãðàíèöû êàíàëà
         for(j=0;j<Nlin;j++) {
           LR=a*(i+j)+b;
           if (useClose) {
             if(Close[j+i]-LR > h) h = Close[i+j]-LR;
             if(LR - Close[i+j]> l) l = LR - Close[i+j];
           } else {
             if(High[j+i]-LR > h) h = High[i+j]-LR;
             if(LR - Low[i+j]> l) l = LR - Low[i+j];
           }           
         }  
         range = MathMax(l,h);
         if(range0==0) Comment("Range=",range/Point);
         //ïðîâåðêà øèðèíû êàíàëà
         if (range<r0*Point) {
            //åñòü êàíàë, ñîõðàíÿåì
            isChannel=true;
            a0=a;
            b0=b;
            chEnd=iTime(NULL,0,i);
            range0=range;
            R0=(StrToTime(TimeToStr(chEnd, TIME_DATE)+" "+FinishTime)-chEnd)/60/Period();
            for (j=0;j<Nlin;j++) {
               B3[i+j]=a*(i+j)+b+range;
               B4[i+j]=a*(i+j)+b-range;
               B0[i+j]=a*(i+j)+b+range;
               B1[i+j]=a*(i+j)+b-range;
            }
         }         
      }
  }
      Msg=false;
      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 ---