//+------------------------------------------------------------------+
//|                                           Ten Stochs Wave EA.mq4 |
//|                              Copyright © 2008, TradingSytemForex |
//|                                http://www.tradingsystemforex.com |
//+------------------------------------------------------------------+

#property copyright "Copyright © 2008, TradingSytemForex"
#property link "http://www.tradingsystemforex.com"

#define OrSt "Ten Stochs Wave EA"

extern string STO="---------------- Stochs";
extern double First_Stoch_KP=6;
extern double Stoch_HLevel=80;
extern double Stoch_MLevel=50;
extern double Stoch_LLevel=20;
extern string LM="---------------- Lot Management";
extern double Lots=0.1;
extern bool MM=false; //money management
extern double Risk=2; //risk in percentage
extern string TSTB="---------------- TP SL TS BE";
bool RealSL_Enabled=false;
int RealSL=5; //stop loss under 15 pīps
bool RealTP_Enabled=false;
int RealTP=10; //take profit under 10 pīps
extern int SL=88; //stop loss
extern int TP=94; //take profit
extern int TS=0; //trailing stop
extern int TS_Step=1; //trailing stop step
extern int BE=0; //breakeven
extern string EXT="---------------- Extras";
extern bool Reverse=false;
extern bool Add_Positions=true; //positions cumulated
extern int MaxOrders=100; //maximum number of orders
extern int Magic=0;

int Slip=3;static int TL=0;double MML=0;

// expert start function
int start(){int j=0,limit=1;double BV=0,SV=0;BV=0;SV=0;double STOM1,STOM2,STOM3,STOM4,STOM5,STOM6,STOM7,STOM8,STOM9,STOM10,STOM1b,STOM2b,STOM3b,STOM4b,STOM5b,STOM6b,STOM7b,STOM8b,STOM9b,STOM10b,STOM1c,STOM2c,STOM3c,STOM4c,STOM5c,STOM6c,STOM7c,STOM8c,STOM9c,STOM10c;
  if(CntO(OP_BUY,Magic)>0) TL=1;if(CntO(OP_SELL,Magic)>0) TL=-1;for(int i=1;i<=limit;i++){
  
  STOM1=iStochastic(NULL,0,First_Stoch_KP,3,3,MODE_SMA,0,MODE_MAIN,i);STOM1b=iStochastic(NULL,0,First_Stoch_KP,3,3,MODE_SMA,0,MODE_MAIN,i+1);STOM1c=iStochastic(NULL,0,First_Stoch_KP,3,3,MODE_SMA,0,MODE_MAIN,i+2);
  STOM2=iStochastic(NULL,0,First_Stoch_KP+1,3,3,MODE_SMA,0,MODE_MAIN,i);STOM2b=iStochastic(NULL,0,First_Stoch_KP+1,3,3,MODE_SMA,0,MODE_MAIN,i+1);STOM2c=iStochastic(NULL,0,First_Stoch_KP+1,3,3,MODE_SMA,0,MODE_MAIN,i+2);
  STOM3=iStochastic(NULL,0,First_Stoch_KP+2,3,3,MODE_SMA,0,MODE_MAIN,i);STOM3b=iStochastic(NULL,0,First_Stoch_KP+2,3,3,MODE_SMA,0,MODE_MAIN,i+1);STOM3c=iStochastic(NULL,0,First_Stoch_KP+2,3,3,MODE_SMA,0,MODE_MAIN,i+2);
  STOM4=iStochastic(NULL,0,First_Stoch_KP+3,3,3,MODE_SMA,0,MODE_MAIN,i);STOM4b=iStochastic(NULL,0,First_Stoch_KP+3,3,3,MODE_SMA,0,MODE_MAIN,i+1);STOM4c=iStochastic(NULL,0,First_Stoch_KP+3,3,3,MODE_SMA,0,MODE_MAIN,i+2);
  STOM5=iStochastic(NULL,0,First_Stoch_KP+4,3,3,MODE_SMA,0,MODE_MAIN,i);STOM5b=iStochastic(NULL,0,First_Stoch_KP+4,3,3,MODE_SMA,0,MODE_MAIN,i+1);STOM5c=iStochastic(NULL,0,First_Stoch_KP+4,3,3,MODE_SMA,0,MODE_MAIN,i+2);
  STOM6=iStochastic(NULL,0,First_Stoch_KP+5,3,3,MODE_SMA,0,MODE_MAIN,i);STOM6b=iStochastic(NULL,0,First_Stoch_KP+5,3,3,MODE_SMA,0,MODE_MAIN,i+1);STOM6c=iStochastic(NULL,0,First_Stoch_KP+5,3,3,MODE_SMA,0,MODE_MAIN,i+2);
  STOM7=iStochastic(NULL,0,First_Stoch_KP+6,3,3,MODE_SMA,0,MODE_MAIN,i);STOM7b=iStochastic(NULL,0,First_Stoch_KP+6,3,3,MODE_SMA,0,MODE_MAIN,i+1);STOM7c=iStochastic(NULL,0,First_Stoch_KP+6,3,3,MODE_SMA,0,MODE_MAIN,i+2);
  STOM8=iStochastic(NULL,0,First_Stoch_KP+7,3,3,MODE_SMA,0,MODE_MAIN,i);STOM8b=iStochastic(NULL,0,First_Stoch_KP+7,3,3,MODE_SMA,0,MODE_MAIN,i+1);STOM8c=iStochastic(NULL,0,First_Stoch_KP+7,3,3,MODE_SMA,0,MODE_MAIN,i+2);
  STOM9=iStochastic(NULL,0,First_Stoch_KP+8,3,3,MODE_SMA,0,MODE_MAIN,i);STOM9b=iStochastic(NULL,0,First_Stoch_KP+8,3,3,MODE_SMA,0,MODE_MAIN,i+1);STOM9c=iStochastic(NULL,0,First_Stoch_KP+8,3,3,MODE_SMA,0,MODE_MAIN,i+2);
  STOM10=iStochastic(NULL,0,First_Stoch_KP+9,3,3,MODE_SMA,0,MODE_MAIN,i);STOM10b=iStochastic(NULL,0,First_Stoch_KP+9,3,3,MODE_SMA,0,MODE_MAIN,i+1);STOM10c=iStochastic(NULL,0,First_Stoch_KP+9,3 ,3,MODE_SMA,0,MODE_MAIN,i+2);
  
  if((STOM1b>Stoch_HLevel && STOM1<Stoch_HLevel && STOM2b>Stoch_HLevel && STOM2<Stoch_HLevel && STOM3b>Stoch_HLevel && STOM3<Stoch_HLevel && STOM4b>Stoch_HLevel && STOM4<Stoch_HLevel && STOM5b>Stoch_HLevel && STOM5<Stoch_HLevel && STOM6b>Stoch_HLevel && STOM6<Stoch_HLevel && STOM7b>Stoch_HLevel && STOM7<Stoch_HLevel && STOM8b>Stoch_HLevel && STOM8<Stoch_HLevel && STOM9b>Stoch_HLevel && STOM9<Stoch_HLevel && STOM10b>Stoch_HLevel && STOM10<Stoch_HLevel)||
     (STOM1b>Stoch_MLevel && STOM1<Stoch_MLevel && STOM2b>Stoch_MLevel && STOM2<Stoch_MLevel && STOM3b>Stoch_MLevel && STOM3<Stoch_MLevel && STOM4b>Stoch_MLevel && STOM4<Stoch_MLevel && STOM5b>Stoch_MLevel && STOM5<Stoch_MLevel && STOM6b>Stoch_MLevel && STOM6<Stoch_MLevel && STOM7b>Stoch_MLevel && STOM7<Stoch_MLevel && STOM8b>Stoch_MLevel && STOM8<Stoch_MLevel && STOM9b>Stoch_MLevel && STOM9<Stoch_MLevel && STOM10b>Stoch_MLevel && STOM10<Stoch_MLevel)||
     (STOM1b>Stoch_LLevel && STOM1<Stoch_LLevel && STOM2b>Stoch_LLevel && STOM2<Stoch_LLevel && STOM3b>Stoch_LLevel && STOM3<Stoch_LLevel && STOM4b>Stoch_LLevel && STOM4<Stoch_LLevel && STOM5b>Stoch_LLevel && STOM5<Stoch_LLevel && STOM6b>Stoch_LLevel && STOM6<Stoch_LLevel && STOM7b>Stoch_LLevel && STOM7<Stoch_LLevel && STOM8b>Stoch_LLevel && STOM8<Stoch_LLevel && STOM9b>Stoch_LLevel && STOM9<Stoch_LLevel && STOM10b>Stoch_LLevel && STOM10<Stoch_LLevel)||
     (STOM1c>Stoch_HLevel && STOM1<Stoch_HLevel && STOM2c>Stoch_HLevel && STOM2<Stoch_HLevel && STOM3c>Stoch_HLevel && STOM3<Stoch_HLevel && STOM4c>Stoch_HLevel && STOM4<Stoch_HLevel && STOM5c>Stoch_HLevel && STOM5<Stoch_HLevel && STOM6c>Stoch_HLevel && STOM6<Stoch_HLevel && STOM7c>Stoch_HLevel && STOM7<Stoch_HLevel && STOM8c>Stoch_HLevel && STOM8<Stoch_HLevel && STOM9c>Stoch_HLevel && STOM9<Stoch_HLevel && STOM10c>Stoch_HLevel && STOM10<Stoch_HLevel)||
     (STOM1c>Stoch_MLevel && STOM1<Stoch_MLevel && STOM2c>Stoch_MLevel && STOM2<Stoch_MLevel && STOM3c>Stoch_MLevel && STOM3<Stoch_MLevel && STOM4c>Stoch_MLevel && STOM4<Stoch_MLevel && STOM5c>Stoch_MLevel && STOM5<Stoch_MLevel && STOM6c>Stoch_MLevel && STOM6<Stoch_MLevel && STOM7c>Stoch_MLevel && STOM7<Stoch_MLevel && STOM8c>Stoch_MLevel && STOM8<Stoch_MLevel && STOM9c>Stoch_MLevel && STOM9<Stoch_MLevel && STOM10c>Stoch_MLevel && STOM10<Stoch_MLevel)||
     (STOM1c>Stoch_LLevel && STOM1<Stoch_LLevel && STOM2c>Stoch_LLevel && STOM2<Stoch_LLevel && STOM3c>Stoch_LLevel && STOM3<Stoch_LLevel && STOM4c>Stoch_LLevel && STOM4<Stoch_LLevel && STOM5c>Stoch_LLevel && STOM5<Stoch_LLevel && STOM6c>Stoch_LLevel && STOM6<Stoch_LLevel && STOM7c>Stoch_LLevel && STOM7<Stoch_LLevel && STOM8c>Stoch_LLevel && STOM8<Stoch_LLevel && STOM9c>Stoch_LLevel && STOM9<Stoch_LLevel && STOM10c>Stoch_LLevel && STOM10<Stoch_LLevel))
     {if(Reverse) BV=1; else SV=1; break;}
  if((STOM1b<Stoch_HLevel && STOM1>Stoch_HLevel && STOM2b<Stoch_HLevel && STOM2>Stoch_HLevel && STOM3b<Stoch_HLevel && STOM3>Stoch_HLevel && STOM4b<Stoch_HLevel && STOM4>Stoch_HLevel && STOM5b<Stoch_HLevel && STOM5>Stoch_HLevel && STOM6b<Stoch_HLevel && STOM6>Stoch_HLevel && STOM7b<Stoch_HLevel && STOM7>Stoch_HLevel && STOM8b<Stoch_HLevel && STOM8>Stoch_HLevel && STOM9b<Stoch_HLevel && STOM9>Stoch_HLevel && STOM10b<Stoch_HLevel && STOM10>Stoch_HLevel)||
     (STOM1b<Stoch_MLevel && STOM1>Stoch_MLevel && STOM2b<Stoch_MLevel && STOM2>Stoch_MLevel && STOM3b<Stoch_MLevel && STOM3>Stoch_MLevel && STOM4b<Stoch_MLevel && STOM4>Stoch_MLevel && STOM5b<Stoch_MLevel && STOM5>Stoch_MLevel && STOM6b<Stoch_MLevel && STOM6>Stoch_MLevel && STOM7b<Stoch_MLevel && STOM7>Stoch_MLevel && STOM8b<Stoch_MLevel && STOM8>Stoch_MLevel && STOM9b<Stoch_MLevel && STOM9>Stoch_MLevel && STOM10b<Stoch_MLevel && STOM10>Stoch_MLevel)||
     (STOM1b<Stoch_LLevel && STOM1>Stoch_LLevel && STOM2b<Stoch_LLevel && STOM2>Stoch_LLevel && STOM3b<Stoch_LLevel && STOM3>Stoch_LLevel && STOM4b<Stoch_LLevel && STOM4>Stoch_LLevel && STOM5b<Stoch_LLevel && STOM5>Stoch_LLevel && STOM6b<Stoch_LLevel && STOM6>Stoch_LLevel && STOM7b<Stoch_LLevel && STOM7>Stoch_LLevel && STOM8b<Stoch_LLevel && STOM8>Stoch_LLevel && STOM9b<Stoch_LLevel && STOM9>Stoch_LLevel && STOM10b<Stoch_LLevel && STOM10>Stoch_LLevel)||
     (STOM1c<Stoch_HLevel && STOM1>Stoch_HLevel && STOM2c<Stoch_HLevel && STOM2>Stoch_HLevel && STOM3c<Stoch_HLevel && STOM3>Stoch_HLevel && STOM4c<Stoch_HLevel && STOM4>Stoch_HLevel && STOM5c<Stoch_HLevel && STOM5>Stoch_HLevel && STOM6c<Stoch_HLevel && STOM6>Stoch_HLevel && STOM7c<Stoch_HLevel && STOM7>Stoch_HLevel && STOM8c<Stoch_HLevel && STOM8>Stoch_HLevel && STOM9c<Stoch_HLevel && STOM9>Stoch_HLevel && STOM10c<Stoch_HLevel && STOM10>Stoch_HLevel)||
     (STOM1c<Stoch_MLevel && STOM1>Stoch_MLevel && STOM2c<Stoch_MLevel && STOM2>Stoch_MLevel && STOM3c<Stoch_MLevel && STOM3>Stoch_MLevel && STOM4c<Stoch_MLevel && STOM4>Stoch_MLevel && STOM5c<Stoch_MLevel && STOM5>Stoch_MLevel && STOM6c<Stoch_MLevel && STOM6>Stoch_MLevel && STOM7c<Stoch_MLevel && STOM7>Stoch_MLevel && STOM8c<Stoch_MLevel && STOM8>Stoch_MLevel && STOM9c<Stoch_MLevel && STOM9>Stoch_MLevel && STOM10c<Stoch_MLevel && STOM10>Stoch_MLevel)||
     (STOM1c<Stoch_LLevel && STOM1>Stoch_LLevel && STOM2c<Stoch_LLevel && STOM2>Stoch_LLevel && STOM3c<Stoch_LLevel && STOM3>Stoch_LLevel && STOM4c<Stoch_LLevel && STOM4>Stoch_LLevel && STOM5c<Stoch_LLevel && STOM5>Stoch_LLevel && STOM6c<Stoch_LLevel && STOM6>Stoch_LLevel && STOM7c<Stoch_LLevel && STOM7>Stoch_LLevel && STOM8c<Stoch_LLevel && STOM8>Stoch_LLevel && STOM9c<Stoch_LLevel && STOM9>Stoch_LLevel && STOM10c<Stoch_LLevel && STOM10>Stoch_LLevel))
     {if(Reverse) SV=1; else BV=1; break;}}

// expert money management
if(MM){if(Risk<0.1 || Risk>100) {Comment("Invalid Risk Value."); return(0);}
   else {MML=MathFloor((AccountFreeMargin() *AccountLeverage()*Risk*Point*100)/(Ask*MarketInfo(Symbol(),MODE_LOTSIZE)*MarketInfo(Symbol(),MODE_MINLOT )))*MarketInfo(Symbol(),MODE_MINLOT );}}
if(MM==false){MML=Lots;}

// expert init positions
int cnt=0,OP=0,OS=0,OB=0,CS=0,CB=0;OP=0;for(cnt=0; cnt<OrdersTotal();cnt++) {OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if((OrderType()==OP_SELL || OrderType()==OP_BUY) && OrderSymbol()==Symbol() && ((OrderMagicNumber()==Magic) || Magic==0)) OP=OP+1;}
if(OP>=1){OS=0; OB=0;}OB=0;OS=0;CB=0;CS=0;

// expert conditions to open position
if(SV>0){OS=1;OB=0;}if(BV>0){OB=1;OS=0;}

// expert conditions to close position
if((SV>0) || (RealSL_Enabled && (OrderOpenPrice()-Bid)/Point>=RealSL)||(RealTP_Enabled && (Ask-OrderOpenPrice())/Point>=RealTP)){CB=1;}
if((BV>0) || (RealSL_Enabled && (Ask-OrderOpenPrice())/Point>=RealSL)||(RealTP_Enabled && (OrderOpenPrice()-Bid)/Point>=RealTP)){CS=1;}
for(cnt=0;cnt<OrdersTotal();cnt++){OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
	if(OrderType()==OP_BUY && OrderSymbol()==Symbol() && ((OrderMagicNumber()==Magic) || Magic==0)){if (CB==1){OrderClose(OrderTicket(),OrderLots(),Bid,Slip,Red); return(0);}}
	if(OrderType()==OP_SELL && OrderSymbol()==Symbol() && ((OrderMagicNumber()==Magic) || Magic==0)){
	if(CS==1){OrderClose(OrderTicket(),OrderLots(),Ask,Slip,Red);return(0);}}}double SLI=0,TPI=0;int TK=0;

// expert open position value
if((AddP() && Add_Positions && OP<=MaxOrders) || (OP==0 && !Add_Positions)) {
	if(OS==1){if (TP==0) TPI=0; else TPI=Bid-TP*Point;if (SL==0) SLI=0; else SLI=Bid+SL*Point;TK=OrderSend(Symbol(),OP_SELL,MML,Bid,Slip,SLI,TPI,OrSt,Magic,0,Red);OS=0;return(0);}	
	if(OB==1){if(TP==0) TPI=0; else TPI=Ask+TP*Point;if(SL==0) SLI=0; else SLI=Ask-SL*Point;TK=OrderSend(Symbol(),OP_BUY,MML,Ask,Slip,SLI,TPI,OrSt,Magic,0,Lime);OB=0; return(0);}}
for(j=0;j<OrdersTotal();j++){if(OrderSelect(j,SELECT_BY_POS, MODE_TRADES)){if (OrderSymbol()==Symbol() && ((OrderMagicNumber()==Magic) || Magic==0)) {TrP();}}}return(0);}

// expert number of orders
int CntO(int Type,int Magic){int _CntO;_CntO=0;
for(int j=0;j<OrdersTotal();j++){OrderSelect(j, SELECT_BY_POS, MODE_TRADES);if(OrderSymbol()==Symbol()) {if((OrderType()==Type && (OrderMagicNumber()==Magic) || Magic==0)) _CntO++;}}return(_CntO);}

// expert trailing stop
void TrP(){double pb,pa,pp;pp=MarketInfo(OrderSymbol(),MODE_POINT);if (OrderType()==OP_BUY){pb=MarketInfo(OrderSymbol(),MODE_BID);

//expert breakeven
    if(BE>0){if((pb-OrderOpenPrice())>BE*pp){if((OrderStopLoss()-OrderOpenPrice())<0){ModSL(OrderOpenPrice()+0*pp);}}}
    if(TS>0){if((pb-OrderOpenPrice())>TS*pp){if(OrderStopLoss()<pb-(TS+TS_Step-1)*pp){ModSL(pb-TS*pp);return;}}}}
  if(OrderType()==OP_SELL){pa=MarketInfo(OrderSymbol(),MODE_ASK);if(BE>0){if((OrderOpenPrice()-pa)>BE*pp){if((OrderOpenPrice()-OrderStopLoss())<0){ModSL(OrderOpenPrice()-0*pp);}}}
  if (TS>0){if (OrderOpenPrice()-pa>TS*pp){if (OrderStopLoss()>pa+(TS+TS_Step-1)*pp || OrderStopLoss()==0){ModSL(pa+TS*pp);return;}}}}}

//expert stoploss
void ModSL(double ldSL){bool fm;fm=OrderModify(OrderTicket(),OrderOpenPrice(),ldSL,OrderTakeProfit(),0,CLR_NONE);}

//expert add positions function
bool AddP(){int _num=0; int _ot=0;
for (int j=0;j<OrdersTotal();j++){if(OrderSelect(j,SELECT_BY_POS)==true && OrderSymbol()==Symbol() && OrderType()<3 && ((OrderMagicNumber()==Magic) || Magic==0)) {	
	 _num++;if(OrderOpenTime()>_ot) _ot=OrderOpenTime();}}
if(_num==0) return(true);if(_num>0 && ((Time[0]-_ot))>0) return(true);else return(false);}