//+------------------------------------------------------------------+
//|                                                   # MA Histo.mq4 |
//|                                     Copyright 2013, Kolosov D.E. |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, Kolosov D.E."

#property indicator_separate_window
#property indicator_buffers 8
#property indicator_color1  Gray
#property indicator_color2  Salmon
#property indicator_color3  Gray
#property indicator_minimum 0
#property indicator_maximum 0.5
#define indi_name "MA Histo One v2.0"

extern string  str1         = "---Настройки HMA и EMA---";
extern int     hma                      =  10;            // Период индикатора HMA
extern int     ema                      =  10;            // Период индикатора SMA
extern string  str2         = "--Настройки первого TMS--";
extern int     rsiperiod1               =  14;            // Период основного RSI
extern int     rsiprice1                =  PRICE_CLOSE;   // Используемая цена
extern int     rsisignalperiod1         =  2;             // Период быстрой сигнальной МА к RSI
extern int     rsisignalmode1           =  MODE_SMA;      // Метод быстрой сигнальной MA к RSI
extern int     tradesignalperiod1       =  7;             // Период медленной сигнальной МА к RSI
extern int     tradesignalmode1         =  MODE_SMA;      // Метод быстрой сигнальной MA к RSI
extern string  str3         = "--Настройки второго TMS--";
extern int     rsiperiod2               =  70;            // Период основного RSI
extern int     rsiprice2                =  PRICE_CLOSE;   // Используемая цена
extern int     rsisignalperiod2         =  2;             // Период быстрой сигнальной МА к RSI
extern int     rsisignalmode2           =  MODE_SMA;      // Метод быстрой сигнальной MA к RSI
extern int     tradesignalperiod2       =  35;             // Период медленной сигнальной МА к RSI
extern int     tradesignalmode2         =  MODE_SMA;      // Метод быстрой сигнальной MA к RSI

int period_tf1 = 0; // ТФ индикатора

double up[];
double dn[];
double all[];

double gadRSItf1[];
double gadRMAFasttf1[];
double gadRMASlowtf1[];

double gadRSItf2[];
double gadRMAFasttf2[];
double gadRMASlowtf2[];

bool   покупка = true;
bool   продажа = true;

int init()
{
   SetIndexStyle(0,DRAW_ARROW);
   SetIndexBuffer(0,up);
   SetIndexArrow(0,110);
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexBuffer(1,dn);
   SetIndexArrow(1,110);
   SetIndexStyle(2,DRAW_NONE);
   SetIndexBuffer(2,all);
   SetIndexArrow(2,110);
   
   IndicatorShortName(indi_name);

   if (period_tf1 == 0) {
      period_tf1 = Period();
   }
   
   Comment("");
   
   return(0);
}

int deinit()
{
   for (int i = ObjectsTotal()-1; i > -1; i--)
      if (StringFind(ObjectName(i),indi_name) >= 0)  ObjectDelete(ObjectName(i));
   Comment("");
   return(0);
}

int start()
{
   int   counted_bars = IndicatorCounted();
   int   limit, bar, temp, sum;

   if    (counted_bars > 0) counted_bars--;
   limit = Bars - counted_bars;

   for (int i = limit - 2; i >= 0; i--) {
      temp = 0;
      temp = hma(i) + sma(i) + tf1(i) + tf2(i); sum = 4;

      if (temp ==  sum) { all[i] =  1; покупка = true; продажа = false; }
      if (temp == -sum) { all[i] = -1; продажа = true; покупка = false; }
      
      if (покупка) up[i] = 0.2;
      if (продажа) dn[i] = 0.2;
   }

   Print("Последнее обновление показаний индикатора было в: ", TimeHour(TimeCurrent()), ":", TimeMinute(TimeCurrent()));

   return(0);
}

int hma(int i) 
{
   double maOpen, maClose, maLow, maHigh, hmaoldopen, hmaoldclose, temp;
   
   maHigh      =  iCustom(Symbol(),0,"# HMA",hma,MODE_EMA,PRICE_HIGH, 0,1,0,i);
   maLow       =  iCustom(Symbol(),0,"# HMA",hma,MODE_EMA,PRICE_LOW,  0,1,0,i);
   maOpen      =  iCustom(Symbol(),0,"# HMA",hma,MODE_EMA,PRICE_OPEN, 0,1,0,i);
   maClose     =  iCustom(Symbol(),0,"# HMA",hma,MODE_EMA,PRICE_CLOSE,0,1,0,i);
   hmaoldopen  =  iCustom(Symbol(),0,"# HMA",hma,MODE_EMA,PRICE_OPEN, 0,1,0,i+1);
   hmaoldclose =  iCustom(Symbol(),0,"# HMA",hma,MODE_EMA,PRICE_CLOSE,0,1,0,i+1);

   temp = (hmaoldopen + hmaoldclose)/2 - (maOpen + maHigh + maLow + maClose)/4;
      
   if (temp <  0) { return ( 1); }
   if (temp >= 0) { return (-1); }
}

int sma(int i)
{
   double maOpen, maClose, maLow, maHigh, smaoldopen, smaoldclose, temp;
   
   maHigh      =  iMA(Symbol(),0,ema,0,MODE_EMA,PRICE_HIGH, i);
   maLow       =  iMA(Symbol(),0,ema,0,MODE_EMA,PRICE_LOW,  i);
   maOpen      =  iMA(Symbol(),0,ema,0,MODE_EMA,PRICE_OPEN, i);
   maClose     =  iMA(Symbol(),0,ema,0,MODE_EMA,PRICE_CLOSE,i);
   smaoldopen  =  iMA(Symbol(),0,ema,0,MODE_EMA,PRICE_OPEN, i+1);
   smaoldclose =  iMA(Symbol(),0,ema,0,MODE_EMA,PRICE_CLOSE,i+1);
   
   temp = (smaoldopen + smaoldclose)/2 - (maOpen + maHigh + maLow + maClose)/4;
      
   if (temp <  0) { return ( 1); }
   if (temp >= 0) { return (-1); }
}

int tf1(int i)
{
   double gdRMAFast, gdRMASlow;
   
   gdRMAFast = iCustom(Symbol(),period_tf1,"TDI-MTF-zz",period_tf1,rsiperiod1,rsisignalperiod1,rsisignalmode1,
                  tradesignalperiod1,tradesignalmode1,Bars-2,0,i);
   gdRMASlow = iCustom(Symbol(),period_tf1,"TDI-MTF-zz",period_tf1,rsiperiod1,rsisignalperiod1,rsisignalmode1,
                  tradesignalperiod1,tradesignalmode1,Bars-2,1,i);
   
   if (gdRMAFast > gdRMASlow)       return ( 1);
   else if (gdRMAFast < gdRMASlow)  return (-1);
}

int tf2(int i)
{
   double gdRMAFast, gdRMASlow;
   
   gdRMAFast = iCustom(Symbol(),period_tf1,"TDI-MTF-zz",period_tf1,rsiperiod2,rsisignalperiod2,rsisignalmode2,
                  tradesignalperiod2,tradesignalmode2,Bars-2,0,i);
   gdRMASlow = iCustom(Symbol(),period_tf1,"TDI-MTF-zz",period_tf1,rsiperiod2,rsisignalperiod2,rsisignalmode2,
                  tradesignalperiod2,tradesignalmode2,Bars-2,1,i);
     
   if (gdRMAFast > gdRMASlow)       return ( 1);
   else if (gdRMAFast < gdRMASlow)  return (-1);
}