//+------------------------------------------------------------------+
//|  ParabolicSARea  v1.0                                            |
//+------------------------------------------------------------------+

#define NONE      0
#define BUY       1
#define SELL      2
#define CLOSEBUY  2
#define CLOSESELL 2
#property copyright   "2005-2014, MetaQuotes Software Corp."
// ---
extern int     MagicNumber       = 341112 ;
extern bool    SignalMail        = False  ;
extern bool    EachTickMode      = True   ;
extern double  Lots              = 0.01   ;
extern int     Slippage          = 4      ;
extern bool    StopLossMode      = True   ;
extern int     StopLoss          = 50     ;
extern bool    TakeProfitMode    = True   ;
extern int     TakeProfit        = 100    ;
extern bool    TrailingStopMode  = True   ;
extern int     TrailingStop      = 150    ;

int BarCount;
int Current;
bool TickCheck = False;

int init() 
{
   BarCount = Bars;
   if (EachTickMode) Current = 0; else Current = 1;
   return(0);
}

int deinit() 
{
   Comment("");
   return(0);
}

int start() {
   int Order = NONE;
   int Total, Ticket;
   double StopLossLevel, TakeProfitLevel;

   if (EachTickMode && Bars != BarCount) TickCheck = False;
   Total = OrdersTotal();
   Order = NONE;
   // -----------------------------------------------------------------|
   double Buy0        = iSAR(NULL, PERIOD_H1, 0.02, 0.2, Current + 1);
   double Buy1        = iSAR(NULL, PERIOD_H1, 0.02, 0.2, Current + 2);
   // -----------------------------------------------------------------|
   double Sell0       = iSAR(NULL, PERIOD_H1, 0.02, 0.2, Current + 1);
   double Sell1       = iSAR(NULL, PERIOD_H1, 0.02, 0.2, Current + 2);
// --------------------------------------------------------------------|
   bool IsTrade = False;
   for (int i = 0; i < Total; i ++) 
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true)
      if(OrderType() <= OP_SELL &&  OrderSymbol() == Symbol()) 
      {
         IsTrade = True;
         if(OrderType() == OP_BUY) 
         {
            if (Buy1 <= Low[1] && Buy0 >= High[0]) Order = CLOSEBUY;
            if (Order == CLOSEBUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) 
            {
               if(OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, MediumSeaGreen) == true)
               if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Close Buy");
               if (!EachTickMode) BarCount = Bars;
               IsTrade = False;
               continue;
            }
            if(TrailingStopMode && TrailingStop > 0) 
            {                 
               if(Bid - OrderOpenPrice() > Point * TrailingStop) 
               {
                  if(OrderStopLoss() < Bid - Point * TrailingStop) 
                  {
                     Ticket=OrderModify(OrderTicket(), OrderOpenPrice(), Bid - Point * TrailingStop, OrderTakeProfit(), 0, MediumSeaGreen);
                     if (!EachTickMode) BarCount = Bars;
                     continue;
                  }
               }
            }
         } else {
            if (Sell1 >= High[0] && Sell0 <= Low[1]) Order = CLOSESELL;
            if (Order == CLOSESELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) 
            {
               Ticket=OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, DarkOrange);
               if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Close Sell");
               if (!EachTickMode) BarCount = Bars;
               IsTrade = False;
               continue;
            }
            if(TrailingStopMode && TrailingStop > 0) 
            {                 
               if((OrderOpenPrice() - Ask) > (Point * TrailingStop)) 
               {
                  if((OrderStopLoss() > (Ask + Point * TrailingStop)) || (OrderStopLoss() == 0)) 
                  {
                     Ticket=OrderModify(OrderTicket(), OrderOpenPrice(), Ask + Point * TrailingStop, OrderTakeProfit(), 0, DarkOrange);
                     if (!EachTickMode) BarCount = Bars;
                     continue;
                  }
               }
            }
         }
      }
   }
   if (Buy1 >= High[0] && Buy0 <= Low[1]) Order = BUY;
   if (Sell1 <= Low[1] && Sell0 >= High[0]) Order = SELL;
   if (Order == BUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) 
   {
      if(!IsTrade) 
      {
         if (AccountFreeMargin() < (1000 * Lots)) {
            Print("We have no money. Free Margin = ", AccountFreeMargin());
            return(0);
         }
         if (StopLossMode) StopLossLevel = Ask - StopLoss * Point; else StopLossLevel = 0.0;
         if (TakeProfitMode) TakeProfitLevel = Ask + TakeProfit * Point; else TakeProfitLevel = 0.0;
         Ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, StopLossLevel, TakeProfitLevel, "Buy(#" + MagicNumber + ")", MagicNumber, 0, DodgerBlue);
         if(Ticket > 0) 
         {
            if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) 
            {
				   Print("BUY order opened : ", OrderOpenPrice());
               if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Open Buy");
			   } else {
				   Print("Error opening BUY order : ", GetLastError());
			   }
         }
         if (EachTickMode) TickCheck = True;
         if (!EachTickMode) BarCount = Bars;
         return(0);
      }
   }
   if (Order == SELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) 
   {
      if(!IsTrade) 
      {
         if (AccountFreeMargin() < (1000 * Lots)) 
         {
            Print("We have no money. Free Margin = ", AccountFreeMargin());
            return(0);
         }
         if (StopLossMode) StopLossLevel = Bid + StopLoss * Point; else StopLossLevel = 0.0;
         if (TakeProfitMode) TakeProfitLevel = Bid - TakeProfit * Point; else TakeProfitLevel = 0.0;
         Ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, StopLossLevel, TakeProfitLevel, "Sell(#" + MagicNumber + ")", MagicNumber, 0, DeepPink);
         if(Ticket > 0) 
         {
            if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) 
            {
				   Print("SELL order opened : ", OrderOpenPrice());
               if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Open Sell");
			   } else {
				   Print("Error opening SELL order : ", GetLastError());
			   }
         }
         if (EachTickMode) TickCheck = True;
         if (!EachTickMode) BarCount = Bars;
         return(0);
      }
   }
   if (!EachTickMode) BarCount = Bars;
   return(0);
}
//+----------------------- END --------------------------------------+