//+------------------------------------------------------------------+
//|                                                stRangeExpert.mq4 |
//| created to work with stRangeCandles Indicator                    |
//| just moves SL to BREAK EVEN                                      |
//--------------------------------------------------------------------

#include <stdlib.mqh>
#include <stderror.mqh>
#include <WinUser32.mqh> 

extern string     Breakeven_Settings    = "—————SECTION A———————";
extern string     BreakEven1            = "if SL is set and its not ZERO";
extern string     BreakEven2            = "SL is moved only for profitable orders";
extern string     BreakEven3            = "profits in SL is never reduced";
extern int        BreakEvenPips         = 20;
extern bool       UseSound              = true;
extern string     StopSound             = "stops.wav";

// section to be removed when the indicator and EA is merged
extern string     Indicator_Settings    = "—————SECTION B———————";
extern int        BoxSize               = 15;

extern string     Test_Settings         = "—————SECTION C———————";
extern bool       TestMode              = false;

// Global variables
double            stoplevelpts          = MarketInfo(Symbol(), MODE_STOPLEVEL);
double            tickValue             = MarketInfo(Symbol(), MODE_TICKVALUE); 
double            spread                = Ask-Bid;  
string            name                  = WindowExpertName();
static double     BoxPoints;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void deinit() 
  {
   GlobalVariablesDeleteAll(name);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void init() 
  {
// code to be merged with indicator

   if(Digits==5 || (Digits==3 && StringFind(Symbol(),"JPY")!=-1))
     {
      BoxSize=BoxSize*10;
     }
   if(Digits==6 || (Digits==4 && StringFind(Symbol(),"JPY")!=-1))
     {
      BoxSize=BoxSize*100;     
     }

// calculating points for user definded Box Size  
   BoxPoints=NormalizeDouble(BoxSize*Point,Digits); 
   

  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
void start() 
  {

   bool result=false;

   int totalorders=OrdersTotal();
   for(int i=totalorders-1;i>=0;i--)
     {
      result=OrderSelect(i,SELECT_BY_POS);

      if(OrderSymbol()==Symbol() && result)
        {

         if(OrderStopLoss()!=0) BreakEvenTrade();
         
        }
      // return;
     }

   if(TestMode)  OpenPosition(); 

   return;
  }
//+-------------------------------------------------------------------------------------------+
void BreakEvenTrade() 
  {
   double NewStop=-1;
   double costOfBusiness;

   if(OrderType()==OP_BUY) 
     {                         // is Buy Order in Profit
     costOfBusiness =    OrderCommission()+OrderSwap() / tickValue*OrderLots();
      NewStop=OrderOpenPrice() + spread +(BreakEvenPips*Point);     // stop is OrderPrice + BE
      if(Bid>(OrderOpenPrice()+BoxPoints) && OrderStopLoss()<NewStop && Bid>NewStop) {
         Print(costOfBusiness);
      _BreakEvenTrade(NewStop);
   
      }
     
     }
   if(OrderType()==OP_SELL) 
     {         // is Sell Order in Profit
      costOfBusiness = Point * (OrderCommission()+OrderSwap()) / tickValue*OrderLots();
      NewStop=OrderOpenPrice() - spread -(BreakEvenPips*Point);     // stop is OrderPrice - BE   
      if(Ask<(OrderOpenPrice()-BoxPoints) && OrderStopLoss()>NewStop && Ask<NewStop) _BreakEvenTrade(NewStop);
    
     }
   return;
  }
//+-------------------------------------------------------------------------------------------+
void _BreakEvenTrade(double newstop=0) 
  {
   if(newstop!=OrderStopLoss() && newstop>0)
     {
      if(_ModifyStopLoss(newstop)==1)
         Print(name+" modified Order No"+ OrderTicket() +" Stop Loss to BreakEven");
     }

   return;
  }
//+-------------------------------------------------------------------------------------------+
int _ModifyStopLoss(double ldStopLoss) 
  {
   RefreshRates();
   int Ans=-1;
   double trailByDbl  = (stoplevelpts * Point) + spread,       // delta price
   newSlPrc;                                           // new SL price

   if(OrderType()==OP_BUY) 
     {
      newSlPrc   = Bid - trailByDbl;
      if(ldStopLoss<newSlPrc) Ans=OrderModify(OrderTicket(),OrderOpenPrice(),ldStopLoss,OrderTakeProfit(),0,CLR_NONE);
     }

   if(OrderType()==OP_SELL) 
     {
      newSlPrc = Ask + trailByDbl;
      if(ldStopLoss>newSlPrc) Ans=OrderModify(OrderTicket(),OrderOpenPrice(),ldStopLoss,OrderTakeProfit(),0,CLR_NONE);
     }

   if(Ans==0) 
     {
      handleError("_ModifyStopLoss");  
     }
   if(Ans==1) 
     {
      if(UseSound) PlaySound(StopSound);      
     }
   return(Ans);
  }
//+-------------------------------------------------------------------------------------------+
void OpenPosition()
  {
   int Ticket;
   if(Open[0]<Close[0]) 
     {
      Ticket=OrderSend(Symbol(),OP_BUY,0.01,Ask,25, Ask-(20*Point) ,0,NULL,10,Blue); //Opening Buy            
     } 
   else
   if(Open[0]>Close[0]) 
     {
      Ticket=OrderSend(Symbol(),OP_SELL,0.01,Bid,25,Bid+(20*Point) ,0,NULL,10,Red); //Opening Sell      
     }
   if(Ticket==-1) handleError("OpenPosition");
   return;
  }
//+-------------------------------------------------------------------------------------------+
void handleError(string functionName) 
  {
   int err;
   err=GetLastError();
   if(err>0)Print(functionName+" caused "+err);
   return;
  }
//+-------------------------------------------------------------------------------------------+
