//+------------------------------------------------------------------+
//|                                           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=4;
extern double Stoch_PERIOD=2;
extern double Stoch_Slowing=2;
extern double Hig_l=80;
extern double Lo_l =20;

extern string           RSI_Settings         = "---------- RSI Filter Settings";  
extern bool             UseRSIforOpen        =true;                  
extern int              RSIPeriod            = 14,   
                        RSIPrice             = 1;
extern int              RSIBuySig            = 55,
                        RSISellSig           = 45;

extern string STL="---------------- Level";
extern bool   UseHighLevelforClose=true;
//extern bool   UseDownLevelforClose=true;
//extern double DownLevel_close_buy=79;   // < High_l
extern double HighLevel_close_buy=98;   // max
//extern double DownLevel_close_sell=21;  // > Low_l
extern double HighLevel_close_sell=3;   // mini

extern string SFC="---------------- Stoch for close";
extern bool    UseSFCwithClose=true;                       
extern int     KPeriodclose=8;
extern int     DPeriodclose=3;
extern int     Slowingclose=3;
extern int     MAStoch=0;                                   //0-simple;1-exponential;2-smoothed;3-linear weight
extern int     PriceStoch=0;                                 //1-close/close ; 0-low/High
extern bool    UseDistance=false;
extern double  Distance=5;
extern string  timeframe="5-5min,15-15min,30-30min,60-1h,240-4h,";
extern double  Timeframe=5;                                // 5-5min,15-15min,30-30min,60-1h,240-4h,
extern bool    closestochonthesametimeframe=true;                                                            //  

extern string LM="---------------- Lot Management";
extern double  Lots=0.1;
extern bool    MM=false; //money management
extern double  Risk=10; //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=0; //stop loss
extern int     TP=0; //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;
bool           Add_Positions=false; //positions cumulated
int            MaxOrders=100; //maximum number of orders
extern int     Magic=0;
extern string Safety="Equity  Baskett";
extern bool             UseMargincut = true;
extern double           Margincutoff = 50;       // Expert will stop trading if equity level decreases to that level. 
extern bool             Usetarget    = true;
extern bool             Usebasket    = true;
extern double           TargetEquity         =1000000;   //value of win 
extern double           BasketLoss           =10000;     //value of loses

extern int MaxTradePerBar=1;
datetime Time0;int TradePerBar=0;int BarCount=-1;
int init(){Time0=Time[0];return(0);}
int deinit(){return(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;
double STOM1,STOM2,STOM3,STOM4,STOM5,STOM6,STOM7,STOM8,STOM9,STOM10,czas,High_l,Low_l;
int x;       
  if(CntO(OP_BUY,Magic)>0) TL=1;if(CntO(OP_SELL,Magic)>0) TL=-1;for(int i=1;i<=limit;i++){
  
  //string stopbuy="false",stopsell="false";
  //stopcrossbuy="false",stopcrosssell="false",stopdownbuy="false",stopdownsell="false",stophighbuy="false",stophighsell="false";
  
  STOM1=iStochastic(NULL,0,First_Stoch_KP,Stoch_PERIOD,Stoch_Slowing,MODE_SMA,0,MODE_MAIN,i);
  STOM2=iStochastic(NULL,0,First_Stoch_KP+1,Stoch_PERIOD,Stoch_Slowing,MODE_SMA,0,MODE_MAIN,i);
  STOM3=iStochastic(NULL,0,First_Stoch_KP+2,Stoch_PERIOD,Stoch_Slowing,MODE_SMA,0,MODE_MAIN,i);
  STOM4=iStochastic(NULL,0,First_Stoch_KP+3,Stoch_PERIOD,Stoch_Slowing,MODE_SMA,0,MODE_MAIN,i);
  STOM5=iStochastic(NULL,0,First_Stoch_KP+4,Stoch_PERIOD,Stoch_Slowing,MODE_SMA,0,MODE_MAIN,i);
  STOM6=iStochastic(NULL,0,First_Stoch_KP+5,Stoch_PERIOD,Stoch_Slowing,MODE_SMA,0,MODE_MAIN,i);
  STOM7=iStochastic(NULL,0,First_Stoch_KP+6,Stoch_PERIOD,Stoch_Slowing,MODE_SMA,0,MODE_MAIN,i);
  STOM8=iStochastic(NULL,0,First_Stoch_KP+7,Stoch_PERIOD,Stoch_Slowing,MODE_SMA,0,MODE_MAIN,i);
  STOM9=iStochastic(NULL,0,First_Stoch_KP+8,Stoch_PERIOD,Stoch_Slowing,MODE_SMA,0,MODE_MAIN,i);
  STOM10=iStochastic(NULL,0,First_Stoch_KP+9,Stoch_PERIOD,Stoch_Slowing,MODE_SMA,0,MODE_MAIN,i);
  
  {if(UseSFCwithClose && closestochonthesametimeframe==true)
          {if(Timeframe==5){czas=PERIOD_M5;x=300000;}if(Timeframe==15){czas=PERIOD_M15;x=900000;}if(Timeframe==30){czas=PERIOD_M30;x=1800000;}if(Timeframe==60){czas=PERIOD_H1;x=3600000;}if(Timeframe==240){czas=PERIOD_H4;x=14400000;}}
               else{if(Timeframe==5){czas=PERIOD_M1;x=300000;}if(Timeframe==15){czas=PERIOD_M5;x=900000;}if(Timeframe==30){czas=PERIOD_M15;x=1800000;}if(Timeframe==60){czas=PERIOD_M30;x=3600000;}if(Timeframe==240){czas=PERIOD_H1;x=14400000;}}}
               
  double RSI    = iRSI(NULL,0,RSIPeriod,RSIPrice,0); 
  string RSIFIB="false";string RSIFIS="false";
  if(UseRSIforOpen==true){if(RSI>RSIBuySig)RSIFIB="true";if(RSI<RSISellSig)RSIFIS="true";}
  if(UseRSIforOpen==false){RSIFIB="true";RSIFIS="true";}           
  double SCA=iStochastic(NULL,czas,KPeriodclose,DPeriodclose,Slowingclose,MAStoch,PriceStoch,MODE_MAIN,0);
  double SCB=iStochastic(NULL,czas,KPeriodclose,DPeriodclose,Slowingclose,MAStoch,PriceStoch,MODE_SIGNAL,0);
  double SC1=iStochastic(NULL,czas,KPeriodclose,DPeriodclose,Slowingclose,MAStoch,PriceStoch,MODE_MAIN,i);
  double SC2=iStochastic(NULL,czas,KPeriodclose,DPeriodclose,Slowingclose,MAStoch,PriceStoch,MODE_SIGNAL,i);
  //if(UseSFCwithClose&&SCA<SCB&&SC1>SC2&&(UseDistance==false||(UseDistance&&(SCB-SCA)>=Distance*Point))){stopcrossbuy="true";}
  //if(UseSFCwithClose&&SCA>SCB&&SC2>SC1&&(UseDistance==false||(UseDistance&&(SCA-SCB)>=Distance*Point))){stopcrosssell="true";}
  //if(UseDownLevelforClose&&SCA<DownLevel_close_buy){stopdownbuy="true";}
  //if(UseDownLevelforClose&&SCA>DownLevel_close_sell){stopdownsell="true";}
  //if(UseHighLevelforClose&&SCA>HighLevel_close_buy){stophighbuy="true";}
  //if(UseHighLevelforClose&&SCA<HighLevel_close_sell){stophighsell="true";}
  
 if(UseSFCwithClose&&SCA<SCB&&SC1>SC2&&SCA>Hig_l&&STOM1>Hig_l && STOM2>Hig_l && STOM3>Hig_l && STOM4>Hig_l && STOM5>Hig_l && STOM6>Hig_l && STOM7>Hig_l && STOM8>Hig_l && STOM9>Hig_l && STOM10>Hig_l){High_l=100;}else {High_l=Hig_l ;}
 if(SCA>SCB&&SC2>SC1&&UseSFCwithClose&&SCA<Lo_l&&STOM1<Lo_l && STOM2<Lo_l && STOM3<Lo_l && STOM4<Lo_l && STOM5<Lo_l && STOM6<Lo_l && STOM7<Lo_l && STOM8<Lo_l && STOM9<Lo_l && STOM10<Lo_l){Low_l=0;} else{ Low_l=Lo_l;}

  if( RSIFIS=="true" && STOM1<Low_l && STOM2<Low_l && STOM3<Low_l && STOM4<Low_l && STOM5<Low_l && STOM6<Low_l && STOM7<Low_l && STOM8<Low_l && STOM9<Low_l && STOM10<Low_l&&TradePerBar<=MaxTradePerBar){if(Reverse) {BV=1;PlaySound("alert.wav");} else {SV=1;PlaySound("alert.wav");} break;}
  if( RSIFIB=="true" && STOM1>High_l && STOM2>High_l && STOM3>High_l && STOM4>High_l && STOM5>High_l && STOM6>High_l && STOM7>High_l && STOM8>High_l && STOM9>High_l && STOM10>High_l&&TradePerBar<=MaxTradePerBar){if(Reverse) {SV=1;PlaySound("alert.wav");} else {BV=1;PlaySound("alert.wav");} 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,CLoseBuy=0,CLoseSel=0,CLHLCB=0,CLHLCS=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&&TradePerBar<=MaxTradePerBar){OS=1;OB=0;}if(BV>0&&TradePerBar<=MaxTradePerBar){OB=1;OS=0;}

// safety 
 if((UseMargincut&&AccountFreeMargin()< Margincutoff)
              ||(Usetarget&&AccountEquity()>=TargetEquity) 
                    || (Usebasket&&AccountEquity()<=(AccountBalance()-BasketLoss)  ))
   {
  Comment(
             "\nSTOP TRADING....",
             "\nAccountEquity = ", AccountEquity(),
             "\nTarget Balance or Target Loss  or FreeMargin hit !!!!!");	
  closeall();
   return(0);
   }  

// expert conditions to close position
//{if(UseSFCwithClose )
//          {if(Timeframe==5)x=300000;if(Timeframe==15)x=900000;if(Timeframe==30)x=1800000;if(Timeframe==60)x=3600000;}}
  if(SCA<SCB&&SC1>SC2&&(UseDistance==false||(UseDistance&&(SCB-SCA)>=Distance*Point))){CLoseBuy=1;}
  if(SCA>SCB&&SC2>SC1&&(UseDistance==false||(UseDistance&&(SCA-SCB)>=Distance*Point))){CLoseSel=1;}//}
 // if(SCA<DownLevel_close_buy){CLDLCB=1;}
 // if(SCA>DownLevel_close_sell){CLDLCS=1;}
  if(SCA>HighLevel_close_buy){CLHLCB=1;}
  if(SCA<HighLevel_close_sell){CLHLCS=1;}  
if((SV>0) ||(UseSFCwithClose&&CLoseBuy==1)|| (CLHLCB==1&&UseHighLevelforClose)|| (RealSL_Enabled && (OrderOpenPrice()-Bid)/Point>=RealSL)||(RealTP_Enabled && (Ask-OrderOpenPrice())/Point>=RealTP)){CB=1;}
if((BV>0) ||(UseSFCwithClose&&CLoseSel==1)|| (CLHLCS==1&&UseHighLevelforClose)|| (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);Sleep(x); return(0);}}
	if(OrderType()==OP_SELL && OrderSymbol()==Symbol() && ((OrderMagicNumber()==Magic) || Magic==0)){	if(CS==1){OrderClose(OrderTicket(),OrderLots(),Ask,Slip,Red);Sleep(x);return(0);}}}
	if(BarCount!=Bars){TradePerBar=0;BarCount = Bars;}
	
	
	double SLI=0,TPI=0;int TK=0;

// expert open position value
if((AddP() && Add_Positions && OP<=MaxOrders) || (OP==0 && !Add_Positions)) {
   if(OS==0&&OB==0){Comment("no order opened");}
	if(OS==1){if (TP==0) TPI=0; else TPI=Bid-TP*Point;if (SL==0) SLI=0; else SLI=Bid+SL*Point;if(Time0!=Time[0]){TK=OrderSend(Symbol(),OP_SELL,MML,Bid,Slip,SLI,TPI,OrSt,Magic,0,Red);OS=0;Comment("sell order opened","\n","magic number : ",Magic);Time0=Time[0];if(TK>0)TradePerBar++;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;if(Time0!=Time[0]){TK=OrderSend(Symbol(),OP_BUY,MML,Ask,Slip,SLI,TPI,OrSt,Magic,0,Lime);OB=0;Comment("buy order opened","\n","magic number : ",Magic); Time0=Time[0];if(TK>0)TradePerBar++;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);}

//
void closeall()
  {
  for (int cnt = OrdersTotal()-1 ; cnt >= 0; cnt--) 
   { 
      OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES); 
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderCloseTime()==0) 
      { 
            if(OrderType()==OP_BUY)  OrderClose(OrderTicket(),OrderLots(),Bid,3,Blue); 
            if(OrderType()==OP_SELL) OrderClose(OrderTicket(),OrderLots(),Ask,3,Red); 
      } }}