//+------------------------------------------------------------------+
//|                                                        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 ;
   
    //Filtro de volatilidade
    //double imalow_Strategy4 = iMA(NULL, 0, MAPeriod_Strategy4, Gi_180, MAMethod_Strategy4, PRICE_LOW, 0);
    //double imahigth_Strategy4 = iMA(NULL, 0, MAPeriod_Strategy4, Gi_180, MAMethod_Strategy4, PRICE_HIGH, 0);
    //double vVolatilidadeHiLO_Strategy4 = imahigth_Strategy4 - imalow_Strategy4;
    //if (vVolatilidadeHiLO_Strategy4 > 100) {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);
   
   RotinasRobo1();
  
  // 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 Robo1 = true;              // Ativa Robo 1        
extern int MaxTrades_Robo1 = 60;        // Max Trades Robo 1
extern double PipStep_Robo1 = 30.0;   // PIP Step Robo 1
extern double LotExponent_Robo1 = 1.05;           // Fator incremento Robo 1
extern int MagicNumber_Robo1 = 11111;
extern string Coment_Robo1 = "Robo 1 ";
extern bool UseTrailingStop_Robo1 = TRUE;        // Usa Trailling Stop Robo 1?


bool gi_184_Robo1 = FALSE; // Parece não ter sentido
double gd_188_Robo1 = 48.0;   // Futuro
double g_pips_196_Robo1 = 40.0; // Futuro
double g_slippage_204_Robo1; // Parece não ter nada
double g_price_216_Robo1; // ???
double gd_equity_Robo1; // Parece que~não foi usada
double g_price_264_Robo1;
double LastBuyPrice_Robo1;
double LastSellPrice_Robo1;
bool gi_312_Robo1;
int gi_324_Robo1 = 0;
int gi_328_Robo1;
int QtdTrades_Robo1 = 0;
double SendLots_Robo1;
int g_pos_344_Robo1 = 0;
int Trades_Robo1;
double gd_352_Robo1 = 0.0;
bool EspacoGrid_Robo1 = FALSE;
bool gi_364_Robo1 = FALSE;
bool gi_368_Robo1 = FALSE;
int OpenTicket_Robo1;
bool gi_376_Robo1 = FALSE;
double gd_380_Robo1;
double gd_388_Robo1;

int g_datetime_824_Robo1 = 1;

 
bool Robo1Comprador = TRUE;

 
////////////////////// FUNCOES STRATEGIA 1 ///////////////////////

void RotinasRobo1(){

   int foo=0;
   
   double DefineLot_Robo1 = DefineLot();
     
             
   if (UseTrailingStop_Robo1) TrailingAlls_Robo1(TrailStart, TrailStop, g_price_264_Robo1);
   if (gi_184_Robo1) {
      if (TimeCurrent() >= gi_328_Robo1) {
         CloseThisSymbolAll_Robo1();
         Print("Closed All Robo1 to TimeOut");
      }
   }
   if (gi_324_Robo1 == Time[0]) return;
   gi_324_Robo1 = Time[0];
   double Profit_Robo1 = CalculateProfit_Robo1();
   if (UseEquityStop) {
      if (Profit_Robo1 < 0.0 && MathAbs(Profit_Robo1) > TotalEquityRisk2 / 100.0 * AccountEquityHigh_Robo1()) {
         CloseThisSymbolAll_Robo1();
         Print("Closed All Robo1 to Stop Out");
         gi_376_Robo1 = FALSE;
      }
       if (Profit_Robo1 < 0.0 && MathAbs(Profit_Robo1) > TotalEquityRisk / 100.0 * AccountEquityHigh_Robo1()) {
      
        return;
         gi_376_Robo1 = FALSE;
      }
   }
   
   //Qtd Ordens Abertas
   Trades_Robo1 = CountTrades_Robo1();
   if (Trades_Robo1 == 0) gi_312_Robo1 = FALSE;
   for (g_pos_344_Robo1 = OrdersTotal() - 1; g_pos_344_Robo1 >= 0; g_pos_344_Robo1--) {
      if( !OrderSelect(g_pos_344_Robo1, SELECT_BY_POS, MODE_TRADES) ){ continue; }
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber_Robo1) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber_Robo1) {
         if (OrderType() == OP_BUY) {
            gi_364_Robo1 = TRUE;
            gi_368_Robo1 = FALSE;
            break;
         }
      }
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber_Robo1) {
         if (OrderType() == OP_SELL) {
            gi_364_Robo1 = FALSE;
            gi_368_Robo1 = TRUE;
            break;
         }
      }
   }
   
   //Verifica espaço entre Grid Robo1
   if (Trades_Robo1 > 0 && Trades_Robo1 <= MaxTrades_Robo1) {
      RefreshRates();
      LastBuyPrice_Robo1 = FindLastBuyPrice_Robo1();
      LastSellPrice_Robo1 = FindLastSellPrice_Robo1();
        if (gi_364_Robo1 && Ask - LastBuyPrice_Robo1  >= PipStep_Robo1 * Point) EspacoGrid_Robo1 = TRUE;
      if (gi_368_Robo1 &&   LastSellPrice_Robo1 - Bid >= PipStep_Robo1 * Point) EspacoGrid_Robo1 = TRUE;
   }
   
   
   if (Trades_Robo1 < 1) {
      gi_368_Robo1 = FALSE;
      gi_364_Robo1 = FALSE;
      EspacoGrid_Robo1 = TRUE;
      gd_equity_Robo1 = AccountEquity();
   }
   
   //Caso possua espaço abre novos trades
   if (EspacoGrid_Robo1 && false) {
      LastBuyPrice_Robo1 = FindLastBuyPrice_Robo1();
      LastSellPrice_Robo1 = FindLastSellPrice_Robo1();
      if (gi_368_Robo1&&Robo1) {
         QtdTrades_Robo1 = Trades_Robo1;
         SendLots_Robo1 = NormalizeDouble(DefineLot_Robo1 * MathPow(LotExponent_Robo1, QtdTrades_Robo1), lotdecimal);
         RefreshRates();
         OpenTicket_Robo1 = OpenOrder_Robo1(1, SendLots_Robo1, Bid, slip, Ask, 0, 0, Coment_Robo1 + "-" + string(QtdTrades_Robo1), MagicNumber_Robo1, 0, HotPink);
         if (OpenTicket_Robo1 < 0) {
            Print("Error: ", GetLastError());
            return ;
         }
         LastSellPrice_Robo1 = FindLastSellPrice_Robo1();
         EspacoGrid_Robo1 = FALSE;
         gi_376_Robo1 = TRUE;
      } else {
         if (gi_364_Robo1&&Robo1) {
            QtdTrades_Robo1 = Trades_Robo1;
            SendLots_Robo1 = NormalizeDouble(DefineLot_Robo1 * MathPow(LotExponent_Robo1, QtdTrades_Robo1), lotdecimal);
            OpenTicket_Robo1 = OpenOrder_Robo1(0, SendLots_Robo1, Ask, slip, Bid, 0, 0, Coment_Robo1 + "-" + string(QtdTrades_Robo1), MagicNumber_Robo1, 0, Lime);
            if (OpenTicket_Robo1 < 0) {
               Print("Error: ", GetLastError());
               return ;
            }
            LastBuyPrice_Robo1 = FindLastBuyPrice_Robo1();
            EspacoGrid_Robo1 = FALSE;
            gi_376_Robo1 = TRUE;
         }
      }
   }
   
    double longEma = iMA(Symbol(), 0, 3, 0, MODE_LWMA, PRICE_CLOSE,  0);
    double longEma2 = iMA(Symbol(), 0, 200, 0, MODE_LWMA, PRICE_CLOSE,  0);
 
 int Env_period = 10;
 double Env_deviation = 0.5;
 int Env_shift = 1;
int Env_low_band_price = PRICE_HIGH;
int Env_high_band_price = PRICE_LOW;

       //Filtro de volatilidade
double indicator_low = iEnvelopes ( NULL, 0, Env_period, MODE_SMA, Env_shift, Env_low_band_price, Env_deviation, MODE_LOWER, 0 );
	double 	indicator_high = iEnvelopes ( NULL,0, Env_period, MODE_SMA, Env_shift, Env_high_band_price, Env_deviation, MODE_UPPER, 0 );
    //double vVolatilidadeHiLO_Strategy4 = (imahigth_Strategy4 - imalow_Strategy4)* 1000;
    Comment((longEma- longEma2 )* 1000);
    
   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_Robo1) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber_Robo1)
         if (OrderType() == OP_SELL && iClose(Symbol(),0,1) > longEma2)
               OrderClose(OrderTicket(), OrderLots(),Ask , 3, Violet);
               
         if( OrderType() == OP_BUY && iClose(Symbol(),0,1) < longEma2) 
              OrderClose(OrderTicket(), OrderLots(),Bid , 3, Violet);
   }}
   
   //Primeiro trade do grid Robo1
   if (g_datetime_824_Robo1 != iTime(NULL, 0, 0)) {
   if (EspacoGrid_Robo1 && Trades_Robo1 < 1 && Robo1 && NewCycle) {
      double l_ihigh_112 = iHigh(Symbol(), 0, 1);
      double l_ilow_120 = iLow(Symbol(), 0, 2);
  
      
      bool LastPreju  = isCloseLastOrderNotProfit_Robo1() ;
      if (!gi_368_Robo1 && !gi_364_Robo1) {
         QtdTrades_Robo1 = Trades_Robo1;
         SendLots_Robo1 = NormalizeDouble(DefineLot_Robo1 * MathPow(LotExponent_Robo1, QtdTrades_Robo1), lotdecimal);
         if(LastPreju) SendLots_Robo1 = SendLots_Robo1*LotExponent_Robo1;
         if ((NormalizeDouble(iClose(Symbol(),0,1), Digits) <longEma )
         && (NormalizeDouble(iClose(Symbol(),0,2), Digits) < longEma2 )
         && (((longEma2 - longEma  )* 1000) < 2)
         )  {
            if (iClose(Symbol(),0,1) < iOpen(Symbol(),0,1 )  ) {
               OpenTicket_Robo1 = OpenOrder_Robo1(1, SendLots_Robo1, Bid, slip, Bid, 0, 0, Coment_Robo1 + "-" + string(QtdTrades_Robo1), MagicNumber_Robo1, 0, HotPink);
               if (OpenTicket_Robo1 < 0) {
                  Print("Error: ", GetLastError());
                  return ;
               }
               LastBuyPrice_Robo1 = FindLastBuyPrice_Robo1();
               gi_376_Robo1 = TRUE;
            }
         } 
         if ((NormalizeDouble(iClose(Symbol(),0,1), Digits) > longEma )
         && (NormalizeDouble(iClose(Symbol(),0,2), Digits) > longEma2  )
          && (((longEma - longEma2    )* 1000 )< 2)
         ){
            if ( iClose(Symbol(),0,1) > iOpen(Symbol(),0,1) ) {
               OpenTicket_Robo1 = OpenOrder_Robo1(0, SendLots_Robo1, Ask, slip, Ask, 0, 0, Coment_Robo1 + "-" + string(QtdTrades_Robo1), MagicNumber_Robo1, 0, Lime);
               if (OpenTicket_Robo1 < 0) {
                  Print("Error: ", GetLastError());
                  return ;
               }
               LastSellPrice_Robo1 = FindLastSellPrice_Robo1();
               gi_376_Robo1 = TRUE;
            }
         }
         if (OpenTicket_Robo1 > 0) gi_328_Robo1 = TimeCurrent() + 60.0 * (60.0 * gd_188_Robo1);
         EspacoGrid_Robo1 = FALSE;
      }
   }
       g_datetime_824_Robo1 = iTime(NULL, 0, 0);
   }
   Trades_Robo1 = CountTrades_Robo1();
   g_price_264_Robo1 = 0;
   double ld_1136 = 0;
   for (g_pos_344_Robo1 = OrdersTotal() - 1; g_pos_344_Robo1 >= 0; g_pos_344_Robo1--) {
      if( !OrderSelect(g_pos_344_Robo1, SELECT_BY_POS, MODE_TRADES) ){ continue; }
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber_Robo1) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber_Robo1) {
         if (OrderType() == OP_BUY || OrderType() == OP_SELL) {
            g_price_264_Robo1 += OrderOpenPrice() * OrderLots();
            ld_1136 += OrderLots();
         }
      }
   }
   if (Trades_Robo1 > 0) g_price_264_Robo1 = NormalizeDouble(g_price_264_Robo1 / ld_1136, Digits);
   if (gi_376_Robo1 && false) {
      for (g_pos_344_Robo1 = OrdersTotal() - 1; g_pos_344_Robo1 >= 0; g_pos_344_Robo1--) {
         if( !OrderSelect(g_pos_344_Robo1, SELECT_BY_POS, MODE_TRADES) ){ continue; }
         if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber_Robo1) continue;
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber_Robo1) {
            if (OrderType() == OP_BUY) {
               g_price_216_Robo1 = g_price_264_Robo1 + TakeProfit * Point;
              
               gd_352_Robo1 = g_price_264_Robo1 - g_pips_196_Robo1 * Point;
               gi_312_Robo1 = TRUE;
            }
         }
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber_Robo1) {
            if (OrderType() == OP_SELL) {
               g_price_216_Robo1 = g_price_264_Robo1 - TakeProfit * Point;
             
               gd_352_Robo1 = g_price_264_Robo1 + g_pips_196_Robo1 * Point;
               gi_312_Robo1 = TRUE;
            }
         }
      }
   }
   if (gi_376_Robo1) {
      if (gi_312_Robo1 == TRUE) {
         for (g_pos_344_Robo1 = OrdersTotal() - 1; g_pos_344_Robo1 >= 0; g_pos_344_Robo1--) {
            if( !OrderSelect(g_pos_344_Robo1, SELECT_BY_POS, MODE_TRADES) ){ continue; }
            if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber_Robo1) continue;
            if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber_Robo1 && CanModify(OrderTicket()) ) {
               ResetLastError();
               //while (!OrderModify(OrderTicket(), g_price_264_Robo1, OrderStopLoss(), g_price_216_Robo1, 0, Yellow)) {
               while (true) {
                  foo=OrderModify(OrderTicket(), g_price_264_Robo1, OrderStopLoss(), g_price_216_Robo1, 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_Robo1 = FALSE;
         }
      }
   }


}

int CountTrades_Robo1() {
   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_Robo1) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber_Robo1)
         if (OrderType() == OP_SELL || OrderType() == OP_BUY) l_count_0++;
   }
   return (l_count_0);
}

void CloseThisSymbolAll_Robo1() {
   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_Robo1) {
            if (OrderType() == OP_BUY) 
               foo=OrderClose(OrderTicket(), OrderLots(), Bid, g_slippage_204_Robo1, Blue);
               
            if (OrderType() == OP_SELL) 
               foo=OrderClose(OrderTicket(), OrderLots(), Ask, g_slippage_204_Robo1, Red);
         }
         Sleep(1000);
      }
   }
}

int OpenOrder_Robo1(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_Robo1(Bid, ai_32), TakeLong_Robo1(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_Robo1(Ask, ai_32), TakeShort_Robo1(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_Robo1(double ad_0, int ai_8) {
   if (ai_8 == 0) return (0);
   return (ad_0 - ai_8 * Point);
}

double StopShort_Robo1(double ad_0, int ai_8) {
   if (ai_8 == 0) return (0);
   return (ad_0 + ai_8 * Point);
}

double TakeLong_Robo1(double ad_0, int ai_8) {
   if (ai_8 == 0) return (0);
   return (ad_0 + ai_8 * Point);
}

double TakeShort_Robo1(double ad_0, int ai_8) {
   if (ai_8 == 0) return (0);
   return (ad_0 - ai_8 * Point);
}

double CalculateProfit_Robo1() {
   double ld_ret_0 = 0;
   for (g_pos_344_Robo1 = OrdersTotal() - 1; g_pos_344_Robo1 >= 0; g_pos_344_Robo1--) {
      if( !OrderSelect(g_pos_344_Robo1, SELECT_BY_POS, MODE_TRADES) ){ continue; }
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber_Robo1) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber_Robo1)
         if (OrderType() == OP_BUY || OrderType() == OP_SELL) ld_ret_0 += OrderProfit();
   }
   return (ld_ret_0);
}

void TrailingAlls_Robo1(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, 200, 0, MODE_LWMA, PRICE_CLOSE,  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_Robo1) continue;
            if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber_Robo1 ) {
               if (OrderType() == OP_BUY ) {
                  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 = longEma;
                  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 ) {
                  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 = longEma;
                  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_Robo1() {
   if (CountTrades_Robo1() == 0) gd_380_Robo1 = AccountEquity();
   if (gd_380_Robo1 < gd_388_Robo1) gd_380_Robo1 = gd_388_Robo1;
   else gd_380_Robo1 = AccountEquity();
   gd_388_Robo1 = AccountEquity();
   return (gd_380_Robo1);
}

double FindLastBuyPrice_Robo1() {
   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_Robo1) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber_Robo1 && 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_Robo1() {
   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_Robo1) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber_Robo1 && 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_Robo1() {
  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_Robo1) {
              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_Robo1() {
  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_Robo1) {
              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_Robo1() {
  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_Robo1) {
              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 (OrderProfit() < 0 ) return(True);
  }
  return(False);

}

void OpenCloseLineDraw(){

   //if(Info /*&& !IsTesting() && !IsOptimization()*/){
      string _name = "";
      color _clr = CLR_NONE;
      for(int i=OrdersHistoryTotal()-1;i>=0;i--){
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)){
            if(OrderSymbol()==Symbol() && (OrderMagicNumber() == MagicNumber_Robo1 ) && 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)); }