Как высчитать TakeProfit "замка"

 

Допустим на графике есть несколько сделок открытых в разную сторону. Например, две в бай, одна в сел. У всех сделок разный объем. 

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

 
MadBob:

Допустим на графике есть несколько сделок открытых в разную сторону. Например, две в бай, одна в сел. У всех сделок разный объем. 

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

См. Перевод в безубыток. - эксперт для MetaTrader 4

Правда он предназначен для перевода стоплосса в безубыток, но это уже мелочи.

 
Yury Reshetov:

См. Перевод в безубыток. - эксперт для MetaTrader 4

Правда он предназначен для перевода стоплосса в безубыток, но это уже мелочи.

Там вроде бы для каждого ордера отдельный безубыток выставляется. Человек спросил про формулу расчета общего безубыточного уровня для всех открытых ордеров, при этом часть закроется в минусе, часть в плюсе, но итог в БУ.

Тема то не плохая....

 
if(buy_lots>0.0)
   if(sell_lots>=0.0)
      if(buy_lots>sell_lots)
         if(SymbolInfoTick(_Symbol,last_tick)==true)
           {
            double def_lots=NDVD(buy_lots-sell_lots);
            double tick_value=MarketInfo(_Symbol,MODE_TICKVALUE);
            average_price=NDD(last_tick.bid-((profit_buy+profit_sell)/(tick_value*def_lots))*_Point);
           }
if(buy_lots>=0.0)
   if(sell_lots>0.0)
      if(buy_lots<sell_lots)
         if(SymbolInfoTick(_Symbol,last_tick)==true)
           {
            double def_lots=NDVD(sell_lots-buy_lots);
            double tick_value=MarketInfo(_Symbol,MODE_TICKVALUE);
            average_price=NDD(last_tick.ask+((profit_buy+profit_sell)/(tick_value*def_lots))*_Point);
           }
 
MadBob:

Допустим на графике есть несколько сделок открытых в разную сторону. Например, две в бай, одна в сел. У всех сделок разный объем. 

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

Набор функций
//===============================================================================================
//--------------------- Возвращает уровень безубытка открытых позиций --------------------------+
//===============================================================================================
double BreakEvenOpenPos(string symb="0", int type=-1, int mg=-1) {
 int digit=0;
 double BLt=0,SLt=0,PrB=0,PrS=0,ResBr=0,TickValue=0,p=0,ask=0,bid=0;
 if(symb=="0") { symb=Symbol(); }
  BLt=AmountLotFromOpenPos(symb,OP_BUY,mg);
  PrB=ProfitOpenPosInCurrency(symb,OP_BUY,mg);
  SLt=AmountLotFromOpenPos(symb,OP_SELL,mg);
  PrS=ProfitOpenPosInCurrency(symb,OP_SELL,mg);
   p=MarketInfo(symb, MODE_POINT);
   ask=MarketInfo(symb, MODE_ASK);
   bid=MarketInfo(symb, MODE_BID);
   digit=(int)MarketInfo(symb, MODE_DIGITS);
   TickValue=MarketInfo(symb,MODE_TICKVALUE);
 // Расчеты
  if(BLt>0 && type==OP_BUY) {
    ResBr=NormalizeDouble(bid-(PrB/(TickValue*BLt))*p,digit);
   return(ResBr);
  }
  if(SLt>0 && type==OP_SELL) {
    ResBr=NormalizeDouble(ask+(PrS/(TickValue*SLt))*p,digit);
   return(ResBr);
  }
  if(BLt-SLt!=0 && type==-1) {
    ResBr=NormalizeDouble(bid-((PrB+PrS)/(TickValue*(BLt-SLt))*p),digit);
   return(ResBr);
  }
  return(0);
 }
//===============================================================================================
//------------------------ Возвращает сумму лотов открытых позиций -----------------------------+
//===============================================================================================
double AmountLotFromOpenPos(string symb="0", int type=-1, int mg=-1) {
 double l=0;
  if(symb=="0") { symb=Symbol();}
   for(int i=0; i<OrdersTotal(); i++) {
    if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
     if((OrderSymbol()==symb||symb=="")&&(type<0||OrderType()==type)&&(mg<0||OrderMagicNumber()==mg)) {
      if(OrderType()==OP_BUY || OrderType()==OP_SELL) {
       l+=OrderLots();
 }}}}
  return(l);
 }
//===============================================================================================
//------------- Возвращает суммарный профит открытых позиций в валюте депозита -----------------+
//===============================================================================================
double ProfitOpenPosInCurrency(string symb="0", int type=-1, int mg=-1) {
 double p=0;
  if(symb=="0") { symb=Symbol();}
   for(int i=0; i<OrdersTotal(); i++) {
    if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
     if(OrderType()==OP_BUY || OrderType()==OP_SELL) {
      if((OrderSymbol()==symb||symb=="")&&(type<0||OrderType()==type)&&(mg<0||OrderMagicNumber()==mg)) {
       p+=OrderProfit()+OrderSwap()+OrderCommission();
 }}}}
  return(p);
 }

Применение

void OnTick()
 {                                   // "Magic" = -1(все), или с конкретным
  double BuBuy  = BreakEvenOpenPos(_Symbol,OP_BUY,-1);  // Безубыток BUY   
  double BuSell = BreakEvenOpenPos(_Symbol,OP_SELL,-1); // Безубыток SELL  
  double BuBS   = BreakEvenOpenPos(_Symbol,-1,-1);      // Безубыток Общий

 Comment(BuBuy," | ",BuSell," | ",BuBS);
 }
 
Vitaly Muzichenko:
Набор функций

Применение

Никогда не понимал программистов которые вместо слов понятных или хотябы сокращённых пишут по 1-ой 2-е буквы.
 
Vasyl Nosal:
Никогда не понимал программистов которые вместо слов понятных или хотябы сокращённых пишут по 1-ой 2-е буквы.

Код писал не для общего обозрения, это первое,  второе - чем меньше слов и букавок, тем меньше размер файла, а когда в коде за 4000 строк, то это значительно увеличивает размер.

Название переменных внутри функции можно и одной буквой писать, к ней обращаться не нужно, но название самой функции должно быть понятным - у меня так и есть. 

 
MadBob:

Допустим на графике есть несколько сделок открытых в разную сторону. Например, две в бай, одна в сел. У всех сделок разный объем. 

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

Посмотрите скрипт "Хирурга", работает отлично, на кроссах только небольшая погрешность, но то кроссы.

https://c.mql5.com/mql4/forum/2007/06/zero_level_1.mq4 

//+------------------------------------------------------------------+
//|                                                   Zero_Level.mq4 |
//|                                         Copyright © 2007, Xupypr |
//+------------------------------------------------------------------+
// Скрипт вычисляющий уровни без убытка, на покупку, на продажу с учетом накопленных свопов.
#property copyright "Copyright © 2007, Xupypr"
#include <WinUser32.mqh>
void start()
{
 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);
 if (BuyLots>0) double BuyLevel=NormalizeDouble(Bid-(BuyProfit/(TickValue*BuyLots)*Point),Digits); else BuyLevel=0;
 if (SellLots>0) double SellLevel=NormalizeDouble(Ask+(SellProfit/(TickValue*SellLots)*Point),Digits); else SellLevel=0;
 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);
 string Title="Уровень без убытка для "+Symbol();
 string ZeroLevel=" не существует";
 if (Price>0) ZeroLevel=" = "+DoubleToStr(Price,Digits);
 string Buy=" не существует";
 if (BuyLevel>0) Buy=" = "+DoubleToStr(BuyLevel,Digits);
 string Sell=" не существует";
 if (SellLevel>0) Sell=" = "+DoubleToStr(SellLevel,Digits);
 string Message="Уровень без убытка"+ZeroLevel+"\t\nУровень на покупку"+Buy+"\t\nУровень на продажу"+Sell;
 MessageBox(Message,Title,MB_OK|MB_ICONINFORMATION);
}
 
//_types поддержка!
double GOrders::get_Average(int itype,int &idirect)
  {
   double dprice[2]={0,0},
   m_lots[2]={0,0},
   icount[2]={0,0};

   idirect=0;

   double dask=MarketInfo(sname,MODE_ASK);
   double dbid=MarketInfo(sname,MODE_BID);

   int flag;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(!OrderSelect(i,SELECT_BY_POS)) continue;

      if((OrderSymbol()==sname || sname==NULL) && (OrderMagicNumber()==imagic || imagic==-1))
        {

         flag=toMyTypes(OrderType())&itype;

         if(OrderType()==OP_BUY && toDefType(flag,itype)==OP_BUY)
           {
            m_lots[0]+=OrderLots();
            dprice[0]+=NormalizeDouble(OrderProfit()+OrderCommission()+OrderSwap(),2);
            icount[0]++;
           }
         if(OrderType()==OP_SELL && toDefType(flag,itype)==OP_SELL)
           {
            m_lots[1]+=OrderLots();
            dprice[1]+=NormalizeDouble(OrderProfit()+OrderCommission()+OrderSwap(),2);
            icount[1]++;
           }
        }
     }

   if(NormalizeDouble(m_lots[0],2)-NormalizeDouble(m_lots[1],2)==0.0) return (0);

   if(NormalizeDouble(m_lots[0],2)>NormalizeDouble(m_lots[1],2)) idirect=1;
   if(NormalizeDouble(m_lots[0],2)<NormalizeDouble(m_lots[1],2)) idirect=-1;

   double PriceLevel=0;
   double TickValue=NormalizeDouble(MarketInfo(sname,MODE_TICKVALUE),2);
   if(TickValue==0.0) return 0;
   double point=MarketInfo(sname,MODE_POINT);
   if(point==0.0) return 0;

   int idigits=(int)MarketInfo(sname,MODE_DIGITS);
   if(MarketInfo(sname,MODE_DIGITS)==5 || MarketInfo(sname,MODE_DIGITS)==3 || MarketInfo(sname,MODE_PROFITCALCMODE)==1) idigits=(int)(MarketInfo(sname,MODE_DIGITS)-1);

   if((m_lots[0]-m_lots[1])>0) PriceLevel=dbid-((dprice[0]+dprice[1])/(TickValue*(m_lots[0]-m_lots[1]))*point);
   if((m_lots[1]-m_lots[0])>0) PriceLevel=dask+((dprice[0]+dprice[1])/(TickValue*(m_lots[1]-m_lots[0]))*point);

   return (NormalizeDouble(PriceLevel,idigits));
  }

пользуйтесь, функция универсальная.

toDefType можете заменить на явную проверку какой тип ордера анализируется. или можете убрать если надо сделать общий безубыток

idirect возвращает в какую сторону перевес и куда откладывать потом тр и сл.

функцию использую давно никогда не подводила. учитывает и свопы и комиссии и т.п 

 

Офигеть! Такие портянки выложили и ни у кого нет правильно когда. За то вы все из себя тут такие. 

Бурные аплодисменты. 

ps. Самый прикол в том, что никто в это даже не поверит. Да? 

ps2. А я опять такой злодей, критикую. Да? 

 
Dmitry Fedoseev:

Офигеть! Такие портянки выложили и ни у кого нет правильно когда. За то вы все из себя тут такие. 

Бурные аплодисменты. 

ps. Самый прикол в том, что никто в это даже не поверит. Да? 

ps2. А я опять такой злодей, критикую. Да? 

Чем код "Хирурга" не устраивает ? Там почти всё идеально, на кроссах погрешность, так как цена пункта не постоянная, но погрешность в рамках допустимого.
Причина обращения: