//+------------------------------------------------------------------+
//|                                      Fibonacci High Low.mq4 v1.1 |
//|                                                          robisop |
//|                                              robosopko@gmail.com |
//+------------------------------------------------------------------+
#property copyright "robisop"
#property link      "robosopko@gmail.com"

//--- input parameters
extern double    high = 0.0;
extern double    low = 0.0;
extern double    lots = 0.1;
extern int    entry_pips_diff = 3;
extern int    sl_pips_diff = 1;
extern int    expire_in_hours = 24;
extern int    point_size_factor = 1;

static int fib_sell_be = 0;
static int fib_false_sell_be = 0;
static int fib_sell_tp2 = 0;
static int fib_false_sell_tp = 0;
static int fib_buy_be = 0;
static int fib_false_buy_be = 0;
static int fib_buy_tp2 = 0; 
static int fib_false_buy_tp = 0; 

static double entry_diff;
static double sl_diff;

static double entry_low;
static double entry_high;
static double tp2_low;
static double be_low;
static double sl_low;
static double be_mid;
static double sl_high;
static double be_high;
static double tp2_high;

static string TradeSymbol;
double FibExpiry;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
      TradeSymbol = Symbol();

      entry_diff = entry_pips_diff*Point*point_size_factor;
      sl_diff = sl_pips_diff*Point*point_size_factor;      
      
      FibExpiry = TimeCurrent() + 60*60*expire_in_hours;
      
      double diff = high - low;
      
      entry_low = normDouble(low - entry_diff);
      entry_high = normDouble(high + entry_diff);
      tp2_low = normDouble(low - 0.5*diff);
      be_low = normDouble(low - 0.25*diff);
      sl_low = normDouble(low + 0.236*diff);
      be_mid = normDouble(low + 0.5*diff);
      sl_high = normDouble(low + 0.764*diff);
      be_high = normDouble(low + 1.25*diff);
      tp2_high = normDouble(low + 1.5*diff); 
      
      
      fib_sell_be = OrderSend(   TradeSymbol,
                           OP_SELLSTOP,
                           lots,
                           entry_low,
                           0,
                           normDouble(sl_low + sl_diff),
                           be_low,
                           "Fib Sell BE",
                           1,
                           FibExpiry,
                           Lime);
     Print("fib_sell_be ticket: ", fib_sell_be);
     
     fib_sell_tp2 = OrderSend(   TradeSymbol,
                           OP_SELLSTOP,
                           lots,
                           entry_low,
                           0,
                           normDouble(sl_low + sl_diff),
                           tp2_low,
                           "Fib Sell TP2",
                           2,
                           FibExpiry,
                           Lime);
     Print("fib_sell_tp2 ticket: ", fib_sell_tp2);                           
     
     fib_buy_be = OrderSend(   TradeSymbol,
                           OP_BUYSTOP,
                           lots,
                           entry_high,
                           0,
                           normDouble(sl_high - sl_diff),
                           be_high,
                           "Fib Buy BE",
                           3,
                           FibExpiry,
                           Lime);
     Print("fib_buy_be ticket: ", fib_buy_be);
     
     fib_buy_tp2 = OrderSend(   TradeSymbol,
                           OP_BUYSTOP,
                           lots,
                           entry_high,
                           0,
                           normDouble(sl_high - sl_diff),
                           tp2_high,
                           "Fib Buy TP2",
                           4,
                           FibExpiry,
                           Lime);
     Print("fib_buy_tp2 ticket: ", fib_buy_tp2);
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   
   RefreshRates();
   
   //delete false break orders if price goes beyond tp2
   if(Ask >= tp2_high)
   {
      if (OrderSelect(fib_false_sell_be, SELECT_BY_TICKET) == true && OrderCloseTime() == 0) OrderDelete(fib_false_sell_be);
      if (OrderSelect(fib_false_sell_tp, SELECT_BY_TICKET) == true && OrderCloseTime() == 0) OrderDelete(fib_false_sell_tp);
      return(0);
   }
   if(Bid <= tp2_low)
   {
      if (OrderSelect(fib_false_buy_be, SELECT_BY_TICKET) == true && OrderCloseTime() == 0) OrderDelete(fib_false_buy_be);
      if (OrderSelect(fib_false_buy_tp, SELECT_BY_TICKET) == true && OrderCloseTime() == 0) OrderDelete(fib_false_buy_tp);
      return(0);
   }
   
   //move stop loss if price gets to break even
   if(Ask >= be_high)
   {
      if (OrderSelect(fib_buy_tp2, SELECT_BY_TICKET) == true && OrderCloseTime() == 0)
      {
         if(OrderStopLoss() != entry_high)
         {
            OrderModify(OrderTicket(),OrderOpenPrice(),entry_high,OrderTakeProfit(), OrderExpiration(), Blue);      
            Print("modified fib_buy_tp2 stop loss to: ", entry_high);
         }
         return(0);
      }
   }
   if(Bid <= be_low)
   {
      if (OrderSelect(fib_sell_tp2, SELECT_BY_TICKET) == true && OrderCloseTime() == 0)
      {
         if(OrderStopLoss() != entry_low)
         {
            OrderModify(OrderTicket(),OrderOpenPrice(),entry_low,OrderTakeProfit(), OrderExpiration(), Blue);
            Print("modified fib_sell_tp2 stop loss to: ", entry_low);
         }
         return(0);
      }
   }
   
   //create new orders for false break 
   if(Ask >= entry_high)
   {
      if(fib_false_sell_be <= 0)
      {
         fib_false_sell_be = OrderSend(   TradeSymbol,
                           OP_SELLSTOP,
                           lots,
                           normDouble(sl_high - sl_diff),
                           0,
                           normDouble(high + sl_diff),
                           be_mid,
                           "Fib False Sell BE",
                           1,
                           FibExpiry,
                           Lime);
      Print("fib_false_sell_be ticket: ", fib_false_sell_be);
      }
      
      if(fib_false_sell_tp <= 0)
      {
         fib_false_sell_tp = OrderSend(   TradeSymbol,
                           OP_SELLSTOP,
                           lots,
                           normDouble(sl_high - sl_diff),
                           0,
                           normDouble(high + sl_diff),
                           normDouble(sl_low + sl_diff),
                           "Fib False Sell TP",
                           2,
                           FibExpiry,
                           Lime);      
      Print("fib_false_sell_tp ticket: ", fib_false_sell_tp);
      }
      return(0);
   }
   if(Bid <= entry_low)
   {
      if(fib_false_buy_be <= 0)
      {
         fib_false_buy_be = OrderSend(   TradeSymbol,
                           OP_BUYSTOP,
                           lots,
                           normDouble(sl_low + sl_diff),
                           0,
                           normDouble(low - sl_diff),
                           be_mid,
                           "Fib False Buy BE",
                           3,
                           FibExpiry,
                           Lime);
      Print("fib_false_buy_be ticket: ", fib_false_buy_be);
      }
      if(fib_false_buy_tp <= 0)
      {
         fib_false_buy_tp = OrderSend(   TradeSymbol,
                           OP_BUYSTOP,
                           lots,
                           normDouble(sl_low + sl_diff),
                           0,
                           normDouble(low - sl_diff),
                           normDouble(sl_high - sl_diff),
                           "Fib False Buy TP",
                           4,
                           FibExpiry,
                           Lime);
      Print("fib_false_buy_tp ticket: ", fib_false_buy_tp);
      }
      return(0);
   }
   
   
   
   
//----
   return(0);
  }
//+------------------------------------------------------------------+

double normDouble( double val )
{
     return ( NormalizeDouble( val, MarketInfo( Symbol(), MODE_DIGITS ) ) );
}


