Общий TP для разнонаправленных позиций - страница 2

 
Volodymyr Zubov #:

Там и формулы и код:

https://www.mql5.com/ru/code/9567

https://www.mql5.com/en/code/9567

код "ZeroLevel" то что я имел ввиду, надо будет его проверить.

 
//+------------------------------------------------------------------+
//|                                                   Zero_Level.mq4 |
//|                                         Copyright © 2007, Xupypr |
//+------------------------------------------------------------------+
// Функция вычисляющая уровни без убытка, на покупку, на продажу с учетом накопленных свопов.
double Zero_Level(string sy, int mn)
  {
   double ZeroLevel=0;
   double BuyLots=0;
   double SellLots=0;
   double BuyProfit=0;
   double SellProfit=0;
   double SellLevel;
   double BuyLevel;

   int Total=OrdersTotal();
   for(int i=Total-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {

         if(OrderSymbol()!=sy)
            continue;

         if(mn > 0)
            if(OrderMagicNumber() != mn)
               continue;

         if(OrderType()==OP_BUY)
           {
            BuyLots=BuyLots+OrderLots();
            BuyProfit=BuyProfit+OrderProfit()+OrderCommission()+OrderSwap();
           }
         if(OrderType()==OP_SELL)
           {
            SellLots=SellLots+OrderLots();
            SellProfit=SellProfit+OrderProfit()+OrderCommission()+OrderSwap();
           }
        }
     }

   double TickValue=MarketInfo(sy,MODE_TICKVALUE);
   if(BuyLots>0)
      BuyLevel=NormalizeDouble(MarketInfo(sy,MODE_BID)-(BuyProfit/(TickValue*BuyLots)*MarketInfo(sy,MODE_POINT)),(int)MarketInfo(sy,MODE_DIGITS));
   else
      BuyLevel=0;
   if(SellLots>0)
      SellLevel=NormalizeDouble(MarketInfo(sy,MODE_ASK)+(SellProfit/(TickValue*SellLots)*MarketInfo(sy,MODE_POINT)),(int)MarketInfo(sy,MODE_DIGITS));
   else
      SellLevel=0;
   if(BuyLevel>0)
      ZeroLevel=BuyLevel;
   if(SellLevel>0)
      ZeroLevel=SellLevel;

   return NormalizeDouble(ZeroLevel,_Digits);//Нормализовали полученную цену
  }
//--- End ---
 
Volodymyr Zubov #:

это какой-то ещё один код вы нашли (но это не подходит, так как он учитывает направления по отдельности).  Вот код, который был в предыдущей ссылке и он соответствует заданию:

//+------------------------------------------------------------------+

//|                                                    ZeroLevel.mq4 |

//|                                                          VadimVP |

//|                                                poluyan@fxmail.ru |

/*

 Скрипт поставит TakeProfit и StopLoss у открытых ордеров на текущем

 инструменте на уровень безубыточности.

 Расчет ведется только для ордеров текущего инструмента.

 Учитывает своп и комиссии. Работает при любых Digits.

 Точность +/- размер спреда.

 Об успешности изменений сообщит в диалоговом окне.

 Проверьте, включена ли опция "разрешить советнику торговать". 

*/

//| 

//+------------------------------------------------------------------+

#property copyright "VadimVP"

#property link      "poluyan@fxmail.ru"

 

//+------------------------------------------------------------------+

//| script program start function                                    |

//+------------------------------------------------------------------+

int start()

  {

   int kol=0;

   int kolOK=0;

   int i=0;

   double lots=0;

   double sum=0;

   double sum1=0;

   for (i=0; i<OrdersTotal(); i++)

   {

      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;

      if (OrderSymbol()!=Symbol()) continue;

      if (OrderType()==OP_BUY)

      {

       lots=lots+OrderLots();

       sum=sum+OrderLots()*OrderOpenPrice();

       sum1=sum1+OrderProfit( )+OrderSwap( )+OrderCommission( )  ; 

       kol=kol+1;

      }

      if (OrderType()==OP_SELL)

      {

       lots=lots-OrderLots();

       sum=sum-OrderLots()*OrderOpenPrice();

       sum1=sum1+OrderProfit( )+OrderSwap( )+OrderCommission( )  ;

       kol=kol+1;

      }

   }

   double zeroprice=0;

   if (lots!=0) zeroprice=sum/lots;

   zeroprice = (MathRound(zeroprice*MathPow(10,Digits)))/MathPow(10,Digits);



   

//-----

 Alert ("!!!  Пожалуйста дождитель окончания работы скрипта!");

 int res = 0;

 for (i=0; i<OrdersTotal(); i++)

   {

      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;

      if (OrderSymbol()!=Symbol()) continue;

        

         if (sum1>0) 

         { if (OrderType()==OP_BUY) {if (zeroprice == OrderTakeProfit()) res=res+1; else { if (OrderModify(OrderTicket(),0,OrderStopLoss(),zeroprice,0,CLR_NONE)) res = res+1;}    }

           if (OrderType()==OP_SELL){if (zeroprice == OrderStopLoss()) res=res+1; else { if (  OrderModify(OrderTicket(),0,zeroprice,OrderTakeProfit(),0,CLR_NONE)) res = res+1;}     } }

         if (sum1<0) 

         { if (OrderType()==OP_BUY) {if (zeroprice == OrderStopLoss()) res=res+1; else { if (  OrderModify(OrderTicket(),0,zeroprice,OrderTakeProfit(),0,CLR_NONE)) res = res+1;} }

           if (OrderType()==OP_SELL){if (zeroprice == OrderTakeProfit()) res=res+1; else { if (OrderModify(OrderTicket(),0,OrderStopLoss(),zeroprice,0,CLR_NONE)) res = res+1;}    } } 

          

   }

 Alert ("***************************************************");

 Alert ("Цена безубыточности "+DoubleToStr(zeroprice,Digits));

 if (kol==res) Alert ("Все ордера успешно изменены! Точка безубыточности выставлена. ОК!"); else Alert ("!!! Внимание!!! Не удалось изменить - " +(kol-res)+ " ордера из "+kol+" имеющихся");

 Alert ("************ информация от ZeroLevel script ************");

 

//------



   return(0);

  }
 
Konstantin Kulikov #:

это какой-то ещё один код вы нашли (но это не подходит, так как он учитывает направления по отдельности).  Вот код, который был в предыдущей ссылке и он соответствует заданию:

Тот код, который я выложил скопировал из своего советника. Код оригинала ZeroLevel переделывал под свои условия, но смысл одинаковый.