
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net/"

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Red

extern int MA_Period = 13;
extern int MA_Shift = 0;
extern int MA_Method = 0;
double g_ibuf_88[];
int gi_92 = 0;

int init() {
   string ls_4;
   SetIndexStyle(0, DRAW_LINE);
   SetIndexShift(0, MA_Shift);
   IndicatorDigits(MarketInfo(Symbol(), MODE_DIGITS));
   if (MA_Period < 2) MA_Period = 13;
   int li_0 = MA_Period - 1;
   switch (MA_Method) {
   case 1:
      ls_4 = "EMA(";
      li_0 = 0;
      break;
   case 2:
      ls_4 = "SMMA(";
      break;
   case 3:
      ls_4 = "LWMA(";
      break;
   default:
      MA_Method = FALSE;
      ls_4 = "SMA(";
   }
   IndicatorShortName(ls_4 + MA_Period + ")");
   SetIndexDrawBegin(0, li_0);
   SetIndexBuffer(0, g_ibuf_88);
   return (0);
}

int start() {
   if (Bars <= MA_Period) return (0);
   gi_92 = IndicatorCounted();
   if (gi_92 < 0) return (-1);
   if (gi_92 > 0) gi_92--;
   switch (MA_Method) {
   case 0:
      sma();
      break;
   case 1:
      ema();
      break;
   case 2:
      smma();
      break;
   case 3:
      lwma();
   }
   return (0);
}

void sma() {
   double ld_0 = 0;
   int li_12 = Bars - gi_92 - 1;
   if (li_12 < MA_Period) li_12 = MA_Period;
   int li_8 = 1;
   while (li_8 < MA_Period) {
      ld_0 += Close[li_12];
      li_8++;
      li_12--;
   }
   while (li_12 >= 0) {
      ld_0 += Close[li_12];
      g_ibuf_88[li_12] = ld_0 / MA_Period;
      ld_0 -= Close[li_12 + MA_Period - 1];
      li_12--;
   }
   if (gi_92 < 1) for (li_8 = 1; li_8 < MA_Period; li_8++) g_ibuf_88[Bars - li_8] = 0;
}

void ema() {
   double ld_0 = 2.0 / (MA_Period + 1);
   int li_8 = Bars - 2;
   if (gi_92 > 2) li_8 = Bars - gi_92 - 1;
   while (li_8 >= 0) {
      if (li_8 == Bars - 2) g_ibuf_88[li_8 + 1] = Close[li_8 + 1];
      g_ibuf_88[li_8] = Close[li_8] * ld_0 + (g_ibuf_88[li_8 + 1]) * (1 - ld_0);
      li_8--;
   }
}

void smma() {
   int l_count_8;
   double ld_0 = 0;
   int li_16 = Bars - gi_92 + 1;
   li_16 = Bars - MA_Period;
   if (li_16 > Bars - gi_92) li_16 = Bars - gi_92;
   while (li_16 >= 0) {
      if (li_16 == Bars - MA_Period) {
         l_count_8 = 0;
         for (int li_12 = li_16; l_count_8 < MA_Period; li_12++) {
            ld_0 += Close[li_12];
            g_ibuf_88[li_12] = 0;
            l_count_8++;
         }
      } else ld_0 = (g_ibuf_88[li_16 + 1]) * (MA_Period - 1) + Close[li_16];
      g_ibuf_88[li_16] = ld_0 / MA_Period;
      li_16--;
   }
}

void lwma() {
   double l_close_16;
   double ld_0 = 0.0;
   double ld_8 = 0.0;
   int li_28 = 0;
   int li_32 = Bars - gi_92 - 1;
   if (li_32 < MA_Period) li_32 = MA_Period;
   int li_24 = 1;
   while (li_24 <= MA_Period) {
      l_close_16 = Close[li_32];
      ld_0 += l_close_16 * li_24;
      ld_8 += l_close_16;
      li_28 += li_24;
      li_24++;
      li_32--;
   }
   li_32++;
   li_24 = li_32 + MA_Period;
   while (li_32 >= 0) {
      g_ibuf_88[li_32] = ld_0 / li_28;
      if (li_32 == 0) break;
      li_32--;
      li_24--;
      l_close_16 = Close[li_32];
      ld_0 = ld_0 - ld_8 + l_close_16 * MA_Period;
      ld_8 -= Close[li_24];
      ld_8 += l_close_16;
   }
   if (gi_92 < 1) for (li_24 = 1; li_24 < MA_Period; li_24++) g_ibuf_88[Bars - li_24] = 0;
}