#property copyright "Rodolfo Leonardo"
#property link      "rodolfo.leonardo@gmail.com"

extern bool use_daily_target = FALSE;
extern double daily_target = 30.0;

extern bool Trade_in_Monday  =false; 
extern bool Trade_in_Tuesday =true; 
extern bool Trade_in_Wednesday=true;
extern bool Trade_in_Thursday=true; 
extern bool Trade_in_Friday  =false;

extern int magic =  D'03.07.2016 00:31:30';
extern double start_lot = 0.01;
extern double range = 10.0;
extern int level = 10;
extern bool lot_multiplier = TRUE;
extern double multiplier = 2.0;
extern double increament = 0.1;
extern bool use_sl_and_tp = true;
extern double sl = 60.0;
extern double tp = 30.0;
extern double tp_in_money = 0.5;
extern bool stealth_mode = TRUE;
extern bool use_stoch = TRUE;

//stochastic params
extern int k = 10;
extern int d = 3;
extern int slowing = 3;
extern int price_field = 0;//Price field parameter. Can be one of this values: 0 - Low/High or 1 - Close/Close.
extern int stoch_shift = 0;// Index of the value taken from the indicator buffer (shift relative to the current bar the given amount of periods ago).
extern int lo_level = 30;
extern int up_level = 70;
extern double AO=0.003;

extern int   TF_M                =  2; 
extern int   Sensitivity_M       =  40;  

extern int   TF_M2                =  2;     
extern int   Sensitivity_M2       =  20; 


extern string StartHour = "00:00"; 
extern string EndHour   = "23:00";  

extern double MaxOrderLot = 0.0;
extern double MaxSpread = 24.0; // Maximo de Spread p/ abertura de Ordem
extern bool UseRiskPercent = TRUE;
extern double RiskPercent = 1;

extern int TrailingStop = 30;

extern color background_color = Teal;

extern int HA_MaMetod=2;
extern int HA_MaPeriod=6;
extern int HA_MaMetod2=3;
extern int HA_MaPeriod2=2;

#define  NL    "\n"
double gd_200;
double g_minlot_208;
double g_stoplevel_216;
int gi_224 = 0;
int g_count_228 = 0;
int g_ticket_232 = 0;
double vTamanhoPonto;
string vMsg = "FutureMilionarioX";
int Time_Frame = 0;
int Slippage = 50;
double HA1,HA2,AOnow,AOprev;
double vQtdLotes;
bool vGravaLogErro = TRUE;
int vSTOPLEVEL;
int vCodErro = -1;
     bool Gi_596 = true;
     
bool ToNoLucro = false;
double vValorLucro;

int init() {
vValorLucro= 0;
   Time_Frame =  TimeCurrent();
   vSTOPLEVEL = MarketInfo(Symbol(), MODE_STOPLEVEL);
   if (Digits == 3 || Digits == 5) gd_200 = 10.0 * Point;
   else gd_200 = Point;
   g_minlot_208 = MarketInfo(Symbol(), MODE_MINLOT);
   g_stoplevel_216 = MarketInfo(Symbol(), MODE_STOPLEVEL);
   if (start_lot < g_minlot_208) Print("lotsize is to small.");
   if (sl < g_stoplevel_216) Print("stoploss is to tight.");
   if (tp < g_stoplevel_216) Print("takeprofit is to tight.");
   if (g_minlot_208 == 0.01) gi_224 = 2;
   if (g_minlot_208 == 0.1) gi_224 = 1;
   
    vTamanhoPonto = TamanhoPonto();
    
   return (0);
}

int deinit() {
   return (0);
}

int start() {
   int cmd_4;
   double order_open_price_8;
   double order_lots_16;
   double order_stoploss_24;
   double order_takeprofit_32;
   if (use_daily_target && f0_0() >= daily_target) {
      Comment("\ndaily target achieved.");
      return (0);
   }
   
    //Caso o spreed seja maior que o parametrizado foge
   double vSpread = MarketInfo(Symbol(), MODE_SPREAD);
   if (vSpread > MaxSpread ) return (0);
   
  if (UseRiskPercent) vQtdLotes = CalculaQtdLotes();
  else vQtdLotes = start_lot; // caso n�o utiliza os lotes fixos
  
   //if ( (DayOfWeek() == 5 || DayOfWeek() == 1) && f0_3() == 0) {
   //   Comment("\nstop trading in Friday.");
   //   return (0);
   //}
   
   if (TrailingStop != 0) VerificaOrdensParaModificar();
  
   if(TimeFilter()){
     if(IsExpertEnabled()){

   if (f0_3() == 0 && g_count_228 == 0) {
      //if (f0_1() == -2  || (M()==1 || M2()==1 || HA() ==1)) {
      if (SinalMestre() == 1 && SignalMega() ==1){
         if (stealth_mode) {
            if (use_sl_and_tp) g_ticket_232 = OrderSend(Symbol(), OP_BUY, vQtdLotes, Ask, 3, Ask - sl * gd_200, Ask + tp * gd_200, "", magic, 0, Blue);
            else g_ticket_232 = OrderSend(Symbol(), OP_BUY, vQtdLotes, Ask, 3, 0, 0, "", magic, 0, Blue);
         } else {
            if (use_sl_and_tp) {
               if (OrderSend(Symbol(), OP_BUY, vQtdLotes, Ask, 3, Ask - sl * gd_200, Ask + tp * gd_200, "", magic, 0, Blue) > 0) {
                  for (int li_0 = 1; li_0 < level; li_0++) {
                     if (lot_multiplier) {
                        g_ticket_232 = OrderSend(Symbol(), OP_BUYLIMIT, NormalizeDouble(vQtdLotes * MathPow(multiplier, li_0), gi_224), Ask - range * li_0 * gd_200, 3, Ask - range * li_0 * gd_200 - sl * gd_200,
                           Ask - range * li_0 * gd_200 + tp * gd_200, "", magic, 0, Blue);
                     } else {
                        g_ticket_232 = OrderSend(Symbol(), OP_BUYLIMIT, NormalizeDouble(vQtdLotes + increament * li_0, gi_224), Ask - range * li_0 * gd_200, 3, Ask - range * li_0 * gd_200 - sl * gd_200,
                           Ask - range * li_0 * gd_200 + tp * gd_200, "", magic, 0, Blue);
                     }
                  }
               }
            } else {
               if (OrderSend(Symbol(), OP_BUY, vQtdLotes, Ask, 3, 0, 0, "", magic, 0, Blue) > 0) {
                  for (li_0 = 1; li_0 < level; li_0++) {
                     if (lot_multiplier) {
                        g_ticket_232 = OrderSend(Symbol(), OP_BUYLIMIT, NormalizeDouble(vQtdLotes * MathPow(multiplier, li_0), gi_224), Ask - range * li_0 * gd_200, 3, 0, 0, "", magic, 0,
                           Blue);
                     } else g_ticket_232 = OrderSend(Symbol(), OP_BUYLIMIT, NormalizeDouble(vQtdLotes + increament * li_0, gi_224), Ask - range * li_0 * gd_200, 3, 0, 0, "", magic, 0, Blue);
                  }
               }
            }
         }
      }
      //if (f0_1() == 2 || (M()==-1 || M2()==-1 || HA() ==-1)) {
       if (SinalMestre() == -1 && SignalMega() ==-1 ){
         if (stealth_mode) {
            if (use_sl_and_tp) g_ticket_232 = OrderSend(Symbol(), OP_SELL, vQtdLotes, Bid, 3, Bid + sl * gd_200, Bid - tp * gd_200, "", magic, 0, Red);
            else g_ticket_232 = OrderSend(Symbol(), OP_SELL, vQtdLotes, Bid, 3, 0, 0, "", magic, 0, Red);
         } else {
            if (use_sl_and_tp) {
               if (OrderSend(Symbol(), OP_SELL, vQtdLotes, Bid, 3, Bid + sl * gd_200, Bid - tp * gd_200, "", magic, 0, Red) > 0) {
                  for (li_0 = 1; li_0 < level; li_0++) {
                     if (lot_multiplier) {
                        g_ticket_232 = OrderSend(Symbol(), OP_SELLLIMIT, NormalizeDouble(vQtdLotes * MathPow(multiplier, li_0), gi_224), Bid + range * li_0 * gd_200, 3, Bid + range * li_0 * gd_200 +
                           sl * gd_200, Bid + range * li_0 * gd_200 - tp * gd_200, "", magic, 0, Red);
                     } else {
                        g_ticket_232 = OrderSend(Symbol(), OP_SELLLIMIT, NormalizeDouble(vQtdLotes + increament * li_0, gi_224), Bid + range * li_0 * gd_200, 3, Bid + range * li_0 * gd_200 +
                           sl * gd_200, Bid + range * li_0 * gd_200 - tp * gd_200, "", magic, 0, Red);
                     }
                  }
               }
            } else {
               if (OrderSend(Symbol(), OP_SELL, vQtdLotes, Bid, 3, 0, 0, "", magic, 0, Red) > 0) {
                  for (li_0 = 1; li_0 < level; li_0++) {
                     if (lot_multiplier) {
                        g_ticket_232 = OrderSend(Symbol(), OP_SELLLIMIT, NormalizeDouble(vQtdLotes * MathPow(multiplier, li_0), gi_224), Bid + range * li_0 * gd_200, 3, 0, 0, "", magic,
                           0, Red);
                     } else g_ticket_232 = OrderSend(Symbol(), OP_SELLLIMIT, NormalizeDouble(vQtdLotes + increament * li_0, gi_224), Bid + range * li_0 * gd_200, 3, 0, 0, "", magic, 0, Red);
                  }
               }
            }
         }
      }
   }
   if (stealth_mode && f0_3() > 0 && f0_3() < level) {
      for (li_0 = 0; li_0 < OrdersTotal(); li_0++) {
         OrderSelect(li_0, SELECT_BY_POS, MODE_TRADES);
         if (OrderSymbol() != Symbol() || OrderMagicNumber() != magic) continue;
         cmd_4 = OrderType();
         order_open_price_8 = OrderOpenPrice();
         order_lots_16 = OrderLots();
      }
      if (cmd_4 == OP_BUY && Ask <= order_open_price_8 - range * gd_200    ) {
         if (use_sl_and_tp) {
            if (lot_multiplier) g_ticket_232 = OrderSend(Symbol(), OP_BUY, NormalizeDouble(order_lots_16 * multiplier, gi_224), Ask, 3, Ask - sl * gd_200, Ask + tp * gd_200, "", magic, 0, Blue);
            else g_ticket_232 = OrderSend(Symbol(), OP_BUY, NormalizeDouble(order_lots_16 + increament, gi_224), Ask, 3, Ask - sl * gd_200, Ask + tp * gd_200, "", magic, 0, Blue);
         } else {
            if (lot_multiplier) g_ticket_232 = OrderSend(Symbol(), OP_BUY, NormalizeDouble(order_lots_16 * multiplier, gi_224), Ask, 3, 0, 0, "", magic, 0, Blue);
            else g_ticket_232 = OrderSend(Symbol(), OP_BUY, NormalizeDouble(order_lots_16 + increament, gi_224), Ask, 3, 0, 0, "", magic, 0, Blue);
         }
      }
      if (cmd_4 == OP_SELL && Bid >= order_open_price_8 + range * gd_200  ) {
         if (use_sl_and_tp) {
            if (lot_multiplier) g_ticket_232 = OrderSend(Symbol(), OP_SELL, NormalizeDouble(order_lots_16 * multiplier, gi_224), Bid, 3, Bid + sl * gd_200, Bid - tp * gd_200, "", magic, 0, Red);
            else g_ticket_232 = OrderSend(Symbol(), OP_SELL, NormalizeDouble(order_lots_16 + increament, gi_224), Bid, 3, Bid + sl * gd_200, Bid - tp * gd_200, "", magic, 0, Red);
         } else {
            if (lot_multiplier) g_ticket_232 = OrderSend(Symbol(), OP_SELL, NormalizeDouble(order_lots_16 * multiplier, gi_224), Bid, 3, 0, 0, "", magic, 0, Red);
            else g_ticket_232 = OrderSend(Symbol(), OP_SELL, NormalizeDouble(order_lots_16 + increament, gi_224), Bid, 3, 0, 0, "", magic, 0, Red);
         }
      }
   }
   if (use_sl_and_tp && f0_3() > 1) {
      for (li_0 = 0; li_0 < OrdersTotal(); li_0++) {
         OrderSelect(li_0, SELECT_BY_POS, MODE_TRADES);
         if (OrderSymbol() != Symbol() || OrderMagicNumber() != magic || OrderType() > OP_SELL) continue;
         cmd_4 = OrderType();
         order_stoploss_24 = OrderStopLoss();
         order_takeprofit_32 = OrderTakeProfit();
      }
      for (li_0 = OrdersTotal() - 1; li_0 >= 0; li_0--) {
         OrderSelect(li_0, SELECT_BY_POS, MODE_TRADES);
         if (OrderSymbol() != Symbol() || OrderMagicNumber() != magic || OrderType() > OP_SELL) continue;
         if (OrderType() == cmd_4)
            if (OrderStopLoss() != order_stoploss_24 || OrderTakeProfit() != order_takeprofit_32) OrderModify(OrderTicket(), OrderOpenPrice(), order_stoploss_24, order_takeprofit_32, 0, CLR_NONE);
      }
   }
   double ld_40 = 0;
   for (li_0 = 0; li_0 < OrdersTotal(); li_0++) {
      OrderSelect(li_0, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != magic || OrderType() > OP_SELL) continue;
      ld_40 += OrderProfit();
   }
    }
    }
 
    
   if (ld_40 >= tp_in_money || g_count_228 > 0  ) {
      vValorLucro = ld_40 + vValorLucro;
      f0_2();
      f0_2();
      f0_2();
      g_count_228++;

      if (f0_3() == 0) g_count_228 = 0;
   }
   if ((!stealth_mode) && use_sl_and_tp && f0_3() < level) f0_2();
   
   Informacoes();
   return (0);
  
}

		   	 		 	 	   					   	 						 			 	 		 	 	 				 			  	  	  	   		 		 	 		 				  				 					  		 			  	     	 	 	 	  	 		    				      					 		 
int CountTrades() {
   int count = 0;
   for (int trade = OrdersTotal() - 1; trade >= 0; trade--) {
      OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != magic) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == magic)
         if (OrderType() == OP_SELL || OrderType() == OP_BUY) count++;
   }
   return (count);
}

void Informacoes() {
   double Ld_0;
   double Ld_8;
   double Ld_16;
   double Ld_24;
   double Ld_32;
   double Ld_40;
   double Ld_48;
   double Ld_56;
   string Ls_64;
   string Ls_72;
   int Li_84;

   if (true) {
     
      Ls_64 = "==========================\n";
      Ls_64 = Ls_64 + "               " + "FutureMilionarioX v1.00" 
      + "\n";
      Ls_64 = Ls_64 + "==========================\n";
      for (int count_80 = 0; count_80 <= MathMod(Seconds(), 20); count_80++) Ls_72 = Ls_72 + "|";
      Ls_64 = Ls_64 + "  Status: RUNNING " + Ls_72 
      + "\n";
      Ls_64 = Ls_64 + "==========================\n";
      Ls_64 = Ls_64 + "  ValorLucro: $ " + vValorLucro + "\n";
      Ls_64 = Ls_64 + "  Dia da semana :  " + TimeDayOfWeek(Time[0]) + "\n";
      
      Ls_64 = Ls_64 + "==========================\n";
      Ls_64 = Ls_64 + "   Ordens Abertas: " + CountTrades() + " \n";
      Ls_64 = Ls_64 + "   Tempo Atual: " + TimeToStr(TimeCurrent(), TIME_SECONDS) + " \n";
      Ls_64 = Ls_64 + "   UseRiskPercent:  " + UseRiskPercent   + "\n";
      Ls_64 = Ls_64 + "   RiskPercent:  " + RiskPercent  + "\n";
      Ls_64 = Ls_64 + "   MaxSpread:  " + MaxSpread  + "\n";
      Ls_64 = Ls_64 + "   TakeProfit:  " + tp  + "\n";
      Ls_64 = Ls_64 + "   StopLoss:  " + sl + "\n";
     // Ls_64 = Ls_64 + "   M:  " + M() + "\n";
     // Ls_64 = Ls_64 + "   M2:  " + M2() + "\n";
      Ls_64 = Ls_64 + "   SignalMega():  " + SignalMega() + "\n";
      Ls_64 = Ls_64 + "   Stocastic:  " + Sinalstochastic() + "\n";
      //Ls_64 = Ls_64 + "  MAX Floating DD: $ " + DoubleToStr(Gd_616, 2) 
      + "\n";
      //Ls_64 = Ls_64 + "  BUY Breakeven Level @ " + DoubleToStr(Ld_48, Digits) 
      + "\n";
     // Ls_64 = Ls_64 + "  SELL Breakeven Level @ " + DoubleToStr(Ld_56, Digits) 
      + "\n";
      Ls_64 = Ls_64 + "==========================\n";
      //Ls_64 = Ls_64 + "  Base Lot Size: " + DoubleToStr(Gda_524[0], 2) + " lots\n";
     // Ls_64 = Ls_64 + "  Slippage: " + DoubleToStr(slippage, 2) + " pips\n";
      Ls_64 = Ls_64 + "==========================\n";
      Comment(Ls_64);
      //f0_38("Breakeven_buy", Ld_48, Green, "Breakeven Line");
      //f0_38("Breakeven_sell", Ld_56, Red, "Breakeven Line");
      Li_84 = 11;
    
      if (Gi_596 || Seconds() % 5 == 0) {
         Gi_596 = FALSE;
         for (int count_88 = 0; count_88 < 9; count_88++) {
            for (int count_92 = 0; count_92 < Li_84; count_92++) {
               ObjectDelete("background" + count_88 + count_92);
               ObjectDelete("background" + count_88 + ((count_92 + 1)));
               ObjectDelete("background" + count_88 + ((count_92 + 2)));
               ObjectCreate("background" + count_88 + count_92, OBJ_LABEL, 0, 0, 0);
               ObjectSetText("background" + count_88 + count_92, "n", 30, "Wingdings", background_color);
               ObjectSet("background" + count_88 + count_92, OBJPROP_XDISTANCE, 20 * count_88);
               ObjectSet("background" + count_88 + count_92, OBJPROP_YDISTANCE, 23 * count_92 + 9);
            }
         }
      }
   }
}
	 	
	 	
double f0_0() {
   int day_0 = Day();
   double ld_ret_4 = 0;
   for (int pos_12 = 0; pos_12 < OrdersHistoryTotal(); pos_12++) {
      OrderSelect(pos_12, SELECT_BY_POS, MODE_HISTORY);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != magic) continue;
      if (TimeDay(OrderOpenTime()) == day_0) ld_ret_4 += OrderProfit();
   }
   return (ld_ret_4);
}

int f0_3() {
   int count_0 = 0;
   for (int pos_4 = 0; pos_4 < OrdersTotal(); pos_4++) {
      OrderSelect(pos_4, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != magic) continue;
      count_0++;
   }
   return (count_0);
}


void f0_2() {
   for (int pos_0 = OrdersTotal() - 1; pos_0 >= 0; pos_0--) {
      OrderSelect(pos_0, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != magic) continue;
      if (OrderType() > OP_SELL) OrderDelete(OrderTicket());
      else {
         if (OrderType() == OP_BUY) OrderClose(OrderTicket(), OrderLots(), Bid, 3, CLR_NONE);
         else OrderClose(OrderTicket(), OrderLots(), Ask, 3, CLR_NONE);
      }
   }
}
int  mper[10]={0,1,5,15,30,60,240,1440,10080,43200};
//int M(){ 
//   int MTSSignal=0;
//   int MTSstart=0;
//   double MTS_Green1=iCustom(Symbol(),mper[TF_M],"medium",Sensitivity_M,1,0);
//   double MTS_Red1=iCustom(Symbol(),mper[TF_M],"medium",Sensitivity_M,2,0);
//   double MTS_Green2=iCustom(Symbol(),mper[TF_M],"medium",Sensitivity_M,1,1);
//   double MTS_Red2=iCustom(Symbol(),mper[TF_M],"medium",Sensitivity_M,2,1);
//   if((MTS_Green1!=EMPTY_VALUE)&&(MTS_Green2!=EMPTY_VALUE)) MTSstart=1;
//   if((MTS_Red1!=EMPTY_VALUE)&&(MTS_Red2!=EMPTY_VALUE)) MTSstart=-1;
//   if(MTSstart<0) MTSSignal= -1;                                         //������ Sell 
//   if(MTSstart>0) MTSSignal = 1;                                         // ������ Buy
//   return(MTSSignal);
//}
//
//int M2(){ 
//   int MTSSignal2=0;
//   int MTSstart2=0;
//   double MTS_Green1=iCustom(Symbol(),mper[TF_M2],"medium",Sensitivity_M2,1,0);
//   double MTS_Red1=iCustom(Symbol(),mper[TF_M2],"medium",Sensitivity_M2,2,0);
//   double MTS_Green2=iCustom(Symbol(),mper[TF_M2],"medium",Sensitivity_M2,1,1);
//   double MTS_Red2=iCustom(Symbol(),mper[TF_M2],"medium",Sensitivity_M2,2,1);
//   if((MTS_Green1!=EMPTY_VALUE)&&(MTS_Green2!=EMPTY_VALUE)) MTSstart2=1;
//   if((MTS_Red1!=EMPTY_VALUE)&&(MTS_Red2!=EMPTY_VALUE)) MTSstart2=-1;
//   if(MTSstart2<0) MTSSignal2= -1;                                         //������ Sell 
//   if(MTSstart2>0) MTSSignal2 = 1;                                         // ������ Buy
//   return(MTSSignal2);
//}

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); 
  
 }        
 
 
//Calcula a quantidade de lotes  conforme o risco
double CalculaQtdLotesRisco(double vRiskPercent) 
{
   bool vTrailingStop = TRUE;
   double vMinLotSymbol = MarketInfo(Symbol(), MODE_MINLOT);
   double vMODE_POINT = MarketInfo(Symbol(), MODE_LOTSIZE) / AccountLeverage();
   double vValoraArriscar = vRiskPercent / 100.0 * AccountBalance() / vMODE_POINT;
   double vRetorno = MathFloor(vValoraArriscar);
   while (vTrailingStop) 
   {
      vRetorno += vMinLotSymbol;
      if (vRetorno > vValoraArriscar) 
      {
         vTrailingStop = FALSE;
         vRetorno -= vMinLotSymbol;
      }
   }
   return (vRetorno);
}

//Calcula a quantidade de lotes 
double CalculaQtdLotes() 
{
   double vQtdLotes = start_lot;
   if (UseRiskPercent) vQtdLotes = CalculaQtdLotesRisco(MathAbs(RiskPercent));
   if (vQtdLotes > MaxOrderLot && MaxOrderLot != 0.0) vQtdLotes = MaxOrderLot;
   vQtdLotes = ConfiguraTamanhoLote(vQtdLotes);
   return (vQtdLotes);
}

//Define tamanho de lote conforme o permitido para a moeda negociada
double ConfiguraTamanhoLote(double pTamanhoLote) 
{
	//Minimum permitted amount of a lot
   if (pTamanhoLote > MarketInfo(Symbol(), MODE_MAXLOT)) pTamanhoLote = MarketInfo(Symbol(), MODE_MAXLOT);
   else
      if (pTamanhoLote < MarketInfo(Symbol(), MODE_MINLOT)) pTamanhoLote = MarketInfo(Symbol(), MODE_MINLOT);
   return (pTamanhoLote);
}


// tamanho de ponto na moeda de cota��o
double TamanhoPonto(string a_symbol_0 = "0") 
{
   if (a_symbol_0 == "0") a_symbol_0 = Symbol();
   int digits_8 = MarketInfo(a_symbol_0, MODE_DIGITS);
   double vretorno = 0.0;
   double vMODE_POINT = MarketInfo(a_symbol_0, MODE_POINT);
   if (digits_8 == 5 || digits_8 == 3) vretorno = 10.0 * vMODE_POINT;
   else vretorno = vMODE_POINT;
   return (vretorno);
}


int HA()
{
   int i=1; 
   
 HA1=iCustom(Symbol(),mper[TF_M],"Heiken_Ashi_Smoothed",HA_MaMetod,HA_MaPeriod,HA_MaMetod2,HA_MaPeriod2,2,i);
 HA2=iCustom(Symbol(),mper[TF_M],"Heiken_Ashi_Smoothed",HA_MaMetod,HA_MaPeriod,HA_MaMetod2,HA_MaPeriod2,3,i);


 static int condition =0;
  
  if(HA2>HA1)condition =1;
  else if(HA1>HA2)condition =-1;
  else
  condition = 0;
  

  return(condition);
  
}  

int Sinalstochastic() {
   double istochastic_0 = iStochastic(Symbol(), 0, k, d, slowing, MODE_SMA, price_field, MODE_SIGNAL, stoch_shift);
   if (use_stoch) {
      if (istochastic_0 > up_level) return (-1);
      if (istochastic_0 < lo_level) return (1);
   }
   return (0);
}

int SinalMestre(){
   int   vret = 0;
   double  Procent    =1.3;
   double max = NormalizeDouble(iHigh(Symbol(),1440,0),Digits);
   double min = NormalizeDouble(iLow (Symbol(),1440,0),Digits);
   double opp=NormalizeDouble(iOpen(Symbol(),1440,0),Digits);
   double cl=NormalizeDouble(iClose(Symbol(),1440,0),Digits);
   
   if(cl>min) { double x=NormalizeDouble(cl*100/min-100,2); }
   if(cl<max) { double y=NormalizeDouble(cl*100/max-100,2); }
   
   if (Procent*(-1)<=y&&Close[1]>Open[1]){ vret = 1; }
   if (Procent     >=x&&Close[1]<Open[1]){ vret = -1; }  
   
   return vret;
}

int SignalMega()
{
  int   MegaFX = iCustom(Symbol(),240,"mega_fx",6,0);

  return(MegaFX);      
}

void CloseAll()
{
   bool   Result;
   int    i,Pos,Error;
   int    Total=OrdersTotal();
   
   if(Total>0)
   {
     for(i=Total-1; i>=0; i--) 
     {
       if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == TRUE) 
       {
         Pos=OrderType();
         if(Pos==OP_BUY)
         {Result=OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, CLR_NONE);}
         if(Pos==OP_SELL)
         {Result=OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, CLR_NONE);}
         if((Pos==OP_BUYSTOP)||(Pos==OP_SELLSTOP)||(Pos==OP_BUYLIMIT)||(Pos==OP_SELLLIMIT))
         {Result=OrderDelete(OrderTicket(), CLR_NONE);}
//-----------------------
         if(Result!=true) 
          { 
             Error=GetLastError(); 
             Print("LastError = ",Error); 
          }
         else Error=0;
//-----------------------
       }   
     }
   }
   return(0);
}


//Oferta/Venda (Bid) e de Demanda/Compra (Ask).
void VerificaOrdensParaModificar() 
{
   double vprice;
   int vTrailingStop = TrailingStop;
   
   //percorre as ordens
   for (int c = 0; c < OrdersTotal(); c++) 
   {
	   //se a ordem estiver aberta
      if (OrderSelect(c, SELECT_BY_POS) != FALSE) 
      {
		  //se a ordem for para a moeda 
         if (OrderSymbol() == Symbol()) 
         {
			 //verifica o Numero Magico
            if (OrderMagicNumber() >= magic && OrderMagicNumber() <= magic) 
            {
				//Se a ordem for de compra
               if (OrderType() == OP_BUY) 
               {
				  //PrecoOrdem recebe o preco de venda atual
                  vprice = Bid - (vTamanhoPonto * vTrailingStop );
				  
				  // N�o (Se o pre�o  atual de venda for  maior que o preco do StopLoss  e o pre�o de abertura da Ordem for menor que o pre�o atual de venda menos o TrailingStop)
                  if (!(OrderStopLoss() < vprice && OrderOpenPrice() < Bid - vTrailingStop * vTamanhoPonto)) continue;
				  
                  ModificaOrdem(vprice, OrderTicket());
                  continue;
                  
                  //VENDA
               }else{
			   
      			   //PrecoOrdem recebe o preco de compra atual
                     vprice = Ask + (vTamanhoPonto * vTrailingStop );
      			   
      			   //Se o pre�o  atual de compra for  maior que o preco do StopLoss e o pre�o de abertura da Ordem for maior que o pre�o atual de compra menos o TrailingStop
                     if (OrderStopLoss() > vprice && OrderOpenPrice() > Ask + (vTrailingStop * vTamanhoPonto)) ModificaOrdem(vprice, OrderTicket());
               
               }
            }
         }
      }
   }
}

//Altera a ordem
void ModificaOrdem(double a_price_0, int vOrdemAberta) 
{
   vSTOPLEVEL = MarketInfo(Symbol(), MODE_STOPLEVEL);
   if (!OrderModify(vOrdemAberta, OrderOpenPrice(), a_price_0, OrderTakeProfit(), 0, Red))
      if (vGravaLogErro) GravaErro();
}

void GravaErro() 
{
   string vErro;
   if (vGravaLogErro) 
   {
      if (vCodErro > 0) 
      {
         vErro = "Error:" + GetLastError() + " OrderType:" + OrderType() + " Ticket:" + OrderTicket();
         vErro = TimeToStr(TimeCurrent(), TIME_DATE|TIME_MINUTES|TIME_SECONDS) + " " + vErro;
         FileWrite(vCodErro, vErro);
      }
   }
}