//+------------------------------------------------------------------+ 
//| Big Dog Breakout - ALBERTO TORTELLA                              | 
//+------------------------------------------------------------------+ 

// CARATTERISTICHE
// ENTRATA ROTTURA RANGE DEFINITO A INIZIO MATTINATA.
// STOP LATO OPPPOSTO DEL RANGE, ASSENZA DI TAKE PROFIT
// TAKE PROFIT MIN/MAX ULTIME DUE BARRE PRECEDENTI

extern int    Box         =    4; // ampiezza del box di riferimento
extern int    Start_Trade =    7; // prima ora utile per aprire posizioni
extern int    Stop_Trade  =   16; // ultima ora utile per aprire posizioni
extern int    Close_Trade =   23; // orario chiusura posizioni aperte
extern int    Filter_In   =   50; // filtro da aggiungere al livello di breakout
extern int    Filter_Out  =   50; // filtro da aggiungere al livello di stop
extern double Risk        = 1.0; // rischio massimo accettabile su ogni trade
extern double FixedLots   = 0.1; // lasciare 0 per utilizzare il fixed fractional method

int  Num_Order_Long, Num_Order_Short, Lotti ;
bool Long, Short ;
bool Entry_Long, Entry_Short ;

bool can_trade_long    = false ; // variabile di controllo per breakout long
bool can_trade_short   = false ; // variabile di controllo per breakout short

double Line_Up, Line_Down;
double Distanza_Long, Distanza_Short ;     
double Potential_Loss_Long, Potential_Loss_Short, Punto ; 

double Spread, pipValue, Lots, Apertura, Trailing_Stop ;
double Min_Stop, Stop_Long, Stop_Short ;
double Lots_Long, Lots_Short;
int    a = 0, Contatore ;
 
int Ora_Entrata, cnt, total, ticket_long, ticket_short;
double lotStep;

#include <Punto.mqh>
#include <Lots_Long.mqh>
#include <Lots_Short.mqh>

//+------------------------------------------------------------------+ 
//| ESECUZIONE DELL'EXPERT                                           |                                              
//+------------------------------------------------------------------+ 
 
int start() 
  { 

//+------------------------------------------------------------------+ 
//| DEFINIZIONE DEL BOX                                              |                                              
//+------------------------------------------------------------------+ 

if(Hour()==7)
  { 
  Line_Up   = High[iHighest(NULL,0,MODE_HIGH,Box,1)] ; 
  Line_Down = Low [iLowest(NULL,0,MODE_LOW,Box,1)] ; 
  } 


// SE CAMBIA LA BARRA RESETTO LA VARIABILE "NO TRADE" 
if (Apertura != Open[0]) 
        {
        a=0;
        }          

// CONTROLLO CHE NON CI SIANO ORDINI APERTI SU QUESTO CROSS 
// DA QUESTO EXPERT
  
  total = OrdersTotal();
  Num_Order_Long  = 0;
  Num_Order_Short = 0;
  for(cnt=0;cnt<=total;cnt++)
     {
     OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
     if (OrderSymbol()==Symbol() && OrderMagicNumber()==3) 
        {  // Controlla il cross e l'expert che ha aperto la posizione
        if (OrderType()==OP_BUY)
           { 
           Num_Order_Long++;
           }
        if (OrderType()==OP_SELL)
           { 
           Num_Order_Short++;
           }   
        }  
     }    
    
  if(Bid<Line_Up &&  Num_Order_Long==0 )
    { 
    can_trade_long  = true;
    } 
  if(Bid>Line_Down  &&  Num_Order_Short==0 )
    { 
    can_trade_short = true;
    }  
 
   
//+------------------------------------------------------------------+ 
//| APERTURA POSIZIONI                                               |                                             
//+------------------------------------------------------------------+ 
           

Entry_Long  = Bid>=Line_Up+Filter_In/Punto() && High[1]<=Line_Up  ;               
                         
Entry_Short = Bid<=Line_Down-Filter_In/Punto() && Low[1]>=Line_Down ;                   

 
// POSIZIONI LONG

if(Entry_Long && can_trade_long && Hour()>=Start_Trade && Hour()<Stop_Trade)  
  { 
  Min_Stop      = Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)/Punto() ;
  Stop_Long     = MathMin(Line_Down-Filter_Out/Punto(),Min_Stop) ; 
  Distanza_Long = Bid - Stop_Long ; 
  Lots_Long     = Lots_Long(); 
  
  if (Lots_Long>=0.01)               
     {
     ticket_long = OrderSend(Symbol(),OP_BUY,Lots_Long,Ask,NULL,NULL,NULL,"BD",3,0,Green) ;    
                           
     if(ticket_long>0) 
       { 
       if(OrderSelect(ticket_long,SELECT_BY_TICKET,MODE_TRADES))
         {
         Print("Perdita potenziale è : ", (Potential_Loss_Long*Lots_Long)/AccountFreeMargin()*100 ); 
         can_trade_long = false;
         Apertura = Open[0];
         }
       else Print("Error opening BUY order: ",GetLastError()); 
       return(0); 
       }               
     }
  else if (a == 0)
     {
     Print("No trade man!");
     a = 1;
     Apertura = Open[0];
     }
  }
  
// POSIZIONI SHORT
 
 
if(Entry_Short && can_trade_short && Hour()>=Start_Trade && Hour()<Stop_Trade)  
  {    
  Min_Stop       = Bid+MarketInfo(Symbol(),MODE_STOPLEVEL)/Punto() ;
  Stop_Short     = MathMax(Line_Up+Filter_Out/Punto(),Min_Stop) ;
  Distanza_Short = Stop_Short - Bid ; 
  Lots_Short     = Lots_Short();               
  
  if (Lots_Short>=0.01)                
     { 
     ticket_short = OrderSend(Symbol(),OP_SELL,Lots_Short,Bid,NULL,NULL,NULL,"Big Dog",3,0,Red);              
     
     if(ticket_short>0) 
       { 
       if(OrderSelect(ticket_short,SELECT_BY_TICKET,MODE_TRADES))
       {
       Print("Perdita potenziale è : ", (Potential_Loss_Short*Lots_Short)/AccountFreeMargin()*100 );
       can_trade_short = false;
       Apertura = Open[0];
       }
       else Print("Error opening SELL order : ",GetLastError()); 
       return(0); 
       }
     }  
  else if (a == 0)
     {
     Print("No trade man!");
     a = 1;
     Apertura = Open[0];
     }
  }
  
  
//+------------------------------------------------------------------+ 
//| INSERIMENTO STOP LOSS                                            | 
//+------------------------------------------------------------------+ 

   for(cnt=0;cnt<total;cnt++)
     {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==3)  // SIMBOLO
        {
        if(OrderType()==OP_BUY)   // POSIZIONI LONG
          {
          // trailing stop 
          Min_Stop  = Bid - MarketInfo(Symbol(),MODE_STOPLEVEL)/Punto() ; 
          Stop_Long = MathMin(Line_Down-Filter_Out/Punto(),Min_Stop) ; 
          if(OrderStopLoss()==0)
              {
              OrderModify(OrderTicket(),OrderOpenPrice(),Stop_Long,OrderTakeProfit(),0,Blue);
              }   
          } // Chiude Long 
                    
        else // POSIZIONI SHORT
          { 
          // trailing stop  
          Min_Stop   = Bid + MarketInfo(Symbol(),MODE_STOPLEVEL)/Punto() ; 
          Stop_Short = MathMax(Line_Up+Filter_Out/Punto(),Min_Stop)+(Ask-Bid) ;
          if(OrderStopLoss()==0)
            {
            OrderModify(OrderTicket(),OrderOpenPrice(),Stop_Short,OrderTakeProfit(),0,Blue);
            }        
                   
          }   // Chiude Short
          
        }    // Chiude Simbolo
     }      // Chiude Ciclo For  

//+------------------------------------------------------------------+ 
//| CHIUSURA POSIZIONI                                               | 
//+------------------------------------------------------------------+ 

   for(cnt=0;cnt<total;cnt++)
     {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==3)  // SIMBOLO
        {
        if(OrderType()==OP_BUY)   // POSIZIONI LONG
          {
          // trailing stop  
          Trailing_Stop=Low[iLowest(NULL,0,MODE_LOW,2,1)]-Filter_Out/Punto();
          if(Apertura!=Open[0] && OrderStopLoss()<Trailing_Stop)
              {
              OrderModify(OrderTicket(),OrderOpenPrice(),Trailing_Stop,OrderTakeProfit(),0,Blue);
              } 
          // chiusura posizioni a fine giornata
          if(Hour()==Close_Trade)
            {
            OrderClose(OrderTicket(),OrderLots(),Bid,NULL,PaleGoldenrod);           
            } 
          // chiusura posizioni il venerdì sera
          if(DayOfWeek()==5 && Hour()==19 && Minute()==50)
              {
              OrderClose(OrderTicket(),0.01,Bid,NULL,Violet);           
              }    
          }           
        else // POSIZIONI SHORT
          { 
          // trailing stop  
          Trailing_Stop=High[iHighest(NULL,0,MODE_HIGH,2,1)]+Filter_Out/Punto()+(Ask-Bid);
          if(Apertura!=Open[0] && OrderStopLoss()>Trailing_Stop )
            {
            OrderModify(OrderTicket(),OrderOpenPrice(),Trailing_Stop,OrderTakeProfit(),0,Blue);
            } 
          // chiusura posizioni a fine giornata
          if(Hour()==Close_Trade)
            {
            OrderClose(OrderTicket(),OrderLots(),Ask,NULL,PaleGoldenrod);           
            }    
          // chiusura posizioni il venerdì sera 
          if(DayOfWeek()==5 && Hour()==19 && Minute()==50)
            {
            OrderClose(OrderTicket(),0.01,Ask,NULL,Violet);
            }  
                   
          }   // Chiude Short
          
        }    // Chiude Simbolo
     }      // Chiude Ciclo For
  
    
} // Chiude Start