//+------------------------------------------------------------------+
//|                                                   ОВЕРЛОРД_5.mq4 |
//|                     Copyright © 2008, К.Моржов                   |
//|                                        K-Morzhov@ya.ru           |
//+------------------------------------------------------------------+
// пятая версия из экспертов, выполняющих техническую
// работу за трейдера согласно методу Оверлорда
// за трейдером выбор времени запуска, выбор шага между отложками
// выбор параметра N - см. настройки, т.п.
// эксперт можно оптимизировать на тестере для выбранной пары
// затем запускать раз в день когда предполагаем сильное движение

extern int TS = 50; //трал профитной позиции
extern int TrPr = 10000;//профит в центах, при котором начнем тралить
extern int Step = 30;//шаг сетки отложенных ордеров
extern double Lots = 0.1;
extern int TP = 50;
extern int SL = 500;
extern int H = 11;//время старта - до этого времени не работаем
extern int N = 4;// равно 3 или 4 или 5 - после срабатывания какого прямого ордера придвигаем обратки поближе к цене
int StartTime;
int St;
int MODBUYSTOP,MODSELLSTOP;

int Deleting = 0;

//отличается от третьей версии тем, что модифаит все имеющиеся обратки, а не только три...


int start()
  {





int h = TimeHour(TimeCurrent());
int m = TimeMinute(TimeCurrent());

   if (h == 23 && Deleting != 1)// в 0 часов мск удалим отложки,если таковые остались, чтобы не мешались назавтра  
      {  
        int t;
        MODSELLSTOP = 0;
        MODBUYSTOP = 0;
         for(t = 0; t < OrdersTotal(); t ++)
           {
             OrderSelect(t, SELECT_BY_POS);
             if(OrderSymbol() != Symbol()) continue;
      
             if(OrderType() == OP_BUYSTOP)
             OrderDelete(OrderTicket());
      
             if(OrderType() == OP_SELLSTOP)
             OrderDelete(OrderTicket());
           }
           Deleting = 1;
        }
        
    if(Deleting == 1 && h == 0)
    return(0);
    Deleting = 0;
   
   
    
   if (h < H || Deleting == 1)// до (H+1) мск не работает
    {
     St = 0;
     StartTime = 0;
     return(0);
    }
    

    

    
if (StartTime == 0)//запомним время старта эксперта
StartTime = TimeCurrent();


 TRAL();// трал открытых позиций







// изучаем все отложенные ордера и расфасуем их.

   int i;
   int buystop1 = 0,sellstop1 = 0;
   int buystop2 = 0,sellstop2 = 0;
   int buystop3 = 0,sellstop3 = 0;
   int buystop4 = 0,sellstop4 = 0;
   int buystop5 = 0,sellstop5 = 0;
   
   double buystop_open1, sellstop_open1;
   double buystop_open2, sellstop_open2;
   double buystop_open3, sellstop_open3;
   double buystop_open4, sellstop_open4;
   double buystop_open5, sellstop_open5;
   
   for(i = 0; i < OrdersTotal(); i ++)
   {
      OrderSelect(i, SELECT_BY_POS);
      if(OrderSymbol() != Symbol()) continue;
      
      if(OrderType() == OP_BUYSTOP)
      {
         if (OrderMagicNumber() == 11)
           {
            buystop1 = OrderTicket();
            buystop_open1 = OrderOpenPrice();
           }
           
          if (OrderMagicNumber() == 12)
           {
            buystop2 = OrderTicket();
            buystop_open2 = OrderOpenPrice();
           }  
           
           if (OrderMagicNumber() == 13)
           {
            buystop3 = OrderTicket();
            buystop_open3 = OrderOpenPrice();
           } 
    
          if (OrderMagicNumber() == 14)
           {
            buystop4 = OrderTicket();
            buystop_open4 = OrderOpenPrice();
           } 
    
          if (OrderMagicNumber() == 15)
           {
            buystop5 = OrderTicket();
            buystop_open5 = OrderOpenPrice();
           } 
    
    
    
    
    
      }            //изучили байстопы, их должно быть три (сначала)
      
      
      
      if(OrderType() == OP_SELLSTOP)
      {
         if (OrderMagicNumber() == 21)
           {
            sellstop1 = OrderTicket();
            sellstop_open1 = OrderOpenPrice();
           }
           
          if (OrderMagicNumber() == 22)
           {
            sellstop2 = OrderTicket();
            sellstop_open2 = OrderOpenPrice();
           }  
           
           if (OrderMagicNumber() == 23)
           {
            sellstop3 = OrderTicket();
            sellstop_open3 = OrderOpenPrice();
           } 
           
           if (OrderMagicNumber() == 24)
           {
            sellstop4 = OrderTicket();
            sellstop_open4 = OrderOpenPrice();
           }  
           
           if (OrderMagicNumber() == 25)
           {
            sellstop5 = OrderTicket();
            sellstop_open5 = OrderOpenPrice();
           } 
           
       }                       //изучили сэллстопы, их должно быть три (сначала)
      
          
   }

//если нужных отложек не обнаружено, отложим их:

    if (TimeCurrent() - StartTime < 180) // если с момента запуска прошло 3 минуты,начальные ордера не выставляются

     {
       if (buystop1 == 0 && buystop2 == 0 && buystop3 == 0 && St < 1)//начальный момент
       {
       //отложим три байстопа
       buystop_open1 = Ask + Step*Point;
       buystop_open2 = Ask + 2*Step*Point;
       buystop_open3 = Ask + 3*Step*Point;
       buystop1 = OrderSend(Symbol(),OP_BUYSTOP,Lots,buystop_open1,1,0,buystop_open1+TP*Point,"У-5",11,0,Blue);
       buystop2 = OrderSend(Symbol(),OP_BUYSTOP,Lots,buystop_open2,1,0,buystop_open2+TP*Point,"У-5",12,0,Blue);
       buystop3 = OrderSend(Symbol(),OP_BUYSTOP,Lots,buystop_open3,1,0,buystop_open3+TP*Point,"У-5",13,0,Blue);
       St = 1;
       
       }
       

       if (sellstop1 == 0 && sellstop2 == 0 && sellstop3 == 0 && St < 2)//начальный момент
       {
       //отложим три сэллстопа
       sellstop_open1 = Bid - Step*Point;
       sellstop_open2 = Bid - 2*Step*Point;
       sellstop_open3 = Bid - 3*Step*Point;
       sellstop1 = OrderSend(Symbol(),OP_SELLSTOP,Lots,sellstop_open1,1,0,sellstop_open1-TP*Point,"У-5",21,0,Crimson);
       sellstop2 = OrderSend(Symbol(),OP_SELLSTOP,Lots,sellstop_open2,1,0,sellstop_open2-TP*Point,"У-5",22,0,Crimson);
       sellstop3 = OrderSend(Symbol(),OP_SELLSTOP,Lots,sellstop_open3,1,0,sellstop_open3-TP*Point,"У-5",23,0,Crimson);
       St = 2;
       
       }
     }  
       
       
       //при срабатывании ближних к цене байстопов выставляем их снова за дальним
       if (buystop1 == 0 && buystop2 != 0 && buystop3 != 0 && buystop4 == 0)//момент, когда ближний байстоп сработал, выставим новый за 
       
       //третьим байстопом:
       {
       buystop_open4 = buystop_open3 + Step*Point;
       buystop4 = OrderSend(Symbol(),OP_BUYSTOP,Lots,buystop_open4,1,0,buystop_open4+TP*Point,"У-5",14,0,Aqua);
       }
       if (buystop2 == 0 && buystop3 != 0 && buystop5 == 0)//момент, когда второй байстоп сработал, выставим новый за 
       //четвертым на расст Step:
       {
       buystop_open5 = buystop_open4 + Step*Point;
       buystop5 = OrderSend(Symbol(),OP_BUYSTOP,Lots,buystop_open5,1,0,buystop_open5+TP*Point,"У-5",15,0,Aqua);
       }
       
      //смотрим,не пора ли придвинуть обратные отложки поближе к цене 
      //начинаем придвигать обратки после срабатывания третьего прямого ордера
      if (N == 3 && buystop4 != 0 && buystop5 != 0 && buystop3 == 0)//в момент, когда  третий байстоп сработал, больше не наращиваем
      MODSELLSTOP = 1;//байстопы, а двинем все обратные сэллстопы ближе к цене:
       
       
      //начинаем придвигать обратки после срабатывания четвертого прямого ордера
      if (N == 4 && buystop4 == 0 && buystop5 != 0)//в момент, когда  четвертый байстоп сработал, больше не наращиваем
      MODSELLSTOP = 1; //байстопы, а двинем все обратные сэллстопы ближе к цене:
      
          
       
      //начинаем придвигать обратки после срабатывания пятого прямого ордера
      //если с момента старта эксперта прошло более 15 минут и все 5 прямых ордеров сработали, придвинем обратные
      if (N == 5 && TimeCurrent() - StartTime > 900 && buystop3 == 0 && buystop5 == 0)//в момент, когда  все байстопы сработали, больше не наращиваем
      MODSELLSTOP = 1; 
        
       

        //при срабатывании ближних к цене сэллстопов выставляем их снова ниже дальнего
       if (sellstop1 == 0 && sellstop2 != 0 && sellstop3 != 0 && sellstop4 == 0)//момент, когда ближний сэллстоп сработал, выставим новый за 
       //третьим сэллстопом:
       {
       sellstop_open4 = sellstop_open3 - Step*Point;
       sellstop4 = OrderSend(Symbol(),OP_SELLSTOP,Lots,sellstop_open4,1,0,sellstop_open4-TP*Point,"У-5",24,0,Orange);
       }
       if (sellstop2 == 0 && sellstop3 != 0 && sellstop5 == 0)//момент, когда второй сэллстоп сработал, выставим новый за 
       //"новым первым" сэллстопом:
       {
       sellstop_open5 = sellstop_open4 - Step*Point;
       sellstop5 = OrderSend(Symbol(),OP_SELLSTOP,Lots,sellstop_open5,1,0,sellstop_open5-TP*Point,"У-5",25,0,Orange);
       }
       
       
     //смотрим,не пора ли придвинуть обратные отложки поближе к цене
      
     //начинаем придвигать обратки после срабатывания третьего прямого ордера
     if (N == 3 && sellstop4 != 0 && sellstop5 != 0 && sellstop3 == 0)//в момент, когда  третий сэллстоп сработал, больше не наращиваем
     MODBUYSTOP = 1; //сэллстопы, а двинем все обратные байстопы ближе к цене:
      

     //начинаем придвигать обратки после срабатывания четвертого прямого ордера
     if (N == 4 && sellstop4 == 0 && sellstop5 != 0)//в момент, когда  четвертый сэллстоп сработал, больше не наращиваем
     MODBUYSTOP = 1; //сэллстопы, а двинем все обратные байстопы ближе к цене:

     //начинаем придвигать обратки после срабатывания пятого прямого ордера
     //если с момента старта эксперта прошло более 15 минут и все 5 прямых ордеров сработали, придвинем обратные
     if (N == 5 && TimeCurrent() - StartTime > 900 && sellstop3 == 0 && sellstop5 == 0)//в момент, когда  все сэллстопы сработали, больше не наращиваем
     MODBUYSTOP = 1;//сэллстопы, а двинем все обратные байстопы ближе к цене:
     

        if (MODBUYSTOP == 1)//тут, собственно,двигаем имеющиеся обратные байстопы ближе к цене:
         {
       
          if (buystop_open1 > Ask + Step*Point)
           {
            buystop_open1 = Ask + Step*Point;
            OrderModify(buystop1,buystop_open1,0,0,0,Green);
           }
          if (buystop_open2 > Ask + 2*Step*Point)
           {
            buystop_open2 = Ask + 2*Step*Point;
            OrderModify(buystop2,buystop_open2,0,0,0,Green);
           }
          if (buystop_open3 > Ask + 3*Step*Point)
           {
            buystop_open3 = Ask + 3*Step*Point;
            OrderModify(buystop3,buystop_open3,0,0,0,Green);
           }
           
          if (buystop_open4 > Ask + 4*Step*Point)
           {
            buystop_open4 = Ask + 4*Step*Point;
            OrderModify(buystop4,buystop_open4,0,0,0,Green);
           } 
           
          if (buystop_open5 > Ask + 5*Step*Point)
           {
            buystop_open5 = Ask + 5*Step*Point;
            OrderModify(buystop5,buystop_open5,0,0,0,Green);
           } 
         }


        if (MODSELLSTOP == 1)//тут, собственно,двигаем имеющиеся обратные сэллстопы ближе к цене:
         {
       
           if (sellstop_open1 < Bid - Step*Point)
           {
            sellstop_open1 = Bid - Step*Point;
            OrderModify(sellstop1,sellstop_open1,0,0,0,Yellow);
           }
       
           if (sellstop_open2 < Bid - 2*Step*Point)
           {
            sellstop_open2 = Bid - 2*Step*Point;
            OrderModify(sellstop2,sellstop_open2,0,0,0,Yellow);
           }
           if (sellstop_open3 < Bid - 3*Step*Point)
           {
            sellstop_open3 = Bid - 3*Step*Point;
            OrderModify(sellstop3,sellstop_open3,0,0,0,Yellow);
           }
           
           if (sellstop_open4 < Bid - 4*Step*Point)
           {
            sellstop_open4 = Bid - 4*Step*Point;
            OrderModify(sellstop4,sellstop_open4,0,0,0,Yellow);
           }
           if (sellstop_open5 < Bid - 5*Step*Point)
           {
            sellstop_open5 = Bid - 5*Step*Point;
            OrderModify(sellstop5,sellstop_open5,0,0,0,Yellow); 
           }
           
         }










//////////////////////////////////

   return(0);
  }


     
    
    
    
    
    void TRAL()
    
    {
      int j;
      for(j = 0; j < OrdersTotal(); j ++)
       {
        OrderSelect(j, SELECT_BY_POS);
        if(OrderSymbol() != Symbol()) continue;
      
        if(OrderType() == OP_BUY && OrderProfit() > TrPr)//если профит ордера бай больше значения TrPr (в центах), тралим...
        {
         if (Bid - TS*Point > OrderStopLoss()) //если цена выше, чем на TS пп, чем СЛ ордера бай, переставим этот СЛ
         OrderModify(OrderTicket(),OrderOpenPrice(),Bid - TS*Point,0,0,CLR_NONE);
        }    
    
      
      
      
      
        if(OrderType() == OP_SELL && OrderProfit() > TrPr)//если профит ордера сэлл больше значения TrPr (в центах), тралим...
         {
          if (Ask + TS*Point < OrderStopLoss() || OrderStopLoss()==0) //если цена ниже, чем на TS пп, чем СЛ ордера сэлл, переставим этот СЛ
          OrderModify(OrderTicket(),OrderOpenPrice(),Ask + TS*Point,0,0,CLR_NONE);  
         } 
       }  
     }       
     
     
     
     
            