//+------------------------------------------------------------------+
//|                                          1M Stochastic Cross.mq4 |
//|                      Copyright © 2009, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

extern double LotSize = 2.0; 
extern double StopLossPips = 10;
extern double TakeProfitPips = 10;
extern int Max_Trade = 5;
extern int mag_Buy = 0, mag_Sell = 0;

extern int buy_P_level = 80;
extern int buy_S_level = 20;
extern int sell_P_level = 20;
extern int sell_S_level = 80;

double sl, tp;
double kline[3], dline[3];
bool crossedup, crosseddown;
int longtkt, shorttkt, cnt, t, Total, cnt2, TBS_cnt;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
      crossedup = false;
      crosseddown = false;
      t = 0;
      longtkt = -1;
      shorttkt = -1;
      cnt = 0;
      if((Point == 0.001) || (Point == 0.00001))
      {
         sl = 10*StopLossPips;
         tp = 10*TakeProfitPips;
      }
      else
      {
         sl = StopLossPips;
         tp = TakeProfitPips;
      }
      if(mag_Buy == 0){ mag_Buy = 55558; }
      if(mag_Sell == 0){ mag_Buy = 55559; }
      
  return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
   if(PositionOpen()) return(0);
   crossedup = false;
   crosseddown = false;

   for(int i = 0;i < 3;i++)
   {
      kline[i] = iStochastic(NULL, Period(), 8, 3, 3, MODE_SMA, 0, MODE_MAIN, i);
      dline[i] = iStochastic(NULL, Period(), 8, 3, 3, MODE_SMA, 0, MODE_SIGNAL, i); 
   }
   if ((kline[1] < dline[1]) && (kline[2] > dline[2])) crosseddown = true;
   else if ((kline[1] > dline[1]) && (kline[2] < dline[2])) crossedup = true;
   else return(0);
   if (crossedup && (kline[1] < 20.0)) GoLong();
   if (crosseddown && (kline[1] > 80.0)) GoShort();
//+------------------------------------------------------------------+
   Total=OrdersTotal(); cnt2=0; TBS_cnt=0; //-- Check for Open Orders
   for(cnt2=0; cnt<=Total; cnt++)
   {
      if(OrderSelect(cnt2,SELECT_BY_POS,MODE_TRADES)==true)
      {
         if(OrderType()==OP_BUY||OrderType()==OP_SELL){ TBS_cnt+=1; }
      }
   }
   Total=OrdersTotal(); cnt2=0; //-- Auto Close Orders
   for(cnt2=Total-1; cnt2>=0; cnt2--)
   {
      if(OrderSelect(cnt2,SELECT_BY_POS,MODE_TRADES)==true)
      {
         if(OrderType()==OP_BUY){
         if(dline[1] > buy_P_level || kline[1] > buy_S_level){
         OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3,Magenta); } }
         if(OrderType()==OP_SELL){
         if(dline[1] < sell_P_level || kline[1] > sell_S_level){
         OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3,Magenta); } }
      }
   }
    
   return(0);
  }
//+------------------------------------------------------------------+
int GoLong()
{
   if(TBS_cnt<Max_Trade){
   longtkt = -1;
   cnt = 0;
   while((longtkt < 0) && (cnt < 20))
   {
      longtkt = OrderSend(Symbol(), OP_BUY, LotSize, Ask, 2, Ask-sl*Point,Ask+tp*Point, NULL, mag_Buy, 0, Green);
      cnt++;
   } }
   return(longtkt);
}

int GoShort()
{
   if(TBS_cnt<Max_Trade){
   shorttkt = -1;
   cnt = 0;
   while((shorttkt < 0) && (cnt < 20))
   {
      shorttkt = OrderSend(Symbol(), OP_SELL, LotSize, Bid, 2, Bid+sl*Point, Bid-tp*Point, NULL, mag_Sell, 0, Blue);
      cnt++;
   } }
   return(shorttkt);
}



bool PositionOpen()
{
   t = OrdersTotal();
   for(int z = 0;z < t;z++)
   {
      OrderSelect(z, SELECT_BY_POS, MODE_TRADES);
      if(OrderSymbol() == Symbol()) return(true);
   }
   return(false);
}