//+------------------------------------------------------------------+
//|                                                       _MACD2.mq4 |
//|                                  Copyright © 2012, ProIndicators |
//|                                    http://www.proindicators.com/ |
//+------------------------------------------------------------------+

#property copyright "Copyright © 2012, ProIndicators"
#property link      "http://www.proindicators.com/"

#property indicator_separate_window
#property indicator_buffers 6
#property indicator_color1 Yellow
#property indicator_color2 Green
#property indicator_color3 Red
#property indicator_color4 Lime
#property indicator_color5 DeepSkyBlue
#property indicator_color6 Teal
extern string Price_     = "0C, 1O, 2H, 3L, 4Md:(Md(HL/2)4), 5Tp:(Tp(HLC/3)5), 6WghC:(Wgh(HLCC/4)6)";
extern int Price = 6;
extern int LengthCom = 9;
extern string MAmode_     = "0 sma; 1 ema; 2 smma; 3 lwma";
extern int MAmode = 3;
extern color UpColor = Green;
extern color DownColor = Red;
extern color chncolor = Yellow;
extern color HighChanColor = Lime;
extern color LowChanColor = DeepSkyBlue;
extern color zero2 = Teal;
extern color ZeroLineUpColor = Green;
extern color ZeroLineDownColor = Red;
extern bool Plot_Chart = FALSE;
extern double StDv = 1.0;
int gi_unused_124 = 0;
int gi_128 = 0;
double gd_unused_132 = 0.0;
double gd_unused_140 = 0.0;
double gd_unused_148 = 0.0;
double gd_unused_156 = 0.0;
string gs_unused_164 = " ";
double gd_unused_172 = 0.0;
double gd_unused_180 = 0.0;
bool gi_188 = FALSE;
bool gi_192 = FALSE;
double g_ibuf_208[];
double g_ibuf_212[];
double g_ibuf_216[];
double g_ibuf_220[];
double g_ibuf_224[];
double g_ibuf_228[];
double g_ibuf_232[];
double g_ibuf_236[];

int init() {
   IndicatorBuffers(8);
   SetIndexBuffer(0, g_ibuf_208);
   SetIndexBuffer(1, g_ibuf_212);
   SetIndexBuffer(2, g_ibuf_216);
   SetIndexBuffer(3, g_ibuf_220);
   SetIndexBuffer(4, g_ibuf_224);
   SetIndexBuffer(5, g_ibuf_228);
   SetIndexBuffer(6, g_ibuf_232);
   SetIndexBuffer(7, g_ibuf_236);
   SetIndexStyle(0, DRAW_ARROW, 0, 1, chncolor);
   SetIndexArrow(0, 108);
   SetIndexStyle(1, DRAW_HISTOGRAM, 0, 2, UpColor);
   SetIndexStyle(2, DRAW_HISTOGRAM, 0, 2, DownColor);
   SetIndexStyle(3, DRAW_LINE, EMPTY, EMPTY, HighChanColor);
   SetIndexStyle(4, DRAW_LINE, EMPTY, EMPTY, LowChanColor);
   SetIndexStyle(5, DRAW_LINE, EMPTY, EMPTY, zero2);
   SetIndexLabel(0, "MACD");
   SetIndexLabel(3, "UB");
   SetIndexLabel(4, "LB");
   SetIndexLabel(5, "zero");
   IndicatorShortName("MACD2_v1  ("+Price+", "+LengthCom+", "+MAmode+")");   
   return (0);
}

int start() {
   int li_8 = IndicatorCounted();
   if (li_8 > 0) li_8--;
   int li_4 = Bars - li_8;
   for (int li_0 = 0; li_0 < li_4; li_0++) g_ibuf_228[li_0] = 0;
   for (li_0 = 0; li_0 < li_4; li_0++) g_ibuf_232[li_0] = 100.0 * (iMA(NULL, 0, 1.2 * LengthCom, 0, MODE_EMA, Price, li_0) - iMA(NULL, 0, 2.5 * LengthCom, 0, MODE_EMA, Price, li_0));
   int period_12 = LengthCom;
   for (li_0 = 0; li_0 < li_4; li_0++) g_ibuf_236[li_0] = iMA(NULL, 0, period_12, 0, MODE_EMA, Price, li_0);
   for (li_0 = 0; li_0 < li_4; li_0++) g_ibuf_212[li_0] = iMAOnArray(g_ibuf_236, 0, period_12, 0, MODE_EMA, li_0);
   for (li_0 = 0; li_0 < li_4; li_0++) {
      g_ibuf_236[li_0] = (iMAOnArray(g_ibuf_212, 0, period_12, 0, MODE_EMA, li_0) - iMAOnArray(g_ibuf_212, 0, period_12, 0, MODE_EMA, li_0 + 1)) / iMAOnArray(g_ibuf_212,
         0, period_12, 0, MODE_EMA, li_0);
   }
   for (li_0 = 0; li_0 < li_4; li_0++) g_ibuf_232[li_0] += g_ibuf_236[li_0] + gi_128 / 2.0;
   for (li_0 = 0; li_0 < li_4; li_0++) {
      g_ibuf_220[li_0] = iMAOnArray(g_ibuf_232, 0, period_12, 0, MODE_EMA, li_0) + StDv * iStdDevOnArray(g_ibuf_232, 0, period_12, 0, MAmode, li_0);
      g_ibuf_224[li_0] = iMAOnArray(g_ibuf_232, 0, period_12, 0, MODE_EMA, li_0) - StDv * iStdDevOnArray(g_ibuf_232, 0, period_12, 0, MAmode, li_0);
   }
   for (li_0 = 0; li_0 < li_4; li_0++) {
      if (g_ibuf_232[li_0] > g_ibuf_232[li_0 + 1]) {
         g_ibuf_208[li_0] = EMPTY_VALUE;
         g_ibuf_212[li_0] = g_ibuf_232[li_0];
         g_ibuf_216[li_0] = EMPTY_VALUE;
      } else {
         g_ibuf_208[li_0] = EMPTY_VALUE;
         g_ibuf_212[li_0] = EMPTY_VALUE;
         g_ibuf_216[li_0] = g_ibuf_232[li_0];
      }
      if (gi_188 == FALSE) {
         if (g_ibuf_232[li_0] > g_ibuf_220[li_0]) {
            gi_188 = TRUE;
            gi_192 = FALSE;
            g_ibuf_208[li_0] = g_ibuf_232[li_0];
            g_ibuf_212[li_0] = EMPTY_VALUE;
            g_ibuf_216[li_0] = EMPTY_VALUE;
         }
      } else {
         if (gi_192 == FALSE) {
            if (g_ibuf_232[li_0] < g_ibuf_224[li_0]) {
               gi_188 = FALSE;
               gi_192 = TRUE;
               g_ibuf_208[li_0] = g_ibuf_232[li_0];
               g_ibuf_212[li_0] = EMPTY_VALUE;
               g_ibuf_216[li_0] = EMPTY_VALUE;
            }
         }
      }
   }
   return (0);
}