Обсуждение статьи "Возможности Мастера MQL5, которые вам нужно знать (Часть 6): Преобразование Фурье"

 

Опубликована статья Возможности Мастера MQL5, которые вам нужно знать (Часть 6): Преобразование Фурье:

Преобразование Фурье, введенное Жозефом Фурье, является средством разложения сложных волновых точек данных на простые составляющие волны. Эта особенность может быть полезной для трейдеров, и именно ее мы и рассмотрим в этой статье.

При компиляции со встроенным классом сигналов RSI и встроенным управлением капиталом с фиксированной маржой мы получаем следующие результаты для EURJPY за период с 2022.01.01 по 2023.01.01 на H4. При выполнении этого теста мы не устанавливаем целевую прибыль и не используем стоп-лосс по умолчанию, поэтому оба входных параметра для них равны нулю. Мы хотим, чтобы выходы полностью определялись разворотом сигнала или срабатыванием стоп-лосса, установленного нашим трейлинг-стопом.


r_1

Автор: Stephen Njuki

 

Привет, Стефан,

Это отличная статья, хотя мне нужно изучить ее более подробно, так как я не использовал преобразования Фурье в течение 60 лет. Я удивлен, что не было других комментариев. Можете ли вы опубликовать исходный текст эксперта mq5, чтобы три варианта могли быть собраны в эксперте и протестированы.


Спасибо,

CapeCoddah

 

Привет,

Хорошая статья. Интересная идея. Пример кода mq5 для тестирования/пробы этих опций был бы замечательным. Спасибо.

 

Здравствуйте

Эксперты, используемые в статьях, скомпилированы с помощью мастера MQL5, поэтому остальной исходный код уже находится на вашем компьютере, если у вас есть metatrader.

 

Привет, Стефан

Я оставил свою самую любимую часть математики (Фурье) на 30 лет. Поэтому я не могу комментировать, но я прочитал ваше замечательное "упражнение".

Извините, что не могу помочь вам, но спасибо, что поделились им.

 

Стефан

Спасибо за ссылку, я продолжу использовать ее и сообщу вам о своих результатах,

CapeCoddah

 

Привет, Стивен,

очень интересная статья!

Одна подсказка к ней: Параметры "Points" и "Epicycles" нужно удалить в "Описании класса", они не используются в коде и компилятор жалуется после компиляции сгенерированного EA.

Мой вопрос: Советник работает нормально, но я никак не могу воспроизвести ваши результаты, возможно, я что-то сделал не так. Не могли бы вы выложить файл *.set или даже исходник советника, который вы сгенерировали?

Вы делали форвард-тест?

В любом случае, это хороший урок по использованию FFT. Спасибо!

 

Я так понял, тут автор даже не стал изучать быстрое преобразование Фурье :) И то верно, чего заморачиваться, FT и FFT это пустышки и в трейдинге ничего не дают. Я эти преобразования еще лет 15 назад в Матлабе крутил и так и сяк, и спектры резал, потом делал обратное преобразование во временную форму - полный пшик. FFT хороши в других областях, например радиолокации.

А вот вейвлеты гораздо интереснее. Если вырезать все высокочастотные полосы и сделать обратное преобразование во временную область, получим отличный НЧ фильтр без задержек. Впрочем, это можно сделать гораздо проще — через 2-х проходные фильтры..

 

Здравствуйте,

выдает 12 ошибок

 
В первом скрипте меня беспокоили некоторые вещи, поэтому я внес некоторые изменения.

double CTrailingFT::ProcessFT(int Index) {
    double _ft = 0.0;
    static double _a[6]; // Массив фиксированного размера
    al_complex _f[5];    // 5 эпициклов

    // Заполните _a данными о разнице цен
    for(int p=0; p<6; p++) {
        _a[p] = m_close.GetData(Index+p) - m_close.GetData(Index+p+1);
    }

    // Замените БПФ Alglib на пользовательское 6-точечное БПФ
    CustomFFT6(_a, _f); // Гипотетическая оптимизированная функция

    // Вычислите _ft, используя доминирующую частоту (например, наибольшую величину).
    double maxMagnitude = 0.0;
    for(int s=0; s<5; s++) {
        double mag = MathSqrt(_f[s].re*_f[s].re + _f[s].im*_f[s].im);
        if(mag > maxMagnitude) {
            maxMagnitude = mag;
            _ft = _f[s].re; // Или используйте взвешенную комбинацию
        }
    }

    return _ft * 100.0; // Настройте масштаб по мере необходимости
}

Замените Alglib на Custom FFT:

  • БПФ Alglib может быть медленнее для небольших наборов данных. Реализуйте облегченное БПФ, адаптированное к размеру вашего окна (6 точек).


Предварительно вычисляйте члены MathExp(-2.0*M_PI*...), чтобы не пересчитывать их при каждом тике.

ArrayResize(_a,6) и matrix.Init(6,5) внутри ProcessFT() неэффективны для HFT. Используются буферы фиксированного размера.

Избегайте матричных операций в ProcessFT(). Непосредственно вычисляйте требуемое значение _ft, используя доминирующие частоты.


Обработка ошибок:

Добавьте проверки для предотвращения деления на ноль в _f[s].im / _f[s].re.Избегайте матричных операций в ProcessFT() . Непосредственно вычисляйте требуемое значение _ft с помощью доминирующих частот.

Обработка ошибок:

  • Добавьте проверки для предотвращения деления на ноль в _f[s].im / _f[s].re .


Если кому-то нужен код для имплементации CustomFFT6, просто спросите.
 

Уже есть гораздо более эффективные методы, где используется элементарная структура (М-форма). Изменение её параметров даёт полное представление об изменении динамики цен (это теория импульсного равновесия).

Что же касается преобразования Фурье, то применительно к финансовым рынкам, на мой взгляд, это "притянутый за уши" метод, так движение цен финансовых инструментов - это нестационарный процесс, а анализ таких процессов с помощью методов Фурье малоэффективен.

Что касается вейвлет-анализа, то это действительно, интереснее, так как используются различные волноподобные структуры. Однако это лишь некий субъективный подбор эталонов вместо использования единой элементарной структуры, которая выявлена в теории импульсного равновесия.