//+------------------------------------------------------------------+
//|                                                 i-3CCI-Lines.mq4 |
//|                                               johnfantom & KimIV |
//|                                              http://www.kimiv.ru |
//|                                                                  |
//|  30.01.2006  CCI с 3-х ТФ в одном флаконе.                       |
//+------------------------------------------------------------------+
#property copyright "johnfantom & KimIV"
#property link      "http://www.kimiv.ru"

#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 Aqua
#property indicator_color2 DodgerBlue
#property indicator_color3 Blue
#property indicator_maximum 2.1
#property indicator_level1  0
#property indicator_minimum -1.7

//------- Внешние параметры индикатора -------------------------------
extern int TF_1         = 15;     // Количество минут первого ТФ
extern int CCI_Period_1 = 14;     // Период CCI для первого ТФ
extern int Level_1      = 100;    // Уровень CCI для первого ТФ
extern int TF_2         = 60;     // Количество минут второго ТФ
extern int CCI_Period_2 = 14;     // Период CCI для второго ТФ
extern int Level_2      = 100;    // Уровень CCI для второго ТФ
extern int TF_3         = 240;    // Количество минут третьего ТФ
extern int CCI_Period_3 = 14;     // Период CCI для третьего ТФ
extern int Level_3      = 100;    // Уровень CCI для третьего ТФ
extern int NumberOfBars = 1000;   // Количество баров обсчёта (0-все)

//------- Буферы индикатора ------------------------------------------
double buf0[], buf1[], buf2[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void init() {
  IndicatorDigits(1);

  SetIndexBuffer(0, buf0);
  SetIndexLabel (0, "CCI "+GetNameTF(TF_1));
  SetIndexStyle (0, DRAW_LINE, STYLE_SOLID, 2);
  SetIndexEmptyValue(0, 0);

  SetIndexBuffer(1, buf1);
  SetIndexLabel (1, "CCI "+GetNameTF(TF_2));
  SetIndexStyle (1, DRAW_LINE, STYLE_SOLID, 2);
  SetIndexEmptyValue(1, 0);

  SetIndexBuffer(2, buf2);
  SetIndexLabel (2, "CCI "+GetNameTF(TF_3));
  SetIndexStyle (2, DRAW_LINE, STYLE_SOLID, 2);
  SetIndexEmptyValue(2, 0);
}

//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
void deinit() {
  Comment("");
}

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
void start() {
  double cci1, cci2, cci3;
  int    nb1, nb2, nb3;
  int    LoopBegin, sh;

 	if (NumberOfBars==0) LoopBegin=Bars-1;
  else LoopBegin=NumberOfBars-1;
  LoopBegin=MathMin(Bars-1, LoopBegin);

  for (sh=LoopBegin; sh>=0; sh--) {
    nb1=iBarShift(NULL, TF_1, Time[sh], False);
    nb2=iBarShift(NULL, TF_2, Time[sh], False);
    nb3=iBarShift(NULL, TF_3, Time[sh], False);

    cci1=iCCI(NULL, TF_1, CCI_Period_1, PRICE_CLOSE, nb1);
    cci2=iCCI(NULL, TF_2, CCI_Period_2, PRICE_CLOSE, nb2);
    cci3=iCCI(NULL, TF_3, CCI_Period_3, PRICE_CLOSE, nb3);

    if (cci1>Level_1) buf0[sh]=0.5;
    if (cci1<-Level_1) buf0[sh]=-0.5;

    if (cci2>Level_2) buf1[sh]=1.0;
    if (cci2<-Level_2) buf1[sh]=-1.0;

    if (cci3>Level_3) buf2[sh]=1.5;
    if (cci3<-Level_3) buf2[sh]=-1.5;
  }
}

//+------------------------------------------------------------------+
//| Возвращает наименование таймфрейма                               |
//+------------------------------------------------------------------+
string GetNameTF(int TimeFrame) {
	switch (TimeFrame) {
		case PERIOD_MN1: return("Monthly");
		case PERIOD_W1:  return("Weekly");
		case PERIOD_D1:  return("Daily");
		case PERIOD_H4:  return("H4");
		case PERIOD_H1:  return("H1");
		case PERIOD_M30: return("M30");
		case PERIOD_M15: return("M15");
		case PERIOD_M5:  return("M5");
		case PERIOD_M1:  return("M1");
		default:		     return("UnknownPeriod");
	}
}
//+------------------------------------------------------------------+

