Скачать MetaTrader 5

Возможен ли расчет MaxDD "обратным" ходом?

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Зарегистрируйся на MQL5.community, чтобы оставлять комментарии!
comp
538
comp 2016.03.02 22:39 
Есть массив последовательных результатов сделок.

Если бежать по нему от начала до конца, то в один проход легко вычислить MaxDD (по балансу) - все это делали.


Возможно ли вычислить тот же MaxDD, если бежать наоборот - от конца к началу? Конечно, однопроходно.


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

Alexandr Andreev
2955
Alexandr Andreev 2016.03.03 00:48  
ответ нет, хотя правильнее сказать "в свое время тоже что то подобное пытался сделать - не получилось"
Dmitry Fedoseev
42884
Dmitry Fedoseev 2016.03.03 01:31  
Запредельность крайняя. Как? Как может возникнуть потребность в решении такой задачи?  
comp
538
comp 2016.03.03 08:26  
Александр:
ответ нет, хотя правильнее сказать "в свое время тоже что то подобное пытался сделать - не получилось"

Думаю, положительный ответ вас не удивит. Но результат... сомневаюсь, что для кого-нибудь очевидно, что коды (алгоритм) для прямого и обратного ходов ИДЕНТИЧНЫ.

#property strict

template <typename T>
void RandFillArray( T &Array[] )
{
  MathSrand((int)TimeLocal());

  const int Size = ArraySize(Array);

  for (int i = 0; i < Size; i++)
//    Array[i] = MathRand() - (SHORT_MAX >> 1);
    Array[i] = (MathRand() > (SHORT_MAX >> 1)) ? 1 : -1;

  return;
}

#define GET_MAXDD                   \
  {                                 \
    Profit += Profits[i];           \
                                    \
    if (Profit > Max)               \
    {                               \
      Max = Profit;                 \
      Min = Max;                    \
    }                               \
    else if (Profit < Min)          \
    {                               \
      Min = Profit;                 \
                                    \
      const T TmpMaxDD = Max - Min; \
                                    \
      if (TmpMaxDD > MaxDD)         \
        MaxDD = TmpMaxDD;           \
    }                               \
  }

template <typename T>
T GetMaxDD( const T &Profits[], const bool Reverse = FALSE )
{
  T MaxDD = 0;

  T Profit = 0;

  T Max = Profit;
  T Min = Max;

  const int Size = ArraySize(Profits);

  if (Reverse)
    for (int i = Size - 1; i >= 0; i--)
      GET_MAXDD
  else
    for (int i = 0; i < Size; i++)
      GET_MAXDD

  return(MaxDD);
}

#define AMOUNT 100000

void OnStart( void )
{
  int Profits[AMOUNT];

  RandFillArray(Profits);

  Print("MaxDD = " + (string)GetMaxDD(Profits) + ", MaxDD_Reverse = " + (string)GetMaxDD(Profits, TRUE));

  return;
}
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий