
// EA written by TheBrigadier on ForexFactory
// Based on system designed by supercat1977

#property copyright "EA by TheBrigdier, Tiger Trend Trading by supercat1977."
#property link      "http://www.forexfactory.com/showthread.php?t=365794"

extern string Seperator1 = "************EMA Settings************";
extern int ShortEMA = 3;
extern int LongEMA = 5;
extern string Seperator2 = "************Lot Management************";
extern double Lots = 0.1;
extern int Slippage = 3;
extern int PeriodShort = PERIOD_M15;
extern string Seperator3 = "************Stop Loss************";
extern bool CloseHalfAtBreakEven = true;



string symbol;
bool is_a_trade_open;
int daily_bars;
int five_bars;
bool daily_trend_down;
bool daily_trend_up;
int BarOfLastTrade;

/* Initialize  */
int init()
  {
      symbol = Symbol();
      BarOfLastTrade = 0;
      daily_trend_down = false;
      daily_trend_up = false;
      determine_initial_daily_trend();
  }

/* Unused  */
int deinit(){return(0);}

/* Let's do this  */
int start()
  { 
   /* Get the daily trend direction */
   daily_trend_direction();
   
   /* Close any open trades upon receiving a signal */
   close_trades_from_signal();

   /* Trade only once per bar  */
   if(BarOfLastTrade < iBars(Symbol(), 0))
   {
     if (daily_trend_up && ma_buy_signal())
     {
         if (CloseHalfAtBreakEven)
         {
            OrderSend(Symbol(), OP_BUY, get_lot_size()/2, Ask, Slippage, previous_low_stop_loss(), 0, "buy", 1, 0, Green);
            OrderSend(Symbol(), OP_BUY, get_lot_size()/2, Ask, Slippage, previous_low_stop_loss(), 2*Ask - previous_low_stop_loss(), "buy", 1, 0, Green);
         }
         else
            OrderSend(Symbol(), OP_BUY, get_lot_size(), Ask, Slippage, previous_low_stop_loss(), 0, "buy", 1, 0, Green);
            
         BarOfLastTrade = iBars(Symbol(), 0);
     }
     if (daily_trend_down && ma_sell_signal())
     {
        if (CloseHalfAtBreakEven)
        {
            OrderSend(Symbol(), OP_SELL, get_lot_size()/2, Bid, Slippage, previous_high_stop_loss(), 0, "sell", 1, 0, Red);
            OrderSend(Symbol(), OP_SELL, get_lot_size()/2, Bid, Slippage, previous_high_stop_loss(), 2*Bid - previous_high_stop_loss(), "sell", 1, 0, Red);
        }
        else
            OrderSend(Symbol(), OP_SELL, get_lot_size(), Bid, Slippage, previous_high_stop_loss(), 0, "sell", 1, 0, Red);   
            
        BarOfLastTrade = iBars(Symbol(), 0);
     } 
   }   

   return(0);
}

/* Close open trades when we catch the appropriate signal  */
void close_trades_from_signal()
{
   for (int i = 0; i < OrdersTotal(); i++)
   {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderType() == OP_SELL  && OrderSymbol() == Symbol() && daily_trend_up)
            OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, Blue);
         
         else if (OrderType() == OP_BUY  && OrderSymbol() == Symbol() && daily_trend_down)
            OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Blue);
      }      
   }
}         

void move_stop_loss()
{
   for (int i = 0; i < OrdersTotal(); i++)
   {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderType() == OP_SELL  && OrderSymbol() == Symbol() && OrderStopLoss() > previous_high_stop_loss())
            OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice(), OrderTakeProfit(), 0, CLR_NONE);
         else if (OrderType() == OP_BUY  && OrderSymbol() == Symbol() && OrderStopLoss() < previous_low_stop_loss())
            OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice(), OrderTakeProfit(), 0, CLR_NONE);
      }      
   }
}   
   
/* Did a buy signal occur on the previous candle? */
/* If so return true, else return false  */
bool ma_buy_signal()
{        
      double ma_short =    iMA(symbol, PeriodShort, ShortEMA, 0, MODE_EMA, PRICE_CLOSE, 1);
      double ma_short_pr = iMA(symbol, PeriodShort, ShortEMA, 0, MODE_EMA, PRICE_CLOSE, 2);
      double ma_long =     iMA(symbol, PeriodShort, LongEMA, 0, MODE_EMA, PRICE_CLOSE, 1);
      double ma_long_pr =  iMA(symbol, PeriodShort, LongEMA, 0, MODE_EMA, PRICE_CLOSE, 2);
      
      if (ma_short_pr < ma_long_pr && ma_short > ma_long) 
         return (true);
      else 
         return (false);
}   

/* Did a sell signal occur on the previous candle? */
/* If so return true, else return false  */
bool ma_sell_signal()
{        
      double ma_short =    iMA(symbol, PeriodShort, ShortEMA, 0, MODE_EMA, PRICE_CLOSE, 1);
      double ma_short_pr = iMA(symbol, PeriodShort, ShortEMA, 0, MODE_EMA, PRICE_CLOSE, 2);
      double ma_long =     iMA(symbol, PeriodShort, LongEMA, 0, MODE_EMA, PRICE_CLOSE, 1);
      double ma_long_pr =  iMA(symbol, PeriodShort, LongEMA, 0, MODE_EMA, PRICE_CLOSE, 2);
      
      if (ma_short_pr > ma_long_pr && ma_short < ma_long) 
         return (true);
      else 
         return (false);
}

/* Did a buy signal occur on the previous candle? */
/* If so return true, else return false  */
void daily_trend_direction()
{        
      double ma_short =    iMA(symbol, PERIOD_D1, ShortEMA, 0, MODE_EMA, PRICE_CLOSE, 1);
      double ma_short_pr = iMA(symbol, PERIOD_D1, ShortEMA, 0, MODE_EMA, PRICE_CLOSE, 2);
      double ma_long =     iMA(symbol, PERIOD_D1, LongEMA, 0, MODE_EMA, PRICE_CLOSE, 1);
      double ma_long_pr =  iMA(symbol, PERIOD_D1, LongEMA, 0, MODE_EMA, PRICE_CLOSE, 2);
      
      if (ma_short_pr < ma_long_pr && ma_short > ma_long) 
      {
         daily_trend_up = true;
         daily_trend_down = false;
      }
      else if (ma_short_pr > ma_long_pr && ma_short < ma_long)
      {
         daily_trend_up = false;
         daily_trend_down = true;
      }   
}   

void determine_initial_daily_trend()
{
      double ma_short =    iMA(symbol, PERIOD_D1, ShortEMA, 0, MODE_EMA, PRICE_CLOSE, 1);
      double ma_long =     iMA(symbol, PERIOD_D1, LongEMA, 0, MODE_EMA, PRICE_CLOSE, 1);
      
      if (ma_short < ma_long)
      {
         daily_trend_up = false;
         daily_trend_down = true;
      }
      else
      {
         daily_trend_up = true;
         daily_trend_down = false;
      }
}         
         

double previous_high_stop_loss()
{
   double prev_daily_high = iHigh(Symbol(), PERIOD_D1, 1);
   if (prev_daily_high > Ask)
      return (iHigh(Symbol(), PERIOD_D1, 1));
   else
      return (Ask - 500*Point);   
}

double previous_low_stop_loss()
{
   double prev_daily_low = iLow(Symbol(), PERIOD_D1, 1);
   if (prev_daily_low < Bid)
      return (iLow(Symbol(), PERIOD_D1, 1));
   else
      return (Bid - 500*Point);   
}

double get_lot_size()
{
       return (Lots);
}

