
#property copyright "Bambang Pitono"
#property link      "ifc.bandung@gmail.com"

#property indicator_separate_window
#property indicator_buffers 6
#property indicator_color1 DarkBlue
#property indicator_color2 CLR_NONE
#property indicator_color3 CLR_NONE
#property indicator_color4 CLR_NONE
#property indicator_color5 CLR_NONE
#property indicator_color6 CLR_NONE

#import "ifc.dll"
   double dzBuyP(double& a0[], double a1, int a2, int a3, int a4, double a5);
   double dzSellP(double& a0[], double a1, int a2, int a3, int a4, double a5);
#import

extern string TimeFrame = "current time frame";
extern int HalfLength = 10;
int g_applied_price_88 = PRICE_CLOSE;
bool gi_92 = TRUE;
int gi_96 = 12;
double gd_100 = 0.8;
double gd_108 = 0.15;
double gd_116 = 0.8;
double gd_124 = 0.15;
bool gi_132 = TRUE;
double g_ibuf_136[];
double g_ibuf_140[];
double g_ibuf_144[];
double g_ibuf_148[];
double g_ibuf_152[];
double g_ibuf_156[];
string gs_160;
bool g_bool_168;
bool g_bool_172;
int g_timeframe_176;
string gsa_180[] = {"M1", "M5", "M15", "M30", "H1", "H4", "D1", "W1", "MN"};
int gia_184[] = {1, 5, 15, 30, 60, 240, 1440, 10080, 43200};

int init() {
   HalfLength = MathMax(HalfLength, 1);
   SetIndexBuffer(0, g_ibuf_136);
   SetIndexDrawBegin(0, HalfLength);
   SetIndexBuffer(1, g_ibuf_140);
   SetIndexDrawBegin(1, HalfLength);
   SetIndexBuffer(2, g_ibuf_144);
   SetIndexDrawBegin(2, HalfLength);
   SetIndexBuffer(3, g_ibuf_152);
   SetIndexDrawBegin(3, HalfLength);
   SetIndexBuffer(4, g_ibuf_148);
   SetIndexDrawBegin(4, HalfLength);
   SetIndexBuffer(5, g_ibuf_156);
   SetIndexDrawBegin(5, HalfLength);
   gs_160 = WindowExpertName();
   g_bool_168 = TimeFrame == "calculateTma";
   if (g_bool_168) return (0);
   g_bool_172 = TimeFrame == "returnBars";
   if (g_bool_172) return (0);
   g_timeframe_176 = f0_1(TimeFrame);
   return (0);
}

int deinit() {
   return (0);
}

int start() {
   int li_16;
   double ld_28;
   double ld_36;
   int shift_44;
   int datetime_48;
   double ld_56;
   if (TimeCurrent() >= D'20.12.2012 01:00') return (0);
   double ld_0 = 100.0 * Point;
   int li_8 = IndicatorCounted();
   if (li_8 < 0) return (-1);
   if (li_8 > 0) li_8--;
   int li_24 = MathMin(Bars - 1, Bars - li_8 + HalfLength);
   if (g_bool_172) {
      g_ibuf_136[0] = li_24 + 1;
      return (0);
   }
   if (g_bool_168 || g_timeframe_176 == Period()) {
      for (int li_12 = li_24; li_12 >= 0; li_12--) {
         ld_28 = (HalfLength + 1) * iMA(NULL, 0, 1, 0, MODE_SMA, g_applied_price_88, li_12);
         ld_36 = HalfLength + 1;
         li_16 = 1;
         for (int li_20 = HalfLength; li_16 <= HalfLength; li_20--) {
            ld_28 += li_20 * iMA(NULL, 0, 1, 0, MODE_SMA, g_applied_price_88, li_12 + li_16);
            ld_36 += li_20;
            if (li_16 <= li_12) {
               ld_28 += li_20 * iMA(NULL, 0, 1, 0, MODE_SMA, g_applied_price_88, li_12 - li_16);
               ld_36 += li_20;
            }
            li_16++;
         }
         g_ibuf_136[li_12] = ld_28 / ld_36;
         if (gd_100 > 0.0) g_ibuf_140[li_12] = dzBuyP(g_ibuf_136, gd_100, gi_96, Bars, li_12, ld_0);
         if (gd_108 > 0.0) g_ibuf_144[li_12] = dzBuyP(g_ibuf_136, gd_108, gi_96, Bars, li_12, ld_0);
         if (gd_116 > 0.0) g_ibuf_148[li_12] = dzSellP(g_ibuf_136, gd_116, gi_96, Bars, li_12, ld_0);
         if (gd_124 > 0.0) g_ibuf_152[li_12] = dzSellP(g_ibuf_136, gd_124, gi_96, Bars, li_12, ld_0);
         if (gi_92) g_ibuf_156[li_12] = dzSellP(g_ibuf_136, 0.5, gi_96, Bars, li_12, ld_0);
      }
      return (0);
   }
   li_24 = MathMax(li_24, MathMin(Bars - 1, iCustom(NULL, g_timeframe_176, gs_160, "returnBars", 0, 0) * g_timeframe_176 / Period()));
   for (li_12 = li_24; li_12 >= 0; li_12--) {
      shift_44 = iBarShift(NULL, g_timeframe_176, Time[li_12]);
      g_ibuf_136[li_12] = iCustom(NULL, g_timeframe_176, gs_160, "calculateTma", HalfLength, g_applied_price_88, gi_92, gi_96, gd_100, gd_108, gd_116, gd_124, 0, shift_44);
      if (gd_100 > 0.0) g_ibuf_140[li_12] = iCustom(NULL, g_timeframe_176, gs_160, "calculateTma", HalfLength, g_applied_price_88, gi_92, gi_96, gd_100, gd_108, gd_116, gd_124, 1, shift_44);
      if (gd_108 > 0.0) g_ibuf_144[li_12] = iCustom(NULL, g_timeframe_176, gs_160, "calculateTma", HalfLength, g_applied_price_88, gi_92, gi_96, gd_100, gd_108, gd_116, gd_124, 2, shift_44);
      if (gd_124 > 0.0) g_ibuf_152[li_12] = iCustom(NULL, g_timeframe_176, gs_160, "calculateTma", HalfLength, g_applied_price_88, gi_92, gi_96, gd_100, gd_108, gd_116, gd_124, 3, shift_44);
      if (gd_116 > 0.0) g_ibuf_148[li_12] = iCustom(NULL, g_timeframe_176, gs_160, "calculateTma", HalfLength, g_applied_price_88, gi_92, gi_96, gd_100, gd_108, gd_116, gd_124, 4, shift_44);
      if (gi_92) g_ibuf_156[li_12] = iCustom(NULL, g_timeframe_176, gs_160, "calculateTma", HalfLength, g_applied_price_88, gi_92, gi_96, gd_100, gd_108, gd_116, gd_124, 5, shift_44);
      if (g_timeframe_176 <= Period() || shift_44 == iBarShift(NULL, g_timeframe_176, Time[li_12 - 1])) continue;
      if (gi_132) {
         datetime_48 = iTime(NULL, g_timeframe_176, shift_44);
         for (int li_52 = 1; li_12 + li_52 < Bars && Time[li_12 + li_52] >= datetime_48; li_52++) {
         }
         ld_56 = 1.0 / li_52;
         for (li_20 = 1; li_20 < li_52; li_20++) {
            g_ibuf_136[li_12 + li_20] = li_20 * ld_56 * (g_ibuf_136[li_12 + li_52]) + (1.0 - li_20 * ld_56) * g_ibuf_136[li_12];
            g_ibuf_140[li_12 + li_20] = li_20 * ld_56 * (g_ibuf_140[li_12 + li_52]) + (1.0 - li_20 * ld_56) * g_ibuf_140[li_12];
            g_ibuf_144[li_12 + li_20] = li_20 * ld_56 * (g_ibuf_144[li_12 + li_52]) + (1.0 - li_20 * ld_56) * g_ibuf_144[li_12];
            g_ibuf_148[li_12 + li_20] = li_20 * ld_56 * (g_ibuf_148[li_12 + li_52]) + (1.0 - li_20 * ld_56) * g_ibuf_148[li_12];
            g_ibuf_152[li_12 + li_20] = li_20 * ld_56 * (g_ibuf_152[li_12 + li_52]) + (1.0 - li_20 * ld_56) * g_ibuf_152[li_12];
            g_ibuf_156[li_12 + li_20] = li_20 * ld_56 * (g_ibuf_156[li_12 + li_52]) + (1.0 - li_20 * ld_56) * g_ibuf_156[li_12];
         }
      }
   }
   RefreshRates();
   return (0);
}

int f0_1(string as_0) {
   as_0 = f0_0(as_0);
   for (int li_8 = ArraySize(gia_184) - 1; li_8 >= 0; li_8--)
      if (as_0 == gsa_180[li_8] || as_0 == "" + gia_184[li_8]) return (MathMax(gia_184[li_8], Period()));
   return (Period());
}

string f0_0(string as_0) {
   int li_20;
   string ls_ret_8 = as_0;
   for (int li_16 = StringLen(as_0) - 1; li_16 >= 0; li_16--) {
      li_20 = StringGetChar(ls_ret_8, li_16);
      if ((li_20 > '`' && li_20 < '{') || (li_20 > 'ß' && li_20 < 256)) ls_ret_8 = StringSetChar(ls_ret_8, li_16, li_20 - 32);
      else
         if (li_20 > -33 && li_20 < 0) ls_ret_8 = StringSetChar(ls_ret_8, li_16, li_20 + 224);
   }
   return (ls_ret_8);
}