Проблемы с нахождением точки безубытка.

 

Доброго времени суток. Проблема у меня возникла следующая: есть открытые позиции Sell, мне нужно найти такой объём следующей позиции Sell, чтобы точка безубытка была выше уровня в -120 пунктов от текущей цены, но почему то когда я рассчитываю функцию, точка безубытка опускается все ниже. Не могу понять в чем проблема(


OnTick()
{
  double llot=0.01;
  while(Bid(_Symbol)-120*_Point>Point_Profit_S_test(llot))
           llot=llot+0.01;
           OpenSell(llot,2);
}
//+------------------------------------------------------------------+
double Point_Profit_S_test(double lot1)
  {
   double rez=0.0;
   int kol=0; // количество учета цены открытия позиции на 1 лот объемом 0.01
   double kom=0.0; // своп позиций
   double lot2=lot1;

   for(int j=PositionsTotal()-1; j>=0; j--)
     {
      double lot=0.0;
      if(m_position.SelectByIndex(j))
         if(m_position.PositionType()==POSITION_TYPE_SELL)
           {
            lot=m_position.Volume();
            kom=kom+m_position.Swap();
            if(lot<0.02)
              {
               rez=rez+m_position.PriceOpen();
               kol++;
              }
            if(lot>0.01)
               while(lot>0.0)
                 {
                  rez=rez+m_position.PriceOpen();
                  lot=lot-0.01;
                  kol++;
                 }
           }
     }

   while(lot2>0.0)
     {
      rez=rez+Bid(_Symbol);
      lot2=lot2-0.01;
      kol++;
     }
   rez=rez/((double)kol);
   rez=rez-((volume_S()+lot1)*100*2)*_Point+(kom>0.0 ? (kom*100*_Point)/((volume_S()+lot1)*100) : 0.0) + ((AC1>0.0 || AC1<0.0) ? (((AC1)*100.0*_Point)/((fmax(volume_B(),volume_S())+lot1)*100.0)) : 0.0);
//AC1- учитывает прибыль или убыток уже закрывшихся позиций пока не достигнут необходимый профит
//((volume_S()+lot1)*100*2)*_Point - комиссия которую берет мой брокер на позицию (Объем лота *2)
   Comment("S..." + rez);
   return(rez);
  }
//+------------------------------------------------------------------+
 

Использую такую функцию поиска точки безубытка открытых позиций, работает много лет без вопросов.

//+---------------------------------------------------------------------+
//|                                                   Zero_Level.mq5    |
//|                                         Copyright © 2007, Xupypr 	|
//|            		  MQL5 Version Copyright © 2024, Boshetunmay 	|
//+---------------------------------------------------------------------+
// Функция вычисляющая уровни безубытка, на покупку, на продажу с учетом накопленных свопов.
double Zero_Level(string symb="", int op=-1, int mn=-1)
  {
   if(symb=="0")
      symb=_Symbol;
   double TickValue=SymbolInfoDouble(symb,SYMBOL_TRADE_TICK_VALUE);
   double BuyLots=0;
   double SellLots=0;
   double BuyProfit=0;
   double SellProfit=0;
   double BuyLevel=0;
   double SellLevel=0;
   int Total=PositionsTotal();
   for(int i=Total-1; i>=0; i--)
     {
      if(po.SelectByIndex(i))
        {
         if(po.Symbol()!=symb)
            continue;
         if(po.Magic()!=mn)
            continue;
         if(po.PositionType()==OP_BUY && (op<0 || po.PositionType()==op))
           {
            BuyLots+=NormalizeDouble((po.Volume()),2);
            BuyProfit+=NormalizeDouble((po.Profit()+(po.Commission()*2)+po.Swap()),2);
           }
         if(po.PositionType()==OP_SELL && (op<0 || po.PositionType()==op))
           {
            SellLots+=NormalizeDouble((po.Volume()),2);
            SellProfit+=NormalizeDouble((po.Profit()+(po.Commission()*2)+po.Swap()),2);
            //   Print(SellLots);
            //   Print(SellProfit);
            //   Print(TickValue);
           }
        }
     }
   double Price=0;

   if(BuyLots>0)
      BuyLevel=NormalizeDouble(SymbolInfoDouble(symb,SYMBOL_BID)-(BuyProfit/(TickValue*BuyLots)*SymbolInfoDouble(symb,SYMBOL_POINT)),(int)SymbolInfoInteger(symb,SYMBOL_DIGITS));
   else
      BuyLevel=0;
   if(SellLots>0)
      SellLevel=NormalizeDouble(SymbolInfoDouble(symb,SYMBOL_ASK)+(SellProfit/(TickValue*SellLots)*SymbolInfoDouble(symb,SYMBOL_POINT)),(int)SymbolInfoInteger(symb,SYMBOL_DIGITS));
   else
      SellLevel=0;
   if((BuyLots-SellLots)>0)
      Price=NormalizeDouble(SymbolInfoDouble(symb,SYMBOL_BID)-((BuyProfit+SellProfit)/(TickValue*(BuyLots-SellLots))*SymbolInfoDouble(symb,SYMBOL_POINT)),(int)SymbolInfoInteger(symb,SYMBOL_DIGITS));
   if((SellLots-BuyLots)>0)
      Price=NormalizeDouble(SymbolInfoDouble(symb,SYMBOL_ASK)+((BuyProfit+SellProfit)/(TickValue*(SellLots-BuyLots))*SymbolInfoDouble(symb,SYMBOL_POINT)),(int)SymbolInfoInteger(symb,SYMBOL_DIGITS));

//   Print(SellLevel);
   return(Price);
  }
 
Volodymyr Zubov #:

Использую такую функцию поиска точки безубытка открытых позиций, работает много лет без вопро

что такое op и mn?

 
и не совсем понимаю зачем вообще вычислять профит каждой позиции? какую роль он играет? ведь у нас есть цены открытия и объём позиций
 

Понял смысл, но как по мне вариант с расчётом из таких составляющих как цены открытия и обьем лота получше будет, просто не могу понять где ошибка

 
Anton Novokhatskii:

Доброго времени суток. Проблема у меня возникла следующая: есть открытые позиции Sell, мне нужно найти такой объём следующей позиции Sell, чтобы точка безубытка была выше уровня в -120 пунктов от текущей цены, но почему то когда я рассчитываю функцию, точка безубытка опускается все ниже. Не могу понять в чем проблема(

У вас два условия: если lot > 0.02 и второе условие если lot > 0.01

А если lot == 0.01 тогда что делать???

Невнимательно посмотрел.

По любому, зачем такие или какие то другие условия тут нужны? Просто собираем объёмы, цены открытия и из них вычисляем среднюю цену открытия. А потом считаем где будут безубыток при указанном объёме позиции…

 
Alexey Viktorov #:

У вас два условия: если lot > 0.02 и второе условие если lot > 0.01

А если lot == 0.01 тогда что делать???

1 условие - lot<0.02

2 условие - lot>0.01

 
пока объём всех лотов равен 0.01 то все нормально, но периодически если нужно открыть лот бОльшим объёмом - точка безубытка почему то перестает правильно считаться
 
Anton Novokhatskii #:

1 условие - lot<0.02

2 условие - lot>0.01

Я уже увидел, но пока правил свою ошибку, вы процитировали неправильную версию…

 
Alexey Viktorov #:

У вас два условия: если lot > 0.02 и второе условие если lot > 0.01

А если lot == 0.01 тогда что делать???

Невнимательно посмотрел.

По любому, зачем такие или какие то другие условия тут нужны? Просто собираем объёмы, цены открытия и из них вычисляем среднюю цену открытия. А потом считаем где будут безубыток при указанном объёме

я рассчитываю среднюю цену открытия на каждую позицию объёмом 0.01, и просто если объём больше, то делю его на равные доли по 0.01 и вычисляю среднюю))))

 
Anton Novokhatskii #:

я рассчитываю среднюю цену открытия на каждую позицию объёмом 0.01, и просто если объём больше, то делю его на равные доли по 0.01 и вычисляю среднюю))))

Нет необходимости делить объёмы. Ведь в рынке в данный момент столько сколько есть. И все эти позиции всем объёмом дают прибыль или убыток. Вот ко всему объёму и надо колдовать дополнение…