Блог им. fxsaber

Алгоритм критерия оптимизации при настройке ТС под реинвестирование

    • 07 октября 2019, 04:20
    • |
    • fxsaber
  • Еще

При настройке ТС есть два подхода

  1. Торговля постоянным объемом.
  2. ММ, как часть от свободных средств (или баланса).


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

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

 

Поэтому хорошо бы иметь критерий оптимизации для реинвестирования.

Взял такой: какая относительная прибыльность достигается при жестко заданной максимальной относительной просадке.

 

Алгоритм

Алгоритм вычисления этой прибыльности можно посмотреть на примере интуитивно понятного торгового API из MT4.

// Вычисляет профитность на истории не пересекающихся закрытых позиций.
bool GetSumGain( const double Risk, double &SumGain, double &MaxDD, double &RF, const string Symb, const int Magic = -1 )
{
  bool Res = true;
  const double Leverage = Risk * 100;  
      
  SumGain = 1;
  MaxDD = 0;
  RF = 1;

  double MaxGain = SumGain;
  double DDGain = SumGain;
    
  for (int i = OrdersHistoryTotal() - 1; (i >= 0) && (Res = (SumGain > 0)); i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && (OrderType() <= OP_SELL) &&
        (OrderSymbol() == Symb) && ((Magic == -1) || (OrderMagicNumber() == Magic)))        
    {
      SumGain *= 1 - Leverage * ((OrderType() << 1) - 1) * (1 - OrderOpenPrice() / OrderClosePrice());
      
      if (SumGain > MaxGain)
        MaxGain = SumGain;
      else if (1 - SumGain / MaxGain > MaxDD)
      {
        MaxDD = 1 - SumGain / MaxGain;
        
        DDGain = SumGain;
      }
    }
    
  RF = SumGain / DDGain;
      
  return(Res);
}

// Вычисляет риск для заданной максимальной просадки.
double GetRisk( const double NewMaxDD, const double Alpha, const string Symb, const int Magic = -1  )
{
  double RiskLeft = 0;
  double RiskRight = 10;
  
  double Risk, SumGain, MaxDD, RF;
    
  do
  {
    Risk = (RiskLeft + RiskRight) / 2;
        
    if (!GetSumGain(Risk, SumGain, MaxDD, RF, Symb, Magic)) // https://www.mql5.com/ru/forum/170953/page20#comment_13432058
    {
      MaxDD = DBL_MAX;

      RiskRight = Risk;      
    }
    else if (MaxDD > NewMaxDD)
      RiskRight = Risk;
    else
      RiskLeft = Risk;
  }
  while (!IsStopped() && (MathAbs(MaxDD - NewMaxDD) > Alpha));
  
  return(Risk);  
}

#property strict
#property show_inputs

input double inMaxDD = 0.3; // Для какой максимальной просадки вычислить риск.
input int MagicNumber = 1;

#define D(A) DoubleToString(A, 2)

void OnStart()
{
  double SumGain, MaxDD, RF;
  
  const double Risk = GetRisk(inMaxDD, 0.01, _Symbol, MagicNumber);
  
  if (GetSumGain(Risk, SumGain, MaxDD, RF, _Symbol, MagicNumber))   
    Print((string)MagicNumber + ": при риске " + D(Risk) +
                                " увеличение было бы в " + D(SumGain) + " раза" +
                                " с максимальной относительной просадкой по балансу " + D(MaxDD) + 
                                ", фактор восстановления = " + D(RF));  
}

Результат запуска
1: при риске 0.51 увеличение было бы в 3.82 раза с максимальной относительной просадкой по балансу 0.30, фактор восстановления = 3.20

Т.е. в данном случае критерием оптимизации было бы значение 3.82.

Данная публикация является личным мнением автора. Мнение владельца сайта может не совпадать с мнением автора.
668 | ★1
2 комментария
1. Как насчет устойчивости по отношению к росту транзакционных издержек? Если средняя прибыль на сделку меньше, устойчивость падает.
2. Максимум ДД очень неустойчивый параметр при оптимизации, лучше брать интегральные меры риска. Или хотя бы среднее из помесячных максимумов ДД. 
avatar
SergeyJu, ни в коем случае не веду речь о каком-то замечательном критерии оптимизации. Только показал, как можно переходить в режим реинвестирования.
avatar

Читайте на SMART-LAB:
Фото
NZD/CAD: четверг под знаком быков. Повторится ли северное ралли?
Кросс-курс NZD/CAD протестировал линию восходящего тренда и, похоже, решил, что падать дальше — это плохая примета. Сессию четверга пара изо всех...
Фото
Верните наши 35 рублей. Чем инвесторам не понравилась новая дивполитика МТС
МТС в среду объявила о новой дивидендной политике на 2027-2028 годы. Ключевой момент — компания теперь переходит от политики...
Важные даты по дивидендам за II квартал
Напомним, что 25 августа Совет директоров Займера рекомендовал направить на дивиденды за II квартал 2026 года 486 млн рублей, или 4 рубля 86...
Фото
Какие бизнесы на Мосбирже смогли успешно "впитать" инфляцию за 10 лет? Часть 2: банки и финансы
Инфляция за 10 лет составила 85% официальная, и около 100% по проверке моей потребительской корзины.  Какие инвестиции в акции, сделанные 10 лет...

теги блога fxsaber

....все тэги



UPDONW
Новый дизайн