Price Data Components
Miscellaneous
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 Formatting Guide
# H1
## H2
### H3
**bold text**
*italicized text*
[title](https://www.example.com)

`code`
```
code block
```
> blockquote
- Item 1
- Item 2
1. First item
2. Second item
---