Обсуждение статьи "Советник на базе универсального аппроксиматора MLP" - страница 2

 
Eric Ruvalcaba #:

Большое спасибо за то, что поделились этой статьей и своим пониманием. Отличная идея. Я реализовал некоторые независимые операции с позициями и заставил их работать на хеджирующем счете (мой брокер).

Вы лучшие.

Супер!

 

Уважаемый автор, несколько раз перечитал код TargetFunction() и кажется вы сделали несколько ошибок.

1. При расчете прибыли по позиции вы делаете двойное суммирование профита. 

        if (!truTradeTime [h]) {
            if (posType != 0) { // Если есть открытая позиция
                posClPrice = rates [h].open; // Закрываем по цене открытия бара
                profit = (posClPrice - posOpPrice) * signal - 0.00003; // Комиссия

                if (profit > 0.0) allProfit += profit;
                else              allLoss   += -profit;

                if (posType == 1) buys++;
                else              sells++;

                allProfit += profit;
                posType = 0; // Сбрасываем позицию
            }
            continue; // Пропускаем не торговое время
        }

        if ((posType == 1 && signal == -1) || (posType == -1 && signal == 1)) {
            posClPrice = rates [h].open; // Закрываем по цене открытия текущего бара
            profit = (posClPrice - posOpPrice) * signal - 0.00003; // Расчёт прибыли

            // Учёт прибыли/убытка
            if (profit > 0.0) allProfit += profit;
            else              allLoss   += -profit;

            // Статистика по сделкам
            if (posType == 1) buys++;
            else              sells++;

            allProfit += profit;
            posType = 0; // Позиция закрыта
        }


2. При расчете показателя приспособленности не используется коэффициент ko.
double ko = 1.0;
  if (sells == 0 || buys == 0) return -DBL_MAX;
  if (sells / buys > 1.5 || buys / sells > 1.5) ko = 0.001;

  return (allProfit / (allLoss + DBL_EPSILON)) * dealsNumb;
 
John_Freeman #:

Уважаемый автор, несколько раз перечитал код TargetFunction() и кажется вы сделали несколько ошибок.

1. При расчете прибыли по позиции вы делаете двойное суммирование профита. 


2. При расчете показателя приспособленности не используется коэффициент ko.

1. Да, вы правы, уберите в конце обоих блоков кода строчки 
allProfit += profit;

чтобы получилось так:

f (!truTradeTime [h]) {
            if (posType != 0) { // Если есть открытая позиция
                posClPrice = rates [h].open; // Закрываем по цене открытия бара
                profit = (posClPrice - posOpPrice) * signal - 0.00003; // Комиссия

                if (profit > 0.0) allProfit += profit;
                else              allLoss   += -profit;

                if (posType == 1) buys++;
                else              sells++;

                //allProfit += profit;
                posType = 0; // Сбрасываем позицию
            }
            continue; // Пропускаем не торговое время
        }

        if ((posType == 1 && signal == -1) || (posType == -1 && signal == 1)) {
            posClPrice = rates [h].open; // Закрываем по цене открытия текущего бара
            profit = (posClPrice - posOpPrice) * signal - 0.00003; // Расчёт прибыли

            // Учёт прибыли/убытка
            if (profit > 0.0) allProfit += profit;
            else              allLoss   += -profit;

            // Статистика по сделкам
            if (posType == 1) buys++;
            else              sells++;

            //allProfit += profit;
            posType = 0; // Позиция закрыта
        }


2. Да, ko не используется.