
//+------------------------------------------------------------------+
//|                                                Supertrend EA.mq4 |
//|                                           Copyright ? 2010, Vlan |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Copyright ? 2010, Vlan"
#property link      "http://www.mt4-expert-advisors.com"

#define TREND_UP 1
#define TREND_DOWN 2
#define TREND_CHOP 3

extern int StochK = 5;
extern int StochD = 3;
extern int StochS = 3;
extern int Overbought = 80;
extern int Oversold = 20;
extern int TakeProfit = 50;
extern int StopLoss = 0; 
extern double Lots = 0.01;
extern double TrailingStop = 0;
extern int maxTrades = 5;
extern bool onlyFirstCross = false;

static int prevTrend = TREND_CHOP;
static int pocetObchodovVTrende = 0;
static int MagicNumber = 100679;
static bool NewBar = false;
static bool ThisBarTraded = false;

int    Spread;  

//Normalized variables
double _Spread;
double _TakeProfit;
double _StopLoss;
double _MaxSlippage;
double _MinDistance;
double _TrailingStop;

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
{
  Spread = MarketInfo(Symbol(), MODE_SPREAD);
  
  _Spread = Spread * Point;
  _TakeProfit = TakeProfit * Point;
  _StopLoss = StopLoss * Point;
  _MaxSlippage = 30 * Point;
  _TrailingStop = TrailingStop * Point;

   return(0);
}

//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
  
//+------------------------------------------------------------------+
//| NewBarCheck                                                      |
//+------------------------------------------------------------------+
void NewBarCheck()
{
  static datetime lastbar = 0;
  datetime curbar = Time[0];
   
  if(lastbar!=curbar)
  {
    lastbar=curbar;
    NewBar = true;
  }
  else
    NewBar = false;
}

//+------------------------------------------------------------------+
//| BuyMarket                                                        |
//+------------------------------------------------------------------+
void BuyMarket(double tp, string cmnt)
{
  int Ticket;
  double SL, TP;
  if(_StopLoss > 0)
    SL = Ask - _StopLoss;
  if(tp > 0)
    TP = Ask + tp;

    Ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, _MaxSlippage, SL, TP, cmnt, MagicNumber, 0, Green);         
    if(Ticket>0)           
    {
      //if(OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES))                
      //  Print("BUY order opened : ", OrderOpenPrice());
    }         
    else 
      Print("Error opening BUY order : ",GetLastError());
}

//+------------------------------------------------------------------+
//| SellMarket                                                       |
//+------------------------------------------------------------------+
void SellMarket(double tp, string cmnt)
{
  int Ticket;
  double SL, TP;
  
  if(_StopLoss > 0)
    SL = Bid + _StopLoss;
  if(tp > 0)
    TP = Bid - tp;
    
    
    Ticket=OrderSend(Symbol(), OP_SELL, Lots, Bid, _MaxSlippage, SL, TP, cmnt, MagicNumber, 0, Red);
    if(Ticket>0)
    {
      //if(OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES))
      //  Print("SELL order opened : ",OrderOpenPrice());
    }
    else
      Print("Error opening SELL order : ",GetLastError());
}

//+------------------------------------------------------------------+
//| CloseTrades                                                       |
//+------------------------------------------------------------------+
void CloseTrades()
{  
  while(OrdersTotal() > 0)
  {
    if(OrderSelect(0, SELECT_BY_POS, MODE_TRADES))
    {
      if(OrderType() == OP_BUY && OrderMagicNumber() == MagicNumber)
        OrderClose(OrderTicket(), OrderLots(), Bid, _MaxSlippage, Violet);
      else
      if(OrderType() == OP_SELL && OrderMagicNumber() == MagicNumber)
        OrderClose(OrderTicket(), OrderLots(), Ask, _MaxSlippage, Violet);   
    }
  }
}


//+------------------------------------------------------------------+
//| NewBarAction                                                     |
//+------------------------------------------------------------------+
void NewBarAction()
{
  ThisBarTraded = false;
  //CloseTrades();
}

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
{
  int total;
  
  NewBarCheck();
  if(NewBar)
    NewBarAction();
    
  total = OrdersTotal();   
  if(total >= maxTrades)
    return(0);
    
  if(NewBar && !ThisBarTraded)
  {
    double stUp = iCustom(Symbol(), 0, "Supertrend", false, 0, 1);
    double stDn = iCustom(Symbol(), 0, "Supertrend", false, 1, 1);
    int trend = TREND_CHOP;
    if(stUp != EMPTY_VALUE && stDn == EMPTY_VALUE)
      trend = TREND_UP;
    if(stUp == EMPTY_VALUE && stDn != EMPTY_VALUE)
      trend = TREND_DOWN;
    
    if(trend != prevTrend && trend != TREND_CHOP)
      CloseTrades(); //pocetObchodovVTrende = 0;
  
    if(onlyFirstCross)
      if(pocetObchodovVTrende == 1)
        return(0);
        
    double stochMain1 = iStochastic(Symbol(), 0, StochK, StochD, StochS, MODE_SMA, 0, MODE_MAIN, 1);
    double stochSignal1 = iStochastic(Symbol(), 0, StochK, StochD, StochS, MODE_SMA, 0, MODE_SIGNAL, 1);
  
    if(trend == TREND_UP)
    {
      //if(stochMain1 < Overbought &&
      //   stochMain1 > stochSignal1)
      {
        BuyMarket(_TakeProfit, " ");
        pocetObchodovVTrende++;
      }
    }
    else
    if(trend == TREND_DOWN)
    {
      //if(stochMain1 > Oversold &&
      //   stochMain1 < stochSignal1)
      {
        SellMarket(_TakeProfit, " ");
        pocetObchodovVTrende++;
      }
    }
    
    prevTrend = trend;
  }
  
  return(0);
}
//+------------------------------------------------------------------+