//+-----------------------------------------------------------------+
//|                                                   Советник 7.mq4 |
//|                                       Copyright © 2011, К.Моржов | 
//|                                                  k-morzhov@ya.ru |
//+------------------------------------------------------------------+

// добавлены параметры :

extern int Magic = 777;             // магик в разных окнах - ставь разный, тогда будут (должны) работать независимо

string Line = "1";                  // когда провел горизонт. линию, назвал ее "1" - линия откуда стартуем

int DELTA = 100;                    // команду к старту даем, когда цена (Бид) приблизится к линии на 3 или менее пипсов
                                    //  с любой стороны линии !


extern int TRADE = 1;               // торгуем, если ноль - не торгуем

extern int KUDA = 1;                // 1 - значит бай, если 2 - сэлл

extern double Lots = 0.1;           // а это лот )

extern int X = 5;                   // скока ступеней (сейчас поддерживается до 50 ступеней включительно)

extern int STEP = 100;              // шаг в пп.

extern int TP = 100;                // тейк в пп.

extern int T = 1;                   // таймаут в минутах


double StopBuy, StopSell;
int D;
int PUSK;



string text, count;
int i,type,err;
int Slip = 50;
int START;

double Start;
double Price;
double Take;
int sell_ticket,buy_ticket;
int TYP;
double PR,TAKE,LOT;
int NEW;

datetime TIME;
int  TotalNumber;
string com, COM, close_time;


int start()
  {
  
         if (START < 1)        // преведствие изготовителя и все такое )))
          {
   
             close_time = Symbol()+ "." + Magic;
             
             string char[256]; int i;
             for (i = 0; i < 256; i++) char[i] = CharToStr(i);
             Alert
               (
                   char[67]+char[111]+char[112]+char[121]+char[114]+char[105]+char[103]+char[104]
                   +char[116]+char[32]+char[169]+char[32]+char[50]+char[48]+char[49]+char[49]+char[44]+
                   char[32]+char[202]+char[46]+char[204]+char[238]+char[240]+char[230]+char[238]+char[226]
                );
           
             Alert (Symbol(),"советниг запущен !");
             START = 1;
             ObjectDelete("Level_1");
             
             ObjectCreate("Level_1", OBJ_LABEL,0,0,0);
             ObjectSet("Level_1",OBJPROP_XDISTANCE,10);
             ObjectSet("Level_1",OBJPROP_YDISTANCE,40);
             
             
             
             // задаем массив  из 50 членов (шоб хватило тебе) для тикетов ордеров
                double ticket[50];
             
           
             
            }
  
  
  
  
  
  
  
  
          if (TRADE == 0)    // если торговать не велено, курим...
             {
             
                 text = "не торгуем-с !" ;         // текущий профит
                 ObjectSetText("Level_1",text,30,"Arial",Red); 
             
                 return(0);
       
             }
  
  
  
                     // разберемся с линией старта :
                     
                     if (ObjectFind(Line) != -1 ) // если линия на графике есть, то :
                        { 
                      
                            double LinePrice = NormalizeDouble(ObjectGet(Line,OBJPROP_PRICE1),Digits);  // смотрим, на какой цене она стоит,
  
                            if (KUDA == 1)
                            ObjectSet("1",6,Blue);   // покрасим ее в синий - от нее будем баить, чтоб видеть это наглядно
  
                            if (KUDA == 2)
                            ObjectSet("1",6,Red);   // покрасим ее в красный - от нее будем сэллить
                        }
                        
                        
                        
                    // даем отмашку при пересечении линии на запуск экспа :
                    
                    if (MathAbs(Bid - LinePrice)/Point <= DELTA && PUSK < 1) // как тока цена от линии в пределах ДЕЛЬТА пипсов, стартуем !
                       PUSK = 1;
                            
                  if(PUSK == 1)
                  
                     {
                              // рисуем надпись "ПУСК":
                              ObjectCreate("PUSK", OBJ_LABEL,0,0,0);
                              ObjectSet("PUSK",OBJPROP_XDISTANCE,180);
                              ObjectSet("PUSK",OBJPROP_YDISTANCE,30);
                        string pusk = " пуск !!! ";
                        ObjectSetText("PUSK",pusk,18,"Arial",Blue);
                     
                     
                     }        
                  if(PUSK == 0)
                  
                     ObjectDelete("PUSK");
                                     
                   
                   
                            
                  TotalNumber = 0;  // подсчет ордеров эксперта в работе
                  for(i=0; i<OrdersTotal(); i++)
              
                     {  
                        if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
                        if (OrderSymbol() != Symbol()) continue;
                        if (OrderMagicNumber() != Magic) continue;           
                        // подсчет ордеров :
                        TotalNumber++;
                        //Print("TotalNumber",TotalNumber);
                     } 
  
  
  
           // если торговать можно, торгуем
                 if (KUDA == 1)
                 text = "Баим !" ; 
                 if (KUDA == 2)
                 text = "Сэллим !" ;
                 
                         
                 ObjectSetText("Level_1",text,18,"Arial",Yellow); 
  
 
        
        
        
        
        
        
       
        
        
          
          
          

               
    
 
     if (TotalNumber > 0)
         {
                   // этот кусочег кода следит за закрытием ордеров по тейку и ставит новые взамен закрытых :
                  int j; 
                  for(j=1; j <= 50; j++)   // ищем наши тикеты среди закрытых в истории :
                  
                     {
                       
                     
                       if ( OrderSymbol() != Symbol() || ticket[j] == 0 || OrderSelect(ticket[j],SELECT_BY_TICKET,MODE_HISTORY) == false || OrderCloseTime() == 0) continue; // если такого нету тикета в истории, значит еще не закрылся он
                     
                       // если обнаружен СВЕЖЕзакрытый ордер в истории, то :
                       
                       if (OrderCloseTime() > GlobalVariableGet(close_time) && (OrderComment() == DoubleToStr(OrderMagicNumber(),0)+"[tp]" || OrderComment() == DoubleToStr(OrderMagicNumber(),0))&& TotalNumber > 0 && OrderSymbol() == Symbol()) // если закрылся первый ордер, сносим отложки и сразу на забор на время t 
                          {
                          
                            GlobalVariableSet(close_time,OrderCloseTime());
                          
                            Alert ("обнаружен закрытый первый ордер !");
                            DELETE();
                            
                            TotalNumber = 0;  // подсчет ордеров эксперта в работе
                            for(i=0; i<OrdersTotal(); i++)
              
                              {  
                                 if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
                                 if (OrderSymbol() != Symbol()) continue;
                                 if (OrderMagicNumber() != Magic) continue;           
                                 // подсчет ордеров :
                                 TotalNumber++;
                                 //Print("TotalNumber",TotalNumber);
                              } 
                              
                            if (TotalNumber < 1 && (TIME < TimeCurrent() - 5 || TIME == 0))
                            TIME = TimeCurrent() + T*60;
                            if (TotalNumber < 1)
                              {
                                Alert("удалили отложки");
                                Alert("включаем таймер !");
                            
                            // рисуем счетчик времени :
                              ObjectCreate("COUNTER", OBJ_LABEL,0,0,0);
                              ObjectSet("COUNTER",OBJPROP_XDISTANCE,150);
                              ObjectSet("COUNTER",OBJPROP_YDISTANCE,20);
                            
                              }    
          
                          }
                       if (OrderComment() == DoubleToStr(OrderMagicNumber(),0)+"[tp]" || OrderComment() == DoubleToStr(OrderMagicNumber(),0)) continue;
                       
                       if (OrderType() == OP_SELL)        // смотрим, шо за ордер это был
                       TYP = 3;
                       if (OrderType() == OP_BUY)         // смотрим, шо за ордер это был
                       TYP = 2;
                       PR = OrderOpenPrice();    // на каком уровне он стоял 
                       TAKE = OrderTakeProfit(); // где его тейк
                       LOT = OrderLots();        // каков его лот
                       
                       
                       // если закрылся ордер, ставим новый на его место :
                       if ( OrderProfit() > 0)
                       NEW = OrderSend(Symbol(),TYP,LOT,PR,1,0,TAKE,NULL,Magic,0,CLR_NONE);
                       int er = GetLastError();
                       if (er > 0)
                       Print("ошибко № ",er, "не могу новый вместо закрытого! ");
                       
                       
                       if (NEW > 0)       // если новый встал удачно ордер, то :
                       ticket[j] = NEW;   // все ништяк и мы загоним уже его тикет в массив
                       
                      
                     }
                  
             }
      
                    if (TIME > 0 && TotalNumber < 1)
                       {
                       
                         
                          count = DoubleToStr(TIME - TimeCurrent(),0);
                          ObjectSetText("COUNTER",count,30,"Arial",Red); 
                       
                           if (TimeCurrent() > TIME)
                           Alert("ПОРА ПО НОВОЙ !");
                         
                       
                       
                       }     
              
            
            
            
            if (TotalNumber < 1 && (TimeCurrent() > TIME || TIME == 0) && PUSK > 0)  //

    {
             
               if (KUDA == 1)              // запомним цену старта бай :
             
               Start = Ask;
            
               if (KUDA == 2)              // запомним цену старта сэлл :
           
               Start = Bid;
               
               ArrayInitialize (ticket,0);        // обнуляем все тикеты 
               
               
              
               //выставление ордерофф :   
           
                  int n; 
                  for(n=1; n <= X; n++)   // выставим ордера :
                     {
       
                         // расчет цен :
                         if (KUDA == 1)
                         
                            {
                            
                              if (n>1)
                              Price = NormalizeDouble((Ask - (n-1)*STEP*Point),Digits);
                              Take = Price + TP*Point;
                         
                            }
                         if (KUDA == 2) 
                         
                            { 
                              if (n>1)  
                              Price = NormalizeDouble((Bid + (n-1)*STEP*Point),Digits);
                              Take = Price - TP*Point;                         
                              
                            }  
                 
                         if (KUDA == 1)
                            {
                             if (n==1 && IsTradeAllowed())
                             buy_ticket = OrderSend(Symbol(),OP_BUY,Lots,Ask,Slip,0,Ask + TP*Point,DoubleToStr(Magic,0),Magic,0,Blue);
                             if (buy_ticket == -1)
                             return(0);
                             
                             
                        
                             if (n>1 && IsTradeAllowed())
                               
                                 buy_ticket = OrderSend(Symbol(),OP_BUYLIMIT,Lots,Price,0,0,Take,NULL,Magic,0,Blue);
                             
                             if (buy_ticket > 0)         // запоминаем тикеты в массив
                             ticket[n] = buy_ticket;
                           
                             Print("бай ",ticket[n]);
                         
                            }
                            
                          if (KUDA == 2)
                            {  
                                 if (n==1 && IsTradeAllowed())
                                 sell_ticket = OrderSend(Symbol(),OP_SELL,Lots,Bid,Slip,0,Bid - TP*Point,DoubleToStr(Magic,0),Magic,0,Red);
                            
                                 
                                 
                                     
                                 if (n>1 && IsTradeAllowed())
                               
                                 sell_ticket = OrderSend(Symbol(),OP_SELLLIMIT,Lots,Price,0,0,Take,NULL,Magic,0,Red);   
                                 if (sell_ticket == -1)
                                 return(0);  
                               
                                 if (sell_ticket > 0)
                                    ticket[n] = sell_ticket; // запоминаем тикеты в массив
                            
                                  Print("сэлл ",ticket[n]);
                         
                                                                                        
                             }
         
                
                     }
                     
                     ObjectDelete("COUNTER");  // удалим счетчик 
    
      }
     
     
    
    return(0);
  }



      void DELETE()          // вынесенная ф-ция - удаляем отложки пока не останется ноль ордеров ваще
      
           {
             while(OrdersTotal() > 0) // пока хоть один ордер текущей серии есть :
               { 
                   for(int y = 0; y < OrdersTotal(); y ++)// изучаем все ордера по очереди
                       {
                         OrderSelect(y, SELECT_BY_POS);
                         if(OrderSymbol() != Symbol()) continue; // 
            
                         if(OrderType() == OP_SELLLIMIT) // сносим отложку
                            OrderDelete(OrderTicket());
                          
                         if(OrderType() == OP_BUYLIMIT)  // сносим отложку
                            OrderDelete(OrderTicket());
                       }  
                
                  TotalNumber = 0;  // подсчет ордеров эксперта в работе
                  for(i=0; i<OrdersTotal(); i++)
              
                     {  
                        if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
                        if (OrderSymbol() != Symbol()) continue;
                        if (OrderMagicNumber() != Magic) continue;           
                        // подсчет ордеров :
                        TotalNumber++;
                        //Print("TotalNumber",TotalNumber);
                     } 
                
                
                
                
                
                       
                                           
                }  
           
           
           }

