#property copyright "MojoFX - Conversion only"
#property link      "http://groups.yahoo.com/group/MetaTrader_Experts_and_Indicators/"

#property indicator_chart_window
#property indicator_buffers 4
#property indicator_color1 Gold
#property indicator_color2 Green
#property indicator_color3 Red
#property indicator_color4 CLR_NONE
#property indicator_width1 2
#property indicator_width2 2
#property indicator_width3 2
#property indicator_width4 2

extern bool Alert_Coral_Crossing = FALSE;
bool gi_80 = TRUE;
int gi_84 = 60;
double gd_88 = 0.4;
double g_ibuf_96[];
double g_ibuf_100[];
double g_ibuf_104[];
double g_ibuf_108[];
double gda_112[];
double gda_116[];
double gda_120[];
double gda_124[];
double gda_128[];
double gda_132[];
double gd_136;
double gd_144;
double gd_152;
double gd_160;
double gd_168;
double gd_176;
double gd_184;
double gd_192;
double gd_200;
bool gi_208 = FALSE;
bool gi_212 = FALSE;

int init() {
   IndicatorBuffers(4);
   SetIndexBuffer(0, g_ibuf_96);
   SetIndexBuffer(1, g_ibuf_100);
   SetIndexBuffer(2, g_ibuf_104);
   SetIndexBuffer(3, g_ibuf_108);
   SetIndexStyle(0, DRAW_LINE, STYLE_SOLID, 3, Gold);
   SetIndexStyle(1, DRAW_LINE, STYLE_SOLID, 3, Green); // C'95,154,88;' // C'223,172,38;'
   SetIndexStyle(2, DRAW_LINE, STYLE_SOLID, 3, Red);
   IndicatorShortName("THV Coral (" + gi_84 + ") ");
   gd_192 = gd_88 * gd_88;
   gd_200 = 0;
   gd_200 = gd_192 * gd_88;
   gd_136 = -gd_200;
   gd_144 = 3.0 * (gd_192 + gd_200);
   gd_152 = -3.0 * (2.0 * gd_192 + gd_88 + gd_200);
   gd_160 = 3.0 * gd_88 + 1.0 + gd_200 + 3.0 * gd_192;
   gd_168 = gi_84;
   if (gd_168 < 1.0) gd_168 = 1;
   gd_168 = (gd_168 - 1.0) / 2.0 + 1.0;
   gd_176 = 2 / (gd_168 + 1.0);
   gd_184 = 1 - gd_176;
   return (0);
}

int deinit() {
   return (0);
}

int start() {
   double coralValue;
   double prevCoralValue;
   if (gi_80 == FALSE) return (0);
   int li_20 = IndicatorCounted();
   if (li_20 < 0) return (-1);
   if (li_20 > 0) li_20--;
   int li_16 = Bars - li_20 - 1;
   ArrayResize(gda_112, Bars + 1);
   ArrayResize(gda_116, Bars + 1);
   ArrayResize(gda_120, Bars + 1);
   ArrayResize(gda_124, Bars + 1);
   ArrayResize(gda_128, Bars + 1);
   ArrayResize(gda_132, Bars + 1);
   for (int i = li_16; i >= 0; i--) {
      gda_112[Bars - i] = gd_176 * Close[i] + gd_184 * (gda_112[Bars - i - 1]);
      gda_116[Bars - i] = gd_176 * (gda_112[Bars - i]) + gd_184 * (gda_116[Bars - i - 1]);
      gda_120[Bars - i] = gd_176 * (gda_116[Bars - i]) + gd_184 * (gda_120[Bars - i - 1]);
      gda_124[Bars - i] = gd_176 * (gda_120[Bars - i]) + gd_184 * (gda_124[Bars - i - 1]);
      gda_128[Bars - i] = gd_176 * (gda_124[Bars - i]) + gd_184 * (gda_128[Bars - i - 1]);
      gda_132[Bars - i] = gd_176 * (gda_128[Bars - i]) + gd_184 * (gda_132[Bars - i - 1]);
      g_ibuf_108[i] = gd_136 * (gda_132[Bars - i]) + gd_144 * (gda_128[Bars - i]) + gd_152 * (gda_124[Bars - i]) + gd_160 * (gda_120[Bars - i]);
      coralValue = g_ibuf_108[i];
      prevCoralValue = g_ibuf_108[i + 1];
      g_ibuf_96[i] = coralValue;
      g_ibuf_100[i] = coralValue;
      g_ibuf_104[i] = coralValue;
      if (prevCoralValue > coralValue) g_ibuf_100[i] = EMPTY_VALUE;
      else {
         if (prevCoralValue < coralValue) g_ibuf_104[i] = EMPTY_VALUE;
         else g_ibuf_96[i] = EMPTY_VALUE;
      }
      if (Alert_Coral_Crossing) {
         if (!gi_208 && Close[1] > Close[2] && Close[1] > g_ibuf_108[i + 1] && Close[2] < g_ibuf_108[i + 1]) {
            Alert("PA crossing Coral from below !");
            gi_208 = TRUE;
            gi_212 = FALSE;
         }
         if (!gi_212 && Close[1] < Close[2] && Close[1] < g_ibuf_108[i + 1] && Close[2] > g_ibuf_108[i + 1]) {
            Alert("PA crossing Coral from above !");
            gi_208 = FALSE;
            gi_212 = TRUE;
         }
      }
   }
   return (0);
}