Как правильно рассчитать профит совокупной позиции в пунктах для кроссов?

 

Обращаюсь к профессионалам за помощью. 

Существует такая функция KimIV:

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.08.2008                                                     |
//|  Описание : Возвращает суммарный профит открытых позиций в пунктах         |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int GetProfitOpenPosInPoint(string sy="", int op=-1, int mn=-1) {
  double p;
  int    i, k=OrdersTotal(), pr=0;
  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (mn<0 || OrderMagicNumber()==mn) {
          p=MarketInfo(OrderSymbol(), MODE_POINT);
          if (p==0) if (StringFind(OrderSymbol(), "JPY")<0) p=0.00001; else p=0.001;
          if (OrderType()==OP_BUY) {
            pr+=(int)((MarketInfo(OrderSymbol(), MODE_BID)-OrderOpenPrice())/p);
          }
          if (OrderType()==OP_SELL) {
            pr+=(int)((OrderOpenPrice()-MarketInfo(OrderSymbol(), MODE_ASK))/p);
          }
        }
      }
    }
  }
  return(pr);
}

Не понял для чего такая функция, но на мой взгляд для расчёта профита совокупной позиции в пунктах она не годится. Нужно же при расчёте учитывать  ещё объём у каждой позиции, т.е., наверно, вычислять произведения (пункты x объём), суммировать эти произведения, а потом эту сумму делить на суммарный объём. Но, наверно, таким образом можно рассчитать профит для мажоров. А вот для кроссов, наверно, будет сложнее. 

Может у кого-нибудь есть готовая функция, чтобы годилась и для мажоров и для кроссов или ссылка?

 
khorosh:

Обращаюсь к профессионалам за помощью. 

Существует такая функция KimIV:

Не понял для чего такая функция, но на мой взгляд для расчёта профита совокупной позиции в пунктах она не годится. Нужно же при расчёте учитывать  ещё объём у каждой позиции, т.е., наверно, вычислять произведения (пункты x объём), суммировать эти произведения, а потом эту сумму делить на суммарный объём. Но, наверно, таким образом можно рассчитать профит для мажоров. А вот для кроссов, наверно, будет сложнее. 

Может у кого-нибудь есть готовая функция, чтобы годилась и для мажоров и для кроссов или ссылка?

Опишите что значит учитывать объём? Откуда брать начальную точку отсчёта?

Пункты то она считать будет:  (Buy) BID - Цена открытия. И лоты здесь не играют значения.

Опишите что Вам нужно?

 
Vitaly Muzichenko:

Опишите что значит учитывать объём? Откуда брать начальную точку отсчёта?

Пункты то она считать будет:  (Buy) BID - Цена открытия. И лоты здесь не играют значения.

Опишите что Вам нужно?

Имеем несколько открытых ордеров с разными ценами и разными лотами. Представим, что ,вместо нескольких ордеров имеем один  эквивалентный ордер с объёмом равным сумме объёмов всех ордеров и некой средней расчётной ценой открытия у этого эквивалентного ордера. Так вот расстояние между рыночной ценой и ценой открытия этого эквивалентного ордера и будет профит совокупной позиции в пунктах. 

До недавнего времени я считал в советнике условие закрытия  так:

if(GetProfitOpenPosInCurrency("0",-1,-1)>=TrProfit*MathAbs(SummLots))
  {
   // закрываем
  }
// где TrProfit - порог закрытия в пунктах
// SummLots - разность между совокупным лотом бай и селл

Но недавно при тестировании практически убедился, что такой способ не корректен. В зависимости от суммарного лота закрытие происходит при разном количестве пунктов профита. А мне нужно, чтобы не зависимо от суммарного лота закрытие производилось одинаково. А конкретно на примере так: если совокупная позиция для одного какого то отдельно взятого трейда допустим закрывается при 1.11111, то при изменении лота стартового ордера совокупная позиция этого трейда закрывалась при той же цене 1.11111.

 
khorosh:

Имеем несколько открытых ордеров с разными ценами и разными лотами. Представим, что ,вместо нескольких ордеров имеем один  эквивалентный ордер с объёмом равным сумме объёмов всех ордеров и некой средней расчётной ценой открытия у этого эквивалентного ордера. Так вот расстояние между рыночной ценой и ценой открытия этого эквивалентного ордера и будет профит совокупной позиции в пунктах. 

До недавнего времени я считал в советнике условие закрытия  так:

Но недавно при тестировании практически убедился, что такой способ не корректен. В зависимости от суммарного лота закрытие происходит при разном количестве пунктов профита. А мне нужно, чтобы не зависимо от суммарного лота закрытие производилось одинаково. А конкретно на примере так: если совокупная позиция для одного какого то отдельно взятого трейда допустим закрывается при 1.11111, то при изменении лота стартового ордера совокупная позиция этого трейда закрывалась при той же цене 1.11111.

Возьмите рассчитайте общий безубыток, и к нему прибавьте N-пунктов. Как рассчитать точку безубытка для совокупной позиции - Вы знаете.

P.S. Ответил так, как понял задачу
 

Мне надо либо корректную функцию расчёта профита совокупной позиции в пунктах для кроссов, либо функцию расчёта средней цены совокупной позиции для кроссов. 

Есть вот такая функция для средней цены. Но она вроде только для мажоров подходит:

double AverPriceBuy() //средняя цена совокупной позиции для ордеров бай
 {  
  double avgprice = 0, order_lots = 0, price = 0;
  
  for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderSymbol() == Symbol() && OrderType()==OP_BUY)
           {
            if(OrderLots()>0)
              {
               price += OrderOpenPrice() * OrderLots();
               order_lots += OrderLots();
              }
           }
        }    
     }
  if(order_lots>0) avgprice = NormalizeDouble(price / order_lots, Digits); 
  return(0);
 }
 
Vitaly Muzichenko:

Возьмите рассчитайте общий безубыток, и к нему прибавьте N-пунктов. Как рассчитать точку безубытка для совокупной позиции - Вы знаете.

P.S. Ответил так, как понял задачу

У тебя есть функция определения цены безубытка для кроссов? Я думаю цена безубытка это и есть средняя цена совокупной позиции, если не учитывать комиссию и своп и спред.

 
khorosh:

У тебя есть функция определения цены безубытка для кроссов?

Я считаю вот так.   ND = NormalizeDouble(...)

 double TickValue=SymbolInfoDouble(mSymbol,SYMBOL_TRADE_TICK_VALUE);
 double ask=SymbolInfoDouble(mSymbol,SYMBOL_ASK);
 double bid=SymbolInfoDouble(mSymbol,SYMBOL_BID);
 double poi=SymbolInfoDouble(mSymbol,SYMBOL_POINT);
//-- Текущий безубыток
  if(Buy._Lots>0)  BuyAwerage= bid-(ND(Buy._AllProfit,2)/( TickValue*Buy._Lots ))*poi;
  if(Sell._Lots>0) SellAwerage=ask+(ND(Sell._AllProfit,2)/(TickValue*Sell._Lots))*poi;
 

чо то такое скорее всего

double calcPointProfit(string Symb)//входной параметр функции - наименование инструмента, например "GBPCAD"

 {  

  double profitOnPoint = 0;

  

  for(int i=OrdersTotal()-1; i>=0; i--)

     {

      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) && OrderSymbol() == Symb)

        {

         if(OrderType()==OP_BUY) profitOnPoint= profitOnPoint +( MarketInfo(Symb, MODE_BID)-OrderOpenPrice())*OrderLots()/Point();
         if(OrderType()==OP_SELL) profitOnPoint= profitOnPoint +(OrderOpenPrice()-MarketInfo(Symb, MODE_ASK))* OrderLots()/Point();

        }    

     }

  return(profitOnPoint);

 }


 
Renat Akhtyamov:

чо то такое скорее всего

double calcPointProfit()

...

  return(0);

 }


Этот код выбросьте в форточку, он не учитывает ни комиссии, ни свопы. Точка безубытка будет всегда в убытке

 
Vitaly Muzichenko:

Это код выбросьте в форточку, он не учитывает ни комиссии, ни свопы. Точка безубытка будет всегда в убытке

дядька, не дерзи мне

я тока что тут написал и сам же исправил

и внимательно читай задачу топик-стартера:

"т.е., наверно, вычислять произведения (пункты x объём)"

все отклонения от темы, это не более чем полет фантазии
 
Renat Akhtyamov:

дядька, не дерзи мне

я тока что тут написал и сам же исправил

и внимательно читай задачу топик-стартера:

"т.е., наверно, вычислять произведения (пункты x объём)"

Может и вычислять произведения.

Я дал код безубытка, и к цене безубытка добавить N-пунктов для решения

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