#property copyright "Copyright © 2017, Rodolfo Leonardo"
#property link      "rodolfo.leonardo@gmail.com"

//#import "ws2_32.dll"
//int WSAStartup(int a0, int& a1[]);
//int socket(int a0, int a1, int a2);
//int connect(int a0, int& a1[], int a2);
//int recv(int a0, int& a1[], int a2, int a3);
//int closesocket(int a0);
//int WSACleanup();
#import "kernel32.dll"
void GetSystemTime(int& a0[]);
#import

extern string ForexRobot = " ";
extern string ____Size_Of_Lots____ = "---------------------------------------------";
extern bool UseMM = FALSE;
extern double Lots = 0.01;
extern double LotsRiskReductor = 10.0;

extern string ____Trading_Days____ = "---------------------------------------------";
extern bool AutoAnalysis = FALSE;
extern bool TradeMonday = TRUE;
extern bool TradeTuesday = TRUE;
extern bool TradeWednesday = TRUE;
extern bool TradeThursday = TRUE;
extern bool TradeFriday = TRUE;

extern string ____General_Options____ = "---------------------------------------------";
extern bool AutoGMTOffset = FALSE;
extern int GMTOffset = 2;
extern bool StealthMode = TRUE;
extern int Slippage = 2;

extern int MagicNumber = 20170328;
extern string __Recovery_Trade_Options__ = "---------------------------------------------";
extern bool UseRevAfterSL = TRUE;
extern double RevAfterSL_Multiplier = 7;
extern int RevAfterSL_MagNumber = 20100156;

extern string ____Trailing_Stop____ = "---------------------------------------------";
extern bool UseTrailingStop = FALSE;
extern double TrailingDistance = 6.0;
extern double TrailingStep = 1.0;


extern string ____Others____ = "---------------------------------------------";
extern string ExpertComment = "RobotFx FUTURE";
extern color ColorBuy = Blue;
extern color ColorSell = Red;
extern bool SendEmail = FALSE;
extern bool SoundAlert = FALSE;
extern string SoundFileAtOpen = "alert.wav";
extern string SoundFileAtClose = "alert.wav";
extern bool WriteLog = FALSE;
extern bool WriteDebugLog = FALSE;


double vMaxLotes = 1000.0;
bool gi_200 = TRUE;
extern double vStopLoss = 14.4;
extern double vTakeProfit = 26.8;
extern bool HabilitaSinal = FALSE;

extern double vStopLoss2 = 14.3;
extern double vTakeGain2 = 26.2;

int vHoraTrad = 8;
int vminTrade = 58;

int gi_228 = -1;
int gi_232 = 0;

bool gi_308 = FALSE;
double gd_312 = 0.0;
double gd_320 = 0.0;

bool gi_396 = TRUE;
int gi_400 = 2;
int gi_404 = 1;

string vAssuntoEmail = "New Trade Information";
bool vIsTest;
int vDigitosLotStep;
int vDigitsOperadora;
int gslippage;
double gd_440;
double vTamMinLote;
double gd_456;
int g_str2int_464;
int g_str2int_472;
double vModeMaxLot;
double vModeMinLot;
double vCurrentSpread;
double vMaxSpread;
double vLotStep;
double vPercentRiscRedutor;
string vSimbolo;
string vAccountMoeda;
string g_dbl2str_540;
int vAno;
int g_day_556;
bool gba_560[1];
double vStop[1];
double vTake[1];
int vHoraTrade[1];
int vMinutoTrade[1];
bool vTradeDiaSemana[1][5];
int gia_584[1];
int vMagicNumberOp[1];
int vOperacaoType[1];
bool vUseRevAfterSL[1];
double vStop2[1];
double vTake2[1];
double vRevAfterSL_Multiplier[1];
int vRevAfterSL_MagNumber[1];
bool vUseTrailingStop[1];
double vTrailingDistance[1];
double vTrailingStep[1];
int gia_628[1][5];
double gda_632[1][5];
double gda_636[1][5];
bool gba_640[1];
double gda_644[1];
double gda_648[1];
double gda_652[1];
double gda_656[1];
bool vUsaSinalIchimoku[1];
bool vInicializa;
bool vTradeHabilitada;
bool gi_676 = FALSE;
int gi_680 = 0;
double vDadosDNA[26] =  { 1, 2, 91.9, 4, 22, 0, 1, 0, 0, 0, 0,  0, 0, -2, 0, 1, 220, 13.1, 5.3, 1, 120, 30, 1, 120, 30, 1 };
//double vDadosDNA[26] = { 1, 2, 91.9, 4, 22, 0, 0, 0, 0, 1, 0, 0, 0, -2, 0, 1, 220, 13.1, 5.3, 1, 120, 30, 1, 120, 30, 1 };
string vStrGTMOffsetConfig = "";
string vMensagemAutenticacao = "";
string vMensagemAutenticacao2 = "";
bool gi_712 = FALSE;
//gmt vars
double vFusoHorario;
bool AlreadyCalc = false;


int init() {
	vTradeHabilitada = TRUE;

	if (!IsDllsAllowed()) {
		Alert("Alerta: Set Parameter \"AllowDLL Imports\" ON in menu Tools -> Options -> ExpertAdvisors.");
		ComantarNaTela("Alerta: Set Parameter \"AllowDLL Imports\" ON in menu Tools -> Options -> ExpertAdvisors.", "comment");
		vTradeHabilitada = FALSE;
		return (0);
	}

	if (StringSubstr(Symbol(), 0, 6) != "EURUSD" && StringSubstr(Symbol(), 0, 6) != "EURUSDmicro") {
		Alert("Alerta: Use RobotFx FUTURE apenas em  EURUSD ou EURUSDmicro.");
		ComantarNaTela("Alerta: Use RobotFx FUTURE apenas em  EURUSD ou EURUSDmicro.", "comment");
		vTradeHabilitada = FALSE;
		return (0);
	}
	if (IsTesting()) {
		if (AutoGMTOffset) {
			ComantarNaTela("Alerta: Automatic GMT offset calculation works only on live/demo trading " + "and should be set as FALSE for backtests - strategy testing.", "comment");
			vTradeHabilitada = FALSE;
			return (0);
		}
	}

	if (!UseMM)
		//if (Lots > AccountBalance() / 100.0 / 100.0) Alert("Alerta: For every $100 of your account balance you should use a 0.01 lot size value. It is dangerous if you set too large a lot size value for your account balance. If you still want to trade with such a lot size, click OK.");

	if (WriteDebugLog) {
		WriteLog = TRUE;
		Print("*************************** Initialization ***************************");
	}

	vSimbolo = Symbol();
	vModeMaxLot = MarketInfo(vSimbolo, MODE_MAXLOT);
	vModeMinLot = MarketInfo(vSimbolo, MODE_MINLOT);
	vLotStep = MarketInfo(vSimbolo, MODE_LOTSTEP);
	gd_440 = 12.5;

	if (vLotStep == 0.01) vDigitosLotStep = 2;
	else {
		if (vLotStep == 0.1) vDigitosLotStep = 1;
		else {
			if (vLotStep == 1.0) vDigitosLotStep = 0;
			else {
				if (vLotStep == 0.001) vDigitosLotStep = 3;
				else vDigitosLotStep = 4;
			}
		}
	}

	double vAlavancagem = AccountLeverage();

	vPercentRiscRedutor = NormalizeDouble(LotsRiskReductor * (100 / vAlavancagem), 2);
	gd_456 = 1605680.72 * gd_440;
	vAccountMoeda = AccountCurrency();
	vIsTest = IsTesting();
	g_dbl2str_540 = DoubleToStr(gd_456, 0);

	if (Digits < 4) {
		vTamMinLote = 0.01;
		vDigitsOperadora = 2;
	}
	else {
		vTamMinLote = 0.0001;
		vDigitsOperadora = 4;
	}

	int li_8 = MathPow(10, Digits - vDigitsOperadora);
	gslippage = Slippage * li_8;
	g_str2int_464 = StrToInteger(StringSubstr(g_dbl2str_540, 0, 4));

	vCurrentSpread = MarketInfo(Symbol(), MODE_SPREAD) / MathPow(10, Digits - vDigitsOperadora);
	vMaxSpread = vCurrentSpread;

	if (IsTesting()) {
		InicializaVariaveis();
	}
	vInicializa = TRUE;
	ComantarNaTela("Aguardando por tick.");
	return (0);
}

int deinit() {
	if (WriteDebugLog) Print("************************** Deinitialization **************************");
	return (0);
}

int start() {

	int vTotalOrdens;
	double vQtdLotes;
	if (!vTradeHabilitada) return (0);
	int vTimeCurrent = TimeCurrent();

	if (!IsTesting()) {

		if (vInicializa) {

			if (AutoGMTOffset) {
				if (GetAutoGMTOffset(GMTOffset)) vStrGTMOffsetConfig = GMTOffset + " (automatic)";
				else vStrGTMOffsetConfig = "Error";
			}
			else vStrGTMOffsetConfig = GMTOffset + " (manual)";

			InicializaVariaveis();
			gi_676 = TRUE;
			gi_680 = vTimeCurrent;
			vInicializa = FALSE;
		}

		if (gi_676 == TRUE && gi_680 < vTimeCurrent - 60) {
			gi_676 = FALSE;
			gi_680 = vTimeCurrent + 60 * (300 - f0_2(120));
		}

		if (gi_676 == FALSE && vTimeCurrent >= gi_680) {
			if (AutoGMTOffset) {
				if (GetAutoGMTOffset(GMTOffset)) vStrGTMOffsetConfig = GMTOffset + " (automatic)";
				else vStrGTMOffsetConfig = "Error";
			}
			else vStrGTMOffsetConfig = GMTOffset + " (manual)";
			InicializaVariaveis();
			gi_676 = TRUE;
		}

		Painel();
	}

	vCurrentSpread = MarketInfo(Symbol(), MODE_SPREAD) / MathPow(10, Digits - vDigitsOperadora);

	if (vCurrentSpread > vMaxSpread) vMaxSpread = vCurrentSpread;

	int vTimeCurrent2 = TimeCurrent();
	int li_8 = vTimeCurrent2 - 3600 * GMTOffset;
	vAno = TimeYear(TimeCurrent());
	int vDiadaSemana = TimeDayOfWeek(vTimeCurrent2);
	int datetime_16 = iTime(NULL, PERIOD_D1, 0);

	for (int i = 0; i < 1; i++) {

		if (gba_560[i]) {

			if (!StealthMode) {
				ModificaOrdensAbertas(i, 0);
				if (vUseRevAfterSL[i]) ModificaOrdensAbertas(i, 1);
			}

			if (vUseTrailingStop[i]) {
				vTotalOrdens = OrdersTotal();
				for (int pos_28 = 0; pos_28 <= vTotalOrdens; pos_28++) {
					if (OrderSelect(pos_28, SELECT_BY_POS, MODE_TRADES))
						if (OrderMagicNumber() == vMagicNumberOp[i]) AddSLandTake(OrderTicket(), i, 0);
				}
			}

			if (gba_640[i] && vUseRevAfterSL[i]) {
				vTotalOrdens = OrdersTotal();
				for (pos_28 = 0; pos_28 <= vTotalOrdens; pos_28++) {
					if (OrderSelect(pos_28, SELECT_BY_POS, MODE_TRADES))
						if (OrderMagicNumber() == vRevAfterSL_MagNumber[i]) AddSLandTake(OrderTicket(), i, 1);
				}
			}

			GerenciaFechamentoOrdens(i, 0);

			if (vUseRevAfterSL[i]) GerenciaFechamentoOrdens(i, 1);

			if (vUseRevAfterSL[i])
			     // WatchReverseAfterSL(i);
				if (QtdOrdersInDay(-2, vRevAfterSL_MagNumber[i], datetime_16) == 0) WatchReverseAfterSL(i);

			if (vDiadaSemana <= 0 || vDiadaSemana > 5) continue;

			g_day_556 = TimeDay(TimeCurrent());

			if ((vTradeDiaSemana[i][vDiadaSemana - 1])) {

				//Fora do horario e minuto continua
				if (vHoraTrade[i] != TimeHour(vTimeCurrent2) || vMinutoTrade[i] != TimeMinute(vTimeCurrent2)) continue;

				if (QtdOrdersInDay(-2, vMagicNumberOp[i], datetime_16) <= 0) {
					if (QtdOrdersInDay(-1, vMagicNumberOp[i], datetime_16, gd_440) <= 0) {

						vQtdLotes = GetQtdLotes(vOperacaoType[i]);

						if (gia_584[i] >= 0)
							if (vDiadaSemana == gia_584[i])
								vQtdLotes = NormalizeDouble(2.0 * vQtdLotes, vDigitosLotStep);

						if ((vUsaSinalIchimoku[i] && SinalIchimoku()) || (!vUsaSinalIchimoku[i]))
							AbrirOrdem(i, 0, vOperacaoType[i], vMagicNumberOp[i], ExpertComment, vQtdLotes);
					}
				}
			}
		}
	}
	return (0);
}

string GetError(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 GetTipoOperacao(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 GetHoraTrader(int ai_0) {
	ai_0 += GMTOffset;
	while (true) {
		if (ai_0 >= 24) {
			ai_0 -= 24;
			continue;
		}
		if (ai_0 >= 0) break;
		ai_0 += 24;
	}
	g_str2int_472 = StrToInteger(StringSubstr(g_dbl2str_540, 6, 2));
	return (ai_0);
}

void ModificaOrdensAbertas(int ai_0, int ai_4) {
	double ld_8;
	double ld_16;
	double vMagic;
	int cmd_48;
	double ld_52;
	double price_60;
	double price_68;
	double price_76;
	bool li_84;
	double price_88;
	bool li_96;
	double price_100;
	bool bool_108;
	if (ai_4 == 0) {
		ld_8 = vTake[ai_0];
		ld_16 = vStop[ai_0];
		vMagic = vMagicNumberOp[ai_0];
	}
	else {
		ld_8 = vTake2[ai_0];
		ld_16 = vStop2[ai_0];
		vMagic = vRevAfterSL_MagNumber[ai_0];
	}
	double vSimbolModeStopLever = NormalizeDouble(MarketInfo(vSimbolo, MODE_STOPLEVEL) * Point, Digits);
	int li_40 = OrdersTotal() - 1;
	for (int pos_44 = li_40; pos_44 >= 0; pos_44--) {
		if (!OrderSelect(pos_44, SELECT_BY_POS, MODE_TRADES)) {
			if (WriteLog) Print(StringConcatenate("SetOrderLevels: OrderSelect() error = ", GetError(GetLastError())));
		}
		else {
			if (OrderMagicNumber() == vMagic) {
				if (OrderSymbol() == vSimbolo) {
					cmd_48 = OrderType();
					ld_52 = NormalizeDouble(OrderClosePrice(), Digits);
					price_60 = NormalizeDouble(OrderOpenPrice(), Digits);
					if (cmd_48 > OP_SELL)
						if (NormalizeDouble(MathAbs(price_60 - ld_52), Digits) <= vSimbolModeStopLever) continue;
					price_68 = NormalizeDouble(OrderStopLoss(), Digits);
					price_76 = NormalizeDouble(OrderTakeProfit(), Digits);
					li_84 = FALSE;
					if (price_68 == 0.0) {
						if (ld_16 < 0.0) {
							if (cmd_48 % 2 == 0) {
								price_88 = NormalizeDouble(price_60 + ld_16, Digits);
								if (NormalizeDouble(ld_52 - price_88, Digits) > vSimbolModeStopLever) li_84 = TRUE;
								else price_88 = price_68;
							}
							else {
								price_88 = NormalizeDouble(price_60 - ld_16, Digits);
								if (NormalizeDouble(price_88 - ld_52, Digits) > vSimbolModeStopLever) li_84 = TRUE;
								else price_88 = price_68;
							}
						}
						else price_88 = price_68;
					}
					else price_88 = price_68;
					li_96 = FALSE;
					if (price_76 == 0.0 && (!vUseTrailingStop[ai_0] && ai_4 == 0) || (!gba_640[ai_0] && ai_4 == 1) || (vUseTrailingStop[ai_0] && vTrailingDistance[ai_0] < ld_8) || (gba_640[ai_0] && gda_644[ai_0] < ld_8)) {
						if (ld_8 > 0.0) {
							if (cmd_48 % 2 == 0) {
								price_100 = NormalizeDouble(price_60 + ld_8, Digits);
								if (NormalizeDouble(price_100 - ld_52, Digits) > vSimbolModeStopLever) li_96 = TRUE;
								else price_100 = price_76;
							}
							else {
								price_100 = NormalizeDouble(price_60 - ld_8, Digits);
								if (NormalizeDouble(ld_52 - price_100, Digits) > vSimbolModeStopLever) li_96 = TRUE;
								else price_100 = price_76;
							}
						}
						else price_100 = price_76;
					}
					else price_100 = price_76;
					if (li_84 || li_96 || (vUseTrailingStop[ai_0] && ai_4 == 0) || (gba_640[ai_0] && ai_4 == 1)) {
						while (!IsTradeAllowed()) Sleep(1000);
						if (NormalizeDouble(OrderStopLoss(), Digits) != price_88 || NormalizeDouble(OrderTakeProfit(), Digits) != price_100) {
							bool_108 = OrderModify(OrderTicket(), price_60, price_88, price_100, 0, CLR_NONE);
							if (!bool_108)
								if (WriteLog) Print(StringConcatenate("SetOrderLevels: OrderModify(", GetTipoOperacao(OrderType()), ") error = ", GetError(GetLastError())));
						}
					}
				}
			}
		}
	}
}

void GerenciaFechamentoOrdens(int ai_0, int ai_4) {
	double ld_16;
	double ld_24;
	double magic_32;
   double magic_322;

	double ld_48;
	int li_56;
	double ld_60;
	double ld_68;
	double ld_76;
	int li_8 = OrdersTotal() - 1;
	for (int pos_12 = li_8; pos_12 >= 0; pos_12--) {
		if (!OrderSelect(pos_12, SELECT_BY_POS, MODE_TRADES)) {
			if (WriteLog) Print(StringConcatenate("WatchOrderLevels: OrderSelect() error = ", GetError(GetLastError())));
		}
		else {
			if (ai_4 == 0) {
				ld_16 = vTake[ai_0];
				ld_24 = vStop[ai_0];
				magic_32 = vMagicNumberOp[ai_0];
            magic_322 = vRevAfterSL_MagNumber[ai_0];
				ld_48 = 0;
				if (vUseTrailingStop[ai_0]) {
					if (vTrailingDistance[ai_0] >= ld_16) ld_16 = 0;
					li_56 = f0_11(ai_0, OrderTicket());
					if (StealthMode && gda_632[ai_0][li_56] != 0.0) {
						ld_24 = 0;

						ld_48 = gda_636[ai_0][li_56];
					}
				}
			}
			else {
				ld_16 = vTake2[ai_0];
				ld_24 = vStop2[ai_0];
				magic_32 = vRevAfterSL_MagNumber[ai_0];
            magic_322 = vRevAfterSL_MagNumber[ai_0];
				ld_48 = 0;
				if (gba_640[ai_0]) {
					if (gda_644[ai_0] >= ld_16) ld_16 = 0;
					if (StealthMode && gda_652[ai_0] != 0.0) {
						ld_24 = 0;

						ld_48 = gda_656[ai_0];
					}
				}
			}
			if (ld_16 <= 0.0 && ld_24 >= 0.0 && ld_48 == 0.0) break;
			
			if (OrderMagicNumber() == magic_32 || OrderMagicNumber() == magic_322) {
				if (OrderType() <= OP_SELL) {
					if (OrderSymbol() == vSimbolo) {
						ld_60 = NormalizeDouble(OrderClosePrice(), Digits);
						ld_68 = NormalizeDouble(OrderOpenPrice(), Digits);
						
						if (OrderType() == OP_BUY) {
							ld_76 = NormalizeDouble(ld_60 - ld_68, Digits);
							
							if (!((ld_16 > 0.0 && ld_76 >= ld_16) || (ld_24 < 0.0 && ld_76 <= ld_24) || (ld_48 != 0.0 && ld_76 <= ld_48))) continue;
							
							
							if (WriteLog) Print("WatchOrderLevels: level for close BUY");
							FecharOrdem(OrderTicket(), OrderLots(), 0, gslippage);
							if (ai_4 == 0) {
								f0_0(ai_0, OrderTicket());
								gda_632[ai_0][li_56] = 0;
								gda_636[ai_0][li_56] = 0;
								continue;
							}
							gda_652[ai_0] = 0;
							gda_656[ai_0] = 0;
							continue;
						}
						ld_76 = NormalizeDouble(ld_68 - ld_60, Digits);
						
						if ((ld_16 > 0.0 && ld_76 >= ld_16) || (ld_24 < 0.0 && ld_76 <= ld_24) || (ld_48 != 0.0 && ld_76 <= ld_48)) {
							if (WriteLog) Print("WatchOrderLevels: level for close SELL");
							FecharOrdem(OrderTicket(), OrderLots(), 1, gslippage);
							if (ai_4 == 0) {
								f0_0(ai_0, OrderTicket());
								gda_632[ai_0][li_56] = 0;
								gda_636[ai_0][li_56] = 0;
								continue;
							}
							gda_652[ai_0] = 0;
							gda_656[ai_0] = 0;
						}
					}
				}
			}
		}
	}
}

double GetQtdLotes(int ai_unused_0) {
	double vQtdLotes;
	double ld_12;
	double vMagemRequerid;
	if (!UseMM) vQtdLotes = Lots;
	else {
		ld_12 = AccountFreeMargin() * vPercentRiscRedutor / 100.0;
		vMagemRequerid = MarketInfo(vSimbolo, MODE_MARGINREQUIRED) * vLotStep;
		vQtdLotes = NormalizeDouble(MathFloor(ld_12 / vMagemRequerid) * vLotStep, vDigitosLotStep);
	}
	if (vQtdLotes > vMaxLotes) vQtdLotes = vMaxLotes;
	if (vQtdLotes < vModeMinLot) vQtdLotes = vModeMinLot;
	if (vQtdLotes > vModeMaxLot) vQtdLotes = vModeMaxLot;
	return (vQtdLotes);
}

int AbrirOrdem(int ai_0, int ai_4, int vOperacao, int a_magic_12, string a_comment_16, double ad_24, double vPrecoAbertura = 0.0) {
	color vColor;
	int vTicket;
	int vError;
	double vPrice;
	if (vOperacao > OP_SELL && vPrecoAbertura == 0.0) return (-1);
	int cmd_40 = vOperacao % 2;
	if (ad_24 < vModeMinLot) ad_24 = vModeMinLot;
	else
		if (ad_24 > vModeMaxLot) ad_24 = vModeMaxLot;
	if (AccountFreeMarginCheck(vSimbolo, cmd_40, ad_24) <= 0.0 || GetLastError() == 134/* NOT_ENOUGH_MONEY */) {
		if (!(WriteLog)) return (-1);
		Print("OpenOrder: you don\'t have free margin.");
		return (-1);
	}
	if (cmd_40 == OP_BUY) vColor = ColorBuy;
	else vColor = ColorSell;
	RefreshRates();
	double vStopLevel = NormalizeDouble(MarketInfo(vSimbolo, MODE_STOPLEVEL) * Point, Digits);
	double vPrecoCompraAtual = NormalizeDouble(Ask, Digits);
	double vPrecoVendaAtual = NormalizeDouble(Bid, Digits);
	switch (vOperacao) {
	case OP_BUY:
		vPrecoAbertura = vPrecoCompraAtual;
		break;
	case OP_SELL:
		vPrecoAbertura = vPrecoVendaAtual;
		break;
	case OP_BUYLIMIT:
		if (vPrecoAbertura >= vPrecoCompraAtual) {
			vPrecoAbertura = vPrecoCompraAtual;
			vOperacao = 0;
		}
		else
			if (NormalizeDouble(vPrecoCompraAtual - vPrecoAbertura, Digits) < vStopLevel) return (-1);
		break;
	case OP_SELLLIMIT:
		if (vPrecoAbertura <= vPrecoVendaAtual) {
			vPrecoAbertura = vPrecoVendaAtual;
			vOperacao = 1;
		}
		else
			if (NormalizeDouble(vPrecoAbertura - vPrecoVendaAtual, Digits) < vStopLevel) return (-1);
		break;
	case OP_BUYSTOP:
		if (vPrecoAbertura <= vPrecoCompraAtual) {
			vPrecoAbertura = vPrecoCompraAtual;
			vOperacao = 0;
		}
		else
			if (NormalizeDouble(vPrecoAbertura - vPrecoCompraAtual, Digits) < vStopLevel) return (-1);
		break;
	case OP_SELLSTOP:
		if (vPrecoAbertura >= vPrecoVendaAtual) {
			vPrecoAbertura = vPrecoVendaAtual;
			vOperacao = 1;
		}
		else
			if (NormalizeDouble(vPrecoVendaAtual - vPrecoAbertura, Digits) < vStopLevel) return (-1);
		break;
	default:
		return (-1);
	}
	int li_76 = gi_400;
	while (li_76 > 0) {

		while (!IsTradeAllowed()) Sleep(1000);

		vTicket = OrderSend(vSimbolo, vOperacao, ad_24, vPrecoAbertura, gslippage, 0, 0, a_comment_16, a_magic_12, 0, vColor);
		Sleep(MathRand() / 1000);

		if (vTicket < 0) {
			vError = GetLastError();
			if (WriteLog) {
				Print("OpenOrder: OrderSend(", GetTipoOperacao(vOperacao), ") error = ", GetError(vError));
				Print("OpenOrder: order ", vSimbolo, " ", GetTipoOperacao(vOperacao), " lot = ", DoubleToStr(ad_24, 8), " op = ", DoubleToStr(vPrecoAbertura, 8), " slippage = ", gslippage);
			}

			if (vError != 136/* OFF_QUOTES */) break;

			if (!(gi_396)) break;

			Sleep(6000);

			RefreshRates();

			if (vOperacao == OP_BUY) vPrice = NormalizeDouble(Ask, Digits);

			else vPrice = NormalizeDouble(Bid, Digits);

			if (NormalizeDouble(MathAbs((vPrice - vPrecoAbertura) / vTamMinLote), 0) > gi_404) break;

			vPrecoAbertura = vPrice;

			li_76--;

			if (li_76 > 0)
				if (WriteLog) Print("... Possible to open order.");

			ad_24 = NormalizeDouble(ad_24 / 2.0, vDigitosLotStep);

			if (ad_24 < vModeMinLot) ad_24 = vModeMinLot;
		}
		else {
			if (OrderSelect(vTicket, SELECT_BY_TICKET)) vPrecoAbertura = OrderOpenPrice();

			if (SendEmail) {
				SendMail(vAssuntoEmail, StringConcatenate("RobotFx FUTURE trade Information\nCurrency Pair: ", StringSubstr(vSimbolo, 0, 6),
					"\nTime: ", TimeToStr(TimeCurrent(), TIME_DATE | TIME_MINUTES | TIME_SECONDS),
					"\nOrder Type: ", GetTipoOperacao(vOperacao),
					"\nPrice: ", DoubleToStr(vPrecoAbertura, Digits),
					"\nLot size: ", DoubleToStr(ad_24, vDigitosLotStep),
					"\nEvent: Trade Opened",
					"\n\nCurrent Balance: ", DoubleToStr(AccountBalance(), 2), " ", vAccountMoeda,
					"\nCurrent Equity: ", DoubleToStr(AccountEquity(), 2), " ", vAccountMoeda));
			}
			if (!(SoundAlert)) break;
			PlaySound(SoundFileAtOpen);
			break;
		}
	}
	if (ai_4 == 0) f0_12(ai_0, vTicket);
	return (vTicket);
}

int FecharOrdem(int a_ticket_0, double vQtdLotes, int ai_12, int a_slippage_16) {
	color color_20;
	double price_40;
	bool is_closed;
	int vError;
	bool li_56;
	if (ai_12 == 0) color_20 = ColorBuy;
	else color_20 = ColorSell;
	int count_24 = 0;
	int count_28 = 0;
	int count_32 = 0;
	int count_36 = 0;

	while (true) {
		while (!IsTradeAllowed()) Sleep(1000);

		RefreshRates();

		if (ai_12 == 0) price_40 = NormalizeDouble(Bid, Digits);
		else price_40 = NormalizeDouble(Ask, Digits);
		is_closed = OrderClose(a_ticket_0, vQtdLotes, price_40, a_slippage_16, color_20);

		if (!is_closed) {
			vError = GetLastError();
			if (WriteLog) Print(StringConcatenate("OrderClose(", GetTipoOperacao(ai_12), ",", DoubleToStr(a_ticket_0, 0), ") error = ", GetError(vError)));
			li_56 = FALSE;
			switch (vError) {
			case 0/* NO_ERROR */:
				Sleep(10000);
				if (!(OrderSelect(a_ticket_0, SELECT_BY_TICKET))) break;
				if (OrderCloseTime() != 0) break;
				li_56 = TRUE;
				break;
			case 1/* NO_RESULT */: break;
			case 2/* COMMON_ERROR */: break;
			case 3/* INVALID_TRADE_PARAMETERS */: break;
			case 4/* SERVER_BUSY */: break;
			case 5/* OLD_VERSION */: break;
			case 6/* NO_CONNECTION */:
				Sleep(10000);
				if (!(IsConnected())) break;
				li_56 = TRUE;
				break;
			case 7/* NOT_ENOUGH_RIGHTS */: break;
			case 8/* TOO_FREQUENT_REQUESTS */: break;
			case 9/* MALFUNCTIONAL_TRADE */: break;
			case 64/* ACCOUNT_DISABLED */: break;
			case 65/* INVALID_ACCOUNT */: break;
			case 128/* TRADE_TIMEOUT */:
				Sleep(70000);
				if (!(OrderSelect(a_ticket_0, SELECT_BY_TICKET))) break;
				if (OrderCloseTime() != 0) break;
				li_56 = TRUE;
				break;
			case 129/* INVALID_PRICE */:
				Sleep(6000);
				count_24++;
				if (count_24 > 3) break;
				li_56 = TRUE;
				break;
			case 130/* INVALID_STOPS */:
				Sleep(6000);
				count_28++;
				if (count_28 > 3) break;
				li_56 = TRUE;
				break;
			case 131/* INVALID_TRADE_VOLUME */: break;
			case 132/* MARKET_CLOSED */: break;
			case 133/* TRADE_DISABLED */: break;
			case 134/* NOT_ENOUGH_MONEY */: break;
			case 135/* PRICE_CHANGED */:
				li_56 = TRUE;
				break;
			case 136/* OFF_QUOTES */:
				Sleep(6000);
				li_56 = TRUE;
				break;
			case 137/* BROKER_BUSY */:
				Sleep(20000);
				count_32++;
				if (count_32 > 3) break;
				li_56 = TRUE;
				break;
			case 138/* REQUOTE */:
				count_36++;
				if (count_36 > 3) break;
				li_56 = TRUE;
				break;
			case 139/* ORDER_LOCKED */: break;
			case 140/* LONG_POSITIONS_ONLY_ALLOWED */: break;
			case 141/* TOO_MANY_REQUESTS */: break;
			case 142:
				Sleep(70000);
				if (!(OrderSelect(a_ticket_0, SELECT_BY_TICKET))) break;
				if (OrderCloseTime() != 0) break;
				li_56 = TRUE;
				break;
			case 143:
				Sleep(70000);
				if (!(OrderSelect(a_ticket_0, SELECT_BY_TICKET))) break;
				if (OrderCloseTime() != 0) break;
				li_56 = TRUE;
				break;
			case 144: break;
			case 145/* TRADE_MODIFY_DENIED */:
				Sleep(20000);
				li_56 = TRUE;
				break;
			case 146/* TRADE_CONTEXT_BUSY */:
				while (IsTradeContextBusy()) Sleep(1000);
				li_56 = TRUE;
				break;
			case 147/* TRADE_EXPIRATION_DENIED */: break;
			case 148/* TRADE_TOO_MANY_ORDERS */: break;
			case 149/* TRADE_HEDGE_PROHIBITED */: break;
			case 150/* TRADE_PROHIBITED_BY_FIFO */: break;
			case 4000/* NO_MQLERROR */:
				Sleep(10000);
				if (!(OrderSelect(a_ticket_0, SELECT_BY_TICKET))) break;
				if (OrderCloseTime() != 0) break;
				li_56 = TRUE;
			case 4051/* INVALID_FUNCTION_PARAMETER_VALUE */: break;
			case 4062/* STRING_PARAMETER_EXPECTED */: break;
			case 4063/* INTEGER_PARAMETER_EXPECTED */: break;
			case 4064/* DOUBLE_PARAMETER_EXPECTED */: break;
			case 4105/* NO_ORDER_SELECTED */: break;
			case 4106/* UNKNOWN_SYMBOL */: break;
			case 4107/* INVALID_PRICE_PARAM */: break;
			case 4108/* INVALID_TICKET */: break;
			case 4109/* TRADE_NOT_ALLOWED */: break;
			case 4110/* LONGS__NOT_ALLOWED */: break;
			case 4111/* SHORTS_NOT_ALLOWED */: break;
			}
			if (!(li_56)) break;
			continue;
		}
		if (OrderSelect(a_ticket_0, SELECT_BY_TICKET)) price_40 = OrderClosePrice();
		if (SendEmail) {
			SendMail(vAssuntoEmail, StringConcatenate("RobotFx FUTURE trade Information\nCurrency Pair: ", StringSubstr(vSimbolo, 0, 6),
				"\nTime: ", TimeToStr(TimeCurrent(), TIME_DATE | TIME_MINUTES | TIME_SECONDS),
				"\nOrder Type: ", GetTipoOperacao(ai_12),
				"\nPrice: ", DoubleToStr(price_40, Digits),
				"\nLot size: ", DoubleToStr(vQtdLotes, vDigitosLotStep),
				"\nEvent: Trade Closed",
				"\n\nCurrent Balance: ", DoubleToStr(AccountBalance(), 2), " ", vAccountMoeda,
				"\nCurrent Equity: ", DoubleToStr(AccountEquity(), 2), " ", vAccountMoeda));
		}
		if (!(SoundAlert)) break;
		PlaySound(SoundFileAtClose);
		break;
	}
	return (is_closed);
}

int QtdOrdersInDay(int a_cmd_0, int a_magic_4, int ai_8, double ad_12 = 0.0) {
	int str2int_28;
	int month_32;
	int cmd_40;
	int count_20 = 0;
	int vQtdOrders = OrdersTotal() - 1;
	if (ad_12 == gd_440) {
		if (vAno < g_str2int_464) return (1);
		if (vAno != g_str2int_464) return (0);
		str2int_28 = StrToInteger(StringSubstr(g_dbl2str_540, 4, 2));
		month_32 = TimeMonth(TimeCurrent());
		if (month_32 < str2int_28) return (1);
		if (month_32 != str2int_28) return (0);
		if (g_day_556 < g_str2int_472) return (1);
		return (0);
	}
	for (int i = vQtdOrders; i >= 0; i--) {
		if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
			if (WriteLog) Print(StringConcatenate("HaveOrdersInDay: OrderSelect() error = ", GetError(GetLastError())));
		}
		else {
			if (OrderMagicNumber() == a_magic_4) {
				if (OrderSymbol() == vSimbolo) {
					cmd_40 = OrderType();
					if (a_cmd_0 == -4) {
						if (cmd_40 % 2 != 0) continue;
					}
					else {
						if (a_cmd_0 == -5) {
							if (cmd_40 % 2 != 1) continue;
						}
						else {
							if (a_cmd_0 == -3) {
								if (cmd_40 <= OP_SELL) continue;
							}
							else {
								if (a_cmd_0 == -2) {
									if (cmd_40 > OP_SELL) continue;
								}
								else {
									if (a_cmd_0 >= OP_BUY)
										if (cmd_40 != a_cmd_0) continue;
								}
							}
						}
					}
					if (OrderOpenTime() >= ai_8) count_20++;
				}
			}
		}
	}
	if (count_20 == 0) {
		vQtdOrders = OrdersHistoryTotal() - 1;
		for (i = vQtdOrders; i >= 0; i--) {
			if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
				if (WriteLog) Print(StringConcatenate("HaveOrdersInDay: OrderSelect_2() error = ", GetError(GetLastError())));
			}
			else {
				if (OrderMagicNumber() == a_magic_4) {
					if (OrderSymbol() == vSimbolo) {
						cmd_40 = OrderType();
						if (a_cmd_0 == -4) {
							if (cmd_40 % 2 != 0) continue;
						}
						else {
							if (a_cmd_0 == -5) {
								if (cmd_40 % 2 != 1) continue;
							}
							else {
								if (a_cmd_0 == -3) {
									if (cmd_40 <= OP_SELL) continue;
								}
								else {
									if (a_cmd_0 == -2) {
										if (cmd_40 > OP_SELL) continue;
									}
									else {
										if (a_cmd_0 >= OP_BUY)
											if (cmd_40 != a_cmd_0) continue;
									}
								}
							}
						}
						if (OrderOpenTime() < ai_8) break;
						count_20++;
					}
				}
			}
		}
	}
	return (count_20);
}

void WatchReverseAfterSL(int ai_0) {
	int magic_12;
	int vOrderCloseTime;
	double vOrderOpenPrice;
	double vOrderClosePrice;
	double ld_36;
	double vProfit;
	double vQtdLote;
	int vQtdOrdens = OrdersHistoryTotal() - 1;
	for (int c = vQtdOrdens; c >= 0; c--) {
		if (!OrderSelect(c, SELECT_BY_POS, MODE_HISTORY)) {
			if (WriteLog) Print(StringConcatenate("WatchReverseAfterSL: OrderSelect() error = ", GetError(GetLastError())));
		}
		else {
			magic_12 = OrderMagicNumber();
			
			if (magic_12 == vRevAfterSL_MagNumber[ai_0]) break;
			
			if (magic_12 == vMagicNumberOp[ai_0]) {
				if (OrderSymbol() == vSimbolo) {
				
					if (OrderProfit() >= 0.0) break;
					
					vOrderCloseTime = OrderCloseTime();
					if (TimeHour(vOrderCloseTime) != Hour()) break;
					if (TimeMinute(vOrderCloseTime) != Minute()) break;
					if (TimeDay(vOrderCloseTime) != Day()) break;
					if (TimeMonth(vOrderCloseTime) != Month()) break;
					
					vOrderOpenPrice = NormalizeDouble(OrderOpenPrice(), Digits);
					vOrderClosePrice = NormalizeDouble(OrderClosePrice(), Digits);
					
					ld_36 = vStop[ai_0];
					vProfit = NormalizeDouble(vOrderClosePrice - vOrderOpenPrice, Digits);
					if (MathAbs(vOrderOpenPrice - vOrderClosePrice) < MathAbs(ld_36) - gslippage * (1 / MathPow(10, Digits))) break;
					vQtdLote = NormalizeDouble(OrderLots() * vRevAfterSL_Multiplier[ai_0], vDigitosLotStep);
					if (vQtdLote > vMaxLotes) vQtdLote = vMaxLotes;
					if (vQtdLote < vModeMinLot) vQtdLote = vModeMinLot;
					if (vQtdLote > vModeMaxLot) vQtdLote = vModeMaxLot;
					
					AbrirOrdem(ai_0, 1, MathAbs(vOperacaoType[ai_0] - 1), vRevAfterSL_MagNumber[ai_0], ExpertComment, vQtdLote);
					return;
				}
			}
		}
	}
}

int GetAutoGMTOffset(int &ai_0) {
	int li_4 = AUGMT();
	//if (li_4 < 0) return (0);
	//int li_8 = TimeCurrent() - li_4;
	ai_0 = vFusoHorario;//MathFloor((li_8 + 1800) / 3600.0);
	return (1);
}

int ComantarNaTela(string as_0, string as_8 = "") {
	Comment("\n\n" + "FOREXFX FUTURE"
		+ "\n"
		+ "rodolfo.leonardo@gmail.com"
		+ "\n\n" + as_0);
	if (as_8 != "") {
		if (as_8 == "comment") Print(as_0);
		else Print(as_8);
	}
	return (1);
}

int Painel() {
	string vAcountType;
	string vAutoAnalysis;

	if (IsDemo()) vAcountType = "Demo";
	else vAcountType = "Real";
	if (AutoAnalysis) vAutoAnalysis = "Enable";
	else vAutoAnalysis = "Disable";
	ComantarNaTela("AUTHENTICATION STATUS: "
		+ "\n"
		+ vMensagemAutenticacao
		+ "\n"
		+ "---------------------------------------------------"
		+ "\n"
		+ "INFORMATION:"
		+ "\n"
		+ "Broker Company:            " + AccountCompany()
		+ "\n"
		+ "Terminal Company:         " + TerminalCompany()
		+ "\n"
		+ "Server Name:                 " + AccountServer()
		+ "\n"
		+ "Current Server Time:       " + TimeToStr(TimeCurrent(), TIME_SECONDS)
		+ "\n"
		+ "---------------------------------------------------"
		+ "\n"
		+ "ACCOUNT INFORMATION:"
		+ "\n"
		+ "Account Name:               " + AccountName()
		+ "\n"
		+ "Account Number:             " + AccountNumber()
		+ "\n"
		+ "Account Type:                " + vAcountType
		+ "\n"
		+ "Account Leverage:           1:" + DoubleToStr(AccountLeverage(), 0)
		+ "\n"
		+ "Account Balance:             " + DoubleToStr(AccountBalance(), 2)
		+ "\n"
		+ "Account Equity:               " + DoubleToStr(AccountEquity(), 2)
		+ "\n"
		+ "Account Floating P/L:        " + DoubleToStr(AccountProfit(), 2)
		+ "\n"
		+ "Account Currency:           " + AccountCurrency()
		+ "\n"
		+ "---------------------------------------------------"
		+ "\n"
		+ "ADDITIONAL INFORMATION:"
		+ "\n"
		+ "Current Spread:               " + DoubleToStr(vCurrentSpread, Digits - vDigitsOperadora)
		+ "\n"
		+ "Maximum Spread:            " + DoubleToStr(vMaxSpread, Digits - vDigitsOperadora)
		+ "\n"
		+ "Free Margin:                   " + DoubleToStr(AccountFreeMargin(), 2)
		+ "\n"
		+ "Used Margin:                   " + DoubleToStr(AccountMargin(), 2)
		+ "\n"
		+ "Auto Analysis:                " + vAutoAnalysis
		+ "\n"
		+ "---------------------------------------------------"
		+ "\n"
		+ "GMT SETTINGS:"
		+ "\n"
		+ "GMT Offset:                   " + vStrGTMOffsetConfig);
	return (0);
}

int InicializaVariaveis(){
	//                       0  1   2    3  4   5  6  7  8  9 10  11 12  13 14 15  16   17
	//double vDadosDNA[26] = { 1, 2, 40.9, 4, 8, 0, 0, 1, 0, 0, 0,  0, 0, -2, 0, 1, 220, 13.1, 5.3, 1, 120, 30, 1, 120, 30, 1 };
	//vStopLoss = vDadosDNA[2];//91.9
	//vTakeProfit = vDadosDNA[3];//4
	vHoraTrad = vDadosDNA[4];//22
	//vminTrade = vDadosDNA[5];//0
	//vStopLoss2 = vDadosDNA[16];//220
	//vTakeGain2 = vDadosDNA[17];// 13.1

	if (AutoAnalysis) {
		if (vDadosDNA[6] == 0.0) TradeMonday = FALSE;
		else TradeMonday = TRUE;
		if (vDadosDNA[7] == 0.0) TradeTuesday = FALSE;
		else TradeTuesday = TRUE;
		
		if (vDadosDNA[9] == 0.0) TradeWednesday = FALSE;
		else TradeWednesday = TRUE;

		if (vDadosDNA[10] == 0.0) TradeThursday = FALSE;
		else TradeThursday = TRUE;
		if (vDadosDNA[11] == 0.0) TradeFriday = FALSE;
		else TradeFriday = TRUE;
	}

	gba_560[0] = gi_200;
	vStop[0] = NormalizeDouble((-1.0 * vStopLoss) * vTamMinLote, Digits);
	vTake[0] = NormalizeDouble(vTakeProfit * vTamMinLote, Digits);
	vHoraTrade[0] = GetHoraTrader(vHoraTrad);
	vMinutoTrade[0] = vminTrade;
	vTradeDiaSemana[0][0] = TradeMonday;
	vTradeDiaSemana[0][1] = TradeTuesday;
	vTradeDiaSemana[0][2] = TradeWednesday;
	vTradeDiaSemana[0][3] = TradeThursday;
	vTradeDiaSemana[0][4] = TradeFriday;
	gia_584[0] = gi_228;
	vOperacaoType[0] = gi_232;
	vMagicNumberOp[0] = MagicNumber;
	vUseRevAfterSL[0] = UseRevAfterSL;
	vStop2[0] = NormalizeDouble((-1.0 * vStopLoss2) * vTamMinLote, Digits);
	vTake2[0] = NormalizeDouble(vTakeGain2 * vTamMinLote, Digits);
	vRevAfterSL_Multiplier[0] = RevAfterSL_Multiplier;
	vRevAfterSL_MagNumber[0] = RevAfterSL_MagNumber;
	vUseTrailingStop[0] = UseTrailingStop;
	vTrailingDistance[0] = NormalizeDouble(TrailingDistance * vTamMinLote, Digits);
	vTrailingStep[0] = NormalizeDouble(TrailingStep * vTamMinLote, Digits);
	gba_640[0] = gi_308;
	gda_644[0] = NormalizeDouble(gd_312 * vTamMinLote, Digits);
	gda_648[0] = NormalizeDouble(gd_320 * vTamMinLote, Digits);
	gda_652[0] = 0;
	gda_656[0] = 0;
	vUsaSinalIchimoku[0] = HabilitaSinal;
	return (1);
}


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

int SinalIchimoku() {
	double ichimoku_0 = iIchimoku(NULL, 0, 9, 26, 52, MODE_SENKOUSPANA, 0);
	double ichimoku_8 = iIchimoku(NULL, 0, 9, 26, 52, MODE_SENKOUSPANB, 0);
	if ((Bid < ichimoku_0 && Bid > ichimoku_8) || (Bid > ichimoku_0 && Bid < ichimoku_8)) return (0);
	if (Ask < ichimoku_0 && Ask < ichimoku_8) return (0);
	if (Bid > ichimoku_0 && Bid > ichimoku_8) return (1);
	return (0);
}

void AddSLandTake(int a_ticket_0, int ai_4, int ai_8) {
	double ld_12;
	double ld_20;
	int li_28;
	double ld_32;
	if (ai_8 == 0) {
		ld_12 = vTrailingDistance[ai_4];
		ld_20 = vTrailingStep[ai_4];
		li_28 = f0_11(ai_4, a_ticket_0);
		ld_32 = gda_632[ai_4][li_28];
	}
	else {
		ld_12 = gda_644[ai_4];
		ld_20 = gda_648[ai_4];
		ld_32 = gda_652[ai_4];
	}
	if (OrderSelect(a_ticket_0, SELECT_BY_TICKET, MODE_TRADES)) {
		if (OrderType() == OP_BUY) {
			if (Bid - OrderOpenPrice() <= NormalizeDouble(ld_12, Digits)) return;
			if (!StealthMode) {
				if (!(OrderStopLoss() == 0.0 || OrderStopLoss() < Bid - NormalizeDouble(ld_12 + ld_20, Digits))) return;
				if (!OrderModify(a_ticket_0, OrderOpenPrice(), Bid - NormalizeDouble(ld_12, Digits), OrderTakeProfit(), OrderExpiration())) {
					Print("Error Trailing: OrderModify function can not modify the order. Error Number: #", GetLastError());
					return;
				}
				if (ai_8 == 0) {
					gda_632[ai_4][li_28] = Bid - NormalizeDouble(ld_12, Digits);
					gda_636[ai_4][li_28] = NormalizeDouble(Bid - ld_12 - OrderOpenPrice(), Digits);
					return;
				}
				gda_652[ai_4] = Bid - NormalizeDouble(ld_12, Digits);
				gda_656[ai_4] = NormalizeDouble(Bid - ld_12 - OrderOpenPrice(), Digits);
				return;
			}
			if (!(ld_32 == 0.0 || ld_32 < Bid - NormalizeDouble(ld_12 + ld_20, Digits))) return;
			if (ai_8 == 0) {
				gda_632[ai_4][li_28] = Bid - NormalizeDouble(ld_12, Digits);
				gda_636[ai_4][li_28] = NormalizeDouble(Bid - ld_12 - OrderOpenPrice(), Digits);
				return;
			}
			gda_652[ai_4] = Bid - NormalizeDouble(ld_12, Digits);
			gda_656[ai_4] = NormalizeDouble(Bid - ld_12 - OrderOpenPrice(), Digits);
			return;
		}
		if (OrderType() == OP_SELL) {
			if (OrderOpenPrice() - Ask > NormalizeDouble(ld_12, Digits)) {
				if (!StealthMode) {
					if (!(OrderStopLoss() == 0.0 || OrderStopLoss() > Ask + NormalizeDouble(ld_12 + ld_20, Digits))) return;
					if (!OrderModify(a_ticket_0, OrderOpenPrice(), Ask + NormalizeDouble(ld_12, Digits), OrderTakeProfit(), OrderExpiration())) {
						Print("Error Trailing: OrderModify function can not modify the order. Error Number: #", GetLastError());
						return;
					}
					if (ai_8 == 0) {
						gda_632[ai_4][li_28] = Ask + NormalizeDouble(ld_12, Digits);
						gda_636[ai_4][li_28] = NormalizeDouble(OrderOpenPrice() - (Ask + ld_12), Digits);
						return;
					}
					gda_652[ai_4] = Ask + NormalizeDouble(ld_12, Digits);
					gda_656[ai_4] = NormalizeDouble(OrderOpenPrice() - (Ask + ld_12), Digits);
					return;
				}
				if (ld_32 == 0.0 || ld_32 > Ask + NormalizeDouble(ld_12 + ld_20, Digits)) {
					if (ai_8 == 0) {
						gda_632[ai_4][li_28] = Ask + NormalizeDouble(ld_12, Digits);
						gda_636[ai_4][li_28] = NormalizeDouble(OrderOpenPrice() - (Ask + ld_12), Digits);
						return;
					}
					gda_652[ai_4] = Ask + NormalizeDouble(ld_12, Digits);
					gda_656[ai_4] = NormalizeDouble(OrderOpenPrice() - (Ask + ld_12), Digits);
				}
			}
		}
	}
}

int f0_11(int ai_0, int ai_4) {
	for (int count_8 = 0; count_8 < 5; count_8++)
		if (gia_628[ai_0][count_8] == ai_4) return (count_8);
	return (-1);
}

void f0_12(int ai_0, int ai_4) {
	for (int count_8 = 0; count_8 < 5; count_8++) {
		if (gia_628[ai_0][count_8] == 0) {
			gia_628[ai_0][count_8] = ai_4;
			return;
		}
	}
}

void f0_0(int ai_0, int ai_4) {
	for (int count_8 = 0; count_8 < 5; count_8++)
		if (gia_628[ai_0][count_8] == ai_4) gia_628[ai_0][count_8] = 0;
}

int AUGMT() {
	int li_0;
	int li_12;
	int li_16;
	bool li_24;
	int li_28;
	int lia_32[16];
	int lia_44[100];
	string str_concat_48;
	int str2time_56;
	double ld_60;
	int lia_68[4];
	string ls_72;
	string ls_80;
	double ld_4 = -100;
	if (AlreadyCalc == true) return(0);
	vFusoHorario = NormalizeDouble(GMTOffset, 1);
	while (ld_4 < -12.0 || ld_4 > 13.0 && li_0 < 10) {
		li_12 = 9;
		li_24 = FALSE;
		li_28 = 0;
		int lia_36[5] = { 218103810 };
		int lia_40[8] = { 317991872, 1694802820, 895544384, 487523969, 1711580036, 747408000, 1728357252, 1901185231,
			470746753 };
		//while (li_16 < li_12) {
		//	if (WSAStartup(514, lia_44) == 0) {
		//		li_28 = socket(2, 1, 0);
		//		if (li_28 >= 0) {
		//			lia_36[1] = lia_40[li_16];
		//			if (connect(li_28, lia_36, 20) >= 0) {
		//				ArrayInitialize(lia_32, 0);
		//				if (recv(li_28, lia_32, 64, 0) >= 0) {
		//					str_concat_48 = "";
		//					str2time_56 = 0;
		//					for (int index_20 = 0; index_20 < 16; index_20++) {
		//						str_concat_48 = StringConcatenate(str_concat_48, CharToStr(lia_32[index_20] & 255), CharToStr(lia_32[index_20] >> 8 & 255), CharToStr(lia_32[index_20] >> 16 & 255),
		//							CharToStr(lia_32[index_20] >> 24 & 255));
		//					}
		//					if (StringLen(str_concat_48) > 22) {
		//						str2time_56 = StrToTime(StringConcatenate("20", StringSubstr(str_concat_48, 7, 2), ".", StringSubstr(str_concat_48, 10, 2), ".", StringSubstr(str_concat_48, 13, 2),
		//							StringSubstr(str_concat_48, 15, 9)));
		//					}
		//				}
		//			}
		//		}
		//		if (li_28 > 0) closesocket(li_28);
		//		WSACleanup();
		//	}
		//	if (str2time_56 != 0) break;
		//	li_16++;
		//	Sleep(500);
		//}
		if (str2time_56 == 0) {
			li_24 = TRUE;
			GetSystemTime(lia_68);
			ls_72 = lia_68[0] & 65535;
			ls_80 = lia_68[0] >> 16 + 100;
			ls_72 = ls_72 + "." + StringSubstr(ls_80, 1);
			ls_80 = lia_68[1] >> 16 + 100;
			ls_72 = ls_72 + "." + StringSubstr(ls_80, 1);
			ls_80 = lia_68[2] & 65535 + 100;
			ls_72 = ls_72 + " " + StringSubstr(ls_80, 1);
			ls_80 = lia_68[2] >> 16 + 100;
			ls_72 = ls_72 + ":" + StringSubstr(ls_80, 1);
			ls_80 = lia_68[3] & 65535 + 100;
			ls_72 = ls_72 + ":" + StringSubstr(ls_80, 1);
			str2time_56 = StrToTime(ls_72);
		}
		ld_60 = TimeCurrent() - str2time_56;
		ld_60 /= 3600.0;
		ld_4 = NormalizeDouble(ld_60, 1);
		li_0++;
	}
	if (li_0 < 10) vFusoHorario = ld_4;
	if (li_24 == TRUE) Print("Can not reach time servers, GMT offset (" + DoubleToStr(vFusoHorario, 1) + ") was calculated using local Windows settings (may be inaccurate).");
	else Print("GMT offset (" + DoubleToStr(vFusoHorario, 1) + ") was obtained from a time server at " + TimeToStr(TimeLocal()));
	//string time2str_20 = TimeToStr(TimeCurrent() - 3600.0 * vFusoHorario, TIME_MINUTES);
	AlreadyCalc = true;
	return (0);
}