//+------------------------------------------------------------------+
//|                                                     EmaCross.mq4 |
//|                                         Copyright © 2007, ledzep |
//|                                          http://www.x-trader.net |
//+------------------------------------------------------------------+

/********************************************************************/

//
/********************************************************************/

#define  MAGICMA        20050610
#define  UPPERBAND      0
#define  MIDDLEBAND     1
#define  LOWERBAND      2
#define  BULL           1
#define  BEAR           0
#define  BUY            1
#define  SELL           0
#define  UP             1
#define  DOWN           2
#define  NOTREND        0



extern double  Lots               = 0.1;
extern int     SlowEmaPeriod      = 20;
extern int     FastEmaPeriod      = 5;
extern int     MediumEmaPeriod    = 15;
extern double  TakeProfit         = 0;
extern double  StopLoss           = 50;
extern int     Slippage           = 1;



double         EmaFst;
double         EmaMed;
double         EmaSlw;

double         StoMain;
double         StoSignal;


int            ticket;
int            lstOrder=1;
int            Trend;
bool           Cross=false;
bool           NewBar;
bool           BuySignal;
bool           SellSignal;

//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void CheckForOpen()
  {
   
   
   //TimeFiter
   /*
   if( TimeFilter )
      {
      if((( FromHourTrade <= ToHourTrade ) && ( Hour() < FromHourTrade || Hour() > ToHourTrade ))
         ||
         (( FromHourTrade >  ToHourTrade ) && ( Hour() < FromHourTrade && Hour() > ToHourTrade )))
         {return(0);}
       }
 
   */
   if(SellSignal && OrdersTotal()==0 && lstOrder==BUY )
      {
      if(StopLoss!=0 && TakeProfit!=0) ticket=OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, Bid + StopLoss*Point, Bid-TakeProfit*Point, "SELL", MAGICMA, 0, Red);    
      if(StopLoss==0 && TakeProfit!=0) ticket=OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, Bid-TakeProfit*Point, "SELL", MAGICMA, 0, Red);
      if(StopLoss!=0 && TakeProfit==0) ticket=OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, Bid + StopLoss*Point, 0, "SELL", MAGICMA, 0, Red);        
      if(StopLoss==0 && TakeProfit==0) ticket=OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "SELL", MAGICMA, 0, Red);          
      NewBar=false;
      lstOrder=SELL;
      SellSignal=false;
      }
      
    if(BuySignal  && OrdersTotal()==0 && lstOrder==SELL)
      {
      if(StopLoss!=0 && TakeProfit!=0) ticket=OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, Ask - StopLoss*Point, Ask + TakeProfit*Point,"BUY",MAGICMA,0,Blue);  
      if(StopLoss==0 && TakeProfit!=0) ticket=OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, Ask + TakeProfit*Point, "BUY", MAGICMA, 0, Blue);  
      if(StopLoss!=0 && TakeProfit==0) ticket=OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, Ask - StopLoss*Point, 0, "BUY", MAGICMA, 0, Blue);       
      if(StopLoss==0 && TakeProfit==0) ticket=OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "BUY", MAGICMA, 0, Blue);     
      NewBar=false;
      lstOrder=BUY;
      BuySignal=false;
      }   
      
   
   return;
  }

//+------------------------------------------------------------------+
//| Check for close order conditions                                 |
//+------------------------------------------------------------------+
void CheckForClose()
   {
   if(lstOrder==BUY && EmaFst<EmaMed)
      {
      OrderSelect(ticket,SELECT_BY_TICKET);
      OrderClose(OrderTicket(),OrderLots(),Bid,3,Red);
      BuySignal=false;
      SellSignal=false;
      }
    if(lstOrder==SELL && EmaFst>EmaMed)
      {
      OrderSelect(ticket,SELECT_BY_TICKET);
      OrderClose(OrderTicket(),OrderLots(),Bid,3,Red);
      BuySignal=false;
      SellSignal=false;
      }
      
   
   }

//+------------------------------------------------------------------+
//| Start function                                                   |
//+------------------------------------------------------------------+
void start()
   {
 
   //check for history and trading
   if(Bars<100 || IsTradeAllowed()==false) return;
 
   
   EmaFst=iMA(NULL,0,FastEmaPeriod,1,MODE_EMA,PRICE_CLOSE,0);
   EmaMed=iMA(NULL,0,MediumEmaPeriod,1,MODE_EMA,PRICE_CLOSE,0);
   EmaSlw=iMA(NULL,0,SlowEmaPeriod,1,MODE_EMA,PRICE_CLOSE,0);
   StoMain=iStochastic(NULL,PERIOD_D1,13,5,5,MODE_SMA,0,MODE_MAIN,0);
   StoSignal=iStochastic(NULL,PERIOD_D1,13,5,5,MODE_SMA,0,MODE_SIGNAL,0);
   
  
   if(Volume[0]==1)
      {
      NewBar=true;
      if(EmaFst>EmaMed && EmaMed>EmaSlw)BuySignal=true;
      if(EmaFst<EmaMed && EmaMed<EmaSlw)SellSignal=true;
   
      }
      
      
         
   if(OrdersTotal()==0)
      {
      CheckForOpen();      
      }
   else 
      {
      CheckForClose();
      
      }


   }

//+------------------------------------------------------------------+
//| General functions                                                |
//+------------------------------------------------------------------+

void CloseAllOrders()  
   {
   while (OrdersTotal()>0)
      {
      OrderSelect(OrdersTotal()-1,SELECT_BY_POS);
      if (OrderType()==OP_BUY) OrderClose(OrderTicket(),OrderLots(),Bid,3,Red);
      if (OrderType()==OP_SELL) OrderClose(OrderTicket(),OrderLots(),Ask,3,Red);
      }
   }
   
//Regresa el tipo de la ultima orden abierta
int iOrderType()
   {   
   for(int order=OrdersTotal();order>=0;order--)
      {
      OrderSelect(order,SELECT_BY_POS,MODE_TRADES);
      if(OrderType()==OP_BUY)return(OP_BUY);
      if(OrderType()==OP_SELL)return(OP_SELL);
      }
   return(0);
   }
   
   