Как использовать ИИ для генерации кода MQL4(Или как заставить ИИ генерить на MQL4😃) - страница 2

 
HeAic #:

А это так генерит ИИ в программе Jan с сайта Open-source ChatGPT Alternative | Jan (используется модуль  CodeNinja 7B Q4)

Вот пример реализации функции RNN на MQL4 с комментариями на русском языке:


Спасибо. Не знал про такую программу. Шикарно быстро работает у меня.

 
Andrey Kolmogorov #:
GPT - 4

Четверка такая же тупая, как и 3.5. Вот вчерашний пример, решил проверить 4-ю версию.

Вопрос: напиши на С++ и MQL5 аналог фильтра с нулевой фазовой задержкой, в Matlab он называется filtfilt.

Вместо того чтобы бегать по массивам данных в разных направлениях, этот ИИ тупо вызывает функции физического переворота массива (вектора в С++). Так никакого быстродействия не хватит. Короче, для написания программ эти помойки не годятся. А вот использовать, как справочные системы мне очень нравится, гораздо удобнее Гугла или Яндекса.

--------- ответ Chat GPT 4 --------

Функция `filtfilt` в MATLAB применяет фильтрацию с нулевой фазовой задержкой, обрабатывая данные вперед и назад посредством заданного фильтра. Это устраняет фазовую задержку, которая обычно возникает при односторонней фильтрации. 

Чтобы создать аналог `filtfilt` в C++, мы можем использовать любую доступную библиотеку цифровой обработки сигналов или реализовать алгоритм самостоятельно. В простейшем случае, процедура должна выглядеть следующим образом:

1. Примените фильтр к данным в прямом направлении.

2. Разверните отфильтрованные данные (сделайте их зеркально отраженными).

3. Примените тот же фильтр к развернутым данным.

4. Снова разверните результат.


Ниже представлен очень простой пример реализации этого алгоритма на C++, используя встроенные инструменты STL для разворота вектора:


```cpp

#include <vector>

#include <algorithm> // для std::reverse

#include <numeric>   // для std::accumulate


// Пример простейшей функции фильтрации, замените её на реальную реализацию фильтра

std::vector<double> applyFilter(const std::vector<double>& data) {

    return data; // Заглушка, здесь должна быть логика фильтрации

}


std::vector<double> filtfilt(const std::vector<double>& data) {

    // Применяем фильтр в прямом направлении

    std::vector<double> filteredData = applyFilter(data);

    

    // Разворачиваем отфильтрованные данные

    std::reverse(filteredData.begin(), filteredData.end());

    

    // Применяем фильтр в обратном направлении

    filteredData = applyFilter(filteredData);

    

    // Снова разворачиваем данные для восстановления исходного порядка

    std::reverse(filteredData.begin(), filteredData.end());

    

    return filteredData;

}


int main() {

    // Пример использования функции

    std::vector<double> signal = {1.0, 2.0, 3.0, 2.0, 1.0}; // Ваш сигнал

    std::vector<double> filteredSignal = filtfilt(signal);


    return 0;

}

```

В этом примере используется функция `std::reverse`, чтобы перевернуть вектор. В реальной реализации функция `applyFilter` должна содержать код для фильтрации данных. 


Реализация фильтров бывает довольно сложной задачей, и в зависимости от типа фильтра (FIR, IIR) может потребоваться разработка специальных алгоритмов. Алгоритмы фильтрации могут быть реализованы "с нуля" или с использованием специализированных библиотек, таких как KissFFT для преобразования Фурье или Intel IPP для обработки сигналов.


Если вы не знакомы с деталями проектирования цифровых фильтров и не хотите имплементировать такую сложную систему самостоятельно, возможно, будет разумнее использовать уже готовые библиотеки для работы со звуком и сигналами, такие как Aquila, SpeexDSP или другие.


В MQL5 нет встроенных функций, эквивалентных `filtfilt` из MATLAB, поэтому мы должны реализовать такую функцию самостоятельно. Однако реализация цифрового фильтра с нулевой фазовой задержкой требует хороших знаний в области цифровой обработки сигналов, а основная трудность заключается в реализации самого фильтра (FIR, IIR и т.д.).


В MQL5 с его ограничениями создать полноценный аналог функции `filtfilt` непросто и сложно сделать это без использования дополнительных библиотек. Обычно трейдеры используют более простые методы фильтрации, такие как скользящие средние или индикаторы.


Ниже приведен пример простейшей "фильтрации" сигнала в MQL5, который использует метод скользящего среднего для демонстрации концепции. Это не эквивалент `filtfilt`, так как простое скользящее среднее не является фильтром с нулевой фазовой задержкой, но его можно использовать как отправную точку для более продвинутой реализации:


```mql5

#include <MovingAverages.mqh>


// Пример простой "фильтрации", используя скользящее среднее (не эквивалент filtfilt)

void SimpleMovingAverageFilter(const double &input[], double &output[], int period, int total) {

    // Проверка корректности параметров

    if(ArraySize(input) < total || ArraySize(output) < total)

        return;

  

    // Применяем скользящее среднее в прямом направлении

    for(int i = period-1; i < total; i++) {

        output[i] = 0;

        for(int j = 0; j < period; j++) {

            output[i] += input[i - j];

        }

        output[i] /= period;

    }

  

    // Разворачиваем отфильтрованные данные

    ArraySetAsSeries(output, true);

    ArrayReverse(output);

  

    // Обратно применяем скользящее среднее

    for(int i = period-1; i < total; i++) {

        double temp = 0;

        for(int j = 0; j < period; j++) {

            temp += output[i - j];

        }

        output[i] = temp / period;

    }

  

    // Снова разворачиваем данные

    ArrayReverse(output);

}


int OnInit() {

    return(INIT_SUCCEEDED);

}


void OnTick() {

    // Ваш код здесь

}


void OnStart() {

    // Ваши тестовые данные

    double data[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

    double filteredData[];

    ArraySetAsSeries(data,true);

    ArrayCopy(filteredData,data);


    // Применяем "фильтр"

    SimpleMovingAverageFilter(data, filteredData, 3, ArraySize(data));

}

```


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


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

 
Alexey Volchanskiy #:

1. Примените фильтр к данным в прямом направлении.

2. Разверните отфильтрованные данные (сделайте их зеркально отраженными).

3. Примените тот же фильтр к развернутым данным.

4. Снова разверните результат.

Прям как в анекдоте:

Не спешите выбрасывать банановую кожуру. 
Порежьте её острым ножом на тоненькие длинные полоски аккуратно разложите на газете и два часа подержите под солнечными лучами.
После этого накройте марлей, уберите на тёмное прохладное место и оставьте там на три-четыре дня.
Высохшие полоски сложите вместе и проверните через мясорубку.
Затем растолчите в ступке до состояния одродного мелкого порошка.
В таком виде кожура не займет много места в вашем мусорном ведре.
 
Vitaly Muzichenko #:

Прям как в анекдоте:

Так это ChatGPT 4 писал, не я )). Юмор в том, что вместо того, чтобы пройтись по массиву с данными с индексацией от 0 до N и в обратном направлении от N до нуля он просто тупо, физически реверсирует данные в массиве! И после этого инфоцыгане кричат изо всех утюгов, что ты можешь бухать пивко, а ИИ напишет за тебя диплом, диссертацию и т.д. Главное, пройти у них курсы тысяч так за 70 и золотой ключик у тебя в кармане!

 

И в то же время, для меня все эти ИИ являются отличной заменой поисковикам в технических вопросах. Например, спросим GigaChat от Сбера про ЦФ:

Вопрос: Чем отличаются цифровые FIR фильтры с четным и нечетным числом коэффициентов?

31 января в 18:32

Цифровые фильтры с конечной импульсной характеристикой (FIR) могут иметь четное или нечетное число коэффициентов. Фильтры с четным числом коэффициентов имеют симметричную импульсную характеристику,
что означает, что они имеют одинаковые значения на одинаковых расстояниях от центра. Фильтры с нечетным числом коэффициентов имеют несимметричную импульсную характеристику, что означает, что они имеют
разные значения на одинаковых расстояниях от центра.

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

 
Alexey Volchanskiy #:

И в то же время, для меня все эти ИИ являются отличной заменой поисковикам в технических вопросах. Например, спросим GigaChat от Сбера про ЦФ:

Вопрос: Чем отличаются цифровые FIR фильтры с четным и нечетным числом коэффициентов?

31 января в 18:32

Цифровые фильтры с конечной импульсной характеристикой (FIR) могут иметь четное или нечетное число коэффициентов. Фильтры с четным числом коэффициентов имеют симметричную импульсную характеристику,
что означает, что они имеют одинаковые значения на одинаковых расстояниях от центра. Фильтры с нечетным числом коэффициентов имеют несимметричную импульсную характеристику, что означает, что они имеют
разные значения на одинаковых расстояниях от центра
.

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

представим, что число коэффициентов = 1

ну врет же ! ;)

фу, тупая машина )))))

FIR можно было и по русски - КИХ

к тому же, как мне кажется, КИХ-фильтр сможет отфильтровать только синусоидальный сигнал, т.е. который симметричен относительно горизонтальной оси
 
Renat Akhtyamov #:

представим, что число коэффициентов = 1

ну врет же ! ;)

фу, тупая машина )))))

FIR можно было и по русски - КИХ

к тому же, как мне кажется, КИХ-фильтр сможет отфильтровать только синусоидальный сигнал, т.е. который симметричен относительно горизонтальной оси

При кол-ве коэфф. == 1 фильтр вырождается в умножитель )). КИХ фильтрует любой сигнал. Те же мувинги, которые вычисляются по Simple, по сути КИХ с одинаковыми коэффицинтами.

CalculateSimpleMA

for(i=begin; i<start; i++)
         first_value+=price[i];
first_value/=InpMAPeriod;
 
Petr Zharuk #:

Спасибо. Не знал про такую программу. Шикарно быстро работает у меня.

Это ещё не всё 😉. Здесь отсортированы 8-ми битные модели вместо стандартных 32-х битных - на них скорость ещё выше

Models - Hugging Face
Models - Hugging Face
  • 2024.01.09
  • huggingface.co
We’re on a journey to advance and democratize artificial intelligence through open source and open science.
 
HeAic #:

Это ещё не всё 😉. Здесь отсортированы 8-ми битные модели вместо стандартных 32-х битных - на них скорость ещё выше

А можете поподробнее об этом?)