//+------------------------------------------------------------------+
//|                                                      i-SKB-F.mq4 |
//|                                           Ким Игорь В. aka KimIV |
//|                                              http://www.kimiv.ru |
//|                                                                  |
//|  13.06.2006  Скользящие каналы Баришпольца на Фракталах.         |
//+------------------------------------------------------------------+
#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);
}
//+------------------------------------------------------------------+

