#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);
}