Смотри, как бесплатно скачать роботов
Ищи нас в Twitter!
Ставь лайки и следи за новостями
Интересный скрипт?
Поставь на него ссылку - пусть другие тоже оценят
Понравился скрипт?
Оцени его работу в терминале MetaTrader 5
Индикаторы

Fixed-Width Fractional Differencing (FFD) - индикатор для MetaTrader 5

Patrick Murimi Njoroge
Patrick Murimi Njoroge
I build robust trading tools for MetaTrader. Browse my free articles to learn, get the premium EAs/indicators on the Market, or hire me for custom coding.
| Russian English 中文 Español Deutsch 日本語 Português 한국어 Français Italiano Türkçe
Просмотров:
350
Рейтинг:
(6)
Опубликован:
Обновлен:
\MQL5\Include\
MQL5 Фриланс Нужен робот или индикатор на основе этого кода? Закажите его на бирже фрилансеров Перейти на биржу

Исходные цены на валюту и фьючерсы являются нестационарными: стандартные модели регрессии и классификации, обученные на них, сталкиваются с серьезным смещением, связанным с предвосхищением, и ложными корреляциями. Наивный способ решения этой проблемы — целочисленное дифференцирование — устраняет нестационарность, но при этом уничтожает всю «память» цен, отбрасывая именно ту структуру автокорреляции, которая необходима прогнозной модели.

Дробовое дифференцирование с фиксированной шириной (FFD), представленное в главе 5 книги «Advances in Financial Machine Learning» (López de Prado, 2018), решает эту проблему за счёт дифференцирования с нецелым порядком d ∈ (0, 1), который является достаточным для достижения стационарности при сохранении максимальной «памяти». В данной работе представлена реализация этого метода на языке MQL5, готовая к использованию в производственной среде.

Индикатор FFD: исходная цена (вверху) по сравнению со стационарной серией FFD (внизу)

Иллюстрация результатов FFD на двух панелях: нестационарная исходная цена (a) и стационарный ряд FFD (b) с отмеченным окном обратного обзора


Компоненты

  • FFDEngine.mqh — библиотека, состоящая только из заголовка, содержащая класс CFFDEngine. Предоставляет функции Init(), Compute() (один бар) и ComputeBuffer() (полный буфер индикатора с оптимизацией prev_calculated ). После вызова OnInit() динамическое выделение памяти не производится.
  • FFD.mq5 — пользовательский индикатор, обертывающий CFFDEngine. Рисует ряд FFD в отдельном окне графика. Поддерживает все значения ENUM_APPLIED_PRICE.

Принцип работы алгоритма

Вектор весов определяется рекуррентным соотношением (уравнение 5.4 AFML):

w[0] = 1; w[k] = -w[k-1] * (d - k + 1) / k, k = 1, 2, ...

Итерация прекращается, когда |w[k]| < пороговое значение. Затем вектор обращается, так что самая старая цена в окне обратного просмотра получает наименьший вес, а самая новая — 1,0. Значение FFD на баре i представляет собой скалярное произведение обращенного векторного веса на окно логарифма цены [i−width, …, i].

При d = 0,4 и пороге = 1e-5 ширина окна составляет 1 457 баров. При пороге = 1e-3 она составляет 54 бара. Пороговое значение регулирует компромисс между стационарностью и памятью: меньшие значения сохраняют больше информации за счёт более широкого окна обратного обзора.

Входные параметры

Параметр По умолчанию Описание
InpD 0,4 Порядок дробного дифференцирования. Типичный диапазон: 0,1–0,9. Значения выше 0,5 дают результаты, близкие к целочисленному дифференцированию; значения ниже 0,1 дают результаты, близкие к исходным ценам. Оптимальное значение d — это минимальное значение, которое проходит ADF-тест на выбранном уровне значимости — см. сопутствующую статью, посвященную процедуре поиска в Python.
InpThreshold 1e-5 Пороговое значение τ для весов. Итерация останавливается, когда |w[k]| < τ. Меньшие значения дают более широкое окно и лучшее сохранение памяти, но требуют большего количества исторических баров до получения первого достоверного результата. Рекомендуемый диапазон: от 1e-4 до 1e-5.
InpUseLog true Применять ln(цена) перед дифференцированием. Рекомендуется для необработанных ценовых рядов (цены закрытия, открытия, максимума, минимума). Устанавливайте значение false только в том случае, если входные данные уже представляют собой ряд доходности или логарифмической доходности.
InpPrice PRICE_CLOSE Тип применяемой цены. Принимает любое значение из перечисления ENUM_APPLIED_PRICE: PRICE_OPEN, PRICE_HIGH, PRICE_LOW, PRICE_CLOSE, PRICE_MEDIAN, PRICE_TYPICAL, PRICE_WEIGHTED.

Установка

  1. Скопируйте файл FFDEngine.mqh в папку MQL5\Include\ (или в подпапку, указанную при загрузке из CodeBase — см. расположение файлов ниже).
  2. Скопируйте файл FFD.mq5 в пап ку MQL5\Indicators\Downloads\ (он помещается туда автоматически при загрузке из CodeBase).
  3. Скомпилируйте оба файла в MetaEditor. Индикатор должен скомпилироваться без предупреждений при использовании #property strict.
  4. Прикрепите FFD к любому графику. Окно индикатора появится под основным графиком после заполнения окна обратного обзора (ширина + 1 бар).

Использование CFFDEngine в собственном советнике или индикаторе

FFDEngine.mqh — это библиотека, состоящая только из заголовка. Включите её и вызовите Init() один раз в функции OnInit():

#include <FFDEngine.mqh>

//--- Глобальный экземпляр механизма дифференцирования с фиксированной шириной и дробными шагами
CFFDEngine g_engine;

//+------------------------------------------------------------------+
//| Функция инициализации эксперта                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Инициализация движка FFD с параметрами d=0,4, пороговым значением 1e-5 и включенным логарифмическим преобразованием
//--- Данная конфигурация создаёт окно со статическим весом памяти на этапе инициализации EA
   if(!g_engine.Init(0.4, 1 e-5, true))
     {
      Print("FFD engine init failed");
      return(INIT_FAILED);
     }
   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//| Функция «экспертного тика»                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- Запросить у движка, чтобы точно узнать, сколько исторических баров требуется
//--- для вычисления допустимого значения FFD на основе порогового значения
   int need = g_engine.GetMinBars();
   double close[];

//--- Загрузить данные об исторических ценах за необходимый период.
//--- Если история ещё не синхронизирована или данных недостаточно, пропустить выполнение, чтобы избежать ошибок.
   if(CopyClose(_Symbol, _Period, 0, need, close) < need)
      return;

//--- Убедиться, что индексация массива соответствует хронологическому порядку (самый старый столбец по индексу 0)
//--- для правильного выравнивания с учетом преобразований матрицы векторных весов FFD с обратным порядком
   ArraySetAsSeries(close, false);

//--- Вычислить стационарное значение выходного сигнала с дробными разностями для текущего бара
   double ffd_value = g_engine.Compute(close, need);

//--- Используйте ffd_value в качестве признака для вашей модели.
  }

Перекрестная проверка с помощью Python

Сопутствующий файл FFDValidation.mq5 (доступен в загрузке статьи) экспортирует значения FFD в файл CSV. Скрипт на Python ffd_cross_validate.py пересчитывает те же значения с использованием библиотеки afml и сравнивает их по каждому бару. На 5 000 барах EURUSD H1 с d = 0,4 и пороговым значением = 1e-5 максимальное абсолютное отклонение составляет менее 1e-12.

Примечания по производительности

  • Выделение векторного веса: один раз в OnInit(). Нулевое выделение памяти на пути тиков.
  • Вычисления для каждого бара: скалярное произведение O(width). На современном оборудовании скалярное произведение по 1 457 элементам выполняется менее чем за 50 мкс.
  • Функция ComputeBuffer() использует аргумент prev_calculated для пропуска уже вычисленных баров — при каждом тике пересчитывается только текущий незавершённый бар.

Ссылки и сопутствующая статья

Перевод с английского произведен MetaQuotes Ltd.
Оригинальная публикация: https://www.mql5.com/en/code/72499

Осциллятор TRIX долгосрочного тренда Осциллятор TRIX долгосрочного тренда

Осциллятор долгосрочного импульса и тренда, основанный на двойной фильтрации TRIX и LWMA.

SimpleTradeStats SimpleTradeStats

Статистика закрытых сделок. Индикатор показывает итоги торговли, фильтрация по магическому номеру.

Close Profit Positions Close Profit Positions

Закрыть прибыльные позиции

Institutional Harmonic Volumetric Gravity Center Institutional Harmonic Volumetric Gravity Center

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