//+------------------------------------------------------------------+ //| i-SKB-F.mq4 | //| Ким Игорь В. aka KimIV | //| http://www.kimiv.ru | //| | //+------------------------------------------------------------------+ #property copyright "Ким Игорь В. aka KimIV" #property link "http://www.kimiv.ru" #property indicator_chart_window #property indicator_buffers 2 #property indicator_color1 SkyBlue #property indicator_color2 Salmon //------- Поключение внешних модулей --------------------------------- //#include <.mqh> //------- Внешние параметры индикатора ------------------------------- extern int FixedTF = 60; extern int OffSet = -3; extern bool ShowRay = True; //------- Глобальные переменные индикатора --------------------------- double dBuf0[]; double dBuf1[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ void init() { if(ShowRay) { ObjectCreate("HL",OBJ_TREND,0,0,0,0,0); ObjectCreate("LL",OBJ_TREND,0,0,0,0,0); } SetIndexBuffer(0,dBuf0); SetIndexLabel(0,"HL"); SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,2); SetIndexBuffer(1,dBuf1); SetIndexLabel(1,"LL"); SetIndexStyle(1,DRAW_LINE,STYLE_SOLID,2); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ void deinit() { ObjectDelete("HL"); ObjectDelete("LL"); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ void start() { double y3=0, y2=0, y1=0, zz; // фракталы double y4, u2, u1, d2, d1; // ценовые уровни линий int x3, x2, x1, sh=2; // номера баров string sL1,sL2; color clU,clD; // Берём три Фрактала while(y3==0) { zz=iFractals(NULL,FixedTF,MODE_UPPER,sh); if(zz==0) zz=iFractals(NULL,FixedTF,MODE_LOWER,sh); if(zz!=0) { if(y1==0) { x1=sh; y1=zz; } else if(y2==0) { x2=sh; y2=zz; } else if(y3==0) { x3=sh; y3=zz; } } sh++; } y4=EquationDirect(x3,y3,x1,y1,x2); if(y2>y1) { u2=y3+y2-y4; u1=EquationDirect(x3, u2, x2, y2, 0); d2=y3; d1=EquationDirect(x3, y3, x1, y1, 0); } else { u2=y3; u1=EquationDirect(x3, y3, x1, y1, 0); d2=y3+y2-y4; d1=EquationDirect(x3, d2, x2, y2, 0); } u2+=OffSet*Point; u1+=OffSet*Point; d2-=OffSet*Point; d1-=OffSet*Point; x2=iBarShift(NULL,0,iTime(NULL,FixedTF,x3)); for(sh=x2; sh>=0; sh--) { dBuf0[sh]=EquationDirect(x2, u2, 0, u1, sh); dBuf1[sh]=EquationDirect(x2, d2, 0, d1, sh); } if(ShowRay) { ObjectSet("HL",OBJPROP_TIME1,iTime(NULL,FixedTF,x3)); ObjectSet("HL",OBJPROP_TIME2,Time[0]); ObjectSet("HL",OBJPROP_PRICE1,u2); ObjectSet("HL",OBJPROP_PRICE2,u1); ObjectSet("HL",OBJPROP_BACK,True); ObjectSet("HL",OBJPROP_RAY,True); ObjectSet("HL",OBJPROP_STYLE,STYLE_DOT); ObjectSet("HL",OBJPROP_WIDTH,1); ObjectSet("HL",OBJPROP_COLOR,indicator_color1); ObjectSet("LL",OBJPROP_TIME1,iTime(NULL,FixedTF,x3)); ObjectSet("LL",OBJPROP_TIME2,Time[0]); ObjectSet("LL",OBJPROP_PRICE1,d2); ObjectSet("LL",OBJPROP_PRICE2,d1); ObjectSet("LL",OBJPROP_BACK,True); ObjectSet("LL",OBJPROP_RAY,True); ObjectSet("LL",OBJPROP_STYLE,STYLE_DOT); ObjectSet("LL",OBJPROP_WIDTH,1); ObjectSet("LL",OBJPROP_COLOR,indicator_color2); } } //+------------------------------------------------------------------+ //| Уравнение прямой. | //| Вычисляет значение Y для X в точке пересечения с прямой. | //| Параметры: | //| x1,y1 - координаты первой точки, | //| x2,y2 - координаты второй точки, | //| x - значение, для которого вычислить Y | //+------------------------------------------------------------------+ double EquationDirect(double x1,double y1,double x2,double y2,double x) { if((x2-x1)*(x-x1)==0) return(y1); return((y2-y1)/(x2-x1)*(x-x1)+y1); } //+------------------------------------------------------------------+