//+------------------------------------------------------------------+
//|                                                  MACD Color Bars |
//|                                 Copyleft 2020, Natanael Meneses  |
//+------------------------------------------------------------------+

#property strict

//--- indicator settings
#property indicator_chart_window
#property indicator_buffers 8

extern int   Fast_EMA = 12;
extern int   Slow_EMA2 = 26;
extern int   MACD_SMA3 = 9;
extern color BarUpColor = clrLimeGreen; // MACD Above Zero
extern color BarDnColor = clrRed; // MACD Below Zero
extern int   BodyBarUp = 2; //MACD Above Zero Candle Body Width
extern int   WickBarUp = 2; //MACD Above Zero Candle Wick Width
extern int   BodyBarDn = 2; //MACD Below Zero Candle Body Width
extern int   WickBarDn = 2; //MACD Below Zero Candle Wick Width


//--- indicator buffers
double Buffer1[];
double Buffer2[];
double Buffer3[];
double Buffer4[];
double Buffer5[];
double Buffer6[];
double Buffer7[];
double Buffer8[];

double myPoint; //initialized in OnInit

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   IndicatorBuffers(8);
   SetIndexBuffer(0, Buffer1);
   SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_SOLID,BodyBarUp,BarUpColor); //Candle down body with MACD above zero
   SetIndexBuffer(1, Buffer2);
   SetIndexStyle(1,DRAW_HISTOGRAM,STYLE_SOLID,BodyBarUp,BarUpColor); //Candle up body with MACD above zero
   SetIndexBuffer(2, Buffer3);
   SetIndexStyle(2,DRAW_HISTOGRAM,STYLE_SOLID,WickBarUp,BarUpColor); //Candle Wick with MACD above zero
   SetIndexBuffer(3, Buffer4);
   SetIndexStyle(3,DRAW_HISTOGRAM,STYLE_SOLID,1,BarUpColor); //??
   SetIndexBuffer(4, Buffer5);
   SetIndexStyle(4,DRAW_HISTOGRAM,STYLE_SOLID,BodyBarDn,BarDnColor); //Candle down body with MACD below zero
   SetIndexBuffer(5, Buffer6);
   SetIndexStyle(5,DRAW_HISTOGRAM,STYLE_SOLID,BodyBarDn,BarDnColor); //Candle up body with MACD below zero
   SetIndexBuffer(6, Buffer7);
   SetIndexStyle(6,DRAW_HISTOGRAM,STYLE_SOLID,WickBarDn,BarDnColor); //Candle Wick with MACD below zero
   SetIndexBuffer(7, Buffer8);
   SetIndexStyle(7,DRAW_HISTOGRAM,STYLE_SOLID,1,BarDnColor); //??
//initialize myPoint
   myPoint = Point();
   if(Digits() == 5 || Digits() == 3)
     {
      myPoint *= 10;
     }
   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime& time[],
                const double& open[],
                const double& high[],
                const double& low[],
                const double& close[],
                const long& tick_volume[],
                const long& volume[],
                const int& spread[])
  {
   int limit = rates_total - prev_calculated;
//--- counting from 0 to rates_total
   ArraySetAsSeries(Buffer1, true);
   ArraySetAsSeries(Buffer2, true);
   ArraySetAsSeries(Buffer3, true);
   ArraySetAsSeries(Buffer4, true);
   ArraySetAsSeries(Buffer5, true);
   ArraySetAsSeries(Buffer6, true);
   ArraySetAsSeries(Buffer7, true);
   ArraySetAsSeries(Buffer8, true);
//--- initial zero
   if(prev_calculated < 1)
     {
      ArrayInitialize(Buffer1, 0);
      ArrayInitialize(Buffer2, 0);
      ArrayInitialize(Buffer3, 0);
      ArrayInitialize(Buffer4, 0);
      ArrayInitialize(Buffer5, 0);
      ArrayInitialize(Buffer6, 0);
      ArrayInitialize(Buffer7, 0);
      ArrayInitialize(Buffer8, 0);
     }
   else
      limit++;

//--- main loop
   for(int i = limit-1; i >= 0; i--)
     {
      if(i >= MathMin(30000-1, rates_total-1-50))
         continue; //omit some old rates to prevent "Array out of range" or slow calculation
      //Indicator Buffer 1
      if(iMACD(NULL, PERIOD_CURRENT, Fast_EMA, Slow_EMA2, MACD_SMA3, PRICE_CLOSE, MODE_MAIN, i) > 0 //MACD > fixed value
        )
        {
         Buffer1[i] = Open[i]; //Set indicator value at Candlestick Open
        }
      else
        {
         Buffer1[i] = 0;
        }
      //Indicator Buffer 2
      if(iMACD(NULL, PERIOD_CURRENT, Fast_EMA, Slow_EMA2, MACD_SMA3, PRICE_CLOSE, MODE_MAIN, i) > 0 //MACD > fixed value
        )
        {
         Buffer2[i] = Close[i]; //Set indicator value at Candlestick Close
        }
      else
        {
         Buffer2[i] = 0;
        }
      //Indicator Buffer 3
      if(iMACD(NULL, PERIOD_CURRENT, Fast_EMA, Slow_EMA2, MACD_SMA3, PRICE_CLOSE, MODE_MAIN, i) > 0 //MACD > fixed value
        )
        {
         Buffer3[i] = High[i]; //Set indicator value at Candlestick High
        }
      else
        {
         Buffer3[i] = 0;
        }
      //Indicator Buffer 4
      if(iMACD(NULL, PERIOD_CURRENT, Fast_EMA, Slow_EMA2, MACD_SMA3, PRICE_CLOSE, MODE_MAIN, i) > 0 //MACD > fixed value
        )
        {
         Buffer4[i] = Low[i]; //Set indicator value at Candlestick Low
        }
      else
        {
         Buffer4[i] = 0;
        }
      //Indicator Buffer 5
      if(iMACD(NULL, PERIOD_CURRENT, Fast_EMA, Slow_EMA2, MACD_SMA3, PRICE_CLOSE, MODE_MAIN, i) < 0 //MACD < fixed value
        )
        {
         Buffer5[i] = Open[i]; //Set indicator value at Candlestick Open
        }
      else
        {
         Buffer5[i] = 0;
        }
      //Indicator Buffer 6
      if(iMACD(NULL, PERIOD_CURRENT, Fast_EMA, Slow_EMA2, MACD_SMA3, PRICE_CLOSE, MODE_MAIN, i) < 0 //MACD < fixed value
        )
        {
         Buffer6[i] = Close[i]; //Set indicator value at Candlestick Close
        }
      else
        {
         Buffer6[i] = 0;
        }
      //Indicator Buffer 7
      if(iMACD(NULL, PERIOD_CURRENT, Fast_EMA, Slow_EMA2, MACD_SMA3, PRICE_CLOSE, MODE_MAIN, i) < 0 //MACD < fixed value
        )
        {
         Buffer7[i] = High[i]; //Set indicator value at Candlestick High
        }
      else
        {
         Buffer7[i] = 0;
        }
      //Indicator Buffer 8
      if(iMACD(NULL, PERIOD_CURRENT, Fast_EMA, Slow_EMA2, MACD_SMA3, PRICE_CLOSE, MODE_MAIN, i) < 0 //MACD < fixed value
        )
        {
         Buffer8[i] = Low[i]; //Set indicator value at Candlestick Low
        }
      else
        {
         Buffer8[i] = 0;
        }
     }
   return(rates_total);
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
