Библиотеки: BestInterval

 

BestInterval:

Вычисление лучшего интервала торговли.

BestInterval

Автор: fxsaber

 

Может показаться, что библиотека имеет что-то общее с таким графиком в стандартном отчете MT5-Тестера


Пример, как получить данные для такого графика, ниже

#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006
#include <fxsaber\BestInterval\BestInterval.mqh> // https://www.mql5.com/ru/code/22710

void OnStart()
{
  BESTINTERVAL BestInterval; // Создали объект для вычисления лучшего интервала торговли
  
  BestInterval.Set(); // Поместили историю торгов  
  BestInterval.DeleteWorseInterval() // Выбросили плохой интервал

  double Profit[24], Loss[24];
  
  ArrayInitialize(Profit, 0);
  ArrayInitialize(Loss, 0);
  
  for (int i = BestInterval.GetAmount() - 1; i >= 0; i--)
  {
    const DEAL Deal = BestInterval[i];     // i-я сделка в пересчитанной торговой истории
    const int hour = Deal.OpenTime % 3600; // час i-й сделки
    
    // Распределили профит по соответствующим массивам
    if (Deal.Profit > 0)
      Profit[hour] += Deal.Profit;
    else
      Loss[hour] -= Deal.Profit;    
  }
}


Но на самом деле библиотека предназначена не для одиночных прогонов и не для визуализации. На 99% она нужна для Оптимизации ТС, т.к. позволяет откопать классные режимы работы любой ТС, если такие в ней, пусть и скрытно, но заложены.


Лог, что показан в библиотеке - это стадия анализа уже после Оптимизации: одиночный прогон. По этому логу просто становится понятно, как конкретный экземпляр ТС (набор входных параметров) ведет себя на вычисленных интервалах. Т.е. это доп. контроль, но на конечной стадии. Основа - Оптимизация.

 

Библиотека для получения истории торгов использует MT4Orders.

Могут быть разные причины, почему MT4Orders не должен быть использован. Например, для сторонних анализаторов торговли.

В любом случае такой сценарий предусмотрен:

#include <fxsaber\BestInterval\BestInterval.mqh> // Вычисление лучшего интервала торговли

void OnDeinit( const int )
{
  BESTINTERVAL BestInterval; // Создали объект для вычисления лучшего интервала торговли
  
  // Массив закрывающих сделок
  DEAL Deals[];
  
  // Нужно для каждой закрывающей сделки записать два поля
  // Deals[i].Profit - профит закрывающей позицию сделки
  // Deals[i].OpenTime - время открытия (не закрытия) позиции, что закрывает сделка
      
//  BestInterval.Set(); // Поместили историю торгов - использует MT4Orders
  BestInterval.Set(Deals); // Разместили самостоятельно подготовленную историю торгов
  
  const int AmountIntervals = 3; // Сколько наихудших интервалов торговли выбросить
  
  for (int i = 0; i < AmountIntervals; i++)
    if (BestInterval.DeleteWorseInterval()) // Если что-то выбросили
      Print(BestInterval.ToString());       // Распечатаем полученные данные торговли
    else
      break;                                // Иначе - выйдем
}

Т.е. Вы можете какие угодно данные подавать на вход для расчета лучшего интервала. Библиотека не зависит от платформы.


Обращу внимание, что алгоритм библы не предполагает никакой внутренней оптимизации параметров. Нет никакого перебора, т.к. основа - однопроходность: O(n) (n - количество закрывающих позиции сделок). И самое "медленное" звено - один QuickSort: O(n*log(n)). Поэтому и подходит великолепно для Оптимизации, т.к. не тормозит процесс.


ЗЫ Разработчики могли бы взять на вооружение алгоритм (т.к. однопроходный), для помещения его результатов в отчет одиночного прохода и создания штатного показателя

Идентификатор

Описание статистического показателя

Тип

STAT_PROFIT

Чистая прибыль по окончании тестирования, сумма STAT_GROSS_PROFIT и STAT_GROSS_LOSS (STAT_GROSS_LOSS всегда меньше или равно нулю)

double

STAT_BESTPROFIT

Прибыль на лучшем интервале.

double

 

Идея библиотеки понятна, а реализация поражает простотой использования. Спасибо за проделанную работу.

Однако, напрашивается предложение автору: нужен пример использования на конкретном советнике - от начала включения библиотек и заканчивая формированием фильтра.

 
Sergey Pavlov:

Идея библиотеки понятна, а реализация поражает простотой использования. Спасибо за проделанную работу.

Однако, напрашивается предложение автору: нужен пример использования на конкретном советнике - от начала включения библиотек и заканчивая формированием фильтра.

Поддерживаю на 101% :)

 
Sergey Pavlov:

нужен пример использования на конкретном советнике - от начала включения библиотек и заканчивая формированием фильтра.

Посмотрите BestInterval_Example.mq5.

 

Чтобы применить найденный интервал после его расчета, нужно во входных параметрах указать BestInteval Action = true.



Особенности.

  • Расчет лучшего интервала и его применение в Тестере производится без изменения оригинального исходника советника.

  • ЗЫ

    Просьба в комментариях делиться результатами применения (как выше) библиотеки ДО и ПОСЛЕ в виде картинок и соответствующих кусков логов одиночного прохода MT4/5.


    Существенно проще стало применять результат расчета к советнику. Для этого нужно нажать всего несколько раз кнопкой мыши.

    Как небольшое резюме.

    1. Берете любой советник и прописываете в его начало эти строки

    #include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006
    
    #define BESTINTERVAL_ONTESTER // Критерий оптимизации - прибыль лучшего интервала.
    #include <fxsaber\Virtual\Virtual.mqh> // https://www.mql5.com/ru/code/22577
    #include <fxsaber\BestInterval\BestInterval.mqh> // https://www.mql5.com/ru/code/22710

    2. Устанавливаете количество выбрасываемых интервалов и опцию не применения их.


    3. Ставите Оптимизацию, либо сразу одиночный прогон. Если интересно, в логе Тестера будут данные расчета.

    Amount of Delete Intervals = 0
    00:00:00 - 23:59:59 : Profit = 18385.00, Total = 1070, PF = 1.61, Mean = 17.18, DD = 1769.00, RF = 10.39
    SUMMARY: 00:00:00 - 23:59:59 : Profit = 18385.00, Total = 1070, PF = 1.61, Mean = 17.18, DD = 1769.00, RF = 10.39
    
    Amount of Delete Intervals = 1
    00:00:00 - 10:07:47 : Profit = 4279.00, Total = 181, PF = 2.02, Mean = 23.64, DD = 834.00, RF = 5.13
    11:06:12 - 23:59:59 : Profit = 17349.00, Total = 768, PF = 1.95, Mean = 22.59, DD = 933.00, RF = 18.59
    SUMMARY: 00:00:00 - 23:59:59 : Profit = 21628.00, Total = 949, PF = 1.97, Mean = 22.79, DD = 862.00, RF = 25.09


    4. После одиночного прогона включаете опцию активации лучшего интервала и запускаете снова одиночный прогон.


    5. Получаете отчет Тестера


    И данные по примененным интервалам в логе

    Amount of Delete Intervals = 1
    00:00:00 - 10:07:47 : Profit = 4279.00, Total = 181, PF = 2.02, Mean = 23.64, DD = 834.00, RF = 5.13
    11:06:12 - 23:59:59 : Profit = 17349.00, Total = 768, PF = 1.95, Mean = 22.59, DD = 933.00, RF = 18.59
    SUMMARY: 00:00:00 - 23:59:59 : Profit = 0.00, Total = 0, PF = Max, Mean = 0.00
    


    По итогу все результаты ДО и ПОСЛЕ + подробные данные (добавлены максимальная просадка и фактор восстановления - по балансу) по каждому подинтервалу лучшего интервала.

     

    Проверить библиотеку можно на этом советнике.

     

    Что значит?

    'OnTester' - function already defined and has body      BestInterval.mqh        504     8
    

    не хочет компилировать

     
    Sergey Chalyshev:

    Что значит?

    не хочет компилировать

    Что сделали?

     
    fxsaber:

    Что сделали?

    пока ничего не делал, пытаюсь скомпилировать этот код:

    #include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006
    
    #define VIRTUAL_TESTER // Запуск в виртуальном торговом окружении
    #define BESTINTERVAL_ONTESTER // Критерий оптимизации - прибыль лучшего интервала.
    #include <fxsaber\Virtual\Virtual.mqh> // https://www.mql5.com/ru/code/22577
    #include <fxsaber\BestInterval\BestInterval.mqh> // https://www.mql5.com/ru/code/22710
    
    #include <..\Experts\fxsaber\TesterEA\TesterEA.mq4>

    без Virtual компилируется,

    без BestInterval тоже компилируется,

    вместе не хочет.

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