//--------------------------------------------------------------------
#property link      "http://usd.ucoz.ru/forum"
//--------------------------------------------------------------------
#property indicator_separate_window
#property indicator_buffers 5
#property indicator_color1 SteelBlue
#property indicator_color2 Orange
#property indicator_color3 Black
#property indicator_color4 Blue
#property indicator_color5 Red

double buffer1[];
double buffer2[];
double buffer3[];
double buffer4[];
double buffer5[];
extern int period = 15;
extern int price = 0;
extern bool Mode_Fast = FALSE;
extern bool SignalsInGraf = TRUE;
extern bool SignalsComment = TRUE;
extern int MA1period = 9;
extern int MA2period = 45;
extern string TypeHelp = "SMA- 0, EMA - 1, SMMA - 2, LWMA- 3";
extern string TypeHelp2 = "TypeMA1=0, TypeMA2=3";
extern int TypeMA1 = 0;
extern int TypeMA2 = 3;
extern color Hist1 = clrSteelBlue;
extern color Hist2 = clrOrange;
extern color Line = clrBlack;
extern color MA1 = clrBlue;
extern color MA2 = clrRed;

double gd_144 = 0.0;
double gd_152 = 0.0;
double gd_168 = 0.0;
double gd_176 = 0.0;
double gd_184 = 0.0;
int gi_unused_196 = 0;

int init() {
   SetIndexStyle(0, DRAW_HISTOGRAM, STYLE_SOLID, 1, Hist1);
   SetIndexBuffer(0, buffer1);
   SetIndexStyle(1, DRAW_HISTOGRAM, STYLE_SOLID, 1, Orange);
   SetIndexBuffer(1, buffer2);
   SetIndexStyle(2, DRAW_LINE,EMPTY,1,Line);
   SetIndexLabel(2, "line");
   SetIndexBuffer(2, buffer3);
   SetIndexStyle(3, DRAW_LINE,EMPTY,1,MA1);
   SetIndexLabel(3, "MA1 " + MA1period);
   SetIndexStyle(4, DRAW_LINE,EMPTY,1,MA2);
   SetIndexLabel(4, "MA2 " + MA2period);
   SetIndexBuffer(3, buffer4);
   SetIndexBuffer(4, buffer5);
   return (0);
}

int deinit() {
   for (int l_count_0 = 0; l_count_0 < Bars; l_count_0++) {
      ObjectDelete("Sell Signal: " + DoubleToStr(l_count_0, 0));
      ObjectDelete("Buy Signal: " + DoubleToStr(l_count_0, 0));
      ObjectDelete("Exit:" + DoubleToStr(l_count_0, 0));
   }
   return (0);
}

int start() {
   double l_price;
   double ld_unused_20;
   int count = IndicatorCounted();
   double l_low_28 = 0;
   double l_high_36 = 0;
   double ld_44 = 1.2;
   if (count > 0) count--;
   int n = Bars - count;
   if (Mode_Fast) n = 100;
   for (int i = 0; i < n; i++) {
      l_high_36 = High[iHighest(NULL, 0, MODE_HIGH, period, i)];
      l_low_28 = Low[iLowest(NULL, 0, MODE_LOW, period, i)];
      switch (price) {
      case 1:
         l_price = Open[i];
         break;
      case 2:
         l_price = Close[i];
         break;
      case 3:
         l_price = High[i];
         break;
      case 4:
         l_price = Low[i];
         break;
      case 5:
         l_price = (High[i] + Low[i] + Close[i]) / 3.0;
         break;
      case 6:
         l_price = (Open[i] + High[i] + Low[i] + Close[i]) / 4.0;
         break;
      case 7:
         l_price = (Open[i] + Close[i]) / 2.0;
         break;
      default:
         l_price = (High[i] + Low[i]) / 2.0;
      }
      gd_144 = 0.66 * ((l_price - l_low_28) / (l_high_36 - l_low_28) - 0.5) + 0.67 * gd_152;
      gd_144 = MathMin(MathMax(gd_144, -0.999), 0.999);
      gd_168 = MathLog((gd_144 + 1.0) / (1 - gd_144)) / 2.0 + gd_176 / 2.0;
      buffer1[i] = 0;
      buffer2[i] = 0;
      if (gd_168 < 0.0 && gd_176 > 0.0) {
         if (SignalsComment && i<40) {
            Comment("\n8maf_2: " + DoubleToStr(i, 0) + " / Exit Signal: " + DoubleToStr(l_price, 4) + " on candle: " + TimeToStr(Time[i]));
         }
         if (SignalsInGraf) {
            ObjectCreate("Exit:" + DoubleToStr(i, 0), OBJ_TEXT, 0, Time[i], l_price);
            ObjectSetText("Exit:" + DoubleToStr(i, 0), "x" , 8, "Arial", Yellow);
         }
      }
      if (gd_168 > 0.0 && gd_176 < 0.0) {
         if (SignalsComment && i<40) {
            Comment("\n8maf_2: " + DoubleToStr(i, 0) + " / Exit Signal: " + DoubleToStr(l_price, 4) + " on candle: " + TimeToStr(Time[i]));
         }
         if (SignalsInGraf) {
            ObjectCreate("Exit:" + DoubleToStr(i, 0), OBJ_TEXT, 0, Time[i], l_price);
            ObjectSetText("Exit:" + DoubleToStr(i, 0), "x" , 8, "Arial", Yellow);
         }
         gi_unused_196 = 0;
      }
      if (gd_168 >= 0.0) {
         buffer1[i] = gd_168;
         buffer3[i] = gd_168;
      } else {
         buffer2[i] = gd_168;
         buffer3[i] = gd_168;
      }
      ld_unused_20 = i;
      if (gd_168 < (-ld_44) && gd_168 > gd_176 && gd_176 <= gd_184) {
         if (SignalsComment && i<40) {
            Comment("\n8maf_2: " + DoubleToStr(i, 0) + " / Sell Signal: " + DoubleToStr(l_price, 4) + " on candle: " + TimeToStr(Time[i]));
         }
         if (SignalsInGraf) {
            ObjectCreate("Sell Signal: " + DoubleToStr(i, 0), OBJ_TEXT, 0, Time[i], l_price);
            ObjectSetText("Sell Signal: " + DoubleToStr(i, 0), " - " , 12, "Arial Black", Red);
         }
         gi_unused_196 = 1;
      }
      if (gd_168 > ld_44 && gd_168 < gd_176 && gd_176 >= gd_184) {
         if (SignalsComment && i<40) {
            Comment("\n8maf_2: " + DoubleToStr(i, 0) + " / Buy Signal: " + DoubleToStr(l_price, 4) + " on candle: " + TimeToStr(Time[i]));
         }
         if (SignalsInGraf) {
            ObjectCreate("Buy Signal: " + DoubleToStr(i, 0), OBJ_TEXT, 0, Time[i], l_price);
            ObjectSetText("Buy Signal: " + DoubleToStr(i, 0), " - " , 12, "Arial Black", Lime);
         }
      }
      gd_152 = gd_144;
      gd_184 = gd_176;
      gd_176 = gd_168;
   }
   for (i = 0; i < n; i++) buffer4[i] = iMAOnArray(buffer3, Bars, MA1period, 0, TypeMA1, i);
   for (i = 0; i < n; i++) buffer5[i] = iMAOnArray(buffer4, Bars, MA2period, 0, TypeMA2, i);
   return (0);
}