Navigation:Home > Content >

i-SKB-ZZ.mq4

Time: 2013-04-28 | Download file:i-SKB-ZZ.mq4

//+------------------------------------------------------------------+
//|                                                     i-SKB-ZZ.mq4 |
//|                                           Ким Игорь В. aka KimIV |
//|                                              http://www.kimiv.ru |
//|                                                                  |
//|  11.06.2006  Скользящие каналы Баришпольца на Зиг-Заге.          |
//|  15.06.2006  Средняя линия.                                      |
//+------------------------------------------------------------------+
#property copyright "Ким Игорь В. aka KimIV"
#property link      "http://www.kimiv.ru"

#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 SkyBlue
#property indicator_color2 Salmon
#property indicator_color3 Lime

//------- Внешние параметры индикатора -------------------------------
extern int  ExtDepth     = 12;
extern int  ExtDeviation = 5;
extern int  ExtBackstep  = 3;
extern int  ShiftBars    = 2;
extern int  OffSet       = -3;
extern bool ShowMiddle   = False;
extern bool ShowRay      = True;

//------- Глобальные переменные индикатора ---------------------------
double dBuf0[];
double dBuf1[];
double dBuf2[];


//+------------------------------------------------------------------+
//| 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);
    if (ShowMiddle) ObjectCreate("ML", 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);
  SetIndexBuffer(2, dBuf2);
  SetIndexLabel (2, "ML");
  SetIndexStyle (2, DRAW_LINE, STYLE_DOT, 1);
}

//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
void deinit() {
  ObjectDelete("HL");
  ObjectDelete("LL");
  ObjectDelete("ML");
}

//+------------------------------------------------------------------+
//| 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=ShiftBars;// номера баров
  string sL1, sL2;
  color  clU, clD;

  // Берём три экстремума Зиг-Зага
  while (y3==0) {
    zz=iCustom(NULL, 0, "ZigZag", ExtDepth, ExtDeviation, ExtBackstep, 0, 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;

  for (sh=x3; sh>=0; sh--) {
    dBuf0[sh]=EquationDirect(x3, u2, 0, u1, sh);
    dBuf1[sh]=EquationDirect(x3, d2, 0, d1, sh);
    if (ShowMiddle) dBuf2[sh]=(dBuf0[sh]+dBuf1[sh])/2;
  }

  if (ShowRay) {
    DrawRay("HL", x3, u2, u1, indicator_color1);
    DrawRay("LL", x3, d2, d1, indicator_color2);
    if (ShowMiddle) DrawRay("ML", x3, (u2+d2)/2, (u1+d1)/2, indicator_color3);
  }
}

//+------------------------------------------------------------------+
//| Прорисовка лучей.                                                |
//| Параметры:                                                       |
//|   no - наименование объекта,                                     |
//|   nb - номер первого бара,                                       |
//|   p1 - цена первой точки,                                        |
//|   p2 - цена второй точки                                         |
//+------------------------------------------------------------------+
void DrawRay(string no, int nb, double p1, double p2, color clRay) {
  if (ObjectFind(no)<0) ObjectCreate(no, OBJ_TREND, 0, 0,0,0,0);
  ObjectSet(no, OBJPROP_TIME1 , Time[nb]);
  ObjectSet(no, OBJPROP_TIME2 , Time[0]);
  ObjectSet(no, OBJPROP_PRICE1, p1);
  ObjectSet(no, OBJPROP_PRICE2, p2);
  ObjectSet(no, OBJPROP_BACK  , True);
  ObjectSet(no, OBJPROP_RAY   , True);
  ObjectSet(no, OBJPROP_STYLE , STYLE_DOT);
  ObjectSet(no, OBJPROP_WIDTH , 1);
  ObjectSet(no, OBJPROP_COLOR , clRay);
}

//+------------------------------------------------------------------+
//| Уравнение прямой.                                                |
//| Вычисляет значение 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);
}
//+------------------------------------------------------------------+

Recommend