/*
	2011-10-10 by Capella at http://worldwide-invest.org/
	- Authorization removed 
	2013-08-21 by Capella at http://worldwide-invest.org/
	- No need for external DLL
	- Fixing bugs
*/

#property copyright "Fapturbo-Ichimoku special version 2011"
#property link      "Copyright (c) Fapturbo.com"

#import "wininet.dll"
   int InternetOpenA(string a0, int a1, string a2, string a3, int a4);
   int InternetOpenUrlA(int a0, string a1, string a2, int a3, int a4, int a5);
   int InternetReadFile(int a0, string a1, int a2, int& a3[]);
   int InternetCloseHandle(int a0);
/*   
#import "FaptAuthv1.dll"
   int FAPTAuth(double& a0[], string a1, string a2, string a3, string a4, int a5, int a6);
#import
*/

double gda_76[48] = {0};
string gs_80 = "";
string gs_unused_88 = "";
int gi_96 = 1;                          // Forced authentication
bool gi_100 = FALSE;
int gi_104 = 0;
bool gba_112[7];
int gi_116;
int gi_120;
string gsa_124[7] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
string gsa_128[2] = {"FALSE", "TRUE"};
extern string EMail = "";
extern string ClickbankReceipt = "";
extern string ______GMTsettings_____;
extern bool UseAutoGMToffset = TRUE;
extern int ManualGMToffset = 0;
string gs_dummy_164;
bool gi_172 = TRUE;
bool gi_176 = FALSE;
int g_timeframe_180 = PERIOD_M15;
int gi_184 = 9;
int gi_188 = 26;
int gi_192 = 52;
extern string _____Size_of_lots_____;
extern double Lots = 0.1;
extern bool UseMM = FALSE;
extern double LotsRiskReductor = 5.0;
extern double MaxLots = 10.0;
extern string _____Trade_Options____;
extern bool DownloadBestSettings = TRUE;
extern bool AggressiveSettings = FALSE;
extern int TakeProfit = 3;
extern int StopLoss = 35;
extern bool StealthMode = TRUE;
int gi_260 = 0;
int gi_264 = -1;
int gi_268 = 0;
bool gi_272 = TRUE;
int gi_276 = 0;
bool gi_280 = FALSE;
int gi_284 = 80;
bool gi_288 = FALSE;
int g_period_292 = 5;
int g_applied_price_296 = PRICE_CLOSE;
int g_ma_method_300 = MODE_SMA;
int gi_304 = 20;
double gd_308 = 0.5;
int gi_316 = 5;
extern int StartWorkTimeHour = 23;
extern int EndWorkTimeHour = 0;
extern bool TradeFriday = FALSE;
string gs_dummy_332;
bool gi_340 = FALSE;
int g_period_344 = 100;
int g_applied_price_348 = PRICE_CLOSE;
int g_ma_method_352 = MODE_SMA;
extern string _____Others___________;
extern int MaxSpread = -1;
extern int Slippage = 3;
extern int MagicNumber = 20110716;
extern string ExpertComment = "FapTurboIchimoku";
extern color ColorBuy = Blue;
extern color ColorSell = Red;
extern bool ShowInformation = TRUE;
extern bool WriteLog = TRUE;
extern bool WriteDebugLog = FALSE;
extern bool SoundAlert = FALSE;
extern string SoundFileAtOpen = "alert.wav";
extern string SoundFileAtClose = "alert.wav";
int gi_424 = 60;
int gi_428 = 3;
int gi_432 = 140;
int gi_436 = 2;
int gi_440 = 170;
int gi_444 = 0;
int gi_448 = 200;
int gi_452 = -1;
int gi_456 = 240;
int gi_460 = -4;
int gi_464 = 50;
int g_period_468 = 8;
int g_period_472 = 6;
int gi_476 = 30;
int g_period_480 = 20;
int gi_484 = 36;
int gi_488 = 20;
bool gi_492;
bool gi_496;
bool gi_500 = TRUE;
bool gi_504 = TRUE;
int gi_508;
int g_datetime_512;
int g_datetime_516;
int g_datetime_520;
int gi_524;
int gi_528;
int gi_532;
int gi_536;
int gi_540;
int gi_544;
int gi_548;
int gi_552;
int gi_556;
int gi_560;
int gi_564;
int gi_568;
int gi_572;
double gd_576;
double gd_584;
double gd_592;
double g_lotstep_600;
double gd_608;
double gd_616;
double gd_624;
double gd_632;
double gd_640;
double gd_648;
double gd_656;
double gd_664;
double gd_672;
double gd_680;
double gd_688;
string g_symbol_696;
string gs_704 = "http://fapturbo.com/gmt.php";
string gs_712 = "AlexGmtOffset 1.0";
int gi_720 = -1;
int gi_724;
int gi_728;
int gi_732;
string g_str_concat_736;
string gs_744;
string gs_752;
int gi_760 = 0;
int gi_764;
int g_day_of_week_768;
string g_str_concat_772;

int init() {
   Comment("FapTurbo Ichimoku initializing...");
   if (!IsDllsAllowed()) {
      Comment("Warning: Set Parameter \"AllowDLL Imports\" ON in menu Tools -> Options -> ExpertAdvisors.");
      gi_496 = FALSE;
      return (1);
   }
   gi_496 = TRUE;
   g_symbol_696 = Symbol();
   if (!AggressiveSettings) gs_752 = "safe";
   else gs_752 = "aggro";
   Authentication();
   if (gi_96 != 1) {
      PrintInformation();
      gi_496 = FALSE;
      return (-1);
   }
   gi_496 = TRUE;
   gi_508 = TimeCurrent();
   gi_104 = gi_508;
   if (Digits < 4) {
      gd_576 = 0.01;
      gi_540 = 2;
   } else {
      gd_576 = 0.0001;
      gi_540 = 4;
   }
   gi_572 = Digits - gi_540;
   int li_0 = MathPow(10, gi_572);
   gi_564 = Slippage * li_0;
   gd_584 = MarketInfo(g_symbol_696, MODE_MAXLOT);
   gd_592 = MarketInfo(g_symbol_696, MODE_MINLOT);
   g_lotstep_600 = MarketInfo(g_symbol_696, MODE_LOTSTEP);
   if (g_lotstep_600 == 0.01) gi_568 = 2;
   else {
      if (g_lotstep_600 == 0.1) gi_568 = 1;
      else {
         if (g_lotstep_600 == 1.0) gi_568 = 0;
         else {
            if (g_lotstep_600 == 0.001) gi_568 = 3;
            else gi_568 = 4;
         }
      }
   }
   gd_608 = MarketInfo(g_symbol_696, MODE_MARGINREQUIRED) * g_lotstep_600;
   gd_624 = NormalizeDouble((-1 * StopLoss) * gd_576, Digits);
   gd_616 = NormalizeDouble(TakeProfit * gd_576, Digits);
   gi_544 = 60 * gi_424;
   gi_548 = 60 * gi_432;
   gi_552 = 60 * gi_440;
   gi_556 = 60 * gi_448;
   gi_560 = 60 * gi_456;
   gd_632 = NormalizeDouble(gi_428 * gd_576, Digits);
   gd_640 = NormalizeDouble(gi_436 * gd_576, Digits);
   gd_648 = NormalizeDouble(gi_444 * gd_576, Digits);
   gd_656 = NormalizeDouble(gi_452 * gd_576, Digits);
   gd_664 = NormalizeDouble(gi_460 * gd_576, Digits);
   gd_680 = NormalizeDouble(StopLoss * gd_576, Digits);
   gd_688 = NormalizeDouble(gi_284 * gd_576, Digits);
   if (MaxSpread > 0) gd_672 = NormalizeDouble((MaxSpread + 0.1) * gd_576, Digits);
   else gd_672 = NormalizeDouble((MarketInfo(g_symbol_696, MODE_SPREAD) + 0.1) * gd_576, Digits);
   gi_524 = 100 - gi_476;
   gi_528 = 100 - gi_484;
   gi_532 = gi_488 / 2 + 50;
   gi_536 = 50 - gi_488 / 2;
   if (g_period_344 <= 0) gi_340 = FALSE;
   if (g_applied_price_348 < PRICE_CLOSE || g_applied_price_348 > PRICE_WEIGHTED) gi_340 = FALSE;
   if (g_ma_method_352 < MODE_SMA || g_ma_method_352 > MODE_LWMA) gi_340 = FALSE;
   gi_120 = gi_116 + 604800;
   if (gi_496) gi_492 = TRUE;
   return (0);
}

int deinit() {
   return (0);
}

int start() {
   int l_datetime_0;
   double ld_48;
   bool li_56;
   double ld_60;
   double ld_68;
   double ld_76;
   double ld_84;
   double ld_92;
   gi_760++;
   gi_508 = TimeCurrent();
   if (!IsTesting()) {
      if (gi_100 == TRUE && gi_104 < gi_508 - 60) {
         gi_100 = FALSE;
         gi_104 = gi_508 + 60 * (780 - Rand(120));
      }
      if (gi_100 == FALSE && gi_508 > gi_104) {
         gi_100 = TRUE;
//         Authentication();
      }
      PrintInformation();
   }
   if (gi_96 != 1) 
	{
      gi_496 = FALSE;
      return (1);
   }
	if (gi_492) {
      if (UseAutoGMToffset) {
         if (!IsTesting()) {
            ManualGMToffset = AutoGMTCalculation();
            if (ManualGMToffset == -2147483648) {
               Sleep(60000);
               return (0);
            }
         } else {
            Comment("\nFapTurbo Ichimoku\n" + "www.fapturbo.com" 
               + "\n\n" + "Warning, use manual GMToffsets only on backtest.", 
               "\n", "Automatic GMT offset calculation works only on live/demo trading", 
            "\n", "and should be set as FALSE for backtests - strategy testing.");
            Alert("Warning, use manual GMToffsets only on backtest.", 
               "\n", "Automatic GMT offset calculation works only on live/demo trading", 
            "\n", "and should be set as FALSE for backtests - strategy testing.");
            if (WriteLog) Print("Warning, use manual GMToffsets only on backtest! Set Scalper_UseAutoGMToffset = False.");
            gi_496 = FALSE;
         }
         gs_744 = " (automatic)";
      } else gs_744 = " (manual)";
      g_str_concat_736 = StringConcatenate("GmtOffset: ", DoubleToStr(ManualGMToffset, 1), gs_744, 
      "\n");
      gi_724 = StartWorkTimeHour + ManualGMToffset;
      gi_728 = EndWorkTimeHour + ManualGMToffset;
      gi_764 = gi_508 - 3600 * ManualGMToffset;
      while (true) {
         if (gi_724 >= 24) {
            gi_724 -= 24;
            continue;
         }
         if (gi_724 >= 0) break;
         gi_724 += 24;
      }
      while (true) {
         if (gi_728 >= 24) {
            gi_728 -= 24;
            continue;
         }
         if (gi_728 >= 0) break;
         gi_728 += 24;
      }
      if (gi_264 >= 0 && gi_268 >= 0) {
         gi_732 = gi_264 + ManualGMToffset;
         while (true) {
            if (gi_732 >= 24) {
               gi_732 -= 24;
               continue;
            }
            if (gi_732 >= 0) break;
            gi_732 += 24;
         }
      }
      gi_492 = FALSE;
   }
   if (!gi_496) return (0);
   gi_508 = TimeCurrent();
   gi_764 = gi_508 - 3600 * ManualGMToffset;
   g_day_of_week_768 = TimeDayOfWeek(gi_764);
   if (gi_264 >= 0 && gi_268 >= 0) {
      if (TimeHour(gi_508) == gi_732 && TimeMinute(gi_508) == gi_268) {
         l_datetime_0 = iTime(NULL, PERIOD_M1, 0);
         if (g_datetime_520 != l_datetime_0) {
            if (CloseAllOrders() == 0) g_datetime_520 = l_datetime_0;
            return (0);
         }
      }
   }
   if (ShowInformation) PrintInformation();
   else Comment("\nFapTurbo Ichimoku running");
   if (!StealthMode) SetOrderLevels(gd_616, gd_624, MagicNumber);
   WatchOrderLevels(gd_616, gd_624, MagicNumber);
   if (gi_272) NoiseFilter();
   if (NormalizeDouble(Ask - Bid, Digits) > gd_672) {
      Comment(g_str_concat_772 
      + "\nFapturbo Ichimoku: Trades not allowed\nCurrent Spread(" + DoubleToStr((Ask - Bid) / gd_576, 2) + ") is higher than MaxSpread(" + DoubleToStr(gd_672 / gd_576, 2) + ")");
      return (0);
   }
   string ls_4 = TimeToStr(TimeCurrent()) + " " + gsa_124[DayOfWeek()];
   string ls_12 = TimeToStr(gi_764) + " " + gsa_124[g_day_of_week_768];
   if (g_day_of_week_768 == 0) {
      Comment(g_str_concat_772 
      + "\nFapturbo Ichimoku will not trade now on Sunday (GMT)\nGMT Date/Time=" + ls_12);
      return (0);
   }
   if (g_day_of_week_768 == 1 && TimeHour(gi_764) < StartWorkTimeHour) {
      Comment(g_str_concat_772 
      + "\nFapturbo Ichimoku: No trading on Monday before " + StartWorkTimeHour + ":00 (GMT)\nGMT Date/Time=" + ls_12);
      return (0);
   }
   if (!TradeFriday) {
      if (g_day_of_week_768 == 5 || g_day_of_week_768 == 6) {
         Comment(g_str_concat_772 
         + "\nFapturbo Ichimoku: No trading during Fridays/Saturdays (GMT)\nGMT Date/Time=" + ls_12);
         return (0);
      }
   }
   if (!gba_112[g_day_of_week_768] && gi_764 >= gi_116 && gi_764 < gi_120) {
      Comment(g_str_concat_772 
      + "\nFapturbo Ichimoku will not trade on this day of this week due to possible volatile news/events/holidays!\nGMT Date/Time=" + ls_12);
      return (0);
   }
   if (!IsTradeTime()) {
      Comment(g_str_concat_772 
      + "\nFapturbo Ichimoku will now be IDLE between " + EndWorkTimeHour + ":00 and " + StartWorkTimeHour + ":00 (GMT)\nGMT Date/Time=" + ls_12);
      return (0);
   }
   if (gi_276 > 0)
      if (IsRelaxHours()) return (0);
   if (gi_280)
      if (CheckSimpleHeightFilter()) return (0);
   if (gi_288)
      if (CheckTrendFilter()) return (0);
   if (gi_260 != 0) {
      if (HaveTrade()) {
         if (WriteDebugLog) Print("Already have one trade inside this interval of time.");
         return (0);
      }
   }
   HideTestIndicators(TRUE);
   double l_irsi_20 = iRSI(NULL, 0, g_period_472, PRICE_CLOSE, 0);
   double l_irsi_28 = iRSI(NULL, PERIOD_M1, g_period_480, PRICE_CLOSE, 0);
   double ld_36 = NormalizeDouble(iMA(NULL, 0, g_period_468, 0, MODE_SMA, PRICE_MEDIAN, 1), Digits);
   HideTestIndicators(FALSE);
   int l_count_44 = 0;
   if (!ExistPosition() && l_irsi_20 < gi_476 || l_irsi_28 < gi_484 && ld_36 >= NormalizeDouble(Ask + 0.0002, Digits)) {
      if (gi_500) {
         if (!gi_340) l_count_44 = 0;
         else {
            ld_48 = NormalizeDouble(iMA(NULL, 0, g_period_344, 0, g_ma_method_352, g_applied_price_348, 0), Digits);
            if (NormalizeDouble(Close[0], Digits) <= ld_48) l_count_44++;
         }
         li_56 = FALSE;
         if (gi_172) {
            ld_60 = NormalizeDouble(iIchimoku(NULL, g_timeframe_180, gi_184, gi_188, gi_192, MODE_SENKOUSPANA, 0), Digits);
            ld_68 = NormalizeDouble(iIchimoku(NULL, g_timeframe_180, gi_184, gi_188, gi_192, MODE_SENKOUSPANB, 0), Digits);
            if (ld_60 >= ld_68) {
               ld_76 = ld_60;
               ld_84 = ld_68;
            } else {
               ld_76 = ld_68;
               ld_84 = ld_60;
            }
            ld_92 = NormalizeDouble(Close[0], Digits);
            if (ld_92 < ld_84) {
               if (!gi_176) l_count_44++;
               else li_56 = TRUE;
            } else
               if (ld_92 <= ld_76) l_count_44++;
         }
         if (l_count_44 == 0) {
            if (OpenOrder(li_56, MagicNumber, ExpertComment, LotsOptimized()) >= 0) {
               gi_500 = FALSE;
               gi_504 = TRUE;
            }
         }
      }
   }
   l_count_44 = 0;
   if (!ExistPosition() && l_irsi_20 > gi_524 || l_irsi_28 > gi_528 && ld_36 <= NormalizeDouble(Bid - 0.0002, Digits)) {
      if (gi_504) {
         if (!gi_340) l_count_44 = 0;
         else {
            ld_48 = NormalizeDouble(iMA(NULL, 0, g_period_344, 0, g_ma_method_352, g_applied_price_348, 0), Digits);
            if (NormalizeDouble(Close[0], Digits) >= ld_48) l_count_44++;
         }
         li_56 = TRUE;
         if (gi_172) {
            ld_60 = NormalizeDouble(iIchimoku(NULL, g_timeframe_180, gi_184, gi_188, gi_192, MODE_SENKOUSPANA, 0), Digits);
            ld_68 = NormalizeDouble(iIchimoku(NULL, g_timeframe_180, gi_184, gi_188, gi_192, MODE_SENKOUSPANB, 0), Digits);
            if (ld_60 >= ld_68) {
               ld_76 = ld_60;
               ld_84 = ld_68;
            } else {
               ld_76 = ld_68;
               ld_84 = ld_60;
            }
            ld_92 = NormalizeDouble(Close[0], Digits);
            if (ld_92 > ld_76) {
               if (!gi_176) l_count_44++;
               else li_56 = FALSE;
            } else
               if (ld_92 >= ld_84) l_count_44++;
         }
         if (l_count_44 == 0) {
            if (OpenOrder(li_56, MagicNumber, ExpertComment, LotsOptimized()) >= 0) {
               gi_500 = TRUE;
               gi_504 = FALSE;
            }
         }
      }
   }
   if (l_irsi_20 < gi_532 && l_irsi_20 > gi_536) {
      gi_504 = TRUE;
      gi_500 = TRUE;
   }
   return (0);
}

bool CheckTrendFilter() {
   double ld_4;
   double ld_12;
   double ld_20;
   if (gi_304 <= 0) return (FALSE);
   for (int li_0 = 0; li_0 <= gi_316; li_0++) {
      ld_4 = NormalizeDouble(iMA(NULL, 0, g_period_292, 0, g_ma_method_300, g_applied_price_296, li_0), Digits);
      ld_12 = NormalizeDouble(iMA(NULL, 0, g_period_292, 0, g_ma_method_300, g_applied_price_296, li_0 + gi_304), Digits);
      ld_20 = 100.0 * MathAbs(ld_4 - ld_12) / ld_12;
      if (ld_20 > gd_308) break;
   }
   if (li_0 > gi_316) return (FALSE);
   if (WriteDebugLog) {
      Print("Trade is forbidden by the filter TrendFilter.");
      if (li_0 != 0) Print("Relax Bars Left = " + DoubleToStr(gi_316 - li_0, 0) + " (after MaxPercentMove).");
   }
   return (TRUE);
}

bool CheckSimpleHeightFilter() {
   int l_datetime_4;
   bool li_0 = FALSE;
   if (NormalizeDouble(iHigh(NULL, PERIOD_M15, 1) - iLow(NULL, PERIOD_M15, 1), Digits) > gd_688) li_0 = TRUE;
   if (NormalizeDouble(iHigh(NULL, PERIOD_M15, 2) - iLow(NULL, PERIOD_M15, 2), Digits) > gd_688) li_0 = TRUE;
   if (li_0) {
      l_datetime_4 = iTime(NULL, PERIOD_M15, 0);
      if (g_datetime_516 != l_datetime_4) {
         if (WriteDebugLog) Print("Trade is forbidden by the filter SimpleHeightFilter.");
         g_datetime_516 = l_datetime_4;
      }
      return (TRUE);
   }
   return (FALSE);
}

bool IsRelaxHours() {
   int l_datetime_16;
   bool li_20;
   double ld_24;
   double ld_32;
   double ld_40;
   int l_datetime_52;
   int l_ticket_0 = -1;
   int li_4 = OrdersHistoryTotal() - 1;
   int l_datetime_8 = -2147483648;
   for (int l_pos_12 = li_4; l_pos_12 >= 0; l_pos_12--) {
      if (OrderSelect(l_pos_12, SELECT_BY_POS, MODE_HISTORY)) {
         if (OrderMagicNumber() == MagicNumber) {
            if (OrderSymbol() == g_symbol_696) {
               l_datetime_16 = OrderCloseTime();
               if (l_datetime_8 < l_datetime_16) {
                  l_datetime_8 = l_datetime_16;
                  l_ticket_0 = OrderTicket();
               }
            }
         }
      }
   }
   if (l_ticket_0 < 0) return (FALSE);
   if (OrderSelect(l_ticket_0, SELECT_BY_TICKET)) {
      li_20 = FALSE;
      ld_24 = NormalizeDouble(OrderOpenPrice(), Digits);
      ld_32 = NormalizeDouble(OrderClosePrice(), Digits);
      ld_40 = NormalizeDouble(OrderStopLoss(), Digits);
      if (OrderType() == OP_BUY) {
         if (ld_32 <= ld_40 && ld_40 != 0.0) li_20 = TRUE;
         else
            if (NormalizeDouble(ld_24 - ld_32, Digits) >= gd_680) li_20 = TRUE;
      } else {
         if (ld_32 >= ld_40 && ld_40 != 0.0) li_20 = TRUE;
         else
            if (NormalizeDouble(ld_32 - ld_24, Digits) >= gd_680) li_20 = TRUE;
      }
   } else return (FALSE);
   if (!li_20) return (FALSE);
   int l_shift_48 = iBarShift(NULL, PERIOD_H1, l_datetime_8, FALSE);
   if (l_shift_48 < gi_276) {
      l_datetime_52 = iTime(NULL, PERIOD_H1, 0);
      if (g_datetime_512 != l_datetime_52) {
         if (WriteDebugLog) Print("Relax Hours Left = " + DoubleToStr(l_shift_48 - gi_276, 0) + " (after StopLoss).");
         g_datetime_512 = l_datetime_52;
      }
      return (TRUE);
   }
   return (FALSE);
}

bool IsTradeTime() {
   int l_hour_0 = TimeHour(gi_508);
   if (gi_724 < gi_728 && l_hour_0 < gi_724 || l_hour_0 >= gi_728) return (FALSE);
   if (gi_724 > gi_728 && (l_hour_0 < gi_724 && l_hour_0 >= gi_728)) return (FALSE);
   if (gi_728 == 0) gi_728 = 24;
   if (Hour() == gi_728 - 1 && Minute() >= gi_464) return (FALSE);
   return (TRUE);
}

bool ExistPosition() {
   int l_ord_total_0 = OrdersTotal();
   for (int l_pos_4 = 0; l_pos_4 < l_ord_total_0; l_pos_4++) {
      if (OrderSelect(l_pos_4, SELECT_BY_POS, MODE_TRADES)) {
         if (OrderMagicNumber() == MagicNumber) {
            if (OrderSymbol() == g_symbol_696)
               if (OrderType() <= OP_SELL) return (TRUE);
         }
      }
   }
   return (FALSE);
}

void NoiseFilter() {
   int l_cmd_8;
   int li_12;
   double ld_16;
   double ld_24;
   int li_32;
   double ld_36;
   int li_0 = OrdersTotal() - 1;
   for (int l_pos_4 = li_0; l_pos_4 >= 0; l_pos_4--) {
      if (!OrderSelect(l_pos_4, SELECT_BY_POS, MODE_TRADES)) {
         if (WriteDebugLog) Print("NoiseFilter: OrderSelect() error = ", GetLastError());
      } else {
         if (OrderMagicNumber() == MagicNumber) {
            l_cmd_8 = OrderType();
            if (l_cmd_8 <= OP_SELL) {
               if (OrderSymbol() == g_symbol_696) {
                  li_12 = gi_508 - OrderOpenTime();
                  if (li_12 > gi_544) {
                     ld_16 = NormalizeDouble(OrderClosePrice(), Digits);
                     ld_24 = NormalizeDouble(OrderOpenPrice(), Digits);
                     li_32 = 0;
                     if (l_cmd_8 == OP_BUY) ld_36 = NormalizeDouble(ld_16 - ld_24, Digits);
                     else ld_36 = NormalizeDouble(ld_24 - ld_16, Digits);
                     if (li_12 < gi_548 && ld_36 >= gd_632) li_32 = 1;
                     else {
                        if (li_12 > gi_548 && li_12 < gi_552 && ld_36 >= gd_640) li_32 = 2;
                        else {
                           if (li_12 > gi_552 && li_12 < gi_556 && ld_36 >= gd_648) li_32 = 3;
                           else {
                              if (li_12 > gi_556 && li_12 < gi_560 && ld_36 >= gd_656) li_32 = 4;
                              else
                                 if (li_12 > gi_560 && ld_36 >= gd_664) li_32 = 5;
                           }
                        }
                     }
                     if (li_32 != 0) OrderCloseEx("NoiseFilter level#" + li_32, OrderTicket(), OrderLots(), l_cmd_8, gi_564);
                  }
               }
            }
         }
      }
   }
}

double LotsOptimized() {
   double ld_ret_0;
   double ld_8;
   if (!UseMM) ld_ret_0 = Lots;
   else {
      ld_8 = AccountFreeMargin() * LotsRiskReductor / 100.0;
      ld_ret_0 = NormalizeDouble(MathFloor(ld_8 / gd_608) * g_lotstep_600, gi_568);
      if (ld_ret_0 < gd_592) ld_ret_0 = gd_592;
      else
         if (ld_ret_0 > gd_584) ld_ret_0 = gd_584;
      if (ld_ret_0 > MaxLots) ld_ret_0 = MaxLots;
   }
   return (ld_ret_0);
}

int CloseAllOrders() {
   bool li_16;
   int li_ret_0 = 0;
   int li_4 = OrdersTotal() - 1;
   int li_unused_8 = MarketInfo(g_symbol_696, MODE_SPREAD);
   for (int l_pos_12 = li_4; l_pos_12 >= 0; l_pos_12--) {
      if (!OrderSelect(l_pos_12, SELECT_BY_POS, MODE_TRADES)) {
         if (WriteDebugLog) Print("CloseAllOrders: OrderSelect() error = ", GetLastError());
      } else {
         if (OrderMagicNumber() == MagicNumber) {
            if (OrderSymbol() == g_symbol_696) {
               li_16 = OrderCloseEx("CloseAllOrders", OrderTicket(), OrderLots(), OrderType(), gi_564);
               if (!li_16) li_ret_0 = -1;
            }
         }
      }
   }
   return (li_ret_0);
}

bool HaveTrade() {
   int l_datetime_20;
   if (gi_724 == gi_728) return (FALSE);
   int li_0 = iTime(NULL, PERIOD_D1, 0);
   int l_hour_4 = TimeHour(gi_508);
   if (gi_724 > gi_728)
      if (l_hour_4 < gi_724) li_0 -= 86400;
   li_0 += 3600 * gi_724;
   int li_8 = OrdersTotal() - 1;
   int l_datetime_12 = -2147483648;
   for (int l_pos_16 = li_8; l_pos_16 >= 0; l_pos_16--) {
      if (OrderSelect(l_pos_16, SELECT_BY_POS, MODE_TRADES)) {
         if (OrderMagicNumber() == MagicNumber) {
            if (OrderSymbol() == g_symbol_696) {
               l_datetime_20 = OrderOpenTime();
               if (l_datetime_12 < l_datetime_20) l_datetime_12 = l_datetime_20;
            }
         }
      }
   }
   if (l_datetime_12 >= li_0) return (TRUE);
   li_8 = OrdersHistoryTotal() - 1;
   l_datetime_12 = -2147483648;
   for (l_pos_16 = li_8; l_pos_16 >= 0; l_pos_16--) {
      if (OrderSelect(l_pos_16, SELECT_BY_POS, MODE_HISTORY)) {
         if (OrderMagicNumber() == MagicNumber) {
            if (OrderSymbol() == g_symbol_696) {
               l_datetime_20 = OrderOpenTime();
               if (l_datetime_12 < l_datetime_20) l_datetime_12 = l_datetime_20;
            }
         }
      }
   }
   if (l_datetime_12 >= li_0) return (TRUE);
   return (FALSE);
}

string ErrorDescription(int ai_0) {
   string ls_ret_8;
   switch (ai_0) {
   case 0:
   case 1:
      ls_ret_8 = "no error";
      break;
   case 2:
      ls_ret_8 = "common error";
      break;
   case 3:
      ls_ret_8 = "invalid trade parameters";
      break;
   case 4:
      ls_ret_8 = "trade server is busy";
      break;
   case 5:
      ls_ret_8 = "old version of the client terminal";
      break;
   case 6:
      ls_ret_8 = "no connection with trade server";
      break;
   case 7:
      ls_ret_8 = "not enough rights";
      break;
   case 8:
      ls_ret_8 = "too frequent requests";
      break;
   case 9:
      ls_ret_8 = "malfunctional trade operation (never returned error)";
      break;
   case 64:
      ls_ret_8 = "account disabled";
      break;
   case 65:
      ls_ret_8 = "invalid account";
      break;
   case 128:
      ls_ret_8 = "trade timeout";
      break;
   case 129:
      ls_ret_8 = "invalid price";
      break;
   case 130:
      ls_ret_8 = "invalid stops";
      break;
   case 131:
      ls_ret_8 = "invalid trade volume";
      break;
   case 132:
      ls_ret_8 = "market is closed";
      break;
   case 133:
      ls_ret_8 = "trade is disabled";
      break;
   case 134:
      ls_ret_8 = "not enough money";
      break;
   case 135:
      ls_ret_8 = "price changed";
      break;
   case 136:
      ls_ret_8 = "off quotes";
      break;
   case 137:
      ls_ret_8 = "broker is busy (never returned error)";
      break;
   case 138:
      ls_ret_8 = "requote";
      break;
   case 139:
      ls_ret_8 = "order is locked";
      break;
   case 140:
      ls_ret_8 = "long positions only allowed";
      break;
   case 141:
      ls_ret_8 = "too many requests";
      break;
   case 145:
      ls_ret_8 = "modification denied because order too close to market";
      break;
   case 146:
      ls_ret_8 = "trade context is busy";
      break;
   case 147:
      ls_ret_8 = "expirations are denied by broker";
      break;
   case 148:
      ls_ret_8 = "amount of open and pending orders has reached the limit";
      break;
   case 149:
      ls_ret_8 = "hedging is prohibited";
      break;
   case 150:
      ls_ret_8 = "prohibited by FIFO rules";
      break;
   case 4000:
      ls_ret_8 = "no error (never generated code)";
      break;
   case 4001:
      ls_ret_8 = "wrong function pointer";
      break;
   case 4002:
      ls_ret_8 = "array index is out of range";
      break;
   case 4003:
      ls_ret_8 = "no memory for function call stack";
      break;
   case 4004:
      ls_ret_8 = "recursive stack overflow";
      break;
   case 4005:
      ls_ret_8 = "not enough stack for parameter";
      break;
   case 4006:
      ls_ret_8 = "no memory for parameter string";
      break;
   case 4007:
      ls_ret_8 = "no memory for temp string";
      break;
   case 4008:
      ls_ret_8 = "not initialized string";
      break;
   case 4009:
      ls_ret_8 = "not initialized string in array";
      break;
   case 4010:
      ls_ret_8 = "no memory for array\' string";
      break;
   case 4011:
      ls_ret_8 = "too long string";
      break;
   case 4012:
      ls_ret_8 = "remainder from zero divide";
      break;
   case 4013:
      ls_ret_8 = "zero divide";
      break;
   case 4014:
      ls_ret_8 = "unknown command";
      break;
   case 4015:
      ls_ret_8 = "wrong jump (never generated error)";
      break;
   case 4016:
      ls_ret_8 = "not initialized array";
      break;
   case 4017:
      ls_ret_8 = "dll calls are not allowed";
      break;
   case 4018:
      ls_ret_8 = "cannot load library";
      break;
   case 4019:
      ls_ret_8 = "cannot call function";
      break;
   case 4020:
      ls_ret_8 = "expert function calls are not allowed";
      break;
   case 4021:
      ls_ret_8 = "not enough memory for temp string returned from function";
      break;
   case 4022:
      ls_ret_8 = "system is busy (never generated error)";
      break;
   case 4050:
      ls_ret_8 = "invalid function parameters count";
      break;
   case 4051:
      ls_ret_8 = "invalid function parameter value";
      break;
   case 4052:
      ls_ret_8 = "string function internal error";
      break;
   case 4053:
      ls_ret_8 = "some array error";
      break;
   case 4054:
      ls_ret_8 = "incorrect series array using";
      break;
   case 4055:
      ls_ret_8 = "custom indicator error";
      break;
   case 4056:
      ls_ret_8 = "arrays are incompatible";
      break;
   case 4057:
      ls_ret_8 = "global variables processing error";
      break;
   case 4058:
      ls_ret_8 = "global variable not found";
      break;
   case 4059:
      ls_ret_8 = "function is not allowed in testing mode";
      break;
   case 4060:
      ls_ret_8 = "function is not confirmed";
      break;
   case 4061:
      ls_ret_8 = "send mail error";
      break;
   case 4062:
      ls_ret_8 = "string parameter expected";
      break;
   case 4063:
      ls_ret_8 = "integer parameter expected";
      break;
   case 4064:
      ls_ret_8 = "double parameter expected";
      break;
   case 4065:
      ls_ret_8 = "array as parameter expected";
      break;
   case 4066:
      ls_ret_8 = "requested history data in update state";
      break;
   case 4099:
      ls_ret_8 = "end of file";
      break;
   case 4100:
      ls_ret_8 = "some file error";
      break;
   case 4101:
      ls_ret_8 = "wrong file name";
      break;
   case 4102:
      ls_ret_8 = "too many opened files";
      break;
   case 4103:
      ls_ret_8 = "cannot open file";
      break;
   case 4104:
      ls_ret_8 = "incompatible access to a file";
      break;
   case 4105:
      ls_ret_8 = "no order selected";
      break;
   case 4106:
      ls_ret_8 = "unknown symbol";
      break;
   case 4107:
      ls_ret_8 = "invalid price parameter for trade function";
      break;
   case 4108:
      ls_ret_8 = "invalid ticket";
      break;
   case 4109:
      ls_ret_8 = "trade is not allowed in the expert properties";
      break;
   case 4110:
      ls_ret_8 = "longs are not allowed in the expert properties";
      break;
   case 4111:
      ls_ret_8 = "shorts are not allowed in the expert properties";
      break;
   case 4200:
      ls_ret_8 = "object is already exist";
      break;
   case 4201:
      ls_ret_8 = "unknown object property";
      break;
   case 4202:
      ls_ret_8 = "object is not exist";
      break;
   case 4203:
      ls_ret_8 = "unknown object type";
      break;
   case 4204:
      ls_ret_8 = "no object name";
      break;
   case 4205:
      ls_ret_8 = "object coordinates error";
      break;
   case 4206:
      ls_ret_8 = "no specified subwindow";
      break;
   default:
      ls_ret_8 = "unknown error";
   }
   return (ls_ret_8);
}

string OrderTypeToStr(int ai_0) {
   string ls_ret_8;
   switch (ai_0) {
   case 0:
      ls_ret_8 = "Buy";
      break;
   case 1:
      ls_ret_8 = "Sell";
      break;
   case 2:
      ls_ret_8 = "BuyLimit";
      break;
   case 3:
      ls_ret_8 = "SellLimit";
      break;
   case 4:
      ls_ret_8 = "BuyStop";
      break;
   case 5:
      ls_ret_8 = "SellStop";
      break;
   default:
      ls_ret_8 = "Unknown";
   }
   return (ls_ret_8);
}

int OrderModifyEx(int a_ticket_0, double a_price_4, double a_price_12, double a_price_20, int a_datetime_28 = -1, color a_color_32 = -1) {
   bool l_bool_56;
   string l_symbol_64;
   int l_cmd_72;
   int l_digits_76;
   double l_price_80;
   double l_price_88;
   double l_price_96;
   double l_price_104;
   int l_datetime_112;
   double ld_116;
   bool li_124;
   double l_price_128;
   bool li_136;
   double l_datetime_144;
   double l_price_152;
   double l_price_160;
   double l_price_168;
   int l_error_180;
   bool li_184;
   int l_count_36 = 0;
   int l_count_40 = 0;
   int l_count_44 = 0;
   int l_count_48 = 0;
   int l_count_52 = 0;
   while (true) {
      if (!IsExpertEnabled()) {
         l_bool_56 = FALSE;
         break;
      }
      RefreshRates();
      for (int l_count_60 = 0; l_count_60 < 3; l_count_60++) {
         if (OrderSelect(a_ticket_0, SELECT_BY_TICKET)) break;
         if (WriteLog) Print(StringConcatenate("OrderModifyEx: OrderSelect() error = ", ErrorDescription(GetLastError())));
         Sleep(1000);
      }
      if (l_count_60 >= 3) {
         l_bool_56 = FALSE;
         break;
      }
      if (OrderCloseTime() != 0) {
         l_bool_56 = TRUE;
         break;
      }
      l_symbol_64 = OrderSymbol();
      l_cmd_72 = OrderType();
      l_digits_76 = MarketInfo(l_symbol_64, MODE_DIGITS);
      a_price_4 = NormalizeDouble(a_price_4, l_digits_76);
      a_price_12 = NormalizeDouble(a_price_12, l_digits_76);
      a_price_20 = NormalizeDouble(a_price_20, l_digits_76);
      l_price_80 = NormalizeDouble(OrderOpenPrice(), l_digits_76);
      l_price_88 = NormalizeDouble(OrderClosePrice(), l_digits_76);
      l_price_96 = NormalizeDouble(OrderStopLoss(), l_digits_76);
      l_price_104 = NormalizeDouble(OrderTakeProfit(), l_digits_76);
      l_datetime_112 = OrderExpiration();
      ld_116 = NormalizeDouble(MarketInfo(l_symbol_64, MODE_STOPLEVEL) * MarketInfo(l_symbol_64, MODE_POINT), l_digits_76);
      li_124 = FALSE;
      if (l_cmd_72 > OP_SELL) {
         if (a_price_4 < 0.0 || a_price_4 == l_price_80) {
            l_price_128 = l_price_80;
            if (NormalizeDouble(MathAbs(l_price_128 - l_price_88), l_digits_76) < ld_116) {
               l_bool_56 = FALSE;
               break;
            }
         } else {
            l_price_128 = a_price_4;
            li_124 = TRUE;
            li_136 = TRUE;
            switch (l_cmd_72) {
            case OP_BUYLIMIT:
            case OP_SELLSTOP:
               if (NormalizeDouble(l_price_88 - l_price_128, l_digits_76) < ld_116) li_136 = FALSE;
               break;
            case OP_BUYSTOP:
            case OP_SELLLIMIT:
               if (NormalizeDouble(l_price_128 - l_price_88, l_digits_76) < ld_116) li_136 = FALSE;
            }
            if (!li_136) {
               l_bool_56 = FALSE;
               break;
            }
         }
         if (a_datetime_28 < 0 || a_datetime_28 == l_datetime_112) l_datetime_144 = l_datetime_112;
         else {
            l_datetime_144 = a_datetime_28;
            li_124 = TRUE;
         }
         l_price_152 = l_price_128;
      } else {
         l_price_128 = l_price_80;
         l_datetime_144 = l_datetime_112;
         l_price_152 = l_price_88;
      }
      if (a_price_12 < 0.0 || a_price_12 == l_price_96) l_price_160 = l_price_96;
      else {
         l_price_160 = a_price_12;
         li_124 = TRUE;
      }
      if (a_price_20 < 0.0 || a_price_20 == l_price_104) l_price_168 = l_price_104;
      else {
         l_price_168 = a_price_20;
         li_124 = TRUE;
      }
      if (!li_124) {
         l_bool_56 = TRUE;
         break;
      }
      if (l_cmd_72 % 2 == 0) {
         if (l_price_160 != 0.0 && NormalizeDouble(l_price_152 - l_price_160, l_digits_76) < ld_116) {
            l_bool_56 = FALSE;
            break;
         }
         if (l_price_168 != 0.0 && NormalizeDouble(l_price_168 - l_price_152, l_digits_76) < ld_116) {
            l_bool_56 = FALSE;
            break;
         }
      } else {
         if (l_price_160 != 0.0 && NormalizeDouble(l_price_160 - l_price_152, l_digits_76) < ld_116) {
            l_bool_56 = FALSE;
            break;
         }
         if (l_price_168 != 0.0 && NormalizeDouble(l_price_152 - l_price_168, l_digits_76) < ld_116) {
            l_bool_56 = FALSE;
            break;
         }
      }
      for (int l_count_176 = 0; l_count_176 < 30; l_count_176++) {
         if (!(IsTradeContextBusy())) break;
         Sleep(1000);
      }
      if (l_count_176 >= 30) continue;
      GetLastError();
      l_bool_56 = OrderModify(a_ticket_0, l_price_128, l_price_160, l_price_168, l_datetime_144, a_color_32);
      if (!(!l_bool_56)) break;
      l_error_180 = GetLastError();
      if (WriteLog) Print(StringConcatenate("OrderModifyEx(", OrderTypeToStr(l_cmd_72), ",", DoubleToStr(a_ticket_0, 0), ") error = ", ErrorDescription(l_error_180)));
      li_184 = FALSE;
      switch (l_error_180) {
      case 0/* NO_ERROR */:
         Sleep(10000);
         li_184 = TRUE;
         break;
      case 6/* NO_CONNECTION */:
         Sleep(10000);
         if (IsConnected()) li_184 = TRUE;
         break;
      case 128/* TRADE_TIMEOUT */:
         Sleep(70000);
         li_184 = TRUE;
         break;
      case 129/* INVALID_PRICE */:
         Sleep(6000);
         l_count_36++;
         if (l_count_36 <= 3) li_184 = TRUE;
         break;
      case 130/* INVALID_STOPS */:
         Sleep(6000);
         l_count_40++;
         if (l_count_40 <= 3) li_184 = TRUE;
         break;
      case 134/* NOT_ENOUGH_MONEY */:
         Sleep(6000);
         li_184 = TRUE;
         break;
      case 135/* PRICE_CHANGED */:
         li_184 = TRUE;
         break;
      case 136/* OFF_QUOTES */:
         Sleep(6000);
         li_184 = TRUE;
         break;
      case 137/* BROKER_BUSY */:
         Sleep(20000);
         l_count_44++;
         if (l_count_44 <= 3) li_184 = TRUE;
         break;
      case 138/* REQUOTE */:
         l_count_48++;
         if (l_count_48 <= 3) li_184 = TRUE;
         break;
      case 142:
         Sleep(70000);
         li_184 = TRUE;
         break;
      case 143:
         Sleep(70000);
         li_184 = TRUE;
         break;
      case 145/* TRADE_MODIFY_DENIED */:
         Sleep(20000);
         l_count_52++;
         if (l_count_52 <= 3) li_184 = TRUE;
         break;
      case 146/* TRADE_CONTEXT_BUSY */:
         while (IsTradeContextBusy()) Sleep(1000);
         li_184 = TRUE;
         break;
      case 147/* ERR_TRADE_EXPIRATION_DENIED */:
         a_datetime_28 = 0;
         li_184 = TRUE;
         break;
      case 4000/* NO_MQLERROR */:
         Sleep(10000);
         li_184 = TRUE;
      }
      if (!(li_184)) break;
   }
   return (l_bool_56);
}

int OrderCloseEx(string as_unused_0, int a_ticket_8, double a_lots_12, int ai_20, int a_slippage_24) {
   color l_color_28;
   bool l_ord_close_48;
   int l_digits_56;
   double l_price_60;
   int l_error_68;
   bool li_72;
   if (ai_20 == 0) l_color_28 = ColorBuy;
   else l_color_28 = ColorSell;
   int l_count_32 = 0;
   int l_count_36 = 0;
   int l_count_40 = 0;
   int l_count_44 = 0;
   while (true) {
      if (!IsExpertEnabled()) {
         l_ord_close_48 = FALSE;
         break;
      }
      RefreshRates();
      for (int l_count_52 = 0; l_count_52 < 3; l_count_52++) {
         if (OrderSelect(a_ticket_8, SELECT_BY_TICKET)) {
            l_digits_56 = MarketInfo(OrderSymbol(), MODE_DIGITS);
            break;
         }
         if (WriteLog) Print(StringConcatenate("OrderCloseEx: OrderSelect() error = ", ErrorDescription(GetLastError())));
         Sleep(1000);
      }
      if (l_count_52 >= 3) {
         l_ord_close_48 = FALSE;
         break;
      }
      if (OrderCloseTime() != 0) {
         l_ord_close_48 = TRUE;
         break;
      }
      while (!IsTradeAllowed()) Sleep(1000);
      GetLastError();
      l_price_60 = NormalizeDouble(OrderClosePrice(), l_digits_56);
      l_ord_close_48 = OrderClose(a_ticket_8, a_lots_12, l_price_60, a_slippage_24, l_color_28);
      if (l_ord_close_48 && SoundAlert) PlaySound(SoundFileAtOpen);
      if (!(!l_ord_close_48)) break;
      l_error_68 = GetLastError();
      if (WriteLog) Print(StringConcatenate("OrderCloseEx(", OrderTypeToStr(ai_20), ",", DoubleToStr(a_ticket_8, 0), ") error = ", ErrorDescription(l_error_68)));
      li_72 = FALSE;
      switch (l_error_68) {
      case 0/* NO_ERROR */:
         Sleep(10000);
         if (OrderSelect(a_ticket_8, SELECT_BY_TICKET))
            if (OrderCloseTime() == 0) li_72 = TRUE;
         break;
      case 6/* NO_CONNECTION */:
         Sleep(10000);
         if (IsConnected()) li_72 = TRUE;
         break;
      case 128/* TRADE_TIMEOUT */:
         Sleep(70000);
         if (OrderSelect(a_ticket_8, SELECT_BY_TICKET))
            if (OrderCloseTime() == 0) li_72 = TRUE;
         break;
      case 129/* INVALID_PRICE */:
         Sleep(6000);
         l_count_32++;
         if (l_count_32 <= 3) li_72 = TRUE;
         break;
      case 130/* INVALID_STOPS */:
         Sleep(6000);
         l_count_36++;
         if (l_count_36 <= 3) li_72 = TRUE;
         break;
      case 135/* PRICE_CHANGED */:
         li_72 = TRUE;
         break;
      case 136/* OFF_QUOTES */:
         Sleep(6000);
         li_72 = TRUE;
         break;
      case 137/* BROKER_BUSY */:
         Sleep(20000);
         l_count_40++;
         if (l_count_40 <= 3) li_72 = TRUE;
         break;
      case 138/* REQUOTE */:
         l_count_44++;
         if (l_count_44 <= 3) li_72 = TRUE;
         break;
      case 142:
         Sleep(70000);
         if (OrderSelect(a_ticket_8, SELECT_BY_TICKET))
            if (OrderCloseTime() == 0) li_72 = TRUE;
         break;
      case 143:
         Sleep(70000);
         if (OrderSelect(a_ticket_8, SELECT_BY_TICKET))
            if (OrderCloseTime() == 0) li_72 = TRUE;
         break;
      case 145/* TRADE_MODIFY_DENIED */:
         Sleep(20000);
         li_72 = TRUE;
         break;
      case 146/* TRADE_CONTEXT_BUSY */:
         while (IsTradeContextBusy()) Sleep(1000);
         li_72 = TRUE;
         break;
      case 4000/* NO_MQLERROR */:
         Sleep(10000);
         if (OrderSelect(a_ticket_8, SELECT_BY_TICKET))
            if (OrderCloseTime() == 0) li_72 = TRUE;
      }
      if (!(li_72)) break;
   }
   return (l_ord_close_48);
}

int OpenOrder(int ai_0, int ai_4, string as_8, double ad_16, double ad_24 = 0.0) {
   int l_color_36;
   if (ai_0 > 1 && ad_24 <= 0.0) return (-1);
   int l_cmd_32 = ai_0 % 2;
   if (ad_16 < gd_592) ad_16 = gd_592;
   else
      if (ad_16 > gd_584) ad_16 = gd_584;
   if (AccountFreeMarginCheck(g_symbol_696, l_cmd_32, ad_16) <= 0.0 || GetLastError() == 134/* NOT_ENOUGH_MONEY */) {
      Print("OpenOrder: you don\'t have free margin.");
      return (-1);
   }
   if (l_cmd_32 == OP_BUY) l_color_36 = ColorBuy;
   else l_color_36 = ColorSell;
   RefreshRates();
   double ld_40 = NormalizeDouble(MarketInfo(g_symbol_696, MODE_STOPLEVEL) * Point, Digits);
   double ld_48 = NormalizeDouble(Ask, Digits);
   double ld_56 = NormalizeDouble(Bid, Digits);
   switch (ai_0) {
   case 0:
      ad_24 = ld_48;
      break;
   case 1:
      ad_24 = ld_56;
      break;
   case 2:
      if (ad_24 >= ld_48) {
         ad_24 = ld_48;
         ai_0 = 0;
      } else
         if (NormalizeDouble(ld_48 - ad_24, Digits) < ld_40) return (-1);
      break;
   case 3:
      if (ad_24 <= ld_56) {
         ad_24 = ld_56;
         ai_0 = 1;
      } else
         if (NormalizeDouble(ad_24 - ld_56, Digits) < ld_40) return (-1);
      break;
   case 4:
      if (ad_24 <= ld_48) {
         ad_24 = ld_48;
         ai_0 = 0;
      } else
         if (NormalizeDouble(ad_24 - ld_48, Digits) < ld_40) return (-1);
      break;
   case 5:
      if (ad_24 >= ld_56) {
         ad_24 = ld_56;
         ai_0 = 1;
      } else
         if (NormalizeDouble(ld_56 - ad_24, Digits) < ld_40) return (-1);
      break;
   default:
      return (-1);
   }
   int li_68 = OrderSendEx(g_symbol_696, ai_0, ad_16, ad_24, gi_564, 0, 0, as_8, ai_4, 0, l_color_36);
   return (li_68);
}

int OrderSendEx(string a_symbol_0, int a_cmd_8, double a_lots_12, double a_price_20, int a_slippage_28, double a_price_32, double a_price_40, string a_comment_48 = "", int a_magic_56 = 0, int a_datetime_60 = 0, color a_color_64 = -1) {
   int l_ticket_92;
   double l_price_96;
   double l_price_104;
   double ld_112;
   double l_price_120;
   double ld_132;
   int l_error_140;
   bool li_144;
   int l_count_68 = 0;
   int l_count_72 = 0;
   int l_count_76 = 0;
   int l_count_80 = 0;
   int l_count_84 = 0;
   if (a_symbol_0 == "" || a_symbol_0 == "0") a_symbol_0 = g_symbol_696;
   int l_digits_88 = MarketInfo(a_symbol_0, MODE_DIGITS);
   a_price_20 = NormalizeDouble(a_price_20, l_digits_88);
   a_price_32 = NormalizeDouble(a_price_32, l_digits_88);
   a_price_40 = NormalizeDouble(a_price_40, l_digits_88);
   while (true) {
      if (!IsExpertEnabled()) {
         l_ticket_92 = -1;
         break;
      }
      RefreshRates();
      l_price_96 = NormalizeDouble(MarketInfo(a_symbol_0, MODE_ASK), l_digits_88);
      l_price_104 = NormalizeDouble(MarketInfo(a_symbol_0, MODE_BID), l_digits_88);
      ld_112 = NormalizeDouble(MarketInfo(a_symbol_0, MODE_STOPLEVEL) * MarketInfo(a_symbol_0, MODE_POINT), l_digits_88);
      if (a_cmd_8 > OP_SELL) {
         if (a_price_20 <= 0.0) {
            l_ticket_92 = -1;
            break;
         }
         if (a_cmd_8 % 2 == 0) l_price_120 = l_price_96;
         else l_price_120 = l_price_104;
         switch (a_cmd_8) {
         case OP_BUYLIMIT:
         case OP_SELLSTOP:
            ld_132 = NormalizeDouble(l_price_120 - a_price_20, l_digits_88);
            break;
         case OP_BUYSTOP:
         case OP_SELLLIMIT:
            ld_132 = NormalizeDouble(a_price_20 - l_price_120, l_digits_88);
         }
         if (ld_132 < ld_112) {
            if (WriteDebugLog) {
               if (ld_132 < 0.0) Print("OrderSendEx: The position of open price order does not correspond to type of the order.");
               else Print("OrderSendEx: It is impossible to open the order (the open price is near to the current price).");
            }
            l_ticket_92 = -1;
            break;
         }
         if (a_slippage_28 < 0) a_slippage_28 = 0;
      } else {
         if (a_cmd_8 == OP_BUY) {
            if (a_price_20 <= 0.0) a_price_20 = l_price_96;
         } else
            if (a_price_20 <= 0.0) a_price_20 = l_price_104;
         if (a_slippage_28 < 0) a_slippage_28 = gi_564;
      }
      if (a_price_32 != 0.0) {
         if (a_cmd_8 % 2 == 0) ld_132 = NormalizeDouble(a_price_20 - a_price_32, l_digits_88);
         else ld_132 = NormalizeDouble(a_price_32 - a_price_20, l_digits_88);
         if (ld_132 < ld_112) {
            if (WriteDebugLog) {
               if (ld_132 < 0.0) Print("OrderSendEx: The position of stop-loss price order does not correspond to type of the order.");
               else Print("OrderSendEx: It is impossible to open the order (stop-loss is near to the open price).");
            }
            l_ticket_92 = -1;
            break;
         }
      }
      if (a_price_40 != 0.0) {
         if (a_cmd_8 % 2 == 0) ld_132 = NormalizeDouble(a_price_40 - a_price_20, l_digits_88);
         else ld_132 = NormalizeDouble(a_price_20 - a_price_40, l_digits_88);
         if (ld_132 < ld_112) {
            if (WriteDebugLog) {
               if (ld_132 < 0.0) Print("OrderSendEx: The position of take-profit price order does not correspond to type of the order.");
               else Print("OrderSendEx: It is impossible to open the order (take-profit is near to the open price).");
            }
            l_ticket_92 = -1;
            break;
         }
      }
      while (IsTradeContextBusy()) Sleep(1000);
      GetLastError();
      l_ticket_92 = OrderSend(a_symbol_0, a_cmd_8, a_lots_12, a_price_20, a_slippage_28, a_price_32, a_price_40, a_comment_48, a_magic_56, a_datetime_60, a_color_64);
      if (l_ticket_92 > 0 && SoundAlert) PlaySound(SoundFileAtOpen);
      if (l_ticket_92 >= 0) break;
      l_error_140 = GetLastError();
      if (WriteLog) Print(StringConcatenate("OrderSendEx: OrderSend(", OrderTypeToStr(a_cmd_8), ") ", ErrorDescription(l_error_140)));
      li_144 = FALSE;
      switch (l_error_140) {
      case 0/* NO_ERROR */:
         Sleep(10000);
         break;
      case 6/* NO_CONNECTION */:
         Sleep(10000);
         if (IsConnected()) li_144 = TRUE;
         break;
      case 128/* TRADE_TIMEOUT */:
         Sleep(70000);
         break;
      case 129/* INVALID_PRICE */:
         Sleep(6000);
         l_count_68++;
         if (l_count_68 <= 3) li_144 = TRUE;
         break;
      case 130/* INVALID_STOPS */:
         Sleep(6000);
         l_count_72++;
         if (l_count_72 <= 3) li_144 = TRUE;
         break;
      case 134/* NOT_ENOUGH_MONEY */:
         Sleep(6000);
         break;
      case 135/* PRICE_CHANGED */:
         li_144 = TRUE;
         break;
      case 136/* OFF_QUOTES */:
         Sleep(6000);
         li_144 = TRUE;
         break;
      case 137/* BROKER_BUSY */:
         Sleep(20000);
         l_count_76++;
         if (l_count_76 <= 3) li_144 = TRUE;
         break;
      case 138/* REQUOTE */:
         l_count_80++;
         if (l_count_80 <= 3) li_144 = TRUE;
         break;
      case 140/* LONG_POSITIONS_ONLY_ALLOWED */:
         if (a_cmd_8 % 2 == FALSE) li_144 = TRUE;
         break;
      case 142:
         Sleep(70000);
         break;
      case 143:
         Sleep(70000);
         break;
      case 146/* TRADE_CONTEXT_BUSY */:
         while (IsTradeContextBusy()) Sleep(1000);
         li_144 = TRUE;
         break;
      case 147/* ERR_TRADE_EXPIRATION_DENIED */:
         a_datetime_60 = 0;
         li_144 = TRUE;
         break;
      case 4000/* NO_MQLERROR */:
         Sleep(10000);
         break;
      case 4107/* INVALID_PRICE_PARAM */:
         l_count_84++;
         if (l_count_84 <= 3) li_144 = TRUE;
         break;
      case 4110/* LONGS__NOT_ALLOWED */:
         if (a_cmd_8 % 2 == TRUE) li_144 = TRUE;
         break;
      case 4111/* SHORTS_NOT_ALLOWED */:
         if (a_cmd_8 % 2 == FALSE) li_144 = TRUE;
      }
      if (!(li_144)) break;
   }
   return (l_ticket_92);
}

void WatchOrderLevels(double ad_0, double ad_8, int a_magic_16) {
   double ld_28;
   double ld_36;
   int l_cmd_44;
   double ld_48;
   if (ad_0 <= 0.0 && ad_8 >= 0.0) return;
   int li_20 = OrdersTotal() - 1;
   for (int l_pos_24 = li_20; l_pos_24 >= 0; l_pos_24--) {
      if (!OrderSelect(l_pos_24, SELECT_BY_POS, MODE_TRADES)) {
         if (WriteLog) Print(StringConcatenate("WatchOrderLevels: OrderSelect() error = ", ErrorDescription(GetLastError())));
      } else {
         if (OrderMagicNumber() == a_magic_16) {
            if (OrderType() <= OP_SELL) {
               if (OrderSymbol() == g_symbol_696) {
                  ld_28 = NormalizeDouble(OrderClosePrice(), Digits);
                  ld_36 = NormalizeDouble(OrderOpenPrice(), Digits);
                  l_cmd_44 = OrderType();
                  if (l_cmd_44 == OP_BUY) ld_48 = NormalizeDouble(ld_28 - ld_36, Digits);
                  else ld_48 = NormalizeDouble(ld_36 - ld_28, Digits);
                  if (ad_0 > 0.0 && ld_48 >= ad_0) {
                     if (WriteDebugLog) Print("WatchOrderLevels: close order by stealth t/p.");
                     OrderCloseEx("WatchLevels", OrderTicket(), OrderLots(), l_cmd_44, gi_564);
                  } else {
                     if (ad_8 < 0.0 && ld_48 <= ad_8) {
                        if (WriteDebugLog) Print("WatchOrderLevels: close order by stealth s/l.");
                        OrderCloseEx("WatchLevels", OrderTicket(), OrderLots(), l_cmd_44, gi_564);
                     }
                  }
               }
            }
         }
      }
   }
}

void SetOrderLevels(double ad_0, double ad_8, int a_magic_16) {
   int l_cmd_36;
   double ld_40;
   double ld_48;
   double ld_56;
   double ld_64;
   bool li_72;
   double ld_76;
   bool li_84;
   double ld_88;
   int l_color_96;
   double ld_20 = NormalizeDouble(MarketInfo(g_symbol_696, MODE_STOPLEVEL) * Point, Digits);
   int li_28 = OrdersTotal() - 1;
   for (int l_pos_32 = li_28; l_pos_32 >= 0; l_pos_32--) {
      if (!OrderSelect(l_pos_32, SELECT_BY_POS, MODE_TRADES)) {
         if (WriteLog) Print(StringConcatenate("SetOrderLevels: OrderSelect() error = ", ErrorDescription(GetLastError())));
      } else {
         if (OrderMagicNumber() == a_magic_16) {
            if (OrderSymbol() == g_symbol_696) {
               l_cmd_36 = OrderType();
               ld_40 = NormalizeDouble(OrderClosePrice(), Digits);
               ld_48 = NormalizeDouble(OrderOpenPrice(), Digits);
               if (l_cmd_36 > OP_SELL)
                  if (NormalizeDouble(MathAbs(ld_48 - ld_40), Digits) <= ld_20) continue;
               ld_56 = NormalizeDouble(OrderStopLoss(), Digits);
               ld_64 = NormalizeDouble(OrderTakeProfit(), Digits);
               li_72 = FALSE;
               if (ld_56 == 0.0) {
                  if (ad_8 < 0.0) {
                     if (l_cmd_36 % 2 == 0) {
                        ld_76 = NormalizeDouble(ld_48 + ad_8, Digits);
                        if (l_cmd_36 == OP_BUY) {
                           if (NormalizeDouble(ld_40 - ld_76, Digits) > ld_20) li_72 = TRUE;
                           else ld_76 = ld_56;
                        } else li_72 = TRUE;
                     } else {
                        ld_76 = NormalizeDouble(ld_48 - ad_8, Digits);
                        if (l_cmd_36 == OP_SELL) {
                           if (NormalizeDouble(ld_76 - ld_40, Digits) > ld_20) li_72 = TRUE;
                           else ld_76 = ld_56;
                        } else li_72 = TRUE;
                     }
                  } else ld_76 = ld_56;
               } else ld_76 = ld_56;
               li_84 = FALSE;
               if (ld_64 == 0.0) {
                  if (ad_0 > 0.0) {
                     if (l_cmd_36 % 2 == 0) {
                        ld_88 = NormalizeDouble(ld_48 + ad_0, Digits);
                        if (l_cmd_36 == OP_BUY) {
                           if (NormalizeDouble(ld_88 - ld_40, Digits) > ld_20) li_84 = TRUE;
                           else ld_88 = ld_64;
                        } else li_84 = TRUE;
                     } else {
                        ld_88 = NormalizeDouble(ld_48 - ad_0, Digits);
                        if (l_cmd_36 == OP_SELL) {
                           if (NormalizeDouble(ld_40 - ld_88, Digits) > ld_20) li_84 = TRUE;
                           else ld_88 = ld_64;
                        } else li_84 = TRUE;
                     }
                  } else ld_88 = ld_64;
               } else ld_88 = ld_64;
               if (li_72 || li_84) {
                  if (l_cmd_36 % 2 == 0) l_color_96 = ColorBuy;
                  else l_color_96 = ColorSell;
                  OrderModifyEx(OrderTicket(), ld_48, ld_76, ld_88, 0, l_color_96);
               }
            }
         }
      }
   }
}

int AutoGMTCalculation() {
   string ls_8;
   int li_ret_16;
   int li_20;
   gi_720 = InternetOpenA(gs_712, 0, "0", "0", 0);
   string ls_0 = "XXXXXXXXXX";
   if (!GetData(gs_704, ls_0)) {
      ls_8 = "Error getting data to server.";
      Comment(ls_8);
      Print(ls_8);
      li_ret_16 = -2147483648;
   } else {
      li_20 = TimeCurrent() - StrToInteger(ls_0);
      li_ret_16 = MathFloor((li_20 + 1800) / 3600.0);
   }
   InternetCloseHandle(gi_720);
   return (li_ret_16);
}

bool GetData(string as_0, string &as_8) {
   int li_16 = InternetOpenUrlA(gi_720, as_0, "0", 0, -2080374528, 0);
   if (li_16 == 0) return (FALSE);
   int lia_20[] = {1};
   string ls_24 = "xxxxxxxxxx";
   int li_32 = InternetReadFile(li_16, ls_24, 10, lia_20);
   if (li_16 != 0) InternetCloseHandle(li_16);
   as_8 = ls_24;
   return (TRUE);
}

int PrintInformation() {
   string ls_0;
   string ls_8;
   string ls_16;
   string l_dbl2str_24;
   string l_dbl2str_32;
   int l_bool_40;
   int li_44;
   int l_bool_48;
//   if (gi_96 == 1) 
	{
      if (IsDemo()) ls_0 = "Demo";
      else ls_0 = "Real";
      ls_8 = TimeToStr(TimeCurrent()) + " " + gsa_124[DayOfWeek()];
      ls_16 = TimeToStr(gi_764) + " " + gsa_124[g_day_of_week_768];
      l_dbl2str_24 = DoubleToStr(gd_672 / gd_576, 1);
      l_dbl2str_32 = DoubleToStr(NormalizeDouble(Ask - Bid, Digits) / gd_576, 1);
      l_bool_40 = StealthMode;
      li_44 = gi_272;
      l_bool_48 = UseMM;
      g_str_concat_772 = StringConcatenate("\nFapTurbo Ichimoku\n" + "www.fapturbo.com\n\n" + "Validation status: " + gs_80 
      + "\n", "-------------------------------------------------\n");
      Comment(StringConcatenate(g_str_concat_772, "Broker Date/Time = " + ls_8 
         + "\n", g_str_concat_736, "GMT Date/Time   = " + ls_16 
         + "\n", "-------------------------------------------------\n", "SETTINGS:\n", "Trading Mode = " + gs_752 
         + "\n", "TakeProfit = " + TakeProfit 
         + "\n", "StopLoss = " + StopLoss 
         + "\n", "StealthMode = " + gsa_128[l_bool_40] 
         + "\n", "StartTime = " + StartWorkTimeHour + ":00\n", "EndTime = " + EndWorkTimeHour + ":00\n", "TradeFriday = " + TradeFriday 
         + "\n", "UseNoiseFilter = " + gsa_128[li_44] 
         + "\n", "Lots = " + Lots 
         + "\n", "UseMM = " + gsa_128[l_bool_48] 
         + "\n", "LotsRiskReductor = " + LotsRiskReductor 
         + "\n", "MaxLots = " + MaxLots 
         + "\n", "MaxSpread = " + l_dbl2str_24 
         + "\n", "Current Spread = " + l_dbl2str_32 
         + "\n", "MagicNumber = " + MagicNumber 
         + "\n", "ExpertComment = " + ExpertComment 
         + "\n", "------------------------------------------------\n", "ACCOUNT INFORMATIONS:", 
         "\n", "Account Number = " + AccountNumber() 
         + "\n", "Account Type = " + ls_0 
         + "\n", "Balance = " + DoubleToStr(AccountBalance(), 2) 
         + "\n", "Equity = " + DoubleToStr(AccountEquity(), 2) 
         + "\n", "Free Margin = " + DoubleToStr(AccountFreeMargin(), 2) 
         + "\n", "Used Margin = " + DoubleToStr(AccountMargin(), 2) 
      + "\n", "------------------------------------------------"));
   }
/*   else {
      Comment("\nFapTurbo Ichimoku\n" + "www.fapturbo.com" 
      + "\n\n" + "Validation Status: " + gs_80);
   }
*/   
   return (0);
}

int SetVariables() {
   if (DownloadBestSettings) {
      TakeProfit = gda_76[6];
      StopLoss = gda_76[7];
      StartWorkTimeHour = gda_76[22];
      EndWorkTimeHour = gda_76[23];
      TradeFriday = gda_76[35];
   }
   gi_172 = gda_76[0];
   gi_176 = gda_76[1];
   g_timeframe_180 = gda_76[2];
   gi_184 = gda_76[3];
   gi_188 = gda_76[4];
   gi_192 = gda_76[5];
   gi_280 = gda_76[8];
   gi_284 = gda_76[9];
   gi_288 = gda_76[10];
   g_period_292 = gda_76[11];
   gi_424 = gda_76[12];
   gi_428 = gda_76[13];
   gi_432 = gda_76[14];
   gi_436 = gda_76[15];
   gi_440 = gda_76[16];
   gi_444 = gda_76[17];
   gi_448 = gda_76[18];
   gi_452 = gda_76[19];
   gi_456 = gda_76[20];
   gi_460 = gda_76[21];
   gi_260 = gda_76[25];
   gi_264 = gda_76[26];
   gi_268 = gda_76[27];
   gi_272 = gda_76[28];
   gi_276 = gda_76[29];
   g_applied_price_296 = gda_76[30];
   g_ma_method_300 = gda_76[31];
   gi_304 = gda_76[32];
   gd_308 = gda_76[33];
   gi_316 = gda_76[34];
   gi_340 = gda_76[36];
   g_period_344 = gda_76[37];
   g_applied_price_348 = gda_76[38];
   g_ma_method_352 = gda_76[39];
   for (int l_index_0 = 0; l_index_0 < 7; l_index_0++) gba_112[l_index_0] = gda_76[l_index_0 + 40];
   gi_116 = gda_76[47];
   return (1);
}

int Authentication() 
{
//   gi_96 = FAPTAuth(gda_76, EMail, ClickbankReceipt, Symbol(), gs_752, IsDemo(), AccountNumber());
   if (gi_96 == -1) {
      gs_80 = "Authentication Failed [Invalid Internet Connection]\n[Trades are not available]";
      return (-1);
   }
   if (gi_96 == -2) {
      gs_80 = "Authentication Failed [Invalid Internet Connection]\n[Trades are not available]";
      return (-2);
   }
   if (gi_96 == 0 || gi_96 == -3) {
      gs_80 = "Authentication Failed [Wrong E-Mail or ClickbankReceipt]\n[Trades are not available]";
      return (-3);
   }
   if (gi_96 == -7) {
      gs_80 = "BANNED: You have refunded your FapTurbo purchase!!\nPlease contact out support in order to purchase a new licence.\n[Trades are not available]";
      return (-7);
   }
   if (gi_96 == -6) {
      gs_80 = "Authentication Failed - You have not yet registered your Live Account#\nKindly contact support to do so!\n[Trades are not available]";
      return (-6);
   }
   if (gi_96 == -4) {
      gs_80 = "Authentication Failed [Invalid Real Money Account Number]\n[Trades are not available]";
      return (-4);
   }
   if (gi_96 == -9) {
      gs_80 = "Authentication Failed [Empty/Invalid Email or CBreceipt#]\n[Trades are not available]";
      return (-9);
   }
   if (gi_96 == -10) {
      gs_80 = "Authentication Failed [Invalid Email or CBreceipt#]\n[Trades are not available]";
      return (-10);
   }
   if (gi_96 == -8) {
      gs_80 = "You have dropped the robot onto the Wrong Pair or Symbol\n[Trades are not available]";
      return (-8);
   }
   if (gi_96 == 1) {
      SetVariables();
      gs_80 = "Authenticated [Trades are available]\nThank you for joining FapTurbo!";
      return (1);
   }
   return (0);
}

int Rand(int ai_0) {
   MathSrand(TimeLocal());
   return (MathRand() % ai_0);
}