//+------------------------------------------------------------------+
//| MACH4.mq4 |
//| Copyright 2017,Rodolfo Leonardo. |
//| rodolfo.leonardo@gmail.com |
//+------------------------------------------------------------------+
#include <stderror.mqh>
#include <stdlib.mqh>
#property strict
#property copyright "FX- MACH X V1.01 18/08/2017 - Rodolfo Leonardo"
#property link "rodolfo.leonardo@gmail.com"
#property version "1.01"
#property description "Robo 100% FREE sem restrições"
extern string _____Product_name_______ = "FX- MACH X v1.01";
extern string CC2______________________ = "========= Configurações Globais =========";
extern double Lots = 0.01; // Lotes Manuais (Não gerenciado)
extern double MaxSpread = 17; // Max Spread p/ Abertura de Posição
extern double slip = 5.0; // Derrapagem (Slippage)
extern double MaxLots = 100.0; // Max Lotes
extern double TakeProfit = 5080.0; // Take Profit
extern double TrailStart = 40.0; // Inicio TraillingStop
extern double TrailStop = 10.0; // Tamanho Trailling stop
extern bool DynamicPips = true;
extern int DefaultPips = 12;
extern int Glubina = 24;
extern int DEL = 3;
extern string CC3______________________ = "========= Money management =========";
extern bool MM_Active = TRUE; // Utiliza gerenciamento de capital?
extern string _MM02 = "Lote = Fator * Lote Mínimo"; // Fator de Multiplicação = Saldo / Fator
extern string _MM03 = "Lote Minimo: 0.02"; // Ex. Saldo: $ 2.247,30 Fator: $ 1.000,00
extern string _MM04 = "Lote = 2 * 0.02 => 0.04"; // Fator de Multiplicação = 2.247,30/1.000=2,2473 => 2
extern string _MM05 = "Lote será sempre 0.01"; // Enquanto o saldo estiver abaixo do fator
extern double MM_Factor = 200; // Fator de Incremento, baseado no saldo
extern double MM_MinLot = 0.01; // Lote Mínimo
extern bool MM_MultiChart = false; // Múltiplos pares?
int lotdecimal = 2;
double Equity;
double gd_248;
extern string CC20_____________________ = "========= EquityStop Risk =======";
extern bool UseEquityStop = TRUE; // Usar EquityStop?
extern double TotalEquityRisk = 30.0; // Risco Total para EquityStop
extern double TotalEquityRisk2 = 90.0; // Risco Total para EquityStop
///////////////////////////////////////////////
extern string TimeFilter__ = "Filtro de Data e Hora";
extern bool UtilizeTimeFilter =true;
extern bool Trade_in_Monday =true;
extern bool Trade_in_Tuesday =true;
extern bool Trade_in_Wednesday=true;
extern bool Trade_in_Thursday=true;
extern bool Trade_in_Friday =true;
extern string StartHour = "00:00";
extern string EndHour = "23:59";
bool NewCycle = TRUE;
int OnInit(){
return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason){
}
void OnTick() {
//OpenCloseLineDraw();
if(UtilizeTimeFilter && !TimeFilter()) NewCycle = false;
else NewCycle = true;
//Filtro de Spread
double vSpread = MarketInfo(Symbol(), MODE_SPREAD);
if (vSpread > MaxSpread ) return ;
if (DynamicPips) {
double PipStep = 0;
double hival=High[iHighest(NULL,0,MODE_HIGH,Glubina,1)]; // calculate highest and lowest price from last bar to 24 bars ago
double loval=Low[iLowest(NULL,0,MODE_LOW,Glubina,1)]; // chart used for symbol and time period
PipStep=NormalizeDouble((hival-loval)/DEL/Point,0); // calculate pips for spread between orders
if (PipStep<DefaultPips/DEL) PipStep = NormalizeDouble(DefaultPips/DEL,0);
if (PipStep>DefaultPips*DEL) PipStep = NormalizeDouble(DefaultPips*DEL,0); // if dynamic pips fail, assign pips extreme value
//if(PipStep != 0){
//PipStep_Strategy1 = PipStep;
//PipStep_Strategy2 = PipStep;
//PipStep_Strategy3 = PipStep;
//}
}// else PipStep = DefaultPips;
if (Lots > MaxLots && !MM_Active) Lots = MaxLots;
//int l_ind_counted_200 = IndicatorCounted();
gd_248 = NormalizeDouble(AccountBalance(), 2);
Equity = NormalizeDouble(AccountEquity(), 2);
RotinasRobo3();
// RotinasRobo2();
//RotinasRobo3();
//RotinasRobo4();
return ;
}
////////////// OUTRAS FUNCOES //////////////////////////
bool CanModify(int ticket){
return OrdersTotal() > 0;
/*
if( OrderType() == OP_BUY || OrderType() == OP_SELL)
return OrderCloseTime() == 0;
return false;
/*
bool result = false;
OrderSelect(ticket, SELECT_BY_TICKET
for(int i=OrdersHistoryTotal()-1;i>=0;i--){
if( !OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) ){ continue; }
if(OrderTicket()==ticket){
result=true;
break;
}
}
return result;
*/
}
void ShowError(int error, string complement){
if(error == 1 || error == 130){ return ; }
string ErrorText = ErrorDescription(error);
StringToUpper( ErrorText );
Print(complement, ": Ordem: ", OrderTicket(), ". Falha ao tentar alterar ordem: ", error, " \"", ErrorText, "\"" );
ResetLastError();
}
int ChartCount(){
if(!MM_MultiChart){ return 1; }
int count=1;
long currChart,prevChart=ChartFirst();
while(count<1000){
currChart=ChartNext(prevChart);
if(currChart<0) break;
prevChart=currChart;
count++;
}
//Print(count, " gráficos abertos");
return count;
}
double DefineLot(){
double lot = Lots;
double MM_MaxLot=MarketInfo(Symbol(), MODE_MAXLOT);
if(MM_Active){
lot = MathFloor(AccountBalance() / MM_Factor);
if(lot == 0){
lot = 0.01;
}else{
lot = NormalizeDouble( (lot / ChartCount()) * MM_MinLot, lotdecimal );
if(lot < MM_MinLot){ lot = MM_MinLot; }
if(lot > MM_MaxLot){ lot = MM_MaxLot; }
}
}
return lot;
}
bool TimeFilter(){
bool _res = false;
datetime _time_curent = TimeCurrent();
datetime _time_start = StrToTime(DoubleToStr(Year(),0)+"."+DoubleToStr(Month(),0)+"."+DoubleToStr(Day(),0)+" "+StartHour);
datetime _time_stop = StrToTime(DoubleToStr(Year(),0)+"."+DoubleToStr(Month(),0)+"."+DoubleToStr(Day(),0)+" "+EndHour);
if(((Trade_in_Monday==true) && (TimeDayOfWeek(Time[0]) == 1)) ||
((Trade_in_Tuesday==true) && (TimeDayOfWeek(Time[0]) == 2)) ||
((Trade_in_Wednesday==true) && (TimeDayOfWeek(Time[0]) == 3)) ||
((Trade_in_Thursday==true) && (TimeDayOfWeek(Time[0]) == 4)) ||
((Trade_in_Friday==true) && (TimeDayOfWeek(Time[0]) == 5)))
if(_time_start > _time_stop){
if(_time_curent >= _time_start || _time_curent <= _time_stop) _res = true;
}else
if(_time_curent >= _time_start && _time_curent <= _time_stop) _res = true;
return(_res);
}
//////////////////////////
extern string CC4______________________ = "========= Robo 1 =========";
extern bool Robo3 = true; // Ativa Robo 1
extern int MaxTrades_Robo3 = 60; // Max Trades Robo 1
extern double PipStep_Robo3 = 30.0; // PIP Step Robo 1
extern double LotExponent_Robo3 = 1.05; // Fator incremento Robo 1
extern int MagicNumber_Robo3 = 11111;
extern string Coment_Robo3 = "Robo 1 ";
extern bool UseTrailingStop_Robo3 = TRUE; // Usa Trailling Stop Robo 1?
bool gi_184_Robo3 = FALSE; // Parece não ter sentido
double gd_188_Robo3 = 48.0; // Futuro
double g_pips_196_Robo3 = 40.0; // Futuro
double g_slippage_204_Robo3; // Parece não ter nada
double g_price_216_Robo3; // ???
double gd_equity_Robo3; // Parece que~não foi usada
double g_price_264_Robo3;
double LastBuyPrice_Robo3;
double LastSellPrice_Robo3;
bool gi_312_Robo3;
int gi_324_Robo3 = 0;
int gi_328_Robo3;
int QtdTrades_Robo3 = 0;
double SendLots_Robo3;
int g_pos_344_Robo3 = 0;
int Trades_Robo3;
double gd_352_Robo3 = 0.0;
bool EspacoGrid_Robo3 = FALSE;
bool gi_364_Robo3 = FALSE;
bool gi_368_Robo3 = FALSE;
int OpenTicket_Robo3;
bool gi_376_Robo3 = FALSE;
double gd_380_Robo3;
double gd_388_Robo3;
int g_datetime_824_Robo3 = 1;
int Env_period = 3;
double Env_deviation = 0.05;
int Env_shift = 1;
bool Robo3Comprador = TRUE;
////////////////////// FUNCOES STRATEGIA 1 ///////////////////////
void RotinasRobo3(){
int foo=0;
double DefineLot_Robo3 = DefineLot();
Trades_Robo3 = CountTrades_Robo3();
if (UseTrailingStop_Robo3 ) TrailingAlls_Robo3(TrailStart, TrailStop, g_price_264_Robo3);
if (gi_184_Robo3) {
if (TimeCurrent() >= gi_328_Robo3) {
CloseThisSymbolAll_Robo3();
Print("Closed All Robo3 to TimeOut");
}
}
if (gi_324_Robo3 == Time[0]) return;
gi_324_Robo3 = Time[0];
double Profit_Robo3 = CalculateProfit_Robo3();
if (UseEquityStop) {
if (Profit_Robo3 < 0.0 && MathAbs(Profit_Robo3) > TotalEquityRisk2 / 100.0 * AccountEquityHigh_Robo3()) {
CloseThisSymbolAll_Robo3();
Print("Closed All Robo3 to Stop Out");
gi_376_Robo3 = FALSE;
}
if (Profit_Robo3 < 0.0 && MathAbs(Profit_Robo3) > TotalEquityRisk / 100.0 * AccountEquityHigh_Robo3()) {
return;
gi_376_Robo3 = FALSE;
}
}
//Qtd Ordens Abertas
Trades_Robo3 = CountTrades_Robo3();
if (Trades_Robo3 == 0) gi_312_Robo3 = FALSE;
for (g_pos_344_Robo3 = OrdersTotal() - 1; g_pos_344_Robo3 >= 0; g_pos_344_Robo3--) {
if( !OrderSelect(g_pos_344_Robo3, SELECT_BY_POS, MODE_TRADES) ){ continue; }
if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber_Robo3) continue;
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber_Robo3) {
if (OrderType() == OP_BUY) {
gi_364_Robo3 = TRUE;
gi_368_Robo3 = FALSE;
break;
}
}
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber_Robo3) {
if (OrderType() == OP_SELL) {
gi_364_Robo3 = FALSE;
gi_368_Robo3 = TRUE;
break;
}
}
}
//Verifica espaço entre Grid Robo3
if (Trades_Robo3 < MaxTrades_Robo3 ) {
RefreshRates();
LastBuyPrice_Robo3 = FindLastBuyPrice_Robo3();
LastSellPrice_Robo3 = FindLastSellPrice_Robo3();
if (gi_364_Robo3 && Ask - LastBuyPrice_Robo3 >= PipStep_Robo3 * Point) EspacoGrid_Robo3 = TRUE;
if (gi_368_Robo3 && LastSellPrice_Robo3 - Bid >= PipStep_Robo3 * Point) EspacoGrid_Robo3 = TRUE;
}
if (Trades_Robo3 < 1) {
gi_368_Robo3 = FALSE;
gi_364_Robo3 = FALSE;
EspacoGrid_Robo3 = TRUE;
gd_equity_Robo3 = AccountEquity();
}
if(Trades_Robo3 > MaxTrades_Robo3 ) {
CloseThisSymbolAll_Robo3();
}
//Caso possua espaço abre novos trades
if (EspacoGrid_Robo3 ) {
LastBuyPrice_Robo3 = FindLastBuyPrice_Robo3();
LastSellPrice_Robo3 = FindLastSellPrice_Robo3();
if (gi_368_Robo3&&Robo3) {
QtdTrades_Robo3 = Trades_Robo3;
SendLots_Robo3 = NormalizeDouble(DefineLot_Robo3 * MathPow(LotExponent_Robo3, QtdTrades_Robo3), lotdecimal);
RefreshRates();
OpenTicket_Robo3 = OpenOrder_Robo3(1, SendLots_Robo3, Bid, slip, Ask, 0, 0, Coment_Robo3 + "-" + string(QtdTrades_Robo3), MagicNumber_Robo3, 0, HotPink);
if (OpenTicket_Robo3 < 0) {
Print("Error: ", GetLastError());
return ;
}
LastSellPrice_Robo3 = FindLastSellPrice_Robo3();
EspacoGrid_Robo3 = FALSE;
gi_376_Robo3 = TRUE;
} else {
if (gi_364_Robo3&&Robo3) {
QtdTrades_Robo3 = Trades_Robo3;
SendLots_Robo3 = NormalizeDouble(DefineLot_Robo3 * MathPow(LotExponent_Robo3, QtdTrades_Robo3), lotdecimal);
OpenTicket_Robo3 = OpenOrder_Robo3(0, SendLots_Robo3, Ask, slip, Bid, 0, 0, Coment_Robo3 + "-" + string(QtdTrades_Robo3), MagicNumber_Robo3, 0, Lime);
if (OpenTicket_Robo3 < 0) {
Print("Error: ", GetLastError());
return ;
}
LastBuyPrice_Robo3 = FindLastBuyPrice_Robo3();
EspacoGrid_Robo3 = FALSE;
gi_376_Robo3 = TRUE;
}
}
}
double longEma = iMA(Symbol(), 0, 3, 0, MODE_LWMA, PRICE_CLOSE, 0);
double imalow_Strategy4 = iEnvelopes ( NULL, 0, Env_period, MODE_SMA, Env_shift, PRICE_LOW, Env_deviation, MODE_LOWER, 0 );
double imahigth_Strategy4 = iEnvelopes ( NULL,0, Env_period, MODE_SMA, Env_shift, PRICE_HIGH, Env_deviation, MODE_UPPER, 0 );
//Filtro de volatilidade
//imalow_Strategy4 = (iMA(Symbol(), 0, 3, 0, MODE_LWMA, PRICE_LOW, 0) + longEma) /2;
// imahigth_Strategy4 = (iMA(Symbol(), 0, 3, 0,MODE_LWMA, PRICE_HIGH, 0) + longEma) /2;
double vVolatilidadeHiLO_Strategy4 = (imahigth_Strategy4 - imalow_Strategy4)* 1000;
Comment(vVolatilidadeHiLO_Strategy4);
//if (vVolatilidadeHiLO_Strategy4 < 1.2) {return ;}
if(true){
for (int l_pos_4 = OrdersTotal() - 1; l_pos_4 >= 0; l_pos_4--) {
if( !OrderSelect(l_pos_4, SELECT_BY_POS, MODE_TRADES) ){ continue; }
if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber_Robo3) continue;
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber_Robo3)
if (OrderType() == OP_SELL && iClose(Symbol(),0,1) > longEma)
OrderClose(OrderTicket(), OrderLots(),Ask , 3, Violet);
if( OrderType() == OP_BUY && iClose(Symbol(),0,1) < longEma)
OrderClose(OrderTicket(), OrderLots(),Bid , 3, Violet);
}
}
//Primeiro trade do grid Robo3
if (g_datetime_824_Robo3 != iTime(NULL, 0, 0)) {
if (EspacoGrid_Robo3 && Trades_Robo3 < 1 && Robo3 && NewCycle) {
double l_ihigh_112 = iHigh(Symbol(), 0, 1);
double l_ilow_120 = iLow(Symbol(), 0, 2);
if (!gi_368_Robo3 && !gi_364_Robo3) {
QtdTrades_Robo3 = Trades_Robo3;
SendLots_Robo3 = NormalizeDouble(DefineLot_Robo3 * MathPow(LotExponent_Robo3, QtdTrades_Robo3), lotdecimal);
if (NormalizeDouble(iClose(Symbol(),0,1), Digits) < NormalizeDouble((longEma - 10 * Point),Digits) ) {
if (iClose(Symbol(),0,1) < iOpen(Symbol(),0,1 ) ) {
OpenTicket_Robo3 = OpenOrder_Robo3(1, SendLots_Robo3, Bid, slip, Bid, 0, 0, Coment_Robo3 + "-" + string(QtdTrades_Robo3), MagicNumber_Robo3, 0, HotPink);
if (OpenTicket_Robo3 < 0) {
Print("Error: ", GetLastError());
return ;
}
LastBuyPrice_Robo3 = FindLastBuyPrice_Robo3();
gi_376_Robo3 = TRUE;
}
}
if (NormalizeDouble(iClose(Symbol(),0,1), Digits) > NormalizeDouble((longEma + 10 * Point), Digits)) {
if ( iClose(Symbol(),0,1) > iOpen(Symbol(),0,1) ) {
OpenTicket_Robo3 = OpenOrder_Robo3(0, SendLots_Robo3, Ask, slip, Ask, 0, 0, Coment_Robo3 + "-" + string(QtdTrades_Robo3), MagicNumber_Robo3, 0, Lime);
if (OpenTicket_Robo3 < 0) {
Print("Error: ", GetLastError());
return ;
}
LastSellPrice_Robo3 = FindLastSellPrice_Robo3();
gi_376_Robo3 = TRUE;
}
}
if (OpenTicket_Robo3 > 0) gi_328_Robo3 = TimeCurrent() + 60.0 * (60.0 * gd_188_Robo3);
EspacoGrid_Robo3 = FALSE;
}
}
g_datetime_824_Robo3 = iTime(NULL,0, 0);
}
Trades_Robo3 = CountTrades_Robo3();
g_price_264_Robo3 = 0;
double ld_1136 = 0;
for (g_pos_344_Robo3 = OrdersTotal() - 1; g_pos_344_Robo3 >= 0; g_pos_344_Robo3--) {
if( !OrderSelect(g_pos_344_Robo3, SELECT_BY_POS, MODE_TRADES) ){ continue; }
if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber_Robo3) continue;
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber_Robo3) {
if (OrderType() == OP_BUY || OrderType() == OP_SELL) {
g_price_264_Robo3 += OrderOpenPrice() * OrderLots();
ld_1136 += OrderLots();
}
}
}
if (Trades_Robo3 > 0) g_price_264_Robo3 = NormalizeDouble(g_price_264_Robo3 / ld_1136, Digits);
if (gi_376_Robo3 && false) {
for (g_pos_344_Robo3 = OrdersTotal() - 1; g_pos_344_Robo3 >= 0; g_pos_344_Robo3--) {
if( !OrderSelect(g_pos_344_Robo3, SELECT_BY_POS, MODE_TRADES) ){ continue; }
if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber_Robo3) continue;
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber_Robo3) {
if (OrderType() == OP_BUY) {
g_price_216_Robo3 = g_price_264_Robo3 + TakeProfit * Point;
gd_352_Robo3 = g_price_264_Robo3 - g_pips_196_Robo3 * Point;
gi_312_Robo3 = TRUE;
}
}
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber_Robo3) {
if (OrderType() == OP_SELL) {
g_price_216_Robo3 = g_price_264_Robo3 - TakeProfit * Point;
gd_352_Robo3 = g_price_264_Robo3 + g_pips_196_Robo3 * Point;
gi_312_Robo3 = TRUE;
}
}
}
}
if (gi_376_Robo3) {
if (gi_312_Robo3 == TRUE) {
for (g_pos_344_Robo3 = OrdersTotal() - 1; g_pos_344_Robo3 >= 0; g_pos_344_Robo3--) {
if( !OrderSelect(g_pos_344_Robo3, SELECT_BY_POS, MODE_TRADES) ){ continue; }
if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber_Robo3) continue;
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber_Robo3 && CanModify(OrderTicket()) ) {
ResetLastError();
//while (!OrderModify(OrderTicket(), g_price_264_Robo3, OrderStopLoss(), g_price_216_Robo3, 0, Yellow)) {
while (true) {
foo=OrderModify(OrderTicket(), g_price_264_Robo3, OrderStopLoss(), g_price_216_Robo3, 0, Yellow);
foo=GetLastError();
if( foo==0 || foo==1 || foo==4000 || foo==4108){ break; }
ShowError(foo, "Loop");
Sleep(1000);
RefreshRates();
// Caso a ordem já está fechada, interrompe loop
// Pois não tem porque modificá-la
if( !CanModify(OrderTicket()) ){ break; }
}
}
gi_376_Robo3 = FALSE;
}
}
}
}
int CountTrades_Robo3() {
int l_count_0 = 0;
for (int l_pos_4 = OrdersTotal() - 1; l_pos_4 >= 0; l_pos_4--) {
if( !OrderSelect(l_pos_4, SELECT_BY_POS, MODE_TRADES) ){ continue; }
if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber_Robo3) continue;
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber_Robo3)
if (OrderType() == OP_SELL || OrderType() == OP_BUY) l_count_0++;
}
return (l_count_0);
}
void CloseThisSymbolAll_Robo3() {
bool foo=false;
for (int l_pos_0 = OrdersTotal() - 1; l_pos_0 >= 0; l_pos_0--) {
if( !OrderSelect(l_pos_0, SELECT_BY_POS, MODE_TRADES) ){ continue; }
if (OrderSymbol() == Symbol()) {
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber_Robo3) {
if (OrderType() == OP_BUY)
foo=OrderClose(OrderTicket(), OrderLots(), Bid, g_slippage_204_Robo3, Blue);
if (OrderType() == OP_SELL)
foo=OrderClose(OrderTicket(), OrderLots(), Ask, g_slippage_204_Robo3, Red);
}
Sleep(1000);
}
}
}
int OpenOrder_Robo3(int ai_0, double a_lots_4, double ad_unused_12, int a_slippage_20, double ad_unused_24, int ai_32, int ai_36, string a_comment_40, int a_magic_48, int a_datetime_52, color a_color_56) {
int l_ticket_60 = 0;
int l_error_64 = 0;
int l_count_68 = 0;
int li_72 = 100;
switch (ai_0) {
case 0:
for (l_count_68 = 0; l_count_68 < li_72; l_count_68++) {
RefreshRates();
l_ticket_60 = OrderSend(Symbol(), OP_BUY, a_lots_4, Ask, a_slippage_20, StopLong_Robo3(Bid, ai_32), TakeLong_Robo3(Ask, ai_36), a_comment_40, a_magic_48, a_datetime_52, a_color_56);
l_error_64 = GetLastError();
if (l_error_64 == 0/* NO_ERROR */) break;
if (!((l_error_64 == 4/* SERVER_BUSY */ || l_error_64 == 137/* BROKER_BUSY */ || l_error_64 == 146/* TRADE_CONTEXT_BUSY */ || l_error_64 == 136/* OFF_QUOTES */))) break;
Sleep(5000);
}
break;
case 1:
for (l_count_68 = 0; l_count_68 < li_72; l_count_68++) {
l_ticket_60 = OrderSend(Symbol(), OP_SELL, a_lots_4, Bid, a_slippage_20, StopShort_Robo3(Ask, ai_32), TakeShort_Robo3(Bid, ai_36), a_comment_40, a_magic_48, a_datetime_52, a_color_56);
l_error_64 = GetLastError();
if (l_error_64 == 0/* NO_ERROR */) break;
if (!((l_error_64 == 4/* SERVER_BUSY */ || l_error_64 == 137/* BROKER_BUSY */ || l_error_64 == 146/* TRADE_CONTEXT_BUSY */ || l_error_64 == 136/* OFF_QUOTES */))) break;
Sleep(5000);
}
}
return (l_ticket_60);
}
double StopLong_Robo3(double ad_0, int ai_8) {
if (ai_8 == 0) return (0);
return (ad_0 - ai_8 * Point);
}
double StopShort_Robo3(double ad_0, int ai_8) {
if (ai_8 == 0) return (0);
return (ad_0 + ai_8 * Point);
}
double TakeLong_Robo3(double ad_0, int ai_8) {
if (ai_8 == 0) return (0);
return (ad_0 + ai_8 * Point);
}
double TakeShort_Robo3(double ad_0, int ai_8) {
if (ai_8 == 0) return (0);
return (ad_0 - ai_8 * Point);
}
double CalculateProfit_Robo3() {
double ld_ret_0 = 0;
for (g_pos_344_Robo3 = OrdersTotal() - 1; g_pos_344_Robo3 >= 0; g_pos_344_Robo3--) {
if( !OrderSelect(g_pos_344_Robo3, SELECT_BY_POS, MODE_TRADES) ){ continue; }
if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber_Robo3) continue;
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber_Robo3)
if (OrderType() == OP_BUY || OrderType() == OP_SELL) ld_ret_0 += OrderProfit();
}
return (ld_ret_0);
}
void TrailingAlls_Robo3(int ai_0, int ai_4, double a_price_8) {
int li_16;
double l_ord_stoploss_20;
double l_price_28;
bool foo=false;
double longEma = iMA(Symbol(),0, 3, 0, MODE_LWMA, PRICE_CLOSE, 0);
double imalow_Strategy4 = iEnvelopes ( NULL, 0, Env_period, MODE_SMA, Env_shift, PRICE_LOW, Env_deviation, MODE_LOWER, 0 );
double imahigth_Strategy4 = iEnvelopes ( NULL,0, Env_period, MODE_SMA, Env_shift, PRICE_HIGH, Env_deviation, MODE_UPPER, 0 );
if (ai_4 != 0) {
for (int l_pos_36 = OrdersTotal() - 1; l_pos_36 >= 0; l_pos_36--) {
if (OrderSelect(l_pos_36, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber_Robo3) continue;
if (OrderSymbol() == Symbol() || OrderMagicNumber() == MagicNumber_Robo3 ) {
if (OrderType() == OP_BUY && imalow_Strategy4 > OrderOpenPrice () ) {
li_16 = NormalizeDouble((Bid - a_price_8) / Point, 0);
if (li_16 < ai_0) continue;
l_ord_stoploss_20 = OrderStopLoss();
// l_price_28 = Bid - ai_4 * Point;
l_price_28 = imalow_Strategy4 ;
if (l_ord_stoploss_20 == 0.0 || (l_ord_stoploss_20 != 0.0 && l_price_28 > l_ord_stoploss_20)) {
// Somente ajustar a ordem se ela estiver aberta
if( CanModify(OrderTicket()) && OrderProfit() > 0 ){
ResetLastError();
foo=OrderModify(OrderTicket(), a_price_8, l_price_28, OrderTakeProfit(), 0, Aqua);
// if(!foo){ ShowError(GetLastError(), "Normal"); }
}
}
}
if (OrderType() == OP_SELL && imahigth_Strategy4 < OrderOpenPrice () ) {
li_16 = NormalizeDouble((a_price_8 - Ask) / Point, 0);
if (li_16 < ai_0) continue;
l_ord_stoploss_20 = OrderStopLoss();
// l_price_28 = Ask + ai_4 * Point;
l_price_28 = imahigth_Strategy4 ;
if (l_ord_stoploss_20 == 0.0 || (l_ord_stoploss_20 != 0.0 && l_price_28 < l_ord_stoploss_20)){
// Somente ajustar a ordem se ela estiver aberta
if( CanModify(OrderTicket()) && OrderProfit() > 0 ){
ResetLastError();
foo=OrderModify(OrderTicket(), a_price_8, l_price_28, OrderTakeProfit(), 0, Red);
if(!foo){ ShowError(GetLastError(), "Normal"); }
}
}
}
}
Sleep(1000);
}
}
}
}
double AccountEquityHigh_Robo3() {
if (CountTrades_Robo3() == 0) gd_380_Robo3 = AccountEquity();
if (gd_380_Robo3 < gd_388_Robo3) gd_380_Robo3 = gd_388_Robo3;
else gd_380_Robo3 = AccountEquity();
gd_388_Robo3 = AccountEquity();
return (gd_380_Robo3);
}
double FindLastBuyPrice_Robo3() {
double l_ord_open_price_0;
int l_ticket_8;
int l_ticket_20 = 0;
for (int l_pos_24 = OrdersTotal() - 1; l_pos_24 >= 0; l_pos_24--) {
if( !OrderSelect(l_pos_24, SELECT_BY_POS, MODE_TRADES) ){ continue; }
if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber_Robo3) continue;
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber_Robo3 && OrderType() == OP_BUY) {
l_ticket_8 = OrderTicket();
if (l_ticket_8 > l_ticket_20) {
l_ord_open_price_0 = OrderOpenPrice();
l_ticket_20 = l_ticket_8;
}
}
}
return (l_ord_open_price_0);
}
double FindLastSellPrice_Robo3() {
double l_ord_open_price_0;
int l_ticket_8;
int l_ticket_20 = 0;
for (int l_pos_24 = OrdersTotal() - 1; l_pos_24 >= 0; l_pos_24--) {
if( !OrderSelect(l_pos_24, SELECT_BY_POS, MODE_TRADES) ){ continue; }
if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber_Robo3) continue;
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber_Robo3 && OrderType() == OP_SELL) {
l_ticket_8 = OrderTicket();
if (l_ticket_8 > l_ticket_20) {
l_ord_open_price_0 = OrderOpenPrice();
l_ticket_20 = l_ticket_8;
}
}
}
return (l_ord_open_price_0);
}
bool isCloseLastOrderSL_Robo3() {
datetime t;
double ocp, osl, otp;
int i, j=-1, k=OrdersHistoryTotal();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (OrderSymbol() == Symbol() && OrderMagicNumber()==MagicNumber_Robo3) {
if (t<OrderCloseTime()) {
t=OrderCloseTime();
j=i;
}
}
}
}
}
if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
ocp=NormalizeDouble(OrderClosePrice(), Digits);
osl=NormalizeDouble(OrderStopLoss(), Digits);
otp=NormalizeDouble(OrderTakeProfit(), Digits);
if (ocp==osl ) return(True);
}
return(False);
}
bool isCloseLastOrderTK_Robo3() {
datetime t;
double ocp, osl, otp;
int i, j=-1, k=OrdersHistoryTotal();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (OrderSymbol() == Symbol() && OrderMagicNumber()==MagicNumber_Robo3) {
if (t<OrderCloseTime()) {
t=OrderCloseTime();
j=i;
}
}
}
}
}
if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
ocp=NormalizeDouble(OrderClosePrice(), Digits);
osl=NormalizeDouble(OrderStopLoss(), Digits);
otp=NormalizeDouble(OrderTakeProfit(), Digits);
if (ocp==otp ) return(True);
}
return(False);
}
bool isCloseLastOrderNotProfit_Robo3() {
datetime t;
double ocp, osl, otp;
int i, j=-1, k=OrdersHistoryTotal();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (OrderSymbol() == Symbol() && OrderMagicNumber()==MagicNumber_Robo3) {
if (t<OrderCloseTime()) {
t=OrderCloseTime();
j=i;
}
}
}
}
}
if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
ocp=NormalizeDouble(OrderClosePrice(), Digits);
osl=NormalizeDouble(OrderStopLoss(), Digits);
otp=NormalizeDouble(OrderTakeProfit(), Digits);
if (ocp==otp ) return(True);
}
return(False);
}
void OpenCloseLineDraw(){
//if(Info /*&& !IsTesting() && !IsOptimization()*/){
string _name = "";
color _clr = White;
for(int i=OrdersHistoryTotal()-1;i>=0;i--){
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)){
if(OrderSymbol()==Symbol() && (OrderMagicNumber() == MagicNumber_Robo3 ) && OrderType()<2){
_name = "close line by #"+DoubleToStr(OrderTicket(),0);
if(ObjectFind(_name)==-1){
if(OrderType()==OP_BUY) _clr = clrBlue; else _clr = clrRed;
GraphTrendLineCreate(_name, 0, OrderOpenTime(), OrderOpenPrice(), OrderCloseTime(), OrderClosePrice(), false, _clr, STYLE_DOT, 1);
}
}
}
}
//}
}
void GraphTrendLineCreate(string sName, int _iHandle, datetime _x1, double _y1, datetime _x2, double _y2, bool _isRay, color _MyColor, int _iStyle, int _Width){ ObjectCreate(sName, OBJ_TREND, _iHandle, _x1, _y1, _x2, _y2); ObjectSet(sName, OBJPROP_RAY, _isRay); ObjectSet(sName, OBJPROP_COLOR, _MyColor); ObjectSet(sName, OBJPROP_STYLE, _iStyle); ObjectSet(sName,OBJPROP_WIDTH,_Width); }
double InfoGetMarginLevel(){ double dMarginNow = AccountMargin(); if(dMarginNow==0) dMarginNow = 1; return(NormalizeDouble(((AccountEquity()/dMarginNow)*100),2)); }