//+------------------------------------------------------------------+
//|                                                         EA 3.mq4 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+

#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 clrRoyalBlue
#property indicator_color2 clrRed
#property indicator_color3 clrYellow
#property indicator_width1 2
#property indicator_width2 2
#property indicator_width3 4

enum ma_methods
{
defoult,EMA,Wilder,LWMA,SineWMA,TriMA,LSMA,SMMA,MMA,HMA,ZeroLagEMA,NonLagEMA,
};

enum bands_type
{
STD=1,ENVD,ATR,
};



extern string MA_set = "//////////////MA settings//////////////";
extern int AAB_MAPeriod = 32;
extern int AAB_MAShift = 0;
extern ma_methods AAB_MAMethod = Wilder;
extern ENUM_APPLIED_PRICE AAB_Price = PRICE_CLOSE;
extern double AAB_NLMADeviation = 0.0;
extern double AAB_NLMAPctFilter = 0.0;

extern string ba_set = "////////////BANDS settings/////////////";
extern bands_type AAB_BandsType = ENVD;
extern int AAB_STDPeriod = 20;
extern bool AAB_STDUseMAPeriod = TRUE;
extern double AAB_STDDevations = 1.5;
extern double AAB_ENVDevations = 0.3;
extern int AAB_ATRPeriod = 20;
extern bool AAB_ATRUseMAPeriod = TRUE;
extern double AAB_ATRDevations = 2.0;

extern string al_set = "/////////////Alerts settings/////////////";
extern bool EmailON = false;
extern bool SoundON = false;
extern bool AlertON = false;
extern int AlertRepeat = 3;
extern bool EndLessRepeat = FALSE;
extern string SoundFile = "Alert";
extern int Nbars = -1;



input string BASIC_SETTINGS="Basic EA Settings";
input int    magic=125422;
input double lot=0.1;
input bool   Enable_SL_TP=true;
input int    SL=50;
input int    TP=50;
input int    Pending_Orders_to_Place=5;
input int    GridSize=50;
input double Grid_Lot_Multiplier=1;



//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
double p=Point;  datetime time; int TICKET; double Signal=0;  int close;

int OnInit()
  {
 if(Digits==3 || Digits==5) p=Point*10; 
//---
    
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
int signal=0; int buy=0; int sell=0; 



//-------------------------------------------------------------- 5a --

double buy_macurrent=iCustom(Symbol(),0,"qPallada_MainSignal_AllAverages",MA_set,AAB_MAPeriod,AAB_MAShift,AAB_MAMethod,AAB_Price,AAB_NLMADeviation,AAB_NLMAPctFilter,ba_set,AAB_BandsType,AAB_STDPeriod,AAB_STDUseMAPeriod,AAB_STDDevations,AAB_ENVDevations,AAB_ATRPeriod,AAB_ATRUseMAPeriod,AAB_ATRDevations,al_set,EmailON,SoundON,AlertON,AlertRepeat,EndLessRepeat,SoundFile,Nbars,0,1);
double buy_maprevious=iCustom(Symbol(),0,"qPallada_MainSignal_AllAverages",MA_set,AAB_MAPeriod,AAB_MAShift,AAB_MAMethod,AAB_Price,AAB_NLMADeviation,AAB_NLMAPctFilter,ba_set,AAB_BandsType,AAB_STDPeriod,AAB_STDUseMAPeriod,AAB_STDDevations,AAB_ENVDevations,AAB_ATRPeriod,AAB_ATRUseMAPeriod,AAB_ATRDevations,al_set,EmailON,SoundON,AlertON,AlertRepeat,EndLessRepeat,SoundFile,Nbars,0,1+1);
double sell_macurrent=iCustom(Symbol(),0,"qPallada_MainSignal_AllAverages",MA_set,AAB_MAPeriod,AAB_MAShift,AAB_MAMethod,AAB_Price,AAB_NLMADeviation,AAB_NLMAPctFilter,ba_set,AAB_BandsType,AAB_STDPeriod,AAB_STDUseMAPeriod,AAB_STDDevations,AAB_ENVDevations,AAB_ATRPeriod,AAB_ATRUseMAPeriod,AAB_ATRDevations,al_set,EmailON,SoundON,AlertON,AlertRepeat,EndLessRepeat,SoundFile,Nbars,1,1);
double sell_maprevious=iCustom(Symbol(),0,"qPallada_MainSignal_AllAverages",MA_set,AAB_MAPeriod,AAB_MAShift,AAB_MAMethod,AAB_Price,AAB_NLMADeviation,AAB_NLMAPctFilter,ba_set,AAB_BandsType,AAB_STDPeriod,AAB_STDUseMAPeriod,AAB_STDDevations,AAB_ENVDevations,AAB_ATRPeriod,AAB_ATRUseMAPeriod,AAB_ATRDevations,al_set,EmailON,SoundON,AlertON,AlertRepeat,EndLessRepeat,SoundFile,Nbars,1,1+1);

//-------------------------------------------------------------- 5b --

if(sell_maprevious!=EMPTY_VALUE && sell_macurrent==EMPTY_VALUE && buy_macurrent!=EMPTY_VALUE ) {buy=1;}

if(buy_maprevious!=EMPTY_VALUE && buy_macurrent==EMPTY_VALUE && sell_macurrent!=EMPTY_VALUE ) {sell=1;}

if(ordersTotal()<1)
 {

 if(buy>0  )
 {
 if(Enable_SL_TP && time!=Time[0])
 if(OrderSend(Symbol(),OP_BUY,lot,Ask,3,Ask-p*SL,Ask+p*TP,NULL,magic,0,Blue))time=Time[0];
 if(!Enable_SL_TP && time!=Time[0])
 if(OrderSend(Symbol(),OP_BUY,lot,Ask,3,0,0,NULL,magic,0,Blue))time=Time[0];
 }
  
  if(sell>0  )
  {
  if(Enable_SL_TP && time!=Time[0])
  if(OrderSend(Symbol(),OP_SELL,lot,Bid,3,Bid+p*SL,Bid-p*TP,NULL,magic,0,Red))time=Time[0];
  if(!Enable_SL_TP && time!=Time[0])
  if(OrderSend(Symbol(),OP_SELL,lot,Bid,3,0,0,NULL,magic,0,Red))time=Time[0];
  }
    

 } 
 //===============================================================================================
  if(ordersTotal()<2 && openTotal()>0) {TICKET=0; placePending();}
//================================================================================================
  modify();
//================================================================================================ 

 if(time!=Time[0] && ((typeTotal(1)>0 && sell>0) || (typeTotal(2)>0 && buy>0))) {close=1; DeleteNClose();}
 if(close>0) DeleteNClose();
 if(OrdersTotal()<1) close=0;
  }
//+------------------------------------------------------------------+
//====================================================================================================
int ordersTotal()
{
int k=0;
for(int i=0; i<OrdersTotal(); i++)
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
if(OrderSymbol()==Symbol()) k++;
}
return(k);
}
//---------------------------------------------------
int openTotal()
{
int k=0;
for(int i=0; i<OrdersTotal(); i++)
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
if(OrderSymbol()==Symbol() && (OrderType()==OP_BUY || OrderType()==OP_SELL)) k++;
}
return(k);
}
//========================================================

//------------------------------------------------------------------------------------
void modify()
{
double lastorder=0; double lastorder1=1000; int ModifyTicket=0; double tp=0;
for(int i=0; i<OrdersTotal(); i++)
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
if(OrderSymbol()==Symbol()) 
{
if(OrderType()==OP_BUY && OrderOpenPrice()<lastorder1) {tp=OrderTakeProfit(); lastorder1=OrderOpenPrice();} 
if(OrderType()==OP_SELL && OrderOpenPrice()>lastorder) {tp=OrderTakeProfit(); lastorder=OrderOpenPrice();}
} 
}

for(int k=0; k<OrdersTotal(); k++)
{
if(!OrderSelect(k,SELECT_BY_POS,MODE_TRADES)) continue;
if(OrderSymbol()==Symbol()) 
if((OrderType()==OP_BUY || OrderType()==OP_SELL) && OrderTakeProfit()!=tp)
ModifyTicket=OrderModify(OrderTicket(),OrderOpenPrice(),0,tp,0,Purple);
}


}
//------------------------------------------------------------------------

//------------------------------------------------------------------------------------------------------

void placePending()
{
int type=OP_BUYSTOP; double open=0; double lots=0;
 
for(int i=0; i<OrdersTotal(); i++)
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
if(OrderSymbol()==Symbol()) 
if(OrderType()==OP_BUY || OrderType()==OP_SELL)
{type=OrderType(); open=OrderOpenPrice(); lots=OrderLots();}
}
//----------------------------------------------------------------------------
for(int k=0; TICKET<Pending_Orders_to_Place; k++)
{
if(type==OP_BUY)
{
if(Enable_SL_TP)
if(OrderSend(Symbol(),OP_BUYLIMIT,NormalizeDouble(lots*Grid_Lot_Multiplier,2),NormalizeDouble(open-p*GridSize,Digits),3,NormalizeDouble(open-p*(GridSize+SL),Digits),NormalizeDouble(open-p*(GridSize-TP),Digits),NULL,magic,0,Blue))
{TICKET++; open=NormalizeDouble(open-p*GridSize,Digits); lots*=Grid_Lot_Multiplier;}
if(!Enable_SL_TP)
if(OrderSend(Symbol(),OP_BUYLIMIT,NormalizeDouble(lots*Grid_Lot_Multiplier,2),NormalizeDouble(open-p*GridSize,Digits),3,0,0,NULL,magic,0,Blue))
{TICKET++; open=NormalizeDouble(open-p*GridSize,Digits); lots*=Grid_Lot_Multiplier;}

}

if(type==OP_SELL)
{
if(Enable_SL_TP)
if(OrderSend(Symbol(),OP_SELLLIMIT,NormalizeDouble(lots*Grid_Lot_Multiplier,2),NormalizeDouble(open+p*GridSize,Digits),3,NormalizeDouble(open+p*(GridSize+SL),Digits),NormalizeDouble(open+p*(GridSize-TP),Digits),NULL,magic,0,Blue))
{TICKET++; open=NormalizeDouble(open+p*GridSize,Digits); lots*=Grid_Lot_Multiplier;}

if(!Enable_SL_TP)
if(OrderSend(Symbol(),OP_SELLLIMIT,NormalizeDouble(lots*Grid_Lot_Multiplier,2),NormalizeDouble(open+p*GridSize,Digits),3,0,0,NULL,magic,0,Blue))
{TICKET++; open=NormalizeDouble(open+p*GridSize,Digits); lots*=Grid_Lot_Multiplier;}

}
}
//-----------------------------------------------------------------------
}

//------------------------------------------------------------------------------------

//------------------------------------------------------------------------
int DeleteNClose()
{
int k=0;
for(int i=0;i<OrdersTotal(); i++)
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
if(OrderSymbol()==Symbol()) 
{
if(OrderType()==OP_BUY) 
k=OrderClose(OrderTicket(),OrderLots(),Bid,3,Red);
if(OrderType()==OP_SELL) 
k=OrderClose(OrderTicket(),OrderLots(),Ask,3,Red);
if(OrderType()==OP_BUYLIMIT || OrderType()==OP_SELLLIMIT)
k=OrderDelete(OrderTicket(),Red);
}
}
return(k);
}
//-------------------------------------------------------------------
int typeTotal(int type)
{
int k=0; int k1=0;
for(int i=0;i<OrdersTotal(); i++)
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
if(OrderSymbol()==Symbol()) 
{
if(OrderType()==OP_BUY || OrderType()==OP_BUYLIMIT) 
k++;
if(OrderType()==OP_SELL || OrderType()==OP_SELLLIMIT) 
k1++;
}
}
if(type==1) return(k);
if(type==2) return(k1);

return(0);
}