//+------------------------------------------------------------------+
//|                                           OrderModifyStepper.mq4 |
//|                                  Based on: StepStopExpert_v1.mq4 |
//|                                                           dlazor |
//+------------------------------------------------------------------+
#property copyright "dlazor"
#property link      "http://www.forexfactory.com/showthread.php?t=106889"

//+------------------------------------------------------------------+
//| input parameters                                                 |
//+------------------------------------------------------------------+
extern double     InitialStop     = 6;    // Default SL in not set in order
extern double     BreakEven       = 5;    // Pips above order open price to trigger break even
extern double     StepTwo         = 10;   // Pips above order open price to trigger second SL step
extern double     StepTwoPip      = 2;    // Pips above order open price to set second SL step at
extern double     TakeProfit      = 15;   // Default TP in not set in order

int    digit = 0;
double pip;

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
void init()
  {
     getpip();
  }
//+------------------------------------------------------------------+
//| Step Stops                                                       |
//+------------------------------------------------------------------+
void StepStops()
   {        
    double BuyStop, SellStop, BuyTakeProfit, SellTakeProfit;
    int total = OrdersTotal();
    double BEpip = pip * BreakEven;
    double STpip = pip * StepTwo;
    for (int cnt = total; cnt >= 0; cnt --)
    { 
     OrderSelect(cnt, SELECT_BY_POS);   
     int mode = OrderType();    
        if (OrderSymbol() == Symbol()) 
        {
            if (mode == OP_BUY)
            {
               BuyStop = OrderStopLoss();
               BuyTakeProfit = OrderTakeProfit();
               
               if (Bid - OrderOpenPrice() >0 || OrderStopLoss() == 0 || OrderTakeProfit() == 0) 
               {          
               if (OrderStopLoss() == 0) {BuyStop = OrderOpenPrice() - (InitialStop * pip);}
               
               if (OrderTakeProfit() == 0) {BuyTakeProfit = OrderOpenPrice() + (TakeProfit * pip);}
               
               if (((Bid - OrderOpenPrice()) >= BEpip) && (OrderStopLoss() < OrderOpenPrice())) 
               {BuyStop = OrderOpenPrice();}
               
               if (((Bid - OrderOpenPrice()) >= STpip) && (OrderStopLoss() < (OrderOpenPrice() + (StepTwoPip * pip))))
               {BuyStop = OrderOpenPrice() + (StepTwoPip * pip);}
                                  
               if (OrderStopLoss() != NormalizeDouble(BuyStop, digit) || OrderTakeProfit() != NormalizeDouble(BuyTakeProfit, digit))
                  {
                     OrderModify(OrderTicket(), OrderOpenPrice(),
                           NormalizeDouble(BuyStop, digit),
                           NormalizeDouble(BuyTakeProfit, digit), 0, LightGreen);
			         }
			      }
			   }
            if (mode == OP_SELL)
            {
               SellStop = OrderStopLoss();
               SellTakeProfit = OrderTakeProfit();
               
               if (OrderOpenPrice() - Ask > 0 || OrderStopLoss() == 0 || OrderTakeProfit() == 0)
               {
               if (OrderStopLoss() == 0 ) {SellStop = OrderOpenPrice() + (InitialStop * pip);}
               
               if (OrderTakeProfit() == 0) {SellTakeProfit = OrderOpenPrice() - (TakeProfit * pip);}
              
               if (((OrderOpenPrice() - Ask) >= BEpip) && (OrderStopLoss() > OrderOpenPrice())) 
               {SellStop = OrderOpenPrice();}
              
               if (((OrderOpenPrice() - Ask) >= STpip) && (OrderStopLoss() > (OrderOpenPrice() - (StepTwoPip * pip)))) 
               {SellStop = OrderOpenPrice() - (StepTwoPip * pip);}
               
               if (OrderStopLoss() != NormalizeDouble(SellStop, digit) || OrderTakeProfit() != NormalizeDouble(SellTakeProfit, digit))
                  {
                     OrderModify(OrderTicket(), OrderOpenPrice(),
   		                  NormalizeDouble(SellStop, digit),
   		                  NormalizeDouble(SellTakeProfit, digit), 0, Yellow);	    
                  }
               }  
            }  
         }   
      }
   }
//+------------------------------------------------------------------+
//| Scan Trades                                                      |
//+------------------------------------------------------------------+
int ScanTrades()
  {   
   int total = OrdersTotal();
   int numords = 0;
      
   for(int cnt = total; cnt >= 0; cnt --) 
   {        
      OrderSelect(cnt, SELECT_BY_POS);            
      if(OrderSymbol() == Symbol() && OrderType() <= OP_SELL) 
      numords ++;
   }
   return(numords);
  }     	                    
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
void deinit()
  {
//---- 
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
void start()
  {
   if (ScanTrades() < 1) return(0);
   else if (BreakEven > 0 || InitialStop > 0 || TakeProfit > 0) {StepStops();}
  }
//-------------------------------------------------------------------+
// getpip                                                            |
//-------------------------------------------------------------------+
void getpip()
  {
   if(Digits == 2 || Digits == 4) pip = Point;
   else if(Digits == 3 || Digits==5) pip = 10 * Point;
   else if(Digits == 6) pip = 100 * Point;
   digit = MarketInfo(Symbol(), MODE_DIGITS);
  }
//-------------------------------------------------------------------+
// End Script                                                        |
//-------------------------------------------------------------------+