Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Artem Titarenko
4033
Artem Titarenko  

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

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 );
}
Alexandr Bryzgalov
33072
Alexandr Bryzgalov  
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);
  }
Artem Titarenko
4033
Artem Titarenko  

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

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

Nikolay Demko
12547
Nikolay Demko  

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

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

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

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

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

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

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

igor
1144
igor  
StatBars:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

12345
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий