/*
   Generated by EX4-TO-MQ4 decompiler V4.0.220.2 []
   Website: http://purebeam.biz
   E-mail : purebeam@gmail.com
*/
#property copyright "Copyright © 2011, P-Zig LLC."
#property link      "http://www.simpleforextester.com"

#include <WinUser32.mqh>
#include <stdlib.mqh>

#import "commlink.dll"
   int setupSocket(int a0);
   int acceptSocket(int a0);
   int socketCleanup(int a0, int a1);
   string mt4Recv(int a0);
   int mt4Send(string a0, int a1);
   void mt4Sleep(int a0);
   int runProcess(string a0, int a1);
#import

int gi_76;
int gi_80;
int g_ticket_84 = -1;
int g_ord_total_88 = 0;
int g_hist_total_92 = 0;
int gi_96 = 0;
int g_pos_100 = 0;
extern string lbl1 = "Simple Forex Tester";
extern string lbl2 = " -- Test your manual forex systems";
extern string lbl3 = " -- Multiple Timeframe Settings --";
extern bool UseMultiTimeframe = TRUE;
extern string lbl4 = " -- Custom Timeframe Settings --";
extern bool UseCustomTimeframe = FALSE;
extern int PeriodToConvert = 3;
bool gi_148 = TRUE;
int gi_152 = 22344;
int gi_156 = 23000;
int gi_unused_160 = 32432;
bool gi_164 = TRUE;
int gi_unused_168 = 5000;
int g_ticket_172 = 20;
string gs_176 = "";
bool gi_184 = TRUE;
bool gi_unused_188 = FALSE;
bool gi_192 = TRUE;
int gi_unused_196 = -1;
int g_window_200 = 0;
int gi_204 = 12;
int gi_208 = 65535;
int gi_212 = 12;
int gi_216 = 65535;
int g_corner_220 = 1;
int gi_224 = 10;
int gi_228 = 16777215;
int gi_232 = 0;
int g_file_236 = -1;
bool gi_240 = TRUE;
bool gi_244 = TRUE;
int gi_248 = 0;
int gi_252;
int gi_256;
int gi_260;
datetime g_time_264;
int gi_268;
int gi_272;
double gd_276;
double g_low_284;
double g_high_292;
double g_close_300;
double gd_308;
double gd_316;
int gi_324 = 0;
int gi_328 = 400;
string gs_332;
string gs_340;
int g_timeframe_348;
int g_digits_352;
int gia_356[13];
int gia_360[10][5];
int g_file_364 = -1;

void setWindow() {
   g_window_200 = WindowFind("Heads Up Display Window");
   if (g_window_200 < 0) g_window_200 = 0;
   if (gi_232 != g_window_200) ObjectsDeleteAll(0);
   gi_232 = g_window_200;
}

void drawHUD() {
   if (g_window_200 == 0) {
      setHUD("BidLbl", "Bid: " + DoubleToStr(Bid, Digits), gi_204, gi_208, 20, 30);
      setHUD("AskLbl", "Ask: " + DoubleToStr(Ask, Digits), gi_212, gi_216, 20, 50);
      setHUD("TimeLbl", "Current Time: " + TimeToStr(TimeCurrent(), TIME_MINUTES|TIME_SECONDS), gi_224, gi_228, 20, 100);
      setHUD("DateLbl", "Current Date: " + TimeToStr(TimeCurrent(), TIME_DATE), gi_224, gi_228, 20, 115);
      setHUD("WeekLbl", "Day Of Week: " + stringDayOfWeek(TimeDayOfWeek(TimeCurrent())), gi_224, gi_228, 20, 130);
      setHUD("BalanceLbl", "Account Balance: " + DoubleToStr(AccountBalance(), 2), gi_224, gi_228, 20, 160);
      setHUD("EquityLbl", "Account Equity: " + DoubleToStr(AccountEquity(), 2), gi_224, gi_228, 20, 175);
      setHUD("MarginLbl", "Free Margin: " + DoubleToStr(AccountFreeMargin(), 2), gi_224, gi_228, 20, 190);
      setHUD("OpenLbl", "Open Orders: " + totalOpenOrders(), gi_224, gi_228, 20, 220);
      setHUD("OpenProfitLbl", "Open Order Profit: " + DoubleToStr(totalOrderProfit(), 2), gi_224, gi_228, 20, 235);
      setHUD("CloseLbl", "Closed Orders: " + totalCloseOrders(), gi_224, gi_228, 20, 265);
      setHUD("CloseProfitLbl", "Closed Order Profit: " + DoubleToStr(totalCloseProfit(), 2), gi_224, gi_228, 20, 280);
      setHUD("PendLbl", "Pending Orders: " + totalPendOrders(), gi_224, gi_228, 20, 310);
      return;
   }
   setHUD("BidLbl", "Bid: " + DoubleToStr(Bid, Digits), gi_204, gi_208, 760, 50);
   setHUD("AskLbl", "Ask: " + DoubleToStr(Ask, Digits), gi_212, gi_216, 760, 70);
   setHUD("TimeLbl", "Current Time: " + TimeToStr(TimeCurrent(), TIME_MINUTES|TIME_SECONDS), gi_224, gi_228, 570, 35);
   setHUD("DateLbl", "Current Date: " + TimeToStr(TimeCurrent(), TIME_DATE), gi_224, gi_228, 570, 55);
   setHUD("WeekLbl", "Day Of Week: " + stringDayOfWeek(TimeDayOfWeek(TimeCurrent())), gi_224, gi_228, 570, 75);
   setHUD("BalanceLbl", "Account Balance: " + DoubleToStr(AccountBalance(), 2), gi_224, gi_228, 400, 35);
   setHUD("EquityLbl", "Account Equity: " + DoubleToStr(AccountEquity(), 2), gi_224, gi_228, 400, 55);
   setHUD("MarginLbl", "Free Margin: " + DoubleToStr(AccountFreeMargin(), 2), gi_224, gi_228, 400, 75);
   setHUD("OpenLbl", "Open Orders: " + totalOpenOrders(), gi_224, gi_228, 230, 35);
   setHUD("OpenProfitLbl", "Open Order Profit: " + DoubleToStr(totalOrderProfit(), 2), gi_224, gi_228, 230, 55);
   setHUD("PendLbl", "Pending Orders: " + totalPendOrders(), gi_224, gi_228, 230, 75);
   setHUD("CloseLbl", "Closed Orders: " + totalCloseOrders(), gi_224, gi_228, 50, 50);
   setHUD("CloseProfitLbl", "Closed Order Profit: " + DoubleToStr(totalCloseProfit(), 2), gi_224, gi_228, 50, 70);
}

int totalOpenOrders() {
   int l_count_0 = 0;
   for (int l_pos_4 = 0; l_pos_4 < OrdersTotal(); l_pos_4++) {
      OrderSelect(l_pos_4, SELECT_BY_POS, MODE_TRADES);
      if (OrderType() == OP_BUY || OrderType() == OP_SELL) l_count_0++;
   }
   return (l_count_0);
}

int totalPendOrders() {
   int l_count_0 = 0;
   for (int l_pos_4 = 0; l_pos_4 < OrdersTotal(); l_pos_4++) {
      OrderSelect(l_pos_4, SELECT_BY_POS, MODE_TRADES);
      if (OrderType() == OP_BUY || OrderType() == OP_SELL) continue;
      l_count_0++;
   }
   return (l_count_0);
}

int totalCloseOrders() {
   int l_count_0 = 0;
   for (int l_pos_4 = 0; l_pos_4 < OrdersHistoryTotal(); l_pos_4++) {
      OrderSelect(l_pos_4, SELECT_BY_POS, MODE_HISTORY);
      if (OrderType() == OP_BUY || OrderType() == OP_SELL) l_count_0++;
   }
   return (l_count_0);
}

double totalOrderProfit() {
   double ld_ret_0 = 0;
   for (int l_pos_8 = 0; l_pos_8 < OrdersTotal(); l_pos_8++) {
      OrderSelect(l_pos_8, SELECT_BY_POS, MODE_TRADES);
      if (OrderType() == OP_BUY || OrderType() == OP_SELL) {
         ld_ret_0 += OrderProfit();
         ld_ret_0 += OrderSwap();
      }
   }
   return (ld_ret_0);
}

int totalCloseProfit() {
   double ld_ret_0 = 0;
   for (int l_pos_8 = 0; l_pos_8 < OrdersHistoryTotal(); l_pos_8++) {
      OrderSelect(l_pos_8, SELECT_BY_POS, MODE_HISTORY);
      if (OrderType() == OP_BUY || OrderType() == OP_SELL) {
         ld_ret_0 += OrderProfit();
         ld_ret_0 += OrderSwap();
      }
   }
   return (ld_ret_0);
}

string stringDayOfWeek(int ai_0) {
   if (ai_0 == 0) return ("Sunday");
   else {
      if (ai_0 == 1) return ("Monday");
      else {
         if (ai_0 == 2) return ("Tuesday");
         else {
            if (ai_0 == 3) return ("Wednesday");
            else {
               if (ai_0 == 4) return ("Thursday");
               else {
                  if (ai_0 == 5) return ("Friday");
                  else
                     if (ai_0 == 6) return ("Saturday");
               }
            }
         }
      }
   }
   return ("");
}

void setHUD(string a_name_0, string a_text_8, int a_fontsize_16, color a_color_20, int a_x_24, int a_y_28) {
   if (ObjectFind(a_name_0) != g_window_200) {
      ObjectCreate(a_name_0, OBJ_LABEL, g_window_200, 0, 0);
      ObjectSet(a_name_0, OBJPROP_XDISTANCE, a_x_24);
      ObjectSet(a_name_0, OBJPROP_YDISTANCE, a_y_28);
      ObjectSet(a_name_0, OBJPROP_CORNER, g_corner_220);
   }
   ObjectSetText(a_name_0, a_text_8, a_fontsize_16, "Tahoma", a_color_20);
}

int init() {
   string ls_0;
   if (!IsTesting()) return (-1);
   ArrayInitialize(gia_360, 0);
   if (gi_148) {
      gi_76 = setupSocket(gi_152);
      if (gi_76 == -1) {
         Alert("Invalid socket!");
         return (0);
      }
      if (gi_76 == -2) {
         for (int li_8 = gi_152; li_8 < gi_156; li_8++) {
            Print("Unable to bind to port " + li_8 + "! Must be used by something else...");
            gi_76 = setupSocket(li_8);
            if (gi_76 == -1) {
               Alert("Invalid socket!");
               return (0);
            }
            if (gi_76 != -2) {
               if (gi_76 == -3) {
                  Alert("Unable to listen on socket! Exiting...");
                  return (0);
               }
               Print("Socket Set up! Socket #" + gi_76 + "...Connect now!");
               ls_0 = TerminalPath() + "\\SimpleFXTester.exe";
               runProcess(ls_0, li_8);
               gi_80 = acceptSocket(gi_76);
               Print("Sending info...--+THEINFO~" + Symbol() + "~" + retMyTimeframe());
               sendInfo("+THEINFO~" + Symbol() + "~" + retMyTimeframe(), gi_80);
               break;
            }
         }
         return (0);
      }
      if (gi_76 == -3) {
         Alert("Unable to listen on socket! Exiting...");
         return (0);
      }
      Print("Socket Set up! Socket #" + gi_76 + "...Connect now!");
      ls_0 = TerminalPath() + "\\SimpleFXTester.exe";
      runProcess(ls_0, gi_152);
      gi_80 = acceptSocket(gi_76);
      Print("Sending info...--+THEINFO~" + Symbol() + "~" + retMyTimeframe());
      sendInfo("+THEINFO~" + Symbol() + "~" + retMyTimeframe(), gi_80);
   }
   return (0);
}

string retMyTimeframe() {
   if (Period() == PERIOD_M1) return ("M1");
   if (Period() == PERIOD_M5) return ("M5");
   if (Period() == PERIOD_M15) return ("M15");
   if (Period() == PERIOD_M30) return ("M30");
   if (Period() == PERIOD_H1) return ("H1");
   if (Period() == PERIOD_H4) return ("H4");
   if (Period() == PERIOD_D1) return ("D1");
   return ("");
}

int deinit() {
   socketCleanup(gi_76, gi_80);
   return (0);
}

int start() {
   if (!IsTesting()) Comment("You MUST Run Simple Forex Tester In Strategy Tester!\n\nShutting down...");
   GlobalVariableSet("SFXT_TICK", Bid);
   if (!gi_184) return (0);
   if (UseMultiTimeframe) updateMultiTimeframes();
   if (UseCustomTimeframe) updateCustomTimeframe();
   if (gi_192) dHUD();
   else eraseHUD();
   clearGlobalVars();
   if (g_ord_total_88 != OrdersTotal()) {
      g_ord_total_88 = OrdersTotal();
      sendAllOrders();
   }
   if (gi_96 != tPend()) {
      gi_96 = tPend();
      sendAllOrders();
   }
   recvFirst();
   sendQuotes();
   checkClosed();
   manageTrades();
   return (0);
}

void updateCustomTimeframe() {
   if (gi_244) {
      gi_244 = FALSE;
      moveTFCustom();
      return;
   }
   int li_0 = TimeLocal() - 5;
   int l_datetime_4 = TimeLocal();
   g_time_264 = Time[0];
   FileSeek(g_file_364, gi_268, SEEK_SET);
   if (g_time_264 < gi_260 + gi_272) {
      gd_308 += Volume[0] - gd_316;
      gd_316 = Volume[0];
      if (Low[0] < g_low_284) g_low_284 = Low[0];
      if (High[0] > g_high_292) g_high_292 = High[0];
      g_close_300 = Close[0];
   } else {
      gd_308 += Volume[1] - gd_316;
      if (Low[1] < g_low_284) g_low_284 = Low[1];
      if (High[1] > g_high_292) g_high_292 = High[1];
      FileWriteInteger(g_file_364, gi_260, LONG_VALUE);
      FileWriteDouble(g_file_364, gd_276, DOUBLE_VALUE);
      FileWriteDouble(g_file_364, g_low_284, DOUBLE_VALUE);
      FileWriteDouble(g_file_364, g_high_292, DOUBLE_VALUE);
      FileWriteDouble(g_file_364, g_close_300, DOUBLE_VALUE);
      FileWriteDouble(g_file_364, gd_308, DOUBLE_VALUE);
      gi_268 = FileTell(g_file_364);
      gi_260 = g_time_264 / gi_272;
      gi_260 *= gi_272;
      gd_276 = Open[0];
      g_low_284 = Low[0];
      g_high_292 = High[0];
      g_close_300 = Close[0];
      gd_308 = Volume[0];
      gd_316 = gd_308;
   }
   FileWriteInteger(g_file_364, gi_260, LONG_VALUE);
   FileWriteDouble(g_file_364, gd_276, DOUBLE_VALUE);
   FileWriteDouble(g_file_364, g_low_284, DOUBLE_VALUE);
   FileWriteDouble(g_file_364, g_high_292, DOUBLE_VALUE);
   FileWriteDouble(g_file_364, g_close_300, DOUBLE_VALUE);
   FileWriteDouble(g_file_364, gd_308, DOUBLE_VALUE);
   FileFlush(g_file_364);
   if (gi_248 == 0) {
      gi_248 = WindowHandle(Symbol() + "_tst", g_timeframe_348);
      if (gi_248 != 0) {
         Print("Custom chart window detected!");
         moveTFCustom();
      }
   }
   if (gi_248 != 0) {
      PostMessageA(gi_248, WM_COMMAND, 33324, 0);
      li_0 = l_datetime_4;
   }
}

void updateMultiTimeframes() {
   string l_str_concat_4;
   int li_0 = WindowHandle(Symbol(), 0);
   if (gi_240) {
      l_str_concat_4 = "\n\n === Simple Forex Tester ===\nBuilding multiple timeframes - please wait...\n\n";
      gi_240 = FALSE;
      l_str_concat_4 = StringConcatenate(l_str_concat_4, "Building 1 minute timeframe...");
      Comment(l_str_concat_4);
      PostMessageA(li_0, WM_COMMAND, 33324, 0);
      moveTF(PERIOD_M1, 0);
      l_str_concat_4 = StringConcatenate(l_str_concat_4, "DONE!\nBuilding 5 minute timeframe...");
      Comment(l_str_concat_4);
      PostMessageA(li_0, WM_COMMAND, 33324, 0);
      moveTF(PERIOD_M5, 1);
      l_str_concat_4 = StringConcatenate(l_str_concat_4, "DONE!\nBuilding 15 minute timeframe...");
      Comment(l_str_concat_4);
      PostMessageA(li_0, WM_COMMAND, 33324, 0);
      moveTF(PERIOD_M15, 2);
      l_str_concat_4 = StringConcatenate(l_str_concat_4, "DONE!\nBuilding 30 minute timeframe...");
      Comment(l_str_concat_4);
      PostMessageA(li_0, WM_COMMAND, 33324, 0);
      moveTF(PERIOD_M30, 3);
      l_str_concat_4 = StringConcatenate(l_str_concat_4, "DONE!\nBuilding hourly timeframe...");
      Comment(l_str_concat_4);
      PostMessageA(li_0, WM_COMMAND, 33324, 0);
      moveTF(PERIOD_H1, 4);
      l_str_concat_4 = StringConcatenate(l_str_concat_4, "DONE!\nBuilding 4 hour timeframe...");
      Comment(l_str_concat_4);
      PostMessageA(li_0, WM_COMMAND, 33324, 0);
      moveTF(PERIOD_H4, 5);
      l_str_concat_4 = StringConcatenate(l_str_concat_4, "DONE!\nBuilding daily timeframe...");
      Comment(l_str_concat_4);
      PostMessageA(li_0, WM_COMMAND, 33324, 0);
      moveTF(PERIOD_D1, 6);
      l_str_concat_4 = StringConcatenate(l_str_concat_4, "DONE!\nBuilding weekly timeframe...");
      Comment(l_str_concat_4);
      PostMessageA(li_0, WM_COMMAND, 33324, 0);
      moveTF(PERIOD_W1, 7);
      l_str_concat_4 = StringConcatenate(l_str_concat_4, "DONE!\nBuilding monthly timeframe...");
      Comment(l_str_concat_4);
      PostMessageA(li_0, WM_COMMAND, 33324, 0);
      moveTF(PERIOD_MN1, 8);
      Comment("");
      PostMessageA(li_0, WM_COMMAND, 33324, 0);
      return;
   }
   refreshHwnd(PERIOD_M1, gia_360, 0);
   refreshHwnd(PERIOD_M5, gia_360, 1);
   refreshHwnd(PERIOD_M15, gia_360, 2);
   refreshHwnd(PERIOD_M30, gia_360, 3);
   refreshHwnd(PERIOD_H1, gia_360, 4);
   refreshHwnd(PERIOD_H4, gia_360, 5);
   refreshHwnd(PERIOD_D1, gia_360, 6);
   refreshHwnd(PERIOD_W1, gia_360, 7);
   refreshHwnd(PERIOD_MN1, gia_360, 8);
}

void refreshHwnd(int a_timeframe_0, int &aia_4[10][5], int ai_8) {
   if (aia_4[ai_8][0] == 0) {
      aia_4[ai_8][0] = WindowHandle(Symbol() + "_tst", a_timeframe_0);
      if (aia_4[ai_8][0] != 0) {
         Print("Chart window detected (On period " + a_timeframe_0 + ")");
         moveTF(a_timeframe_0, ai_8);
      }
   } else {
      aia_4[ai_8][0] = WindowHandle(Symbol() + "_tst", a_timeframe_0);
      if (aia_4[ai_8][0] == 0) Print("Chart window period " + a_timeframe_0 + " has been closed!");
   }
   if (aia_4[ai_8][0] != 0) {
      updateMissingInfo(a_timeframe_0, ai_8);
      PostMessageA(aia_4[ai_8][0], WM_COMMAND, 33324, 0);
   }
}

void updateMissingInfo(int a_timeframe_0, int ai_4) {
   FileSeek(gia_360[ai_4][1], gia_360[ai_4][2], SEEK_SET);
   if (gia_360[ai_4][3] != iBars(Symbol(), a_timeframe_0)) {
      gia_360[ai_4][3] = iBars(Symbol(), a_timeframe_0);
      FileWriteInteger(gia_360[ai_4][1], iTime(Symbol(), a_timeframe_0, 1), LONG_VALUE);
      FileWriteDouble(gia_360[ai_4][1], iOpen(Symbol(), a_timeframe_0, 1), DOUBLE_VALUE);
      FileWriteDouble(gia_360[ai_4][1], iLow(Symbol(), a_timeframe_0, 1), DOUBLE_VALUE);
      FileWriteDouble(gia_360[ai_4][1], iHigh(Symbol(), a_timeframe_0, 1), DOUBLE_VALUE);
      FileWriteDouble(gia_360[ai_4][1], iClose(Symbol(), a_timeframe_0, 1), DOUBLE_VALUE);
      FileWriteDouble(gia_360[ai_4][1], iVolume(Symbol(), a_timeframe_0, 1), DOUBLE_VALUE);
      gia_360[ai_4][2] = FileTell(gia_360[ai_4][1]);
   }
   FileWriteInteger(gia_360[ai_4][1], iTime(Symbol(), a_timeframe_0, 0), LONG_VALUE);
   FileWriteDouble(gia_360[ai_4][1], iOpen(Symbol(), a_timeframe_0, 0), DOUBLE_VALUE);
   FileWriteDouble(gia_360[ai_4][1], iLow(Symbol(), a_timeframe_0, 0), DOUBLE_VALUE);
   FileWriteDouble(gia_360[ai_4][1], iHigh(Symbol(), a_timeframe_0, 0), DOUBLE_VALUE);
   FileWriteDouble(gia_360[ai_4][1], iClose(Symbol(), a_timeframe_0, 0), DOUBLE_VALUE);
   FileWriteDouble(gia_360[ai_4][1], iVolume(Symbol(), a_timeframe_0, 0), DOUBLE_VALUE);
   FileFlush(gia_360[ai_4][1]);
}

void moveTFCustom() {
   gs_340 = Symbol() + "_tst";
   g_timeframe_348 = Period() * PeriodToConvert;
   g_digits_352 = Digits;
   g_file_364 = FileOpenHistory(gs_340 + g_timeframe_348 + ".hst", FILE_BIN|FILE_WRITE);
   if (g_file_364 >= 0) {
      gs_332 = "(C)opyright 2003, MetaQuotes Software Corp.";
      FileWriteInteger(g_file_364, gi_328, LONG_VALUE);
      FileWriteString(g_file_364, gs_332, 64);
      FileWriteString(g_file_364, gs_340, 12);
      FileWriteInteger(g_file_364, g_timeframe_348, LONG_VALUE);
      FileWriteInteger(g_file_364, g_digits_352, LONG_VALUE);
      FileWriteInteger(g_file_364, 0, LONG_VALUE);
      FileWriteInteger(g_file_364, 0, LONG_VALUE);
      FileWriteArray(g_file_364, gia_356, 0, 13);
      gi_272 = 60 * g_timeframe_348;
      gi_256 = Bars - 1;
      gd_276 = Open[gi_256];
      g_low_284 = Low[gi_256];
      g_high_292 = High[gi_256];
      gd_308 = Volume[gi_256];
      gi_260 = Time[gi_256] / gi_272;
      gi_260 *= gi_272;
      for (gi_252 = gi_256 - 1; gi_252 >= 0; gi_252--) {
         g_time_264 = Time[gi_252];
         if (gi_252 == 0)
            if (RefreshRates()) gi_252 = iBarShift(NULL, 0, g_time_264);
         if (g_time_264 >= gi_260 + gi_272 || gi_252 == 0) {
            if (gi_252 == 0 && g_time_264 < gi_260 + gi_272) {
               gd_308 += Volume[0];
               if (Low[0] < g_low_284) g_low_284 = Low[0];
               if (High[0] > g_high_292) g_high_292 = High[0];
               g_close_300 = Close[0];
            }
            gi_268 = FileTell(g_file_364);
            gd_316 = Volume[gi_252];
            FileWriteInteger(g_file_364, gi_260, LONG_VALUE);
            FileWriteDouble(g_file_364, gd_276, DOUBLE_VALUE);
            FileWriteDouble(g_file_364, g_low_284, DOUBLE_VALUE);
            FileWriteDouble(g_file_364, g_high_292, DOUBLE_VALUE);
            FileWriteDouble(g_file_364, g_close_300, DOUBLE_VALUE);
            FileWriteDouble(g_file_364, gd_308, DOUBLE_VALUE);
            FileFlush(g_file_364);
            gi_324++;
            if (g_time_264 >= gi_260 + gi_272) {
               gi_260 = g_time_264 / gi_272;
               gi_260 *= gi_272;
               gd_276 = Open[gi_252];
               g_low_284 = Low[gi_252];
               g_high_292 = High[gi_252];
               g_close_300 = Close[gi_252];
               gd_308 = gd_316;
            }
         } else {
            gd_308 += Volume[gi_252];
            if (Low[gi_252] < g_low_284) g_low_284 = Low[gi_252];
            if (High[gi_252] > g_high_292) g_high_292 = High[gi_252];
            g_close_300 = Close[gi_252];
         }
      }
      FileFlush(g_file_364);
      Print(gi_324, " record(s) written for custom chart");
   }
}

void moveTF(int a_timeframe_0, int ai_4) {
   int li_8;
   gs_340 = Symbol() + "_tst";
   g_timeframe_348 = a_timeframe_0;
   g_digits_352 = Digits;
   g_file_236 = FileOpenHistory(gs_340 + g_timeframe_348 + ".hst", FILE_BIN|FILE_WRITE);
   if (g_file_236 >= 0) {
      gs_332 = "(C)opyright 2003, MetaQuotes Software Corp.";
      FileWriteInteger(g_file_236, gi_328, LONG_VALUE);
      FileWriteString(g_file_236, gs_332, 64);
      FileWriteString(g_file_236, gs_340, 12);
      FileWriteInteger(g_file_236, g_timeframe_348, LONG_VALUE);
      FileWriteInteger(g_file_236, g_digits_352, LONG_VALUE);
      FileWriteInteger(g_file_236, 0, LONG_VALUE);
      FileWriteInteger(g_file_236, 0, LONG_VALUE);
      FileWriteArray(g_file_236, gia_356, 0, 13);
      gi_272 = 60 * g_timeframe_348;
      gi_256 = iBars(Symbol(), a_timeframe_0) - 1;
      for (gi_252 = gi_256 - 1; gi_252 >= 0; gi_252--) {
         g_time_264 = iTime(Symbol(), a_timeframe_0, gi_252);
         gd_276 = iOpen(Symbol(), a_timeframe_0, gi_252);
         g_low_284 = iLow(Symbol(), a_timeframe_0, gi_252);
         g_high_292 = iHigh(Symbol(), a_timeframe_0, gi_252);
         gd_308 = iVolume(Symbol(), a_timeframe_0, gi_252);
         g_close_300 = iClose(Symbol(), a_timeframe_0, gi_252);
         gi_260 = iTime(Symbol(), a_timeframe_0, gi_252);
         gia_360[ai_4][2] = FileTell(g_file_236);
         FileWriteInteger(g_file_236, gi_260, LONG_VALUE);
         FileWriteDouble(g_file_236, gd_276, DOUBLE_VALUE);
         FileWriteDouble(g_file_236, g_low_284, DOUBLE_VALUE);
         FileWriteDouble(g_file_236, g_high_292, DOUBLE_VALUE);
         FileWriteDouble(g_file_236, g_close_300, DOUBLE_VALUE);
         FileWriteDouble(g_file_236, gd_308, DOUBLE_VALUE);
         FileFlush(g_file_236);
         li_8++;
      }
      FileFlush(g_file_236);
      Print(li_8, " record(s) written for timeframe " + a_timeframe_0);
      gia_360[ai_4][1] = g_file_236;
   }
}

void manageTrades() {
   string lsa_4[10];
   string lsa_8[100];
   int li_16;
   int l_str2dbl_20;
   string ls_36;
   int li_0 = 0;
   int li_unused_12 = 0;
   double ld_24 = 0;
   for (int l_count_32 = 0; l_count_32 < GlobalVariablesTotal(); l_count_32++) {
      ls_36 = GlobalVariableName(l_count_32);
      if (StringFind(ls_36, "SFXT_") == 0) {
         li_0 = splitByString(ls_36, "_", lsa_4);
         li_16 = StrToDouble(lsa_4[1]);
         l_str2dbl_20 = StrToDouble(lsa_4[2]);
         ld_24 = GlobalVariableGet(ls_36);
         if ((Digits == 5 && StringFind(Symbol(), "JPY") == -1) || (Digits == 3 && StringFind(Symbol(), "JPY") != -1)) ld_24 = 10.0 * ld_24;
         ld_24 *= Point;
         OrderSelect(l_str2dbl_20, SELECT_BY_TICKET);
         if (OrderOpenTime() == li_16) {
            if (OrderCloseTime() <= 0) {
               if (OrderType() == OP_BUY) {
                  if (lsa_4[3] == "TS" && ld_24 > 0.0) {
                     if (Bid - ld_24 > OrderStopLoss()) OrderModify(OrderTicket(), OrderOpenPrice(), Bid - ld_24, OrderTakeProfit(), OrderExpiration(), CLR_NONE);
                  } else {
                     if (lsa_4[3] == "BE" && ld_24 > 0.0)
                        if (Bid - OrderOpenPrice() >= ld_24 && OrderStopLoss() != OrderOpenPrice()) OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice(), OrderTakeProfit(), OrderExpiration(), CLR_NONE);
                  }
               }
               if (OrderType() == OP_SELL) {
                  if (lsa_4[3] == "TS" && ld_24 > 0.0) {
                     if ((Ask + ld_24 < OrderStopLoss() && OrderStopLoss() > 0.0) || OrderStopLoss() == 0.0) OrderModify(OrderTicket(), OrderOpenPrice(), Ask + ld_24, OrderTakeProfit(), OrderExpiration(), CLR_NONE);
                  } else {
                     if (lsa_4[3] == "BE" && ld_24 > 0.0)
                        if (OrderOpenPrice() - Ask >= ld_24 && OrderStopLoss() != OrderOpenPrice()) OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice(), OrderTakeProfit(), OrderExpiration(), CLR_NONE);
                  }
               }
            }
         }
      }
   }
}

void clearGlobalVars() {
   string lsa_4[10];
   string lsa_8[100];
   int l_str2dbl_16;
   int l_str2dbl_20;
   string ls_28;
   int li_0 = 0;
   int l_index_12 = 0;
   for (int l_count_24 = 0; l_count_24 < GlobalVariablesTotal(); l_count_24++) {
      ls_28 = GlobalVariableName(l_count_24);
      if (StringFind(ls_28, "SFXT_") == 0) {
         li_0 = splitByString(ls_28, "_", lsa_4);
         l_str2dbl_16 = StrToDouble(lsa_4[1]);
         l_str2dbl_20 = StrToDouble(lsa_4[2]);
         OrderSelect(l_str2dbl_20, SELECT_BY_TICKET);
         if (OrderOpenTime() == l_str2dbl_16) {
            if (OrderCloseTime() > 0) {
               lsa_8[l_index_12] = ls_28;
               l_index_12++;
            }
         }
      }
   }
   for (int l_index_36 = 0; l_index_36 < l_index_12; l_index_36++) GlobalVariableDel(lsa_8[l_index_36]);
}

void checkClosed() {
   if (g_hist_total_92 != OrdersHistoryTotal()) {
      Print("New order history stuffs.");
      sendAllClosed();
      g_hist_total_92 = OrdersHistoryTotal();
   }
}

void sendAllClosed() {
   Print("Sending all closed! -- " + OrdersHistoryTotal());
   string l_str_concat_0 = "";
   string ls_8 = "";
   for (int li_16 = g_hist_total_92; li_16 < OrdersHistoryTotal(); li_16++) {
      OrderSelect(g_pos_100, SELECT_BY_POS, MODE_HISTORY);
      if (OrderType() == OP_BUY) ls_8 = "Buy";
      else {
         if (OrderType() == OP_SELL) ls_8 = "Sell";
         else {
            if (OrderType() == OP_BUYSTOP) ls_8 = "Buy Stop";
            else {
               if (OrderType() == OP_SELLSTOP) ls_8 = "Sell Stop";
               else {
                  if (OrderType() == OP_BUYLIMIT) ls_8 = "Buy Limit";
                  else
                     if (OrderType() == OP_SELLLIMIT) ls_8 = "Sell Limit";
               }
            }
         }
      }
      l_str_concat_0 = StringConcatenate(l_str_concat_0, "+ORCLOSE~" + OrderTicket() + "~" + TimeToStr(OrderOpenTime(), TIME_DATE) + "~" + ls_8 + "~" + DoubleToStr(OrderLots(), 2) +
         "~" + DoubleToStr(OrderOpenPrice(), Digits) + "~" + DoubleToStr(OrderStopLoss(), Digits) + "~" + DoubleToStr(OrderTakeProfit(), Digits) + "~0~0~" + DoubleToStr(OrderProfit(), 2));
      g_pos_100++;
   }
   sendInfo(l_str_concat_0, gi_80);
}

void dHUD() {
   gi_232 = g_window_200;
   setWindow();
   drawHUD();
   ObjectsRedraw();
}

void eraseHUD() {
   Print("Erasing HUD...");
   ObjectDelete("BidLbl");
   ObjectDelete("AskLbl");
   ObjectDelete("TimeLbl");
   ObjectDelete("DateLbl");
   ObjectDelete("WeekLbl");
   ObjectDelete("BalanceLbl");
   ObjectDelete("EquityLbl");
   ObjectDelete("MarginLbl");
   ObjectDelete("OpenLbl");
   ObjectDelete("OpenProfitLbl");
   ObjectDelete("CloseLbl");
   ObjectDelete("CloseProfitLbl");
   ObjectDelete("PendLbl");
}

int tPend() {
   int l_count_0 = 0;
   for (int l_pos_4 = 0; l_pos_4 < OrdersTotal(); l_pos_4++) {
      OrderSelect(l_pos_4, SELECT_BY_POS, MODE_TRADES);
      if (OrderType() == OP_BUY || OrderType() == OP_SELL) continue;
      l_count_0++;
   }
   return (l_count_0);
}

void sendQuotes() {
   string ls_unused_0;
   if (OrdersTotal() > 0) ls_unused_0 = "";
}

int recvResponse(string as_0) {
   int l_count_8 = 0;
   string ls_12 = "block";
   while (ls_12 == "block") {
      ls_12 = mt4Recv(gi_80);
      if (ls_12 == "block") {
         l_count_8++;
         continue;
      }
      Print("Recv from Response -- ", ls_12);
      if (StringFind(ls_12, as_0) != -1) break;
      processRecv(ls_12);
      if (processResponse() != -1) break;
      gi_184 = FALSE;
      return (-1);
   }
   return (0);
}

void sendAllOrders() {
   Print("Sending all orders! -- " + OrdersTotal());
   string l_str_concat_0 = "";
   string ls_8 = "";
   sendInfo("+FLUSH~dummyInfo", gi_80);
   if (recvResponse("FLUSH") != 0) {
      gi_184 = FALSE;
      Print("Error in recvResponse!");
      return;
   }
   if (OrdersTotal() < 1) sendInfo("+ZERO", gi_80);
   for (int l_pos_16 = 0; l_pos_16 < OrdersTotal(); l_pos_16++) {
      OrderSelect(l_pos_16, SELECT_BY_POS);
      if (OrderType() == OP_BUY) ls_8 = "Buy";
      else {
         if (OrderType() == OP_SELL) ls_8 = "Sell";
         else {
            if (OrderType() == OP_BUYSTOP) ls_8 = "Buy Stop";
            else {
               if (OrderType() == OP_SELLSTOP) ls_8 = "Sell Stop";
               else {
                  if (OrderType() == OP_BUYLIMIT) ls_8 = "Buy Limit";
                  else
                     if (OrderType() == OP_SELLLIMIT) ls_8 = "Sell Limit";
               }
            }
         }
      }
      l_str_concat_0 = StringConcatenate(l_str_concat_0, "+ORDER~" + OrderTicket() + "~" + TimeToStr(OrderOpenTime(), TIME_DATE) + "~" + ls_8 + "~" + DoubleToStr(OrderLots(), 2) +
         "~" + DoubleToStr(OrderOpenPrice(), Digits) + "~" + DoubleToStr(OrderStopLoss(), Digits) + "~" + DoubleToStr(OrderTakeProfit(), Digits) + "~0~0~" + DoubleToStr(OrderProfit(), 2));
   }
   sendInfo(l_str_concat_0, gi_80);
}

int recvFirst() {
   string lsa_4[100];
   string ls_unused_8;
   string ls_unused_16;
   string ls_32;
   int li_unused_40;
   string ls_unused_44;
   int li_unused_0 = -1;
   int li_unused_24 = 0;
   for (int l_count_28 = 0; l_count_28 < 60 / g_ticket_172; l_count_28++) {
      ls_32 = mt4Recv(gi_80);
      li_unused_40 = 0;
      ls_unused_44 = "";
      if (ls_32 == "block") mt4Sleep(5);
      else {
         Print("Recvd Packet! -- ", ls_32);
         processRecv(ls_32);
         if (processResponse() != -1) break;
         gi_184 = FALSE;
         return (-1);
      }
   }
   return (0);
}

int processResponse() {
   if (gs_176 != "") {
      if (sendInfo(gs_176, gi_80) > -1) {
         if (StringFind(gs_176, "QUOTE") != -1)
            if (waitFor("QUOTEOK") == -1) return (-1);
         if (StringFind(gs_176, "ORDERMESSAGE") != -1) {
            if (waitFor("OMOK") == -1) return (-1);
            sendAllOrders();
         }
         if (StringFind(gs_176, "CLOSED") != -1) {
            if (waitFor("COK") == -1) return (-1);
            sendAllOrders();
         }
         if (StringFind(gs_176, "ERRORMSG") != -1)
            if (waitFor("EOK") == -1) return (-1);
         gs_176 = "";
         return (0);
      } else {
         Print("Error in send! Shutting down program..");
         return (-1);
      }
   }
   return (0);
}

int waitFor(string as_0) {
   int li_unused_8 = 0;
   string ls_12 = "block";
   while (ls_12 == "block") {
      ls_12 = mt4Recv(gi_80);
      if (ls_12 == "block") continue;
      if (StringFind(ls_12, as_0) != -1) {
         Print("Wait successful! - " + ls_12);
         return (0);
      }
      Print("Wait for messup -- calling processRecv with " + ls_12);
      processRecv(ls_12);
      if (processResponse() == -1) {
         gi_184 = FALSE;
         return (-1);
      }
   }
   return (0);
}

void processRecv(string as_0) {
   string lsa_12[100];
   string ls_unused_16;
   string ls_24;
   int l_str2dbl_32;
   int l_ticket_36;
   double l_str2dbl_44;
   double l_price_52;
   double l_price_60;
   string l_ticket_68;
   string l_ticket_76;
   string l_ticket_84;
   string l_ticket_92;
   double l_str2dbl_100;
   int l_ticket_108;
   int l_ticket_112;
   int l_cmd_116;
   string ls_120;
   double ld_128;
   double ld_136;
   string ls_144;
   int li_152;
   int li_156;
   double ld_160;
   int li_168;
   string ls_172;
   int l_ticket_180;
   double l_str2dbl_184;
   double l_str2dbl_192;
   string ls_unused_200;
   int l_ticket_208;
   int l_ticket_212;
   int l_error_216;
   bool li_220;
   string ls_224;
   Print("Process Recv Called -- " + as_0);
   int li_8 = -1;
   if (StringFind(as_0, "|CLOSEORDER") != -1) {
      li_8 = splitByString(as_0, "~", lsa_12);
      l_str2dbl_32 = StrToDouble(lsa_12[1]);
      OrderSelect(l_str2dbl_32, SELECT_BY_TICKET);
      if (OrderCloseTime() <= 0) {
         if (OrderType() == OP_BUY) {
            if (OrderClose(OrderTicket(), OrderLots(), Bid, 3, CLR_NONE)) {
               gs_176 = "+CLOSED~" + OrderTicket();
               g_ord_total_88 = OrdersTotal();
            } else gs_176 = "+ERRORMSG~Error in closing order #" + OrderTicket() + " -- Error #" + GetLastError();
         } else {
            if (OrderType() == OP_SELL) {
               if (OrderClose(OrderTicket(), OrderLots(), Ask, 3, CLR_NONE)) {
                  gs_176 = "+CLOSED~" + OrderTicket();
                  g_ord_total_88 = OrdersTotal();
               } else gs_176 = "+ERRORMSG~Error in closing order #" + OrderTicket() + " -- Error #" + GetLastError();
            } else {
               l_ticket_36 = OrderTicket();
               if (OrderDelete(OrderTicket(), CLR_NONE)) {
                  gs_176 = "+CLOSED~" + l_ticket_36;
                  g_ord_total_88 = OrdersTotal();
               } else gs_176 = "+ERRORMSG~Error in closing pending order #" + OrderTicket() + " -- Error #" + GetLastError();
            }
         }
      }
   }
   if (StringFind(as_0, "|OMOK") != -1) sendAllOrders();
   if (StringFind(as_0, "|NEWORDER") != -1) {
      li_8 = splitByString(as_0, "~", lsa_12);
      if (StringFind(lsa_12[1], "PEND") != -1) {
         if (StringFind(lsa_12[2], "BUYSTOP") != -1 || StringFind(lsa_12[2], "BUYLIMIT") != -1) {
            Print("New Pending BUY STOP Order!");
            Print("Full packet - ", as_0);
            for (int l_index_40 = 0; l_index_40 < li_8; l_index_40++) Print("parseArray[" + l_index_40 + "] = " + lsa_12[l_index_40]);
            l_str2dbl_44 = StrToDouble(lsa_12[3]);
            l_price_52 = StrToDouble(lsa_12[4]);
            l_price_60 = StrToDouble(lsa_12[5]);
            l_ticket_68 = lsa_12[6];
            l_ticket_76 = lsa_12[7];
            l_ticket_84 = lsa_12[8];
            l_ticket_92 = lsa_12[9];
            l_str2dbl_100 = StrToDouble(lsa_12[10]);
            l_ticket_108 = StrToDouble(lsa_12[11]);
            l_ticket_112 = StrToDouble(lsa_12[12]);
            if (gi_164) {
               Print("Stop Loss - ", l_price_52);
               Print("Take Profit - ", l_price_60);
               Print("Comment - ", l_ticket_68);
               Print("Expiry - ", l_ticket_76);
               Print("Breakeven - ", l_ticket_84);
               Print("Trailing Stop - ", l_ticket_92);
               Print("At price - ", l_str2dbl_100);
               Print("int SL - ", l_ticket_108);
               Print("int TP - ", l_ticket_112);
            }
            if (StringFind(lsa_12[2], "BUYSTOP") != -1 || StringFind(lsa_12[2], "BUYLIMIT") != -1)
               if (StringFind(lsa_12[2], "BUYSTOP") != -1) l_cmd_116 = 4;
            if (StringFind(lsa_12[2], "BUYLIMIT") != -1) l_cmd_116 = 2;
            if (l_ticket_108 > 0) {
               if ((Digits == 5 && StringFind(Symbol(), "JPY")) == -1 || (Digits == 3 && StringFind(Symbol(), "JPY")) != -1) l_price_52 = l_str2dbl_100 - 10 * l_ticket_108 * Point;
               else l_price_52 = l_str2dbl_100 - l_ticket_108 * Point;
            }
            if (l_ticket_112 > 0) {
               if ((Digits == 5 && StringFind(Symbol(), "JPY")) == -1 || (Digits == 3 && StringFind(Symbol(), "JPY")) != -1) l_price_60 = l_str2dbl_100 + 10 * l_ticket_112 * Point;
               else l_price_60 = l_str2dbl_100 + l_ticket_112 * Point;
            }
            RefreshRates();
            g_ticket_84 = OrderSend(Symbol(), l_cmd_116, l_str2dbl_44, l_str2dbl_100, 0, l_price_52, l_price_60, l_ticket_68, 12345, 0, Green);
            if (g_ticket_84 == -1) gs_176 = "+ORDERMESSAGE~Error in opening order! MetaTrader 4 gives the following error -- " + ErrorDescription(GetLastError());
            else {
               g_ord_total_88 = OrdersTotal();
               OrderSelect(g_ticket_84, SELECT_BY_TICKET);
               GlobalVariableSet("SFXT_" + OrderOpenTime() + "_" + g_ticket_84 + "_TS", StrToDouble(l_ticket_92));
               GlobalVariableSet("SFXT_" + OrderOpenTime() + "_" + g_ticket_84 + "_BE", StrToDouble(l_ticket_84));
               if (OrderType() == OP_BUY) ls_24 = "buy";
               if (OrderType() == OP_SELL) ls_24 = "sell";
               if (OrderType() == OP_BUYLIMIT) ls_24 = "buy limit";
               if (OrderType() == OP_BUYSTOP) ls_24 = "buy stop";
               if (OrderType() == OP_SELLLIMIT) ls_24 = "sell limit";
               if (OrderType() == OP_SELLSTOP) ls_24 = "sell stop";
               gs_176 = "+ORDERMESSAGE~#" + OrderTicket() + " " + ls_24 + " " + DoubleToStr(OrderLots(), 2) + " at " + DoubleToStr(OrderOpenPrice(), Digits) + " successful!";
            }
         }
         if (StringFind(lsa_12[2], "SELLSTOP") != -1 || StringFind(lsa_12[2], "SELLLIMIT") != -1) {
            l_str2dbl_44 = StrToDouble(lsa_12[3]);
            l_price_52 = StrToDouble(lsa_12[4]);
            l_price_60 = StrToDouble(lsa_12[5]);
            l_ticket_68 = lsa_12[6];
            l_ticket_76 = lsa_12[7];
            l_ticket_84 = lsa_12[8];
            l_ticket_92 = lsa_12[9];
            l_str2dbl_100 = StrToDouble(lsa_12[10]);
            if (gi_164) {
               Print("Stop Loss - ", l_price_52);
               Print("Take Profit - ", l_price_60);
               Print("Comment - ", l_ticket_68);
               Print("Expiry - ", l_ticket_76);
               Print("Breakeven - ", l_ticket_84);
               Print("Trailing Stop - ", l_ticket_92);
               Print("At Price - ", l_str2dbl_100);
            }
            l_cmd_116 = 0;
            if (StringFind(lsa_12[2], "SELLSTOP") != -1) l_cmd_116 = 5;
            if (StringFind(lsa_12[2], "SELLLIMIT") != -1) l_cmd_116 = 3;
            if (l_ticket_108 > 0) {
               if ((Digits == 5 && StringFind(Symbol(), "JPY")) == -1 || (Digits == 3 && StringFind(Symbol(), "JPY")) != -1) l_price_52 = l_str2dbl_100 + 10 * l_ticket_108 * Point;
               else l_price_52 = l_str2dbl_100 + l_ticket_108 * Point;
            }
            if (l_ticket_112 > 0) {
               if ((Digits == 5 && StringFind(Symbol(), "JPY")) == -1 || (Digits == 3 && StringFind(Symbol(), "JPY")) != -1) l_price_60 = l_str2dbl_100 - 10 * l_ticket_112 * Point;
               else l_price_60 = l_str2dbl_100 - l_ticket_112 * Point;
            }
            RefreshRates();
            g_ticket_84 = OrderSend(Symbol(), l_cmd_116, l_str2dbl_44, l_str2dbl_100, 0, l_price_52, l_price_60, l_ticket_68, 12345, 0, Green);
            if (g_ticket_84 == -1) gs_176 = "+ORDERMESSAGE~Error in opening order! MetaTrader 4 gives the following error -- " + ErrorDescription(GetLastError());
            else {
               OrderSelect(g_ticket_84, SELECT_BY_TICKET);
               GlobalVariableSet("SFXT_" + OrderOpenTime() + "_" + g_ticket_84 + "_TS", StrToDouble(l_ticket_92));
               GlobalVariableSet("SFXT_" + OrderOpenTime() + "_" + g_ticket_84 + "_BE", StrToDouble(l_ticket_84));
               if (OrderType() == OP_BUY) ls_24 = "buy";
               if (OrderType() == OP_SELL) ls_24 = "sell";
               if (OrderType() == OP_BUYLIMIT) ls_24 = "buy limit";
               if (OrderType() == OP_BUYSTOP) ls_24 = "buy stop";
               if (OrderType() == OP_SELLLIMIT) ls_24 = "sell limit";
               if (OrderType() == OP_SELLSTOP) ls_24 = "sell stop";
               g_ord_total_88 = OrdersTotal();
               gs_176 = "+ORDERMESSAGE~#" + OrderTicket() + " " + ls_24 + " " + DoubleToStr(OrderLots(), 2) + " at " + DoubleToStr(OrderOpenPrice(), Digits) + " successful!";
            }
         }
      }
      if (StringFind(lsa_12[1], "INSTANT") != -1) {
         if (StringFind(lsa_12[2], "BUY") != -1) {
            Print("New Instant BUY Order!");
            Print("Full packet - ", as_0);
            for (l_index_40 = 0; l_index_40 < li_8; l_index_40++) Print("parseArray[" + l_index_40 + "] = " + lsa_12[l_index_40]);
            l_str2dbl_44 = StrToDouble(lsa_12[3]);
            l_price_52 = StrToDouble(lsa_12[4]);
            l_price_60 = StrToDouble(lsa_12[5]);
            l_ticket_68 = lsa_12[6];
            l_ticket_76 = lsa_12[7];
            l_ticket_84 = lsa_12[8];
            l_ticket_92 = lsa_12[9];
            l_ticket_108 = StrToDouble(lsa_12[10]);
            l_ticket_112 = StrToDouble(lsa_12[11]);
            if (gi_164) {
               Print("Stop Loss - ", l_price_52);
               Print("Take Profit - ", l_price_60);
               Print("Comment - ", l_ticket_68);
               Print("Expiry - ", l_ticket_76);
               Print("Breakeven - ", l_ticket_84);
               Print("Trailing Stop - ", l_ticket_92);
               Print("Int SL - ", l_ticket_108);
               Print("Int TP - ", l_ticket_112);
            }
            if (l_ticket_108 > 0) {
               if ((Digits == 5 && StringFind(Symbol(), "JPY")) == -1 || (Digits == 3 && StringFind(Symbol(), "JPY")) != -1) l_price_52 = Ask - 10 * l_ticket_108 * Point;
               else l_price_52 = Ask - l_ticket_108 * Point;
            }
            if (l_ticket_112 > 0) {
               if ((Digits == 5 && StringFind(Symbol(), "JPY")) == -1 || (Digits == 3 && StringFind(Symbol(), "JPY")) != -1) l_price_60 = Ask + 10 * l_ticket_112 * Point;
               else l_price_60 = Ask + l_ticket_112 * Point;
            }
            RefreshRates();
            g_ticket_84 = OrderSend(Symbol(), OP_BUY, l_str2dbl_44, Ask, 0, l_price_52, l_price_60, l_ticket_68, 12345, 0, Green);
            if (g_ticket_84 == -1) gs_176 = "+ORDERMESSAGE~Error in opening order! MetaTrader 4 gives the following error -- " + ErrorDescription(GetLastError());
            else {
               OrderSelect(g_ticket_84, SELECT_BY_TICKET);
               GlobalVariableSet("SFXT_" + OrderOpenTime() + "_" + g_ticket_84 + "_TS", StrToDouble(l_ticket_92));
               GlobalVariableSet("SFXT_" + OrderOpenTime() + "_" + g_ticket_84 + "_BE", StrToDouble(l_ticket_84));
               g_ord_total_88 = OrdersTotal();
               OrderSelect(g_ticket_84, SELECT_BY_TICKET);
               if (OrderType() == OP_BUY) ls_24 = "buy";
               if (OrderType() == OP_SELL) ls_24 = "sell";
               if (OrderType() == OP_BUYLIMIT) ls_24 = "buy limit";
               if (OrderType() == OP_BUYSTOP) ls_24 = "buy stop";
               if (OrderType() == OP_SELLLIMIT) ls_24 = "sell limit";
               if (OrderType() == OP_SELLSTOP) ls_24 = "sell stop";
               gs_176 = "+ORDERMESSAGE~#" + OrderTicket() + " " + ls_24 + " " + DoubleToStr(OrderLots(), 2) + " at " + DoubleToStr(OrderOpenPrice(), Digits) + " successful!";
            }
         }
         if (StringFind(lsa_12[2], "SELL") != -1) {
            l_str2dbl_44 = StrToDouble(lsa_12[3]);
            l_price_52 = StrToDouble(lsa_12[4]);
            l_price_60 = StrToDouble(lsa_12[5]);
            l_ticket_68 = lsa_12[6];
            l_ticket_76 = lsa_12[7];
            l_ticket_84 = lsa_12[8];
            l_ticket_92 = lsa_12[9];
            l_ticket_108 = StrToDouble(lsa_12[10]);
            l_ticket_112 = StrToDouble(lsa_12[11]);
            if (gi_164) {
               Print("Stop Loss - ", l_price_52);
               Print("Take Profit - ", l_price_60);
               Print("Comment - ", l_ticket_68);
               Print("Expiry - ", l_ticket_76);
               Print("Breakeven - ", l_ticket_84);
               Print("Trailing Stop - ", l_ticket_92);
               Print("Int SL - ", l_ticket_108);
               Print("Int TP - ", l_ticket_112);
            }
            if (l_ticket_108 > 0) {
               if ((Digits == 5 && StringFind(Symbol(), "JPY") == -1) || (Digits == 3 && StringFind(Symbol(), "JPY") != -1)) l_price_52 = Bid + 10 * l_ticket_108 * Point;
               else l_price_52 = Bid + l_ticket_108 * Point;
            }
            if (l_ticket_112 > 0) {
               if ((Digits == 5 && StringFind(Symbol(), "JPY") == -1) || (Digits == 3 && StringFind(Symbol(), "JPY") != -1)) l_price_60 = Bid - 10 * l_ticket_112 * Point;
               else l_price_60 = Bid - l_ticket_112 * Point;
            }
            RefreshRates();
            g_ticket_84 = OrderSend(Symbol(), OP_SELL, l_str2dbl_44, Bid, 0, l_price_52, l_price_60, l_ticket_68, 12345, 0, Green);
            if (g_ticket_84 == -1) gs_176 = "+ORDERMESSAGE~Error in opening order! MetaTrader 4 gives the following error -- " + ErrorDescription(GetLastError());
            else {
               OrderSelect(g_ticket_84, SELECT_BY_TICKET);
               GlobalVariableSet("SFXT_" + OrderOpenTime() + "_" + g_ticket_84 + "_TS", StrToDouble(l_ticket_92));
               GlobalVariableSet("SFXT_" + OrderOpenTime() + "_" + g_ticket_84 + "_BE", StrToDouble(l_ticket_84));
               if (OrderType() == OP_BUY) ls_24 = "buy";
               if (OrderType() == OP_SELL) ls_24 = "sell";
               if (OrderType() == OP_BUYLIMIT) ls_24 = "buy limit";
               if (OrderType() == OP_BUYSTOP) ls_24 = "buy stop";
               if (OrderType() == OP_SELLLIMIT) ls_24 = "sell limit";
               if (OrderType() == OP_SELLSTOP) ls_24 = "sell stop";
               g_ord_total_88 = OrdersTotal();
               gs_176 = "+ORDERMESSAGE~#" + OrderTicket() + " " + ls_24 + " " + DoubleToStr(OrderLots(), 2) + " at " + DoubleToStr(OrderOpenPrice(), Digits) + " successful!";
            }
         }
      }
   }
   if (StringFind(as_0, "|MODREQUEST") != -1) {
      li_8 = splitByString(as_0, "~", lsa_12);
      if (!OrderSelect(StrToDouble(lsa_12[1]), SELECT_BY_TICKET)) {
         gs_176 = "+MMSGCLOSE~Unable to select order #" + lsa_12[1] + " -- Try again!";
         return;
      }
      if (OrderType() == OP_BUY) ls_120 = "Buy";
      if (OrderType() == OP_SELL) ls_120 = "Sell";
      if (OrderType() == OP_BUYSTOP) ls_120 = "Buy Stop";
      if (OrderType() == OP_SELLSTOP) ls_120 = "Sell Stop";
      if (OrderType() == OP_BUYLIMIT) ls_120 = "Buy Limit";
      if (OrderType() == OP_SELLLIMIT) ls_120 = "Sell Limit";
      if (OrderStopLoss() > 0.0) ld_128 = MathAbs(OrderOpenPrice() - OrderStopLoss()) / Point;
      else ld_128 = 0;
      if ((Digits == 5 && StringFind(Symbol(), "JPY") == -1) || (Digits == 3 && StringFind(Symbol(), "JPY") != -1))
         if (ld_128 > 0.0) ld_128 /= 10.0;
      if (OrderTakeProfit() > 0.0) ld_136 = MathAbs(OrderOpenPrice() - OrderTakeProfit()) / Point;
      else ld_136 = 0;
      if ((Digits == 5 && StringFind(Symbol(), "JPY") == -1) || (Digits == 3 && StringFind(Symbol(), "JPY") != -1))
         if (ld_136 > 0.0) ld_136 /= 10.0;
      ls_144 = OrderComment();
      if (ls_144 == "") ls_144 = "[NULL]";
      li_152 = getTS(OrderOpenTime(), OrderTicket());
      li_156 = getBE(OrderOpenTime(), OrderTicket());
      Print("theTS -- ", li_152);
      Print("theBE -- ", li_156);
      if (li_152 < 0) li_152 = 0;
      if (li_156 < 0) li_156 = 0;
      ld_160 = 0.0001;
      li_168 = 4;
      if (StringFind(Symbol(), "JPY") != -1) {
         ld_160 = 0.01;
         li_168 = 2;
      }
      ls_172 = "+MODDATA~" + Symbol() + "~" + DoubleToStr(OrderOpenPrice(), Digits) + "~" + DoubleToStr(OrderLots(), 2) + "~" + ls_120 + "~" + DoubleToStr(OrderStopLoss(), Digits) + "~" + DoubleToStr(ld_128, 0) + "~" + DoubleToStr(OrderTakeProfit(), Digits) + "~" + DoubleToStr(ld_136, 0) + "~" + ls_144 + "~" + li_152 + "~" + li_156 + "~" + OrderTicket() + "~" + DoubleToStr(OrderProfit(), 2) + "~" + DoubleToStr(ld_160, li_168);
      gs_176 = ls_172;
   }
   if (StringFind(as_0, "|MODORDER") != -1) {
      Print("Modify Order!!");
      li_8 = splitByString(as_0, "~", lsa_12);
      l_ticket_180 = StrToDouble(lsa_12[1]);
      l_str2dbl_184 = StrToDouble(lsa_12[2]);
      l_str2dbl_192 = StrToDouble(lsa_12[3]);
      ls_unused_200 = lsa_12[4];
      l_ticket_208 = StrToDouble(lsa_12[5]);
      l_ticket_212 = StrToDouble(lsa_12[6]);
      OrderSelect(l_ticket_180, SELECT_BY_TICKET, MODE_TRADES);
      if (OrderCloseTime() > 0) gs_176 = "+MMSGCLOSE~Your order has been closed already, can not modify.";
      else {
         if (!OrderModify(OrderTicket(), OrderOpenPrice(), l_str2dbl_184, l_str2dbl_192, 0, CLR_NONE)) {
            l_error_216 = GetLastError();
            if (l_error_216 == 1/* NO_RESULT */) {
               if (GlobalVariableGet("SFXT_" + OrderOpenTime() + "_" + OrderTicket() + "_TS") == l_ticket_208 && GlobalVariableGet("SFXT_" + OrderOpenTime() + "_" + OrderTicket() +
                  "_BE") == l_ticket_212) gs_176 = "+MMSGOPEN~None of the values have changed, so modifying the order will do nothing. Please change a value and try again";
               else {
                  GlobalVariableSet("SFXT_" + OrderOpenTime() + "_" + g_ticket_84 + "_TS", l_ticket_208);
                  GlobalVariableSet("SFXT_" + OrderOpenTime() + "_" + g_ticket_84 + "_BE", l_ticket_212);
                  gs_176 = "+MMSGOPEN~Order #" + OrderTicket() + " successfully modified!";
               }
            } else gs_176 = "+MMSGOPEN~Failed to modify order. MetaTrader 4 says - " + ErrorDescription(l_error_216);
         } else gs_176 = "+MMSGOPEN~Order #" + OrderTicket() + " successfully modified!";
      }
   }
   if (StringFind(as_0, "|SPEED") != -1) {
      li_8 = splitByString(as_0, "~", lsa_12);
      g_ticket_172 = StrToDouble(lsa_12[1]);
   }
   if (StringFind(as_0, "|TOGGLEHUD") != -1) {
      Print("Toggle HUD...");
      if (!gi_192) {
         Print("Setting to true...");
         gi_192 = TRUE;
         dHUD();
      } else {
         gi_192 = FALSE;
         eraseHUD();
      }
   }
   if (StringFind(as_0, "|PAUSE") != -1) {
      sendInfo("+PAUSEYES", gi_80);
      sendAllOrders();
      li_220 = TRUE;
      ls_224 = "block";
      while (li_220 == TRUE) {
         ls_224 = mt4Recv(gi_80);
         if (StringFind(ls_224, "|PAUSE") == 0) break;
         if (ls_224 == "block") {
            mt4Sleep(50);
            continue;
         }
         processRecv(ls_224);
         if (processResponse() == -1) {
            gi_184 = FALSE;
            return;
         }
         checkClosed();
      }
      sendInfo("+PAUSENO", gi_80);
   }
}

int getTS(int ai_0, int ai_4) {
   Print("Checking for TS -- SFXT_" + ai_0 + "_" + ai_4 + "_TS");
   if (GlobalVariableCheck("SFXT_" + ai_0 + "_" + ai_4 + "_TS")) return (GlobalVariableGet("SFXT_" + ai_0 + "_" + ai_4 + "_TS"));
   return (-1);
}

int getBE(int ai_0, int ai_4) {
   if (GlobalVariableCheck("SFXT_" + ai_0 + "_" + ai_4 + "_BE")) {
      Print("Checking for BE -- SFXT_" + ai_0 + "_" + ai_4 + "_BE");
      return (GlobalVariableGet("SFXT_" + ai_0 + "_" + ai_4 + "_BE"));
   }
   return (-1);
}

int splitByString(string as_0, string as_8, string &asa_16[10]) {
   int li_32;
   int l_index_20 = 0;
   int li_24 = 0;
   int li_28 = StringFind(as_0, as_8);
   if (li_28 == -1) {
      asa_16[0] = as_0;
      return (1);
   }
   if (li_28 == 0) {
      li_32 = StringFind(as_0, as_8, li_28 + 1);
      if (li_32 == -1) {
         asa_16[0] = StringSubstr(as_0, 1);
         return (1);
      }
      asa_16[l_index_20] = StringSubstr(as_0, 1, li_32 - 1);
      l_index_20++;
      li_24 = li_32 + 1;
      li_28 = StringFind(as_0, as_8, li_24);
   }
   while (li_28 != -1) {
      asa_16[l_index_20] = StringSubstr(as_0, li_24, li_28 - li_24);
      l_index_20++;
      li_24 = li_28 + 1;
      li_28 = StringFind(as_0, as_8, li_28 + 1);
   }
   asa_16[l_index_20] = StringSubstr(as_0, li_24);
   l_index_20++;
   return (l_index_20);
}

int sendInfo(string as_0, int ai_8) {
   int li_12 = mt4Send(as_0, ai_8);
   if (li_12 == -1) {
      Alert("Invalid Socket On mt4Send! Exiting.");
      socketCleanup(ai_8, 0);
      return (-1);
   }
   if (li_12 == 0) Print("Sending successful! - ", as_0);
   else {
      Alert("Error when using mt4Send -- " + li_12);
      socketCleanup(ai_8, 0);
      return (-1);
   }
   return (0);
}
