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

 

Делаю сеточного советника. В одном направление может быть открыто множество позиций, разного объема, по разным ценам, со свопами и комиссиями. 

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


Пример:

На EURUSD сделка Buy может быть открыта по цене 100, с комиссией 4 доллара. Цена безубытка будет 104 пункта.

Но если взять кросскурс, то там цена пункта  меняется постоянно. Из-за это в примере выше 4 доллара не всегда равны 4 пунктам. Иногда это 3,5, а иногда 5.7


Т.е. на кросах цена БУ не постоянна, а значит уровни СЛ и ТП, которые отсчитываются от цены безубытка, так же будут постоянно скакать и неточность выставления стопа, при больших объемах может давать убыток.



Вопрос: как лучше всего рассчитывать цену безубытка для кроссов у которых tick_value переменный.


Ниже формула классического расчета БУ.

OrderOpenTruePrice = (Bid - ((profit / (lot * TICKVALUE)) * _Point)); //Для buy
 
В профит разве не включается всё? От брокера наверно зависит.
 
Я тоже делаю сетку, пренебрёг всем этим, можно дать запас по профиту и всё, зачем париться.
 
pribludilsa:
Я тоже делаю сетку, пренебрёг всем этим, можно дать запас по профиту и всё, зачем париться.

Запас можно дать. 

Но свопы, например, начисляются каждый день. Соотвтественно, если сделки висят месяц, то запаса может как-то не хватит. 

 
Sergey Likho:

Запас можно дать. 

Но свопы, например, начисляются каждый день. Соотвтественно, если сделки висят месяц, то запаса может как-то не хватит. 

Да, свопы дают основной убыток, ну так они отражаются в профите.
 
Вроде половина комиссии не включается в профит, на это дело небольшой запас. А свопы и остальная половина есть в  POSITION_PROFIT. Мне лень писать половину комиссии эту. Но наверно потом надо.
 
А Вы сетку не по профиту закрываете? Разве есть альтернатива тому, чтобы делать шаги сетки по пипсам, а закрытие по профиту?
 

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


КОмиссия и свопы в профит не включаются. Они считаются в валюте депозита

А профит итоговый считается с учетом tick_value.


Закрытие сетки по профиту не лучашя идея. Так как лотность может быть набрана разная. Закрывать 20 лотов с прибылью в 10 долларов не лучшая идея.

 

Цена БУ для серии ордеров одного направления:

double GetAveragePrice(const double fTotalVolume, const double fTotalOPVolume, const double fTotalSwapComm, const double fTickSize, const double fTickValue, const int nType)
{
   if (fTotalVolume <= 0.0)
      return -1.0;
   
   // Цена открытия без учета свопов и комиссий
   double fAvePrice = fTotalOPVolume / fTotalVolume;
      
   // Преобразование величины свопов и комиссий к категории цены
   double fSwapInPrice = fTotalSwapComm * fTickSize / (fTotalVolume * fTickValue);
   
   // Для ордеров Buy свопы и комиссии нужно отнять от чистой средней цены (если свопы орицательные, то цена открытия станет выше), я для ордеров Sell - добавить (отрицательный своп уменьшит цену открытия)
   return (nType == OP_BUY)? fAvePrice - fSwapInPrice : fAvePrice + fSwapInPrice;
}

Здесь:

  • fTotalVolume - совокупный объем рыночных ордеров (позиций, если в терминологии МТ5) одной серии
  • fTotalOPVolume - сумма произведений цен открытия ордеров на их объем
  • fTotalSwapComm - сумма свопов и комиссий всех ордеров серии
  • fTickSize - размер тика для символа, нужно проверить на корректность до вызова функции
  • fTickValue - стоимость тика для символа , нужно проверить на корректность до вызова функции
 
Sergey Likho:

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


КОмиссия и свопы в профит не включаются. Они считаются в валюте депозита

А профит итоговый считается с учетом tick_value.


Закрытие сетки по профиту не лучашя идея. Так как лотность может быть набрана разная. Закрывать 20 лотов с прибылью в 10 долларов не лучшая идея.

У меня своп в полном объеме и половина комиссии включены в профит позиции, считаю общую прибыль и всё. А Вы как сетку закрывате, по пипсам? А почему не лучшая идея? Я рассчитываю на пинг не более 10 милисек

 

Цена БУ для ордеров разного направления:

double GetTotalAveragePrice(const double fTotalVolumeBuy, const double fTotalOPVolumeBuy, const double fTotalSwapCommBuy, const double fTotalVolumeSell, const double fTotalOPVolumeSell, 
                            const double fTotalSwapCommSell, const double fTickSize, const double fTickValue, const double fSpread)
{
   // Если совокупные объемы обоих типов ордеров советника равны, то рассчитать среднюю цену открытия невозможно
   if (fTotalVolumeBuy == fTotalVolumeSell)
      return DBL_MAX;
      
   // Цены открытия Buy и Sell-серий
   double fAveBuyPrice = (fTotalVolumeBuy > 0.0)? fTotalOPVolumeBuy / fTotalVolumeSell : 0.0; 
   double fAveSellPrice = (fTotalVolumeSell > 0.0)? fTotalOPVolumeSell / fTotalVolumeSell : 0.0; 
      
   // Средняя цена открытия всех ордеров по Bid без учета свопов
   double fAvePrice = (fAveBuyPrice * fTotalVolumeBuy - fTotalVolumeSell * (fAveSellPrice - fSpread)) / (fTotalVolumeBuy - fTotalVolumeSell);
   
   // Определение доминирующей части свопов и смещение средней цены открытия с учетом свопов и комиссий
   if (fTotalVolumeBuy > fTotalVolumeSell)                           // Доминирует Buy-направление
   {
      double fVolumeDiff = fTotalVolumeBuy - fTotalVolumeSell;
      double fSwaps = fTotalSwapCommBuy / fTotalVolumeBuy * fVolumeDiff;
      fAvePrice -= fSwaps * fTickSize / (fVolumeDiff * fTickValue);
   }
   else                                                                                            // Доминирует Sell-направление
   {
      double fVolumeDiff = fTotalVolumeSell - fTotalVolumeBuy;
      double fSwaps = fTotalSwapCommSell / fTotalVolumeSell * fVolumeDiff;
      fAvePrice += fSwaps * fTickSize / (fVolumeDiff * fTickValue);
   }
   
   return fAvePrice;
}

Тут все то же самое. Только добавляется величина спреда - fSpread.

Все это добро рассчитываем на каждом тике и модифицируем уровни стопа/профита, если они изменились на спред и более, чтобы не делать модификацию на каждом тике, задалбывая сервер ДЦ.

P. S. Сорри за возможные ошибки в коде - портировал со своего эксперта прямо здесь, без проверки синтаксиса. Но общий смысл должен быть понятен.