Функция Расчёта Цены Безубытка

 

Буду благодарен если найдёте ошибки.

double Zero_Point_Price( int mn, string sym )
{
   double average_price_buy = 0 ;
   double average_price_sell = 0 ;
   double price = 0 ;
   double spreads = 0;
   double sum_buy = 0 ;
   double sum_sell = 0 ;
   double aver_lot = 0;
   int orders_total = 0 ;
   double Spread_in_pips = 0;
   
   double SPREAD = MarketInfo( sym, MODE_SPREAD )*MarketInfo( sym, MODE_POINT );
   
   int i;
   for( i = OrdersTotal()-1; i >= 0 ; i--)
   {
      OrderSelect( i, SELECT_BY_POS,MODE_TRADES);
      if(OrderMagicNumber() == mn && sym==OrderSymbol())
      {
         orders_total++;
         Spread_in_pips += SPREAD*( OrderLots() * 10 );
         if( OrderType() == OP_BUY )sum_buy += OrderLots();
         if( OrderType() == OP_SELL )sum_sell += OrderLots();
      }
   }
   
   for( i = OrdersTotal()-1; i >= 0 ; i--)
   {
      OrderSelect( i, SELECT_BY_POS,MODE_TRADES);
      if(OrderMagicNumber() == mn && sym==OrderSymbol())
      {
         if( OrderType() == OP_BUY )average_price_buy+= (OrderOpenPrice() - SPREAD)*( OrderLots()/sum_buy ) ;
         if( OrderType() == OP_SELL )average_price_sell+= OrderOpenPrice()*( OrderLots()/sum_sell ) ;
      }
   }
   
   if(orders_total > 0 )
   {
      if(sum_buy > 0 && sum_sell == 0 )return( average_price_buy );
      if(sum_buy == 0 && sum_sell > 0 )return( average_price_sell );
      
      if( sum_buy > sum_sell )
      {
         aver_lot = sum_buy - sum_sell ;
         price = average_price_buy + (average_price_buy - average_price_sell) + Spread_in_pips/(aver_lot*10); 
      }
      else
      {
         aver_lot = sum_sell - sum_buy ;
         if(sum_sell>0)
         {
            price = average_price_sell - ( average_price_buy - average_price_sell ) - Spread_in_pips/(aver_lot*10);
         }
      }
   }
   return( price );
}
 
int start()
  {
//----
      double SLots=0,Lots=MarketInfo(Symbol(),MODE_MINLOT);
      double Price=0;
      double TotalLots=0;
      double Seredina=0;
      for (int i=0;i<OrdersTotal();i++)//подсчет овщего объема всех сделок на БАЙ, количества минимальных лотов
      {
         if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true&& OrderSymbol()==Symbol()&&OrderType()<=1)
         {  
            SLots=SLots+OrderLots();
            Price=Price+OrderOpenPrice()*(OrderLots()/Lots);
            TotalLots=TotalLots+(OrderLots()/Lots);
         }
      }
      Seredina=NormalizeDouble(Price/(TotalLots),Digits);//тейк профит по средней цене
      ObjectCreateTrend("Sredina",OBJ_HLINE,0,Time[0],Seredina,0,0,Lime,0);//рисует красную лиию
//----
   return(0);
  }
 

и Ваша функция не правильная, и моя тоже...

И ещё куча целая по запросу "безубыток"  тоже не правильные...

 

Парни а зачем так сложно?

int ProfitPoint(int ticket)
{ if(OrderSelect(ticket,SELECT_BY_TICKET))
     return(OrderProfit()/(OrderLots());
  else return(EMPTY_VALUE);
}

узнаём вот так сколько пунктов профита имеет каждый ордер (причём профит выдаёться даже если он отрицательный,

главное чтоб результат не был равен пустому значению EMPTY_VALUE),

затем сумируем все профиты в пунктах по всем ордерам,

полученный результат прибавляем к биду и вуаля вот он уровень безубытка.

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

 
StatBars:

и Ваша функция не правильная, и моя тоже...

И ещё куча целая по запросу "безубыток" тоже не правильные...

Почему? Объясните.
 

а смысл такой функции ?

если есть ордера только по одному инструменту, то да можно что-то посчитать, а есть нет, то посчитать нереально..

да вроде и считать-то особо нечего.. получаем суммарный лот (лоты баев прибавляем, селов - отнимаем), исходя из стоимости пункта и суммарного лота

получаем абсолютное значение изменения депозита при изменении цены на 1 пункт (Ц), далее вычисляем суммарную профитность (П) ордеров с учетом свопов и комиссий.. далее делим П на Ц и получаем количество пунктов - расстояние уровня безубытка от текущей цены..соответственно, если значение больше нуля, то из текущей цены вычитаем полученные пункт, меньше - прибавляем..

примерно так..

 
zhuki:
Почему? Объясните.

Потому что когда много разных открытых ордеров при Ask/Bid равной той что выдаёт одна из функций эквити не равно балансу...
 
Urain:

Парни а зачем так сложно?

узнаём вот так сколько пунктов профита имеет каждый ордер (причём профит выдаёться даже если он отрицательный,

главное чтоб результат не был равен пустому значению EMPTY_VALUE),

затем сумируем все профиты в пунктах по всем ордерам,

полученный результат прибавляем к биду и вуаля вот он уровень безубытка.

А если есть BUY и SELL позиции и у них разные объёмы?
 
StatBars:

и Ваша функция не правильная, и моя тоже...

И ещё куча целая по запросу "безубыток" тоже не правильные...

всегда возвращала значение без убытка для системы однотипных ордеров, проверено на практике, конечно без учета свопа.
 
sanyooooook:
всегда возвращала значение без убытка для системы однотипных ордеров, проверено на практике, конечно без учета свопа.

Однотипных да, не спорю...
 
zhuki:
А если есть BUY и SELL позиции и у них разные объёмы?

Да есть разные ордера и разные объёмы...

Urain - похоже что так и проще, и 100% правильно будет...

Причина обращения: