//+------------------------------------------------------------------+
//|                                                  Remake GoAWAY.mq4 |
//|                                                      Majesty Inc |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Majesty Inc"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#include <stdlib.mqh>



//--- input parameters
extern double  ProfitTarget=50.0;
extern bool    Use_Profit_Target=false;

extern double  Lots=0.1;
extern double  Tp=80;
extern double  Sl=40;
extern string  lsComm="Machine";
extern int     MagicNos=2016011;
extern bool    OnNewCandleONly=true;
extern int     Slippage=5;
extern bool    UseMaxorders=false;
//maximum others in a direction/trend on a symbol
extern int     MaxOrders=4;                 

extern int     WPRperiod=14;
extern int     MA1Period=85;
extern int     MA2Period=70;
extern int     CCIPeriod=14;
extern int     BolPeriod =14;
extern double  BolDeviation=2;
extern int     MaTrendShift=3;
extern int     MaTrendPeriod=100;  


extern string  WPRrange="ENTER RANGE OF WPR BUY AND SELL RANGE";
extern int     WPRselltop=-25;
extern int     WPRsellbot=-10;
extern int     WPRbuytop=-75;
extern int     WPRbuybot=-90;



extern bool    JumpStop=false;
extern bool    UseBE = False;
extern int     BreakEvenPips = 40;
extern int     JumpingStopPips=20;
/*Change to delay entry by one Bar*/
extern int     SignalDelay=0;                



 double  MA1_Prev , MA1_Cur, MA2_Prev,MA2_Cur;
 double Stoch7_Prev2,Stoch7_Prev1,Stoch7_Cur,CloseB4TradeBar;
 datetime CurrentBar, TradeBar;
 bool Buytriggered,Selltriggered;
 
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   

   return(0);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   double MA_Prev=iMA(NULL,0,MaTrendPeriod,MaTrendShift,MODE_LWMA,PRICE_CLOSE,1);
     
      if (TradeBar!= iTime(0,0,0)&&CloseB4TradeBar!=Close[1]) //dont closetrade while price is on trade bar neither use close of bar before trade bar to close
         {
            if (ExistPositions()==true)
            {
               if (Close[1]>MA_Prev) 
                  {
                     CloseSell();
                     Print(Close[1]," > ",MA_Prev);
                  }
                  
               
               if (Close[1]<MA_Prev) 
                  {
                    CloseBuy();
                     Print(Close[1]," < ",MA_Prev);
                  }   
            }   
            
         }   
       
     if(ExistPositions()==false)
      
      {
         if (CloseOutsideBOL()==1 )
         {
             OpenBuyOrder();
             TradeBar=iTime(0,0,0);
             CloseB4TradeBar=Close[1];
            
         }
      }
      
      if(ExistPositions()==false)
      
      {
         if (CloseOutsideBOL()==-1)
         {
             OpenSellOrder();
             TradeBar=iTime(0,0,0);
             CloseB4TradeBar=Close[1];
             
         }
      }
      
  }//END ONTICK
//+------------------------------------------------------------------+
//===========================================================================================================================================
//===========================================END OF MAIN FUNCTIONS====================================================================
//




int CloseOutsideBOL()
{
   double Prev_UpperB=iBands(NULL,0,BolPeriod,BolDeviation,0,PRICE_CLOSE,MODE_UPPER,1);
   double Prev_LowerB=iBands(NULL,0,BolPeriod,BolDeviation,0,PRICE_CLOSE,MODE_LOWER,1);
   
   if (Close[1]>Prev_UpperB) 
   {
      return (1);
   }
   if (Close[1]<Prev_LowerB)
   {
      return(-1);
   }
   return (0);
}
//================================================================
//================================================================
// END OF FILTER FUNCTIONS
//================================================================
//================================================================


//================================================================
//========TRADE FUNCTIONS BEGINS

 void OpenSellOrder() 
  {
   int ticket;
   double multiplier, ldStop, ldTake;
   if(Digits == 2 || Digits == 4) multiplier = 1;
   if(Digits == 3 || Digits == 5) multiplier = 10;
   
   RefreshRates();
   ldStop=Bid+(Sl*Point*multiplier);
   ldTake=Bid-(Tp*Point*multiplier);
   ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage*multiplier,ldStop,ldTake,lsComm,0,0,0);
   RefreshRates();
   if (ticket==-1)
         {
           int err=GetLastError();
           Alert("Order Error ", OrderSymbol(), " ticket no ", OrderTicket()," failed with error (",err,"): ",ErrorDescription(err));
         }
  }

//================================================================
 void OpenBuyOrder() 
  {
   int ticket;
   double multiplier, ldStop, ldTake;
   
   if(Digits == 2 || Digits == 4) multiplier = 1;
   if(Digits == 3 || Digits == 5) multiplier = 10;
   
   RefreshRates();
   
   ldStop=Bid-(Sl*Point*multiplier);
   ldTake=Ask+(Tp*Point*multiplier);
   ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage*multiplier,ldStop,ldTake,lsComm,0,0,0);
   RefreshRates();
   if (ticket==-1)
      {
        int err=GetLastError();
        Alert("Order Error ", OrderSymbol(), " ticket no ", OrderTicket()," failed with error (",err,"): ",ErrorDescription(err));
      }
   
   
  }
  
  
//================================================================
void MoveToBE()
{
double multiplier, ldStop, ldTake;
   
   if(Digits == 2 || Digits == 4) multiplier = 1;
   if(Digits == 3 || Digits == 5) multiplier = 10;
   
int totalorders = OrdersTotal();
for(int i=totalorders-1;i>=0;i--)
   {
   OrderSelect(i, SELECT_BY_POS);
      bool result = false;
   if ( OrderSymbol()==Symbol() )
      {
         if ( OrderType() == OP_BUY &&High[0]-OrderOpenPrice()>=BreakEvenPips*Point*multiplier && OrderStopLoss()!=OrderOpenPrice()) result = OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,Green);
         if ( OrderType() == OP_SELL &&OrderOpenPrice()-Low[0]>=BreakEvenPips*Point*multiplier && OrderStopLoss()!=OrderOpenPrice()) result = OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,Green);
         int err=GetLastError();
      }
   }
return;
}
  
//================================================================  
int OncePerBar()
  {
    if (CurrentBar == iTime(NULL,0,0)) return(0); // if previously set currentbar time is equal to present bar
    CurrentBar = iTime(NULL,0,0);                 //if previously set current bar time isn't equal set it to present bar time & return 1
    return(1);
  }
//================================================================
void CloseBuy() 
  {
  double multiplier, ldStop, ldTake;
   
   if(Digits == 2 || Digits == 4) multiplier = 1;
   if(Digits == 3 || Digits == 5) multiplier = 10;
   
   int ticket = -1;
   int totalorders = OrdersTotal();
   for(int i=totalorders-1;i>=0;i--)
   {
      OrderSelect(i, SELECT_BY_POS);      
      if ( OrderSymbol()==Symbol() && OrderType()==OP_BUY)
      {
         OrderClose(OrderTicket(), OrderLots(), Bid, Slippage*multiplier,clrNONE);
      }
   }   
  
  }  
//================================================================= 
void CloseSell() 
  {
  double multiplier, ldStop, ldTake;
   
   if(Digits == 2 || Digits == 4) multiplier = 1;
   if(Digits == 3 || Digits == 5) multiplier = 10;

   int ticket = -1;
   int totalorders = OrdersTotal();
   for(int i=totalorders-1;i>=0;i--)
   {
      OrderSelect(i, SELECT_BY_POS);      
      if ( OrderSymbol()==Symbol() && OrderType()==OP_SELL)
      {
         OrderClose(OrderTicket(), OrderLots(), Ask, Slippage*multiplier, clrNONE);
      }
   }   
   
  } 
//================================================================
bool ExistPositions() 
  {
     for(int i=0; i<OrdersTotal(); i++) 
     {
        if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) 
        {
           if (OrderSymbol()==Symbol()) 
           {
            return(True);
           }
        }
     }
   return(false);
  }
  
  
//================================================================
bool MaxOrdersReached()
 {
   int countbuy=0;
   int countsell=0;
   
 for (int i=OrdersTotal()-1; i>=0; i--)
    {
      OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
      if (OrderType() == OP_BUY && OrderMagicNumber() == MagicNos && OrderSymbol() == Symbol())
        {
              countbuy =countbuy++;
              if (countbuy==MaxOrders)return(true);
        }
      if (OrderType() == OP_SELL && OrderMagicNumber() == MagicNos && OrderSymbol() == Symbol())
        {
              countsell =countsell++;
              if (countsell==MaxOrders)return(true);
        }
    }
    return(false);
 }
 
