//******************************************************************
//*  MA_Close.mq4 Version 1.2b                                     *
//*                                                                *
//*  Expert Advisor. Automatically closes all trades of the pair,  *
//*  once the price breaks through the moving average.             *
//*                                                                *
//*  Written By: Totoro                                            *
//******************************************************************

#include <stderror.mqh>
#include <stdlib.mqh>

extern int    MagicNumber     = 0; // EA Operation timeframe (in minutes)
extern int    TimeFrame     = 1; // EA Operation timeframe (in minutes)
extern string TimeFrameInfo = "1=M1,5=M5,15=M15,30=M30,60=H1,240=H4,1440=D1,10080=W1,43200=MN,0=variable";
extern int    MAType        = 1;
extern string MATypeInfo    = "0=SMA,1=EMA,2=SMMA,3=LWMA";
extern int    MAPeriod      = 34;
extern int    MAPrice       = 0;
extern string MAPriceInfo   = "0=Close,1=Open,2=High,3=Low,4=Median,5=Typical,6=Weighted";
extern double Tolerance     = 0.0000;
extern string ToleranceInfo = "How far the price is tolerated to break the MA";
extern bool   BarCheck      = true;
extern string BarCheckInfo  = "true=checking previous bar close, false=checking latest price";
extern int    Slippage      = 3;
extern string SlippageInfo  = "Maximum deviation from the market price when closing the order (in points)";
extern bool   AlertMessage  = true; // shows alert message before closing a trade

double lastClose = -1;

int start()
{
   if(BarCheck) { if(iClose(NULL,TimeFrame,1) != lastClose) check(); }
   else         { if(Close[0] != lastClose) check(); }
}

void check()
{
   if(BarCheck) lastClose = iClose(NULL,TimeFrame,1);
   else         lastClose = Close[0];

   double lastMA = iMA(NULL,TimeFrame,MAPeriod,0,MAType,MAPrice,1);

   int OrderAnzahl = OrdersTotal();
   for(int pos=0; pos<OrderAnzahl; pos++)
   {
      if(OrderSelect(0,SELECT_BY_POS)==false) continue;
      if(OrderSymbol() != Symbol()) continue; 
      if( OrderMagicNumber()==MagicNumber) continue;  
     
      if(OrderType() == OP_BUY && lastClose < lastMA-Tolerance)
      {
         if(AlertMessage) Alert("Closing Buy Order #" + OrderTicket());
         if(!OrderClose(OrderTicket(), OrderLots(), Bid, Slippage))
            Alert("Unable to close Order #" + OrderTicket() + ": " + ErrorDescription(GetLastError()));
         else pos--;
      }
      if(OrderType() == OP_SELL && lastClose > lastMA+Tolerance)
      {
         if(AlertMessage) Alert("Closing Sell Order #" + OrderTicket());
         if(!OrderClose(OrderTicket(), OrderLots(), Ask, Slippage))
            Alert("Unable to close Order #" + OrderTicket() + ": " + ErrorDescription(GetLastError()));
         else pos--;
      }
   }
}