Как для нескольких позиций определить безубыточный ТП ?

 

Добрый день.

Не подскажите как можно определить безубыточный уровень ТП, если открыто несколько позиций?

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

:

 
Nexxtor:

Добрый день.

Не подскажите как можно определить безубыточный уровень ТП, если открыто несколько позиций?

:

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

Как найти среднюю цену?

Vladimir Karputov, 2017.11.26 13:45


Calculation Net Price.mq5 version   "1.003" - так как сегодня выходные, то был встроен блок кода, который открывает позиции только если код запущен в тестере стратегий. В коде благодарность @Andrei Fandeev за предоставленную формулу:

//+------------------------------------------------------------------+
//|                                        Calculation Net Price.mq5 |
//|                              Copyright © 2017, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2017, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.003"
#property description "Positions are only opened in the strategy tester!"
#property description "Formula for \"Breakeven\" is provided Andrei Fandeev https://www.mql5.com/ru/users/andreifan"
#property description "in: https://www.mql5.com/ru/forum/220911/page2#comment_6105972"
//---
#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>  
CPositionInfo  m_position;                   // trade position object
CTrade         m_trade;                      // trading object
CSymbolInfo    m_symbol;                     // symbol info object

 
Спасибо!
 
void OnTick()
{
     double profit  = 0.0,
            allLots = 0.0,
            tickValue;
     SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE, tickValue);
     
     for(int cnt=0; cnt<PositionsTotal(); cnt++)
     {
          if( PositionGetSymbol(cnt) != _Symbol ) continue;
          if( PositionGetInteger(POSITION_MAGIC) != 12345 ) continue;
          if( PositionGetInteger(POSITION_TYPE)!=ORDER_TYPE_BUY && PositionGetInteger(POSITION_TYPE)!=ORDER_TYPE_SELL) continue;
          
          profit  += PositionGetDouble(POSITION_PROFIT) + PositionGetDouble(POSITION_SWAP);
          allLots += PositionGetDouble(POSITION_VOLUME);
     }
     
     int pipsProfit = (int)MathFloor(profit / (tickValue * allLots));
}
Как-то так. Не проверял, но вроде все правильно.

P.S. Подобное хорошо применять если позиции одного типа. Тогда да стопы можно ставить. Но если они разные, то любой фиксированный сред, иногда становится плавающим. Что может привести к закрытию одного направления, при том что второе останется висеть.
При разнонаправленных позициях, лучший вариант ориентироваться на нужный профит и закрывать с лета.
 
int star()
  {
//----+
   double lots=0;
   double sum=0;
   for (i=0; i<OrdersTotal(); i++)
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
      if (OrderSymbol()!=Symbol()) continue;
      if (OrderType()==OP_BUY)
      {
       lots=lots+OrderLots();
       sum=sum+OrderLots()*OrderOpenPrice();
      }
      if (OrderType()==OP_SELL)
      {
       lots=lots-OrderLots();
       sum=sum-OrderLots()*OrderOpenPrice();
      }
   }
   double price=0;
   if (lots!=0) 
   price=sum/lots;
//----
   return(0);
  }
 
Nexxtor:

Добрый день.

Не подскажите как можно определить безубыточный уровень ТП, если открыто несколько позиций?

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

:

Вам надо просто рассчитать среднюю цену открытия всех позиций. 

 
Iurii Tokman:

Это очень плохая реализация, потому что есть 99.9% вероятность закрытия вроде по безубытку, а на самом деле в убытке, потому как не учитываются свопы и комиссии

 
Спасибо, ребят!)
 
Nexxtor:
Спасибо, ребят!)

Вот кусочек кода считает общую совокупную позицию и ее профит. 

      for (int i=0;i<=count-1;i++)
      {
         if (OrderSelect(OrderArray[i], SELECT_BY_TICKET, MODE_TRADES)) 
         {
            if (OrderType()==OP_BUY)
            {
               BuyLot=BuyLot+OrderLots();
               BuyProfit = BuyProfit + OrderProfit()+OrderCommission()+OrderSwap();
               BuyCount++;
            }
            if (OrderType()==OP_SELL)
            {
               SellLot=SellLot+OrderLots();
               SellProfit = SellProfit + OrderProfit()+OrderCommission()+OrderSwap();
               SellCount++;
            }          
         }
         Profit = Profit + OrderProfit()+OrderCommission()+OrderSwap(); //общий профит всех ордеров
      }

Далее рассчитываем уровень без убытка.

if (BuyLot > 0)
{    
         UrBezB = Bid - (BuyProfit / (TickValue * BuyLot) * Point);     //уровень безубытка для BUY ордеров
}
if (SellLot > 0)   
{
         UrBezS = Ask + (SellProfit / (TickValue * SellLot) * Point);   //уровень без убытка для SELL ордеров
}

double UrObBez = 0;
if (BuyLot > 0 && SellLot > 0)//Без убыток для разнонаправленных ордеров
{
         if (BuyLot > SellLot) 
         {
            UrObBez = Bid - ((BuyProfit + SellProfit) / (TickValue * (BuyLot-SellLot)) * Point);
         }
         if (BuyLot < SellLot)
         { 
            UrObBez = Ask + ((BuyProfit + SellProfit) / (TickValue * (SellLot-BuyLot)) * Point);
         }
         if (BuyLot == SellLot) UrObBez = 0;         
         UrObBez = NormalizeDouble(UrObBez,Digits());   
}


 Для более точного определения уровня необходимо учитывать еще и спред.

P.S. Код сделан для 4-той версии терминала. Переменная  TickValue это:

double TickValue = MarketInfo(Symbol(),MODE_TICKVALUE);
 
Vitalii Ananev:

Вот кусочек кода считает общую совокупную позицию и ее профит. 

Далее рассчитываем уровень без убытка.

 Для более точного определения уровня необходимо учитывать еще и спред.

P.S. Код сделан для 4-той версии терминала. Переменная  TickValue это:

Заполнение OrderArray[i] не показали.

 
khorosh:

Заполнение OrderArray[i] не показали.

Это не принципиально. Главное сам алгоритм. OrderArray[i] заполняется в другой функции и в нем содержатся тикеты всех открытых позиций и отложенных ордеров.

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