
#property copyright "Copyright © 2006, TrendLaboratory"
#property link      "http://finance.groups.yahoo.com/group/TrendLaboratory"

#property indicator_separate_window
#property indicator_minimum 0.0
#property indicator_maximum 100.0
#property indicator_buffers 2
#property indicator_color1 Yellow
#property indicator_color2 DeepSkyBlue
#property indicator_width1 1
#property indicator_level1 30.0
#property indicator_width2 1
#property indicator_level2 70.0

extern int Length = 10;
extern double Kfast = 1.0;
extern double Kslow = 1.0;
extern int MA_Mode = 0;
extern int StepSizeMIN = 0;
extern int StepSizeMAX = 0;
double g_ibuf_108[];
double g_ibuf_112[];
double g_ibuf_116[];
double g_ibuf_120[];
double g_ibuf_124[];
double g_ibuf_128[];
double g_ibuf_132[];
double g_ibuf_136[];
int gia_140[2];
int gia_144[2];
int gia_148[2];
int gia_152[2];
bool gi_156 = TRUE;
double gd_160;
double gd_168 = 0.0;
double gd_176 = 100000.0;

int init() {
   IndicatorBuffers(8);
   SetIndexStyle(0, DRAW_LINE, STYLE_SOLID, 1);
   SetIndexStyle(1, DRAW_LINE, STYLE_SOLID, 1);
   SetIndexBuffer(0, g_ibuf_108);
   SetIndexBuffer(1, g_ibuf_112);
   SetIndexBuffer(2, g_ibuf_116);
   SetIndexBuffer(3, g_ibuf_120);
   SetIndexBuffer(4, g_ibuf_124);
   SetIndexBuffer(5, g_ibuf_128);
   SetIndexBuffer(6, g_ibuf_132);
   SetIndexBuffer(7, g_ibuf_136);
   string ls_0 = "StepSto v2(" + DoubleToStr(Kfast, 2) + "," + DoubleToStr(Kslow, 2) + ")";
   IndicatorShortName(ls_0);
   SetIndexLabel(0, "StepSto fast");
   SetIndexLabel(1, "StepSto slow");
   SetIndexDrawBegin(0, Length);
   SetIndexDrawBegin(1, Length);
   return (0);
}

int start() {
   int li_4;
   int li_8;
   int li_12;
   double ld_28;
   double ld_36;
   double ld_44;
   double ld_52;
   double ld_60;
   double ld_68;
   double ld_76;
   double ld_84;
   double ld_96;
   double ld_104;
   double ld_116;
   int li_24 = IndicatorCounted();
   if (Bars - 1 < Length + 1) return (0);
   if (li_24 < 0) return (-1);
   if (li_24 > 0) li_24--;
   int li_16 = Bars - 1 - Length - 1;
   int li_20 = Bars - li_24 - 1;
   if (li_20 > li_16) {
      for (int li_0 = li_20; li_0 >= li_16; li_0--) {
         g_ibuf_108[Bars - li_0] = 0;
         g_ibuf_112[Bars - li_0] = 0;
      }
      li_20 = li_16;
   }
   datetime l_time_92 = Time[li_20 + 1];
   if (li_20 < li_16) {
      if (l_time_92 == gia_140[1]) {
         li_4 = gia_144[1];
         li_12 = gia_148[1];
         li_8 = gia_152[1];
         gi_156 = FALSE;
      } else {
         if (l_time_92 == gia_140[0]) {
            li_4 = gia_144[0];
            li_12 = gia_148[0];
            li_8 = gia_152[0];
            gia_144[1] = gia_144[0];
            gia_148[1] = gia_148[0];
            gia_152[1] = gia_152[0];
         } else {
            if (l_time_92 > gia_140[1]) Print("ERROR01");
            else Print("ERROR02");
            return (-1);
         }
      }
   }
   for (li_0 = li_20; li_0 >= 0; li_0--) {
      ld_96 = 0;
      ld_104 = 0;
      for (int li_112 = Length - 1; li_112 >= 0; li_112--) {
         if (MA_Mode == 0) ld_116 = 1.0;
         else ld_116 = 1.0 * (Length - li_112) / Length;
         ld_96 += ld_116 * (High[li_0 + li_112] - (Low[li_0 + li_112]));
         ld_104 += ld_116;
      }
      gd_160 = ld_96 / ld_104;
      if (gd_160 > gd_168) gd_168 = gd_160;
      if (gd_160 < gd_176) gd_176 = gd_160;
      if (StepSizeMIN > 0) gd_176 = StepSizeMIN * Point;
      if (StepSizeMAX > 0) gd_168 = StepSizeMAX * Point;
      ld_68 = Kfast * gd_176;
      ld_76 = Kfast * gd_168;
      ld_84 = Kfast / 2.0 * Kslow * (gd_168 + gd_176);
      g_ibuf_120[li_0] = Close[li_0] + 2.0 * ld_68;
      g_ibuf_116[li_0] = Close[li_0] - 2.0 * ld_68;
      g_ibuf_128[li_0] = Close[li_0] + 2.0 * ld_76;
      g_ibuf_124[li_0] = Close[li_0] - 2.0 * ld_76;
      g_ibuf_136[li_0] = Close[li_0] + 2.0 * ld_84;
      g_ibuf_132[li_0] = Close[li_0] - 2.0 * ld_84;
      if (Close[li_0] > g_ibuf_120[li_0 + 1]) li_4 = 1;
      if (Close[li_0] < g_ibuf_116[li_0 + 1]) li_4 = -1;
      if (Close[li_0] > g_ibuf_128[li_0 + 1]) li_8 = 1;
      if (Close[li_0] < g_ibuf_124[li_0 + 1]) li_8 = -1;
      if (Close[li_0] > g_ibuf_136[li_0 + 1]) li_12 = 1;
      if (Close[li_0] < g_ibuf_132[li_0 + 1]) li_12 = -1;
      if (li_4 > 0) {
         if (g_ibuf_116[li_0] < g_ibuf_116[li_0 + 1]) g_ibuf_116[li_0] = g_ibuf_116[li_0 + 1];
         ld_28 = g_ibuf_116[li_0] + ld_68;
      }
      if (li_4 < 0) {
         if (g_ibuf_120[li_0] > g_ibuf_120[li_0 + 1]) g_ibuf_120[li_0] = g_ibuf_120[li_0 + 1];
         ld_28 = g_ibuf_120[li_0] - ld_68;
      }
      if (li_8 > 0) {
         if (g_ibuf_124[li_0] < g_ibuf_124[li_0 + 1]) g_ibuf_124[li_0] = g_ibuf_124[li_0 + 1];
         ld_36 = g_ibuf_124[li_0] + ld_76;
      }
      if (li_8 < 0) {
         if (g_ibuf_128[li_0] > g_ibuf_128[li_0 + 1]) g_ibuf_128[li_0] = g_ibuf_128[li_0 + 1];
         ld_36 = g_ibuf_128[li_0] - ld_76;
      }
      if (li_12 > 0) {
         if (g_ibuf_132[li_0] < g_ibuf_132[li_0 + 1]) g_ibuf_132[li_0] = g_ibuf_132[li_0 + 1];
         ld_44 = g_ibuf_132[li_0] + ld_84;
      }
      if (li_12 < 0) {
         if (g_ibuf_136[li_0] > g_ibuf_136[li_0 + 1]) g_ibuf_136[li_0] = g_ibuf_136[li_0 + 1];
         ld_44 = g_ibuf_136[li_0] - ld_84;
      }
      ld_52 = ld_36 - ld_76;
      ld_60 = ld_36 + ld_76;
      if (ld_60 - ld_52 > 0.0) g_ibuf_108[li_0] = 100.0 * (ld_28 - ld_52) / (ld_60 - ld_52);
      if (ld_60 - ld_52 > 0.0) g_ibuf_112[li_0] = 100.0 * (ld_44 - ld_52) / (ld_60 - ld_52);
      if (li_0 == 2 || (li_0 == 1 && gi_156 == TRUE)) {
         gia_140[li_0 - 1] = Time[li_0];
         gia_144[li_0 - 1] = li_4;
         gia_148[li_0 - 1] = li_12;
         gia_152[li_0 - 1] = li_8;
      }
   }
   return (0);
}