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

 
Vitaly Muzichenko:

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

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

а че неверное, вот тут обоснование этого решения:


	          
Обобщенная формула вычисления уровня "безубытка"
Обобщенная формула вычисления уровня "безубытка"
  • 2011.02.06
  • www.mql5.com
В codebase имеются скрипты и индикаторы вычислений уровня "безубытка", но общей формулы нет, поэтому для любознательных привожу эту форму...
 
igrok333:

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

если d_Target = 0, то функция возвратит цену безубытка...

 

 

Вот рабочая функция. Учитывает комиссии и свопы.

double ZeroLevel()
{
 double BuyLots=0;
 double SellLots=0;
 double BuyProfit=0;
 double SellProfit=0;
 int Total=OrdersTotal();
 for (int i=Total-1;i>=0;i--)
 {
  if (OrderSelect(i,SELECT_BY_POS))
  {
   if (OrderSymbol()!=Symbol()) 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 Price=0;
 double TickValue=MarketInfo(Symbol(),MODE_TICKVALUE)/(MarketInfo(Symbol(),MODE_TICKSIZE)/Point);
 if ((BuyLots-SellLots)>0) Price=NormalizeDouble(Bid-((BuyProfit+SellProfit)/(TickValue*(BuyLots-SellLots))*Point),Digits);
 if ((SellLots-BuyLots)>0) Price=NormalizeDouble(Ask+((BuyProfit+SellProfit)/(TickValue*(SellLots-BuyLots))*Point),Digits);
 return (Price);
}
 
Viktor Zapadenko:

Вот рабочая функция. Учитывает комиссии и свопы.

Вот, это сильно похоже на рабочий вариант.


========

igrok333:

Если видите в коде расчёта безубытка:

OrderOpenPrice()

Дальше можете не смотреть, а сразу выбрасывать

 
Vitaly Muzichenko:

...

Если видите в коде расчёта безубытка:

Дальше можете не смотреть, а сразу выбрасывать

Это почему же?

 
Dmitry Fedoseev:

Это почему же?

Да, немного погорячился, можно сделать расчёт и с OrderOpenPrice()

   for (int i = total-1; i >= 0; i--) {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      if(OrderSymbol()==symb) {
         if(OrderMagicNumber()==Magic) {
            if(OrderType()==type) {
               SummLots+=OrderLots();
               SummPrice+=OrderOpenPrice()*OrderLots();
               SummLoss+=OrderCommission()+OrderSwap();
            }
         }
      }
   } 
 

прошелся поиском, не нашел

а для МТ5 есть формулы расчета "линии бузубытка"?

в идеале нужен индикатор

 
Самый просто способ - через стоимость пункта. Посчитать суммарную прибыль, совокупный лот, потом на основе величины тика и стоимости тика посчитать стоимость пункта. Останется прибыль поделить на произведение лота на стоимость пункта и прибавить это к рыночной цене.
 
 ZEROLEVEL_BUY=NormalizeDouble(Bid-(BUY_PROFIT/(TICKVALUE*BUY_LOTS)*_Point),_Digits);
if(BUY_LOTS>SELL_LOTS)
ZEROLEVEL_ALL=NormalizeDouble(SymbolInfoDouble(NULL,SYMBOL_BID)-((BUY_PROFIT+SELL_PROFIT)/(TICKVALUE*(BUY_LOTS-SELL_LOTS))*_Point),_Digits);
double BUY_PROFIT=0,SELL_PROFIT=0,BUY_LOTS=0,SELL_LOTS=0;

   BUY_PROFIT=BUY_LOTS=SELL_PROFIT=SELL_LOTS=0;
   TOTAL_VALUE(BUY_PROFIT,BUY_LOTS,SELL_PROFIT,SELL_LOTS,MAGIC_NUMBER);

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void TOTAL_VALUE(double &PROFIT_BUY,double &LOTS_BUY,double &PROFIT_SELL,double &LOTS_SELL, int MAGIC=-1)
  {
   PROFIT_BUY=LOTS_BUY=PROFIT_SELL=LOTS_SELL=0;

   for(int I=0; I<OrdersTotal(); I++)
     {
      if(OrderSelect(I,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==_Symbol && (OrderMagicNumber()==MAGIC || MAGIC==-1))
           {
            if(OrderType()==OP_BUY)
              {
               PROFIT_BUY+=NormalizeDouble(OrderProfit()+OrderSwap()+OrderCommission(),2);
               LOTS_BUY+=OrderLots();
              }
            if(OrderType()==OP_SELL)
              {
               PROFIT_SELL+=NormalizeDouble(OrderProfit()+OrderSwap()+OrderCommission(),2);
               LOTS_SELL+=OrderLots();
              }
           }
        }
     }
   return;
  }

разберетесь?

 
Vladimir Gribachev:

разберетесь?

с этим то все понятно, был у меня такой код

под МТ5 интересует реализация, хочу этот расчет в индикаторе сделать и протестировать стратегию в тестере МТ5

UPD: MT4Orders forever! 

все работает, автору респект!

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