//+------------------------------------------------------------------+
//| This MQL is generated by Expert Advisor Builder                  |
//|                http://sufx.core.t3-ism.net/ExpertAdvisorBuilder/ |
//|                                                                  |
//|  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




extern bool SignalMail = False;
extern bool EachTickMode = True;
extern double Lots = 1.0;
extern int Slippage = 3;
extern bool UseMoneyManagement = true; //Use Money Management or not
extern bool AccountIsMicro = true; //Use Micro-Account or not
extern double Risk = 10; //10%

extern bool UseTakeProfit = True;
extern int TakeProfit = 60;


int BarCount;
int Current;
bool TickCheck = False;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init() {
if(Digits == 3 || Digits == 5)
   {
      TakeProfit *=10;
      Slippage *= 10;
   }

   BarCount = Bars;

   if (EachTickMode) Current = 0; else Current = 1;

   return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit() {
   return(0);
}
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
double LotSize()
{
     double lotMM = MathCeil(AccountFreeMargin() *  Risk / 10000) / 100;
     
     if(AccountIsMicro==false) //normal account
     {
        if (lotMM < 0.1) lotMM = Lots;
        if  (lotMM > 1000) lotMM = 1000;
     }
     else //micro account
     {
        if (lotMM < 0.01) lotMM = Lots;
        if  (lotMM > 1000) lotMM = 1000;
     }
     
     return (lotMM);
     }
int start() {
   int Order = SIGNAL_NONE;
   int Total, Ticket,Ticket2;
   double StopLossLevel, TakeProfitLevel;



   if (EachTickMode && Bars != BarCount) TickCheck = False;
   Total = OrdersTotal();
   Order = SIGNAL_NONE;

   //+------------------------------------------------------------------+
   //| Variable Begin                                                   |
   //+------------------------------------------------------------------+





   
   //+------------------------------------------------------------------+
   //| Variable End                                                     |
   //+------------------------------------------------------------------+

   //Check position
   bool IsTrade = False;

   for (int i = 0; i < Total; i ++) 
   {
      OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      if(OrderType() <= OP_SELL &&  OrderSymbol() == Symbol())
       {
         IsTrade = True;
         
         
         
            if(OrderType() == OP_BUY) 
            {
               //Close

               //+------------------------------------------------------------------+
               //| Signal Begin(Exit Buy)                                           |
               //+------------------------------------------------------------------+

               if(iCCI(NULL, 0, 50,PRICE_CLOSE, Current+1)<0) Order=SIGNAL_CLOSEBUY;

               //+------------------------------------------------------------------+
               //| 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
              
            } else {
               //Close

               //+------------------------------------------------------------------+
               //| Signal Begin(Exit Sell)                                          |
               //+------------------------------------------------------------------+

            if(iCCI(NULL, 0,50,PRICE_CLOSE, Current+1)>0) Order=SIGNAL_CLOSESELL;

               //+------------------------------------------------------------------+
               //| 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(i>0) IsTrade = True;
   //+------------------------------------------------------------------+
   //| Signal Begin(Entry)                                              |
   //+------------------------------------------------------------------+

   if ( iCCI(NULL, 0, 50,PRICE_CLOSE, Current+1)>0 && iCCI(NULL, 0, 50,PRICE_CLOSE, Current+2)<0 ) Order=SIGNAL_BUY;
   
   if (iCCI(NULL, 0, 50,PRICE_CLOSE, Current+1)<0 && iCCI(NULL, 0, 50,PRICE_CLOSE, Current+2)>0 ) Order=SIGNAL_SELL;
   

   double lotMM = MathCeil (AccountFreeMargin() *  Risk / 10000) / 100;
   
            if(UseMoneyManagement==true) Lots = LotSize();
   //+------------------------------------------------------------------+
   //| 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 (UseTakeProfit) TakeProfitLevel = Ask + TakeProfit * Point; else TakeProfitLevel = 0.0;

        Ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, TakeProfitLevel,0, 0, 0, DodgerBlue);
         Ticket2 = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, 0,0 , 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 (UseTakeProfit) TakeProfitLevel = Bid - TakeProfit * Point; else TakeProfitLevel = 0.0;

         Ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, TakeProfitLevel, 0, 0, 0, DeepPink);
         Ticket2 = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage,0,0, 0,0, 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);
}
//+------------------------------------------------------------------+