//+------------------------------------------------------------------+
//|                                                                  |
//|  In no event will author be liable for any damages whatsoever.   |
//|                      Use at your own risk.                       |
//|                                                                  |
//+------------------- DO NOT REMOVE THIS HEADER --------------------+

#define SIGNAL_NONE 0
#define SIGNAL_BUY   1
#define SIGNAL_SELL  2
#define SIGNAL_CLOSEBUY 3
#define SIGNAL_CLOSESELL 4

#property copyright "Mangezi (EIN) ea7"
#property link      "http://bright.lightein@yahoo.com/"

extern int MagicNumber = 02022010;
extern bool SignalMail = False;
extern bool EachTickMode = True;
extern double Lots = 0.01;
extern int Slippage = 5;
extern bool UseStopLoss = True;
extern int StopLoss = 24000;
extern bool UseTakeProfit = True;
extern int TakeProfit = 5;
extern bool UseTrailingStop = True;
extern int TrailingStop = 30;
extern int start1=0;
extern int stop1=23;
extern int start2=0;
extern int stop2=0;
extern int start3=0;
extern int stop3=0;
extern int start4=0;
extern int stop4=0;
extern int start5=0;
extern int stop5=0;
extern int start6=0;
extern int stop6=0;
extern int start7=0;
extern int stop7=0;
extern string separator1="-----  Pending Lots / Buy  -----";
extern double Same_Lots_Buy=0, BLot_1=0,BLot_2=0,BLot_3=0,BLot_4=0,BLot_5=0,BLot_6=0,BLot_7=0;
extern string separator2="-----  Pending Lots / Sell  -----";
extern double Same_Lots_Sell=0,SLot_1=0,SLot_2=0,SLot_3=0,SLot_4=0,SLot_5=0,SLot_6=0,SLot_7=0;
extern string separator3="-----  Buy Orders / Pending  -----";
extern int Same_Spread_Buy=0, PB_1=0,PB_2=0,PB_3=0,PB_4=0,PB_5=0,PB_6=0,PB_7=0;
extern string separator4="-----  Sell Orders / Pending  -----";
extern int Same_Spread_Sell=0,PS_1=0,PS_2=0,PS_3=0,PS_4=0,PS_5=0,PS_6=0,PS_7=0;

int BarCount;
int Current;
bool TickCheck = False;
int TP_Buy,TP_Sell;
double B_targ=0,S_targ=0;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init() {
   BarCount = Bars;

   if (EachTickMode) Current = 0; else Current = 1;
 //---- Setup Pending Lots and Spreads
   double SLB=Same_Lots_Buy,SLS=Same_Lots_Sell,SSB=Same_Spread_Buy,SSS=Same_Spread_Sell;
   if(SLB>0){ BLot_1=SLB; BLot_2=SLB; BLot_3=SLB; BLot_4=SLB; BLot_5=SLB; BLot_6=SLB; BLot_7=SLB; }
   if(SLS>0){ SLot_1=SLS; SLot_2=SLS; SLot_3=SLS; SLot_4=SLS; SLot_5=SLS; SLot_6=SLS; SLot_7=SLS; }
   if(SSB>0){ PB_1=SSB*1; PB_2=SSB*2; PB_3=SSB*3; PB_4=SSB*4; PB_5=SSB*5; PB_6=SSB*6; PB_7=SSB*7; }
   if(SSS>0){ PS_1=SSS*1; PS_2=SSS*2; PS_3=SSS*3; PS_4=SSS*4; PS_5=SSS*5; PS_6=SSS*6; PS_7=SSS*7; }

   return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit() {
   return(0);
}
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
 {
 //---- Set Take Profit Targets
   int Total2=OrdersTotal(),cnt;
   for(cnt=Total2-1; cnt>=0; cnt--)
     {
      if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES)==true)
        {
        if(OrderType()==OP_BUY  && B_targ==0){ B_targ=OrderTakeProfit(); }
        if(OrderType()==OP_SELL && S_targ==0){ S_targ=OrderTakeProfit(); }
        if(OrderType()==OP_BUYLIMIT  && Ask>=B_targ){ OrderDelete(OrderTicket()); B_targ=0; }
        if(OrderType()==OP_SELLLIMIT && Bid<=S_targ){ OrderDelete(OrderTicket()); S_targ=0; }
        }
     }
 //---- Shows last closed values
   Comment("Last Values","\nHigh:",High[1],"\nLow",Low[1],"\nClose",Close[1]);
 //----   

 //---- To stop entering trades during non-trading hours  
   if ((Hour()>=start1 && Hour()<=stop1) || (Hour()>=start2 && Hour()<=stop2) || (Hour()>=start3 && Hour()<=stop3) || (Hour()>=start4 && Hour()<=stop4) || (Hour()>=start5 && Hour()<=stop5) || (Hour()>=start6 && Hour()<=stop6) || (Hour()>=start7 && Hour()<=stop7))
      {
      //Valid Trading hour
      } 
   else
      {
      Comment("Non-trading hours");
      return;
      }   


   int Order = SIGNAL_NONE;
   int Total, Ticket;
   double StopLossLevel, TakeProfitLevel;

   if(Volume[0]==6)

   if (EachTickMode && Bars != BarCount) TickCheck = False;
   Total = OrdersTotal() == 6;
   Order = SIGNAL_NONE;

   //+------------------------------------------------------------------+
   //| Variable Begin                                                   |
   //+------------------------------------------------------------------+



double Buy1_1 = 2.5;
double Buy1_2 = iRSI(NULL, 0, 14, PRICE_CLOSE, 0);


double Sell1_1 = 97.5;
double Sell1_2 = iRSI(NULL, 0, 14, PRICE_CLOSE, 0);


   
   //+------------------------------------------------------------------+
   //| Variable End                                                     |
   //+------------------------------------------------------------------+

   //Check position
   bool IsTrade = False;

   for (int i = 0; i < Total; i ++) {
      OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      if(OrderType() <= OP_SELLSTOP &&  OrderSymbol() == Symbol()) {
         IsTrade = True;
         if(OrderType() == OP_BUYSTOP) {
            //Close

            //+------------------------------------------------------------------+
            //| Signal Begin(Exit Buy)                                           |
            //+------------------------------------------------------------------+

            

            //+------------------------------------------------------------------+
            //| Signal End(Exit Buy)                                             |
            //+------------------------------------------------------------------+

            if (Order == SIGNAL_CLOSEBUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
               OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, MediumSeaGreen);
               if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Close Buy");
               if (!EachTickMode) BarCount = Bars;
               IsTrade = False;
               continue;
            }
            //Trailing stop
            if(UseTrailingStop && TrailingStop > 0) {                 
               if(Bid - OrderOpenPrice() > Point * TrailingStop) {
                  if(OrderStopLoss() < Bid - Point * TrailingStop) {
                     OrderModify(OrderTicket(), OrderOpenPrice(), Bid - Point * TrailingStop, OrderTakeProfit(), 0, MediumSeaGreen);
                     if (!EachTickMode) BarCount = Bars;
                     continue;
                  }
               }
            }
         } else {
            //Close

            //+------------------------------------------------------------------+
            //| Signal Begin(Exit Sell)                                          |
            //+------------------------------------------------------------------+

            

            //+------------------------------------------------------------------+
            //| Signal End(Exit Sell)                                            |
            //+------------------------------------------------------------------+

            if (Order == SIGNAL_CLOSESELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
               OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, DarkOrange);
               if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Close Sell");
               if (!EachTickMode) BarCount = Bars;
               IsTrade = False;
               continue;
            }
            //Trailing stop
            if(UseTrailingStop && TrailingStop > 0) {                 
               if((OrderOpenPrice() - Ask) > (Point * TrailingStop)) {
                  if((OrderStopLoss() > (Ask + Point * TrailingStop)) || (OrderStopLoss() == 0)) {
                     OrderModify(OrderTicket(), OrderOpenPrice(), Ask + Point * TrailingStop, OrderTakeProfit(), 0, DarkOrange);
                     if (!EachTickMode) BarCount = Bars;
                     continue;
                  }
               }
            }
         }
      }
   }

   //+------------------------------------------------------------------+
   //| Signal Begin(Entry)                                              |
   //+------------------------------------------------------------------+

   if (Buy1_1 > Buy1_2) Order = SIGNAL_BUY;

   if (Sell1_1 < Sell1_2) Order = SIGNAL_SELL;


   //+------------------------------------------------------------------+
   //| Signal End                                                       |
   //+------------------------------------------------------------------+

   //Buy
   if (Order == SIGNAL_BUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
      if(!IsTrade) {
         //Check free margin
         if (AccountFreeMargin() < (1000 * Lots)) {
            Print("We have no money. Free Margin = ", AccountFreeMargin());
            return(0);
         }

         if (UseStopLoss) StopLossLevel = Ask - StopLoss * Point; else StopLossLevel = 0.0;
         if (UseTakeProfit) TakeProfitLevel = Ask + TakeProfit * Point; else TakeProfitLevel = 0.0;

         Ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, StopLossLevel, TakeProfitLevel, "Buy(#" + MagicNumber + ")", MagicNumber, 0, DodgerBlue);

         TP_Buy = OrderSend(Symbol(), OP_BUYLIMIT, BLot_1, Ask-Point*PB_1, Slippage, 0, TakeProfitLevel, "Buy(#" + MagicNumber + ")", MagicNumber, 0, DodgerBlue);
         TP_Buy = OrderSend(Symbol(), OP_BUYLIMIT, BLot_2, Ask-Point*PB_2, Slippage, 0, TakeProfitLevel, "Buy(#" + MagicNumber + ")", MagicNumber, 0, DodgerBlue);
         TP_Buy = OrderSend(Symbol(), OP_BUYLIMIT, BLot_3, Ask-Point*PB_3, Slippage, 0, TakeProfitLevel, "Buy(#" + MagicNumber + ")", MagicNumber, 0, DodgerBlue);
         TP_Buy = OrderSend(Symbol(), OP_BUYLIMIT, BLot_4, Ask-Point*PB_4, Slippage, 0, TakeProfitLevel, "Buy(#" + MagicNumber + ")", MagicNumber, 0, DodgerBlue);
         TP_Buy = OrderSend(Symbol(), OP_BUYLIMIT, BLot_5, Ask-Point*PB_5, Slippage, 0, TakeProfitLevel, "Buy(#" + MagicNumber + ")", MagicNumber, 0, DodgerBlue);
         TP_Buy = OrderSend(Symbol(), OP_BUYLIMIT, BLot_6, Ask-Point*PB_6, Slippage, 0, TakeProfitLevel, "Buy(#" + MagicNumber + ")", MagicNumber, 0, DodgerBlue);
         TP_Buy = OrderSend(Symbol(), OP_BUYLIMIT, BLot_7, Ask-Point*PB_7, Slippage, 0, 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);
      }
   }

   //Sell
   if (Order == SIGNAL_SELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
      if(!IsTrade) {
         //Check free margin
         if (AccountFreeMargin() < (1000 * Lots)) {
            Print("We have no money. Free Margin = ", AccountFreeMargin());
            return(0);
         }

         if (UseStopLoss) StopLossLevel = Bid + StopLoss * Point; else StopLossLevel = 0.0;
         if (UseTakeProfit) TakeProfitLevel = Bid - TakeProfit * Point; else TakeProfitLevel = 0.0;

         Ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, StopLossLevel, TakeProfitLevel, "Sell(#" + MagicNumber + ")", MagicNumber, 0, DeepPink);

         TP_Sell = OrderSend(Symbol(), OP_SELLLIMIT, SLot_1, Bid+Point*PS_1, Slippage, 0, TakeProfitLevel, "Sell(#" + MagicNumber + ")", MagicNumber, 0, DeepPink);
         TP_Sell = OrderSend(Symbol(), OP_SELLLIMIT, SLot_2, Bid+Point*PS_2, Slippage, 0, TakeProfitLevel, "Sell(#" + MagicNumber + ")", MagicNumber, 0, DeepPink);
         TP_Sell = OrderSend(Symbol(), OP_SELLLIMIT, SLot_3, Bid+Point*PS_3, Slippage, 0, TakeProfitLevel, "Sell(#" + MagicNumber + ")", MagicNumber, 0, DeepPink);
         TP_Sell = OrderSend(Symbol(), OP_SELLLIMIT, SLot_4, Bid+Point*PS_4, Slippage, 0, TakeProfitLevel, "Sell(#" + MagicNumber + ")", MagicNumber, 0, DeepPink);
         TP_Sell = OrderSend(Symbol(), OP_SELLLIMIT, SLot_5, Bid+Point*PS_5, Slippage, 0, TakeProfitLevel, "Sell(#" + MagicNumber + ")", MagicNumber, 0, DeepPink);
         TP_Sell = OrderSend(Symbol(), OP_SELLLIMIT, SLot_6, Bid+Point*PS_6, Slippage, 0, TakeProfitLevel, "Sell(#" + MagicNumber + ")", MagicNumber, 0, DeepPink);
         TP_Sell = OrderSend(Symbol(), OP_SELLLIMIT, SLot_7, Bid+Point*PS_7, Slippage, 0, 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);
}
//+------------------------------------------------------------------+