Задача для программистов. Как найти линию безубытка?

 

В терминале есть полно сделок, с разной лотностью

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

Как это сделать?

 
igrok333:

В терминале есть полно сделок, с разной лотностью

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

Как это сделать?

double cExpert::GetTargetPrice(double d_Target)
{
   if (mi_ExpertOrdersTotal == 0)
      return(0);
      
   double d_TargetPrice;
   double d_TicValue     = MarketInfo(Symbol(),MODE_TICKVALUE);
   int    i_Spread     = (int)MarketInfo(Symbol(),MODE_SPREAD);
   double d_BuySum   = 0.0;
   double d_SellSum  = 0.0;
   double d_BuyLots  = 0.0;
   double d_SellLots = 0.0;
   
   for (int i = 0; i < mi_ExpertOrdersTotal; i++)
   {
      if (mia_OrderType[i] == OP_BUY)
      {
         d_BuySum  += (mda_OrderOpenPrice[i] * mda_OrderLots[i] + i_Spread * Point *  mda_OrderLots[i]);
         d_BuyLots += mda_OrderLots[i];
      }
      if (mia_OrderType[i] == OP_SELL)
      {
         d_SellSum  -= (mda_OrderOpenPrice[i] * mda_OrderLots[i] + i_Spread * Point *  mda_OrderLots[i]);
         d_SellLots += mda_OrderLots[i];
      }
   }
   if (d_BuyLots == d_SellLots)
   {
      return(-1); 
   }
   d_TargetPrice = (d_Target*Point/d_TicValue + d_BuySum + d_SellSum)/(d_BuyLots - d_SellLots);
   d_TargetPrice = d_TargetPrice - i_Spread * Point;
   d_TargetPrice = NormalizeDouble(d_TargetPrice,Digits);
   return(d_TargetPrice);
}
//+------------------------------------------------------------------+

это так намек, из одной моей ЕА. сейчас нет времени, если не разберетесь, завтра можно поговорить.

 
Denis Sartakov:

это так намек, из одной моей ЕА. сейчас нет времени, если не разберетесь, завтра можно поговорить.

не разобрался)

 
igrok333:

не разобрался)

double cExpert::GetTargetPrice(double d_Target)
{
   if (OrdersTotal() == 0)
      return(0);
      
   double d_TargetPrice;
   double d_TicValue     = MarketInfo(Symbol(),MODE_TICKVALUE);
   int    i_Spread     = (int)MarketInfo(Symbol(),MODE_SPREAD);
   double d_BuySum   = 0.0;
   double d_SellSum  = 0.0;
   double d_BuyLots  = 0.0;
   double d_SellLots = 0.0;
   
   for (int i = 0; i < OrdersTotal(); i++)
   {
      if (OrderSelect(i,SELECT_BY_POS))
      {
         if (OrderType() == OP_BUY)
         {
            d_BuySum  += (OrderOpenPrice() * OrderLots() + i_Spread * Point *  OrderLots());
            d_BuyLots += OrderLots();
         }
         if (OrderType() == OP_SELL)
         {
            d_SellSum  -= (OrderOpenPrice() * OrderLots() + i_Spread * Point *  OrderLots());
            d_SellLots += OrderLots();
         }
      }
   }
   if (d_BuyLots == d_SellLots)
   {
      return(-1); 
   }
   d_TargetPrice = (d_Target*Point/d_TicValue + d_BuySum + d_SellSum)/(d_BuyLots - d_SellLots);
   d_TargetPrice = d_TargetPrice - i_Spread * Point;
   d_TargetPrice = NormalizeDouble(d_TargetPrice,Digits);
   return(d_TargetPrice);
}
//+------------------------------------------------------------------+
 
Denis Sartakov:

а d_Target это что такое?

 
igrok333:

а d_Target это что такое?

Можете даже не смотреть, это в корне неверное решение.

Поищите на форуме, Я где-то выкладывал правильную функцию с правильным расчётом

 
Vitaly Muzichenko:

Можете даже не смотреть, это в корне неверное решение.

Поищите на форуме, Я где-то выкладывал правильную функцию с правильным расчётом

по какому запросу искать?

 
igrok333:

по какому запросу искать?

Расчёт безубытка

 
igrok333:

по какому запросу искать?

Вот почему тот расчёт неверный

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам

Vitaly Muzichenko, 2017.03.21 23:22

Если позиции висят в рынке долго, то на них идут свопы, и они чаще всего отрицательные(среда=х*3). Плюс ко всему нужно учесть комиссии, если счёт ECN, потому как закрываем по тейк-профиту вроде как в плюс, а на самом деле - минус, не учли расходы.

На скрине первый попавшийся вариант, на 5 позиций - 4 дня свопа, и если планировали взять 10пп, то при простом расчёте возьмём только 6пп прибыли,и это без учёта комиссий(если есть), если учесть все расходы, то закроем просто в ноль, потому как одной цены открытия недостаточно для расчёта.

Поэтому и предложил рассчитывать уровень профита для всех от цены безубытка+добавка в N-пунктов


 
Denis Sartakov:
Vitaly Muzichenko:
спасибо за ответы.
 
нашел простое решение.

это как уравнение решать.

пока-что без свопов:

double x=0;

double summ_lots=0;
double summ_rasst=0;


for (int i=OrdersTotal(); i>=1; i--)       
{                               
   if(OrderSelect(i-1,SELECT_BY_POS)==true && OrderMagicNumber()==magic)
      {                          
      if (OrderType()==OP_BUY)
         {
         summ_lots=summ_lots+OrderLots();
         summ_rasst=summ_rasst-OrderLots()*OrderOpenPrice();
         }         
      if (OrderType()==OP_SELL)
         {
         summ_lots=summ_lots-OrderLots();
         summ_rasst=summ_rasst+OrderLots()*OrderOpenPrice();
         }  
      }
} 


summ_rasst=-summ_rasst; 

if (summ_lots!=0)
   x=summ_rasst/summ_lots;      
else
   x=-1; 

Alert(x);