#property copyright "CCH" 

#define NONE       0
#define LONG       1
#define SHORT      2
#define LONG_EXIT  3
#define SHORT_EXIT 4


  
extern int    MagicNumber    = 0;
extern bool   SignalMail     = False;
extern bool   EachTickMode   = False; //Set to False if testing Open Bar//


extern string a="-------------Variables----------------";  
extern int CCIPER            = 50;
extern int ATRPER            = 5; 
 
extern string f="-----------Money Management-----------";
extern double Lots           = 1.0;
extern int    Slippage       = 10;
extern bool   UseSL          = False;
extern int    SL             = 100;
extern bool   UseTP          = False;
extern int    TP             = 200;
extern bool   UseTS          = False;
extern int    TS             = 100;
 
int BarCount;
int Current;
bool TickCheck = False;


 
int init() {
   BarCount = Bars;

   if (EachTickMode) Current = 0; else Current = 1;

   return(0);
}
 
int deinit() {
   return(0);
}
 
int start() {
   int Order = NONE;
   int Total, Ticket;
 double StopLossLevel, TakeProfitLevel;

 
   if (EachTickMode && Bars != BarCount) TickCheck = False;
   Total = OrdersTotal();
   Order = NONE;




double MAIN    = iCustom(NULL, 0, "TrendMagic", CCIPER, ATRPER,  0, Current + 0);
double TREND   = iCustom(NULL, 0, "TrendMagic", CCIPER, ATRPER,  1, Current + 0);
 
double Long    = (TREND > MAIN);
double Short   = (TREND < MAIN);
 
           


       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) {
            

       if   (Short && Short) Order = LONG_EXIT;      

            

       if (Order == LONG_EXIT && ((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;
}
             
       if(UseTS && TS > 0) {                 
       if(Bid - OrderOpenPrice() > Point * TS) {
       if(OrderStopLoss() < Bid - Point * TS) {
          OrderModify(OrderTicket(), OrderOpenPrice(), Bid - Point * TS, OrderTakeProfit(), 0, MediumSeaGreen);
       if (!EachTickMode) BarCount = Bars;
              continue;
}
}
}
} 
         else 
{
            

      if (Long && Long) Order = SHORT_EXIT;      

            

      if (Order == SHORT_EXIT && ((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;
}
             
      if (UseTS && TS > 0) {                 
      if((OrderOpenPrice() - Ask) > (Point * TS)) {
      if((OrderStopLoss() > (Ask + Point * TS)) || (OrderStopLoss() == 0)) {
          OrderModify(OrderTicket(), OrderOpenPrice(), Ask + Point * TS, OrderTakeProfit(), 0, DarkOrange);
      if (!EachTickMode) BarCount = Bars;
                     continue;
}
}
}
}
}
}
      
      if (Long && Long)   Order = LONG;  
      if (Short && Short) Order = SHORT; 

   
    
      if (Order == LONG && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
      if(!IsTrade) {
          
      if (AccountFreeMargin() < (1000 * Lots)) {
            Print("We have no money. Free Margin = ", AccountFreeMargin());
            return(0);
}

      if (UseSL) StopLossLevel = Ask - SL * Point; else StopLossLevel = 0.0;
      if (UseTP) TakeProfitLevel = Ask + TP * 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 == SHORT && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
      if(!IsTrade) {
          
      if (AccountFreeMargin() < (1000 * Lots)) {
            Print("We have no money. Free Margin = ", AccountFreeMargin());
            return(0);
}

      if (UseSL) StopLossLevel = Bid + SL * Point; else StopLossLevel = 0.0;
      if (UseTP) TakeProfitLevel = Bid - TP * 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);
}