//+------------------------------------------------------------------+
//|                                Безубыток_SL_and_X_pips_V_1_1.mq4 |
//|                                                     Vorchunozavr |
//|                                                                  |
//+------------------------------------------------------------------+
/*--  Скрипт считает безубыток по сетке ордеров. Учитывается своп и комиссия.
      Если сетка в плюсе, он предлагает выставить SL для всех ордеров.
      Если сетка в минусе, скрипт предлагает выставить TP для всех ордеров.
      X_Pips - это размер (в пипсах), на который мы хотим превысить безубыток.
      Buy = true - это переключатель, если true - считаем Buy, если false - Sell.
      Ещё, скрипт пишет уровень БУ, общий объём сетки (в лотах, конечно) и профит, который мы получим по нашим SL или TP.
*/
//+------------------------------------------------------------------+
#property copyright "Vorchunozavr"
#property link      ""
#property show_inputs
#include <WinUser32.mqh>

extern int  X_Pips = 1;
extern bool Buy    = true;

string title, lossfree, lossfree_2, msg, str_lots, prof;
int otype;
double BU_1, BU_2;
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
{
   if (OrdersTotal() == 0)
   {
      Alert("Ордеров нет!");
      return;
   }
   if (Buy == true && CountBuy() == 0)
   {
      Alert("Ордеров BUY нет!");
      return;  
   }
   if (Buy == false && CountSell() == 0)
   {
      Alert("Ордеров SELL нет!");
      return;
   }  
   double lots = 0,
          sum = 0,
          price,
          cost = 0;
   if (Buy == true) otype = 0;
   else otype = 1;
   
   for(int i = OrdersTotal()-1; i >= 0; i--)
   {  
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderSymbol() != Symbol()) continue;
         {
            if (OrderType() == OP_BUY && Buy == true)
            {
               lots = lots + OrderLots();                
               sum = sum + OrderOpenPrice()*OrderLots(); 
               cost = cost + OrderSwap() + OrderCommission(); 
            }
            if (OrderType() == OP_SELL && Buy == false)
            {
               lots = lots - OrderLots();               
               sum = sum - OrderOpenPrice()*OrderLots(); 
               cost = cost + OrderSwap() + OrderCommission(); 
            }
         }
      }
   }
   if (lots != 0) price = sum/lots;                      
                                       
   title = "Уровень безубытка SL + X";
   lots = MathAbs(lots);
   prof = DoubleToStr(X_Pips*lots*MarketInfo(Symbol(), MODE_TICKVALUE), 2); 
   str_lots = DoubleToStr(lots, 2);
      
   if (price > 0)
   {
      if (otype == 0)
      {
         BU_1 = NormalizeDouble(price - cost/lots/MarketInfo(Symbol(), MODE_TICKVALUE)*Point, Digits); 
         lossfree = " = " + DoubleToStr(BU_1, Digits);
         BU_2 = NormalizeDouble(BU_1 + X_Pips*Point, Digits);
         lossfree_2 = DoubleToStr(BU_2, Digits);
         if (Bid <= BU_1)
         {
            msg = "Уровень безубытка для " + Symbol() + lossfree + "     " + "\n" +
                  "Безубыток +" + X_Pips + "pips" + " = " + lossfree_2 + "\n" +
                  "Общий объём = " + str_lots + "     " + "\n" +
                  "На " + lossfree_2 + " профит составит " + prof + " USD" + "\n" +
                  "Цена ниже безубытка" + "     " + "\n" + 
                  "Может установить TakeProfit для всех ордеров?";
            if (MessageBox(msg, title, MB_YESNO | MB_ICONINFORMATION) != IDYES) return;
            if (!IsTradeAllowed()) Sleep(500);
            SetTP(otype, BU_2);

         }
         else
         {
            msg = "Уровень безубытка для " + Symbol() + lossfree + "     " + "\n" +
                  "Безубыток +" + X_Pips + "pips" + " = " + lossfree_2 + "\n" +
                  "Общий объём = " + str_lots + "     " + "\n" +
                  "На " + lossfree_2 + " профит составит " + prof + " USD" + "\n" +
                  "Установить SL для всех ордеров?";
            if (MessageBox(msg, title, MB_YESNO | MB_ICONINFORMATION) != IDYES) return;
            if (!IsTradeAllowed()) Sleep(500);
            SetSL(otype, BU_2);
         }         
      }
      
      if (otype == 1)
      {
         BU_1 = NormalizeDouble(price + cost/lots/MarketInfo(Symbol(), MODE_TICKVALUE)*Point, Digits);
         lossfree = " = " + DoubleToStr(BU_1, Digits);
         BU_2 = NormalizeDouble(BU_1 - X_Pips*Point, Digits);
         lossfree_2 = DoubleToStr(BU_2, Digits);
         if (Ask >= BU_2)
         {
            msg = "Уровень безубытка для " + Symbol() + lossfree + "     " + "\n" +
                  "Безубыток +" + X_Pips + "pips" + " = " + lossfree_2 + "\n" +
                  "Общий объём = " + str_lots + "     " + "\n" +
                  "На " + lossfree_2 + " профит составит " + prof + " USD" + "\n" +
                  "Цена выше безубытка" + "     " + "\n" + 
                  "Может установить TakeProfit для всех ордеров?";
            if (MessageBox(msg, title, MB_YESNO | MB_ICONINFORMATION) != IDYES) return; 
            if (!IsTradeAllowed()) Sleep(500);
            SetTP(otype, BU_2);

         }
         else
         {
            msg = "Уровень безубытка для " + Symbol() + lossfree + "     " + "\n" +
                  "Безубыток +" + X_Pips + "pips" + " = " + lossfree_2 + "\n" +
                  "Общий объём = " + str_lots + "     " + "\n" +
                  "На " + lossfree_2 + " профит составит " + prof + " USD" + "\n" +
                  "Установить SL для всех ордеров?";
            if (MessageBox(msg, title, MB_YESNO | MB_ICONINFORMATION) != IDYES) return;
            if (!IsTradeAllowed()) Sleep(500);
            SetSL(otype, BU_2);
         }               
      }
   }
   return(0);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
void SetSL(int otype, double BU_2)
{
   for(int i=OrdersTotal()-1; i>=0; i--)
   {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderSymbol() != Symbol()) continue;
         {
            if (OrderType() == otype)
            {
               if (NormalizeDouble(OrderStopLoss(), Digits) != BU_2)
                  OrderModify(OrderTicket(), OrderOpenPrice(), BU_2, OrderTakeProfit(), 0, CLR_NONE);
            }
         }
      }
   }     
}
//+------------------------------------------------------------------+
void SetTP(int otype, double BU_2)
{
   for(int i=OrdersTotal()-1; i>=0; i--)
   {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderSymbol() != Symbol()) continue;
         {
            if (OrderType() == otype)
            {
               if (NormalizeDouble(OrderTakeProfit(), Digits) != BU_2)
                  OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss(), BU_2, 0, CLR_NONE);
            }
         }
      }
   }     
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
int CountBuy()
{
   int count = 0;
   
   for(int i = OrdersTotal()-1; i >= 0; i--)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if(OrderSymbol() == Symbol() && OrderType() == OP_BUY)
            count++;
      }
   }
   return(count);
}
//+------------------------------------------------------------------+
int CountSell()
{
   int count = 0;
   
   for(int i = OrdersTotal()-1; i >= 0; i--)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if(OrderSymbol() == Symbol() && OrderType() == OP_SELL)
            count++;
      }
   }
   return(count);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+