//+------------------------------------------------------------------+
//|                                                сетка пробная.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property version   "1.00"
#property strict

extern double Lots       = 0.1;
extern int    TakeProfit = 30;
extern int    Step       = 40;
extern int    Slippage   = 3;
extern int    Magic      = 1234;
extern int    RsiPeriod  = 7;
extern string comment    = "получается";
 int ticket, otype ;
 double rsi1, rsi2, TP, price;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
    if(Digits == 3 || Digits == 5)
    {
      TakeProfit *= 10;
      Step       *= 10;
    }
   return(0);
  }

//+------------------------------------------------------------------+
//| Expert tick function    выставляем первый ордер по индекатору iRSI ,определяемся в какую сторону будем открывать ордера                                       |
//+------------------------------------------------------------------+
int start()
{
    rsi1= iRSI(Symbol(),0,RsiPeriod,PRICE_CLOSE,1);  //--- вычисляем период входа по первой свече
    rsi2= iRSI(Symbol(),0,RsiPeriod,PRICE_CLOSE,2);  //--- вычисляем период входа по второй свече
    
//--- проверяем есть ли открытые ордера цена в данный момент имеет значение 0 ,1 свеча выше цены значит покупки
//---  2 свеча ниже цены значит продажи
    
    if (CountTredes() == 0 && rsi1 > rsi2)//--- если нет открытых ордеров и rsi1 > rsi2 то мы входим в покупку
     {     
                   //  Покупка
        ticket =  OrderSend (Symbol(),OP_BUY, Lots, Ask, Slippage,0,0,comment,Magic,0,Blue);// покупка
        if ( OrderSelect( ticket, SELECT_BY_TICKET ,MODE_TRADES))  // выбираем ордер из списка ордеров
         {
           TP = NormalizeDouble(Ask + TakeProfit * Point,Digits); // нормализуем тейк профит
           OrderModify(ticket,OrderOpenPrice(),0,TP,0,Blue);// 
         }
         
      }
         else
   if (CountTredes() == 0 && rsi1 < rsi2 )
   {
                  // Продажа
         ticket =  OrderSend (Symbol(),OP_SELL, Lots, Bid, Slippage,0,0,comment,Magic,0,Red);// покупка
        if ( OrderSelect( ticket, SELECT_BY_TICKET ,MODE_TRADES))  // выбираем ордер из списка ордеров
         {
           TP = NormalizeDouble(Bid - TakeProfit * Point,Digits); // нормализуем тейк профит
           OrderModify(ticket,OrderOpenPrice(),0,TP,0,Red);
         }
   
     }

   
    if (CountTredes() > 0) // проверяем есть ли уже ордера в рынке, далее необходимо выбрать последний ордер его тип
     {    // создаем переменную otype 
   
           // цена последнего ордера на покупку
      otype = FindLastOrderType();   //вычисляем тип последнего ордера
      
        if (otype == OP_BUY)
        {
             price = FindLastBuyPrice();   // 
           
                if ((price - Ask )/Point >= Step) // проверяем отступила ли цена от последнего ордера на степ для выставления следущего ордера
                {
                     OrderSend (Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, comment, Magic, 0, Blue); // открываем следующий ордер
             
                      ModifyOrders();// модифицируем тейк всех ордеров
                }
                
        }
              else if (otype == OP_SELL)
        {
              // цена последнего ордера на продажу
             price = FindLastSellPrice();//
             
                  if (( Bid - price)/Point >= Step) // проверяем отступила ли цена от последнего ордера на степ для выставления следущего ордера
                  {
                        OrderSend (Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, comment, Magic, 0, Red); // открываем следующий ордер
             
                        ModifyOrders();// модифицируем тейк всех ордеров
                  }                            
                                        
          }
     } 
      return(0);
     }
   
 //+------------------------------------------------------------------+
 //   пишем функцию модификации тейк профита она небудет возвращать пораметры поэтому присваиваем ей тип void
 
void ModifyOrders()

{
    double avg = 0; // переменную обьявляем для средней цены
    int count  = 0; // и переменная count для количиства ордеров имеющихся
    
   for(int i = OrdersTotal() -1; i>=0; i--) //пересчитываем ордера
    {
       if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES ))// выбираем ордер
       {
           if(OrderMagicNumber() == Magic && OrderSymbol() == Symbol())// проверяем наш ли это ордер
            {
                if (OrderType() == OP_BUY || OP_SELL)// проверяем тип ордера
                {
                  avg += OrderOpenPrice(); // выщитывем среднию цену всех открытых ордеров на OP_BUY или OP_SELL
                  count ++ ;              // считаем количество наших ордеров
                }
            }
       
       }
    
    }  // выщитываем среднюю цену открытых ордеров ,все сложеные цены разделим на количество ордеров
      avg = NormalizeDouble(avg / count,Digits);
      
   //--- перебераем ордера в цикле и выставляем им ТР
      
       for( int i = OrdersTotal() -1; i>=0; i--) //пересчитываем ордера
    {
       if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES ))// выбираем ордер
       {
           if(OrderMagicNumber() == Magic && OrderSymbol() == Symbol())// проверяем наш ли это ордер
            {
                if (OrderType() == OP_BUY )// проверяем тип ордера
                {
                    TP = NormalizeDouble(avg + TakeProfit * Point, Digits); // выставляем ТР OP_BUY ордерам
                    OrderModify(OrderTicket(), OrderOpenPrice(), 0, TP, 0, Yellow);// модифицируем ордера и выставляем ТР ордерам
                }
                else
                
                 if (OrderType() ==  OP_SELL)// проверяем тип ордера
                 {
                     TP = NormalizeDouble(avg - TakeProfit * Point, Digits); // выставляем ТР OP_SELL ордерам
                     OrderModify(OrderTicket(), OrderOpenPrice(), 0, TP, 0, Yellow);// модифицируем ордера и выставляем ТР ордерам
                 }
                 
            }
       
       }
    
    }   
}    
 
 
 //+------------------------------------------------------------------+
    
//--- описываем количество открытых ордеров в рынке (проверяем есть ли открытые ордера)
   int CountTredes()
   {
      int count = 0;  //--- обьявляем переменную count присваеваем ей значение 0
      
          for(int i=OrdersTotal()-1; i>=0; i--)                    //--- перещитываем количество ордеров
          {
             if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))        //--- выбираем ордер
             { 
                 if (OrderSymbol() == Symbol() &&  OrderMagicNumber() == Magic)  //--- проверяем наш ли это ордер
                 {  
                     if (OrderType() == OP_BUY || OrderType() == OP_SELL)   //--- проверяем рыночные ордера 
                       count++;  // перещитаем их на единичку  
                 }
               
             }
           
          } 
        return(count);  //--- возврашаем значение count на 0 
                                                               
    }
//+------------------------------------------------------------------+
 int FindLastOrderType() // пишем функцию проверки какой ордер выставлен в данный момент в рынке OP_BUY  или OP_SELL
{
    int oticket, ticketnumber = 0, OType=-1; // добовляем переменные для поиска наивышего тикета
        
     for (int i = OrdersTotal() -1; i>=0; i--)// выщитываем и находим последний ордер 
     {
        if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) // Выбирает ордер для дальнейшей работы с ним.
        {
           if (OrderSymbol() == Symbol() &&  OrderMagicNumber() == Magic)  //--- проверяем наш ли это ордер
           {
             oticket = OrderTicket();// переменная = ордер тикету.(OrderTicket) Возвращает номер тикета текущего выбранного ордера.
                 
              if (oticket > ticketnumber)// ищем самый старший тикет а раз oticket > ticketnumber ,а ticketnumber = 0 . то 
              {
                   ticketnumber = oticket;   //
                   OType = OrderType();      // переменная OType = типу нашего ордера   
              }
              
            }
            
         }
         
      }
      return(OType);
}       
//+------------------------------------------------------------------+
// пишем функцию проверки ордера по какой цене он куплен
//+------------------------------------------------------------------+
 double FindLastBuyPrice() // пишем функцию проверки по какой цене куплен последний ордер
 
{
    int oticket, ticketnumber = 0; // добовляем переменные для поиска цены последнего ордера
    double oprice=0;
        
     for (int i = OrdersTotal() -1; i>=0; i--)// выщитываем и находим последний ордер 
     {
        if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) // Выбирает ордер для дальнейшей работы с ним.
        {
           if (OrderSymbol() == Symbol() &&  OrderMagicNumber() == Magic && OrderType() == OP_BUY)  //--- проверяем наш ли это ордер и OrderType является ордером на покупку OP_BUY
           {
             oticket = OrderTicket();// переменная = ордер тикету.(OrderTicket) Возвращает номер тикета текущего выбранного ордера.
                 
              if (oticket > ticketnumber)// ищем самый старший тикет а раз oticket > ticketnumber ,а ticketnumber = 0 . то 
              {
                   ticketnumber = oticket;         //
                   oprice = OrderOpenPrice();      // цена последнего ордера по которой был открыт ордер 
                     
              }
              
            }
            
         }
         
      }
      return(oprice);
}       
//+------------------------------------------------------------------+
//     пишем функцию проверки ордера по какой цене он продан
//+------------------------------------------------------------------+
  double FindLastSellPrice() // пишем функцию проверки по какой цене куплен последний ордер
 
 {
    int oticket, ticketnumber = 0; // добовляем переменные для поиска цены последнего ордера
    double oprice=0;
        
     for (int i = OrdersTotal() -1; i>=0; i--)// выщитываем и находим последний ордер 
     {
        if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) // Выбирает ордер для дальнейшей работы с ним.
        {
           if (OrderSymbol() == Symbol() &&  OrderMagicNumber() == Magic && OrderType() == OP_SELL)  //--- проверяем наш ли это ордер и OrderType является ордером на покупку OP_BUY
           {
             oticket = OrderTicket();// переменная = ордер тикету.(OrderTicket) Возвращает номер тикета текущего выбранного ордера.
                 
              if (oticket > ticketnumber)// ищем самый старший тикет а раз oticket > ticketnumber ,а ticketnumber = 0 . то 
              {
                   ticketnumber = oticket;         //
                   oprice = OrderOpenPrice();      // цена последнего ордера по которой был открыт ордер 
                     
              }
              
            }
            
         }
         
      }
      return(oprice);
  }