Breakeven

 
Есть ли у кого индикатор или скрипт показывающий линию безубытка по открытым ордерам, как на покупку так и на продажу?
 

Нашел, может кому надо. Проще искать через гугл и с него уже переходить на MQL5, так как на самом MQL5 в поиске выбивает много лишнего.

https://www.mql5.com/ru/code/10007

Уровень безубытка (ProfitLine)
Уровень безубытка (ProfitLine)
  • www.mql5.com
Отображения линий безубыточности открытых позиций на графике цены.
 
Anton Garbar #:

Нашел, может кому надо. Проще искать через гугл и с него уже переходить на MQL5, так как на самом MQL5 в поиске выбивает много лишнего.

https://www.mql5.com/ru/code/10007

не хочу вас расстраивать, но

1) это не б/у - там просто рассчёт средней позиции и не учитываются комиссия и свопы

2) настолько старое, что даже странно как вы это откопали - уверен что есть 100500 более новых

 
Zero Lines with Swaps and Comissions
Zero Lines with Swaps and Comissions
  • www.mql5.com
This indicator allows you to calculate and display the break-even level for the current instrument.
 

Это же для МТ4.

 

Спасибо

 

А нет ли подобного инструмента для МТ5?

В МТ4 получение комиссии по открытой сделке является тривиальной задачей ( OrderComission() ).
Было бы интересно посмотреть, как правильно получить комиссию в МТ5.

 
Janis Ozols #:
Было бы интересно посмотреть, как правильно получить комиссию в МТ5.

Вам уже отвечали на этот вопрос здесь и здесь. ))  

С уважением, Владимир.

 
Janis Ozols #:

А нет ли подобного инструмента для МТ5?

В МТ4 получение комиссии по открытой сделке является тривиальной задачей ( OrderComission() ).
Было бы интересно посмотреть, как правильно получить комиссию в МТ5.

В МТ5 нет понятия открытой сделки, сделки существуют только в истории.
В риал-тайме есть только ордера и позиции.

 
Janis Ozols #:

А нет ли подобного инструмента для МТ5?

В МТ4 получение комиссии по открытой сделке является тривиальной задачей ( OrderComission() ).
Было бы интересно посмотреть, как правильно получить комиссию в МТ5.

В МТ5 пользуюсь такой функцией, переделана с МТ4

// Функция вычисляющая уровни безубытка, на покупку, на продажу с учетом накопленных свопов.
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);
  }

MT4

// Функция вычисляющая уровни без убытка, на покупку, на продажу с учетом накопленных свопов.
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 TickValue=MarketInfo(symb,MODE_TICKVALUE);
//   double ZeroLevel=0;
   double BuyLots=0;
   double SellLots=0;
   double BuyProfit=0;
   double SellProfit=0;
   double SellLevel;
   double BuyLevel;

   int Total=OrdersTotal();
   for(int i=Total-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {

         if(OrderSymbol()!=symb)
            continue;
         if(OrderMagicNumber() != mn)
            continue;

         if(OrderType()==OP_BUY && (op<0 || OrderType()==op))
            //         if(OrderType()==OP_BUY)
           {
            BuyLots=(BuyLots+OrderLots());
            BuyProfit=(BuyProfit+OrderProfit()+OrderCommission()+OrderSwap());
           }
         if(OrderType()==OP_SELL && (op<0 || OrderType()==op))
            //         if(OrderType()==OP_SELL)
           {
            SellLots=(SellLots+OrderLots());
            SellProfit=(SellProfit+OrderProfit()+OrderCommission()+OrderSwap());
           }
        }
     }

//   double TickValue=MarketInfo(sy,MODE_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));

   return(Price);
  }
//--- End ---