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

Fuzzy - библиотека для работы с нечеткой логикой - библиотека для MetaTrader 5

Опубликовал:
MetaQuotes
Просмотров:
6613
Рейтинг:
(34)
Опубликован:
2015.08.26 17:08
Обновлен:
2017.05.19 18:11
Нужен робот или индикатор на основе этого кода? Закажите его на бирже фрилансеров Перейти на биржу

Реальный автор

Дмитрий Калюжный. Сайт проекта FuzzyNet - http://sourceforge.net/projects/fuzzynet/

Для работы нужно распаковать архив в папку каталог_данных_терминала.
Коды библиотеки размещаются в папке: <каталог_данных_терминала>\MQL5\Include\Math\FuzzyNet\
Примеры тестовых скриптов можно найти в папке: <каталог_данных_терминала>\MQL5\Scripts\FuzzyNet\

FuzzyNet - одна из самых популярных математических библиотек для создания нечетких моделей

Fuzzy Logic Library Microsoft.Net (FuzzyNet) - это простая в использовании библиотека нечеткой логики, в которой реализованы системы нечеткого логического вывода Мамдани и Сугено.

FuzzyNet включает в себя:

  • 5 функций принадлежностей.
  • Гибкую форму написания правил для нечетких систем.
  • Систему нечеткого логического вывода Мамдани.
  • Систему нечеткого логического вывода Сугено.
  • 1 метод дефаззификации для систем типа Мамдани.
  • Неограниченное количество входных и выходных переменных.

При переводе библиотеки на MQL5 дополнительно в библиотеку было добавлено:

  • 8 новых функций принадлежности.
  • 4 новых метода дефаззификации для систем типа Мамдани.

Порядок работы с библиотекой

  1. В зависимости от решаемой задачи создать пустую нечеткую систему типа Мамдани или Сугено.
  2. Далее создаем нечеткие входные и выходные переменные.
  3. В каждую нечеткую переменную добавляются её термины. Перед этим термину присваивается имя и функция принадлежности термина к своей нечеткой переменной.
  4. Переменные добавляются в систему.
  5. Создается база правил.
  6. Правила добавляются в систему.
  7. В систему посылаются входные данные.
  8. Вызывается функция расчета системы.

Примечание: Настройку системы логического вывода типа Мамдани можно производить на любом этапе после её создания и до вызова функции расчета системы. Если после создания системы её параметры не изменялись, то система будет работать с параметрами по умолчанию. А именно:

  • Импликация будет происходить с использованием оператора Min, то есть путем усечения выходного нечеткого множества.
  • Агрегация будет происходить с использованием оператора Max, то есть получение максимальных значений выходных функций принадлежностей, полученных после импликации.
  • Дефаззификация будет происходить по методу центра тяжести.

Здесь представлена конвертация библиотеки FuzzyNet версии 1.2.0.

Для работы с библиотекой необходимо подключить файл MamdaniFuzzySystem.mqh или SugenoFuzzySystem.mqh в зависимости от создаваемой системы.

Подробнее о пакетах портированной библиотеки FuzzyNet:
Пакеты
Описание
Dictionary.mqh
Пакет содержит вспомогательные классы, необходимые для других пакетов.
FuzzyRule.mqh
Классы для создания нечетких правил:
  1. GenericFuzzyRule - класс для создания условия четкого правила.
  2. MamdaniFuzzyRule - класс для создания заключения нечеткого правила типа Мамдани.
  3. SugenoFuzzyRule - класс для создания заключения нечеткого правила типа Сугено.

Пакет также содержит вспомогательные классы для реализации нечетких правил.

FuzzyTerm.mqh Пакет для создания нечетких терминов.
FuzzyVariable.mqh Пакет для создания нечетких переменных.
GenericFuzzySystem.mqh Класс, реализующий общую функциональную часть для систем Мамдани и Сугено.
Helper.mqh Пакет содержит вспомогательные классы, необходимые для других пакетов.
InferenceMethod.mqh Пакет содержит вспомогательные классы, необходимые для других пакетов.
MamdaniFuzzySystem.mqh Класс для создания нечеткой системы типа Мамдани.
MembershipFunction.mqh Классы функций принадлежностей:
  1. Гауссовская функция принадлежности.
  2. Двухсторонняя Гауссовская функция принадлежности.
  3. Обобщенная колоколообразная функция принадлежности.
  4. S-подобная функция принадлежности.
  5. Z-подобная функция принадлежности.
  6. Пи-подобная функция принадлежности.
  7. Сигмоидная функция принадлежности.
  8. Произведение двух сигмоидных функций принадлежности.
  9. Функция принадлежности в виде разности между двумя сигмоидными функциями.
  10. Трапециевидная функция принадлежности.
  11. Треугольная функция принадлежности.
  12. Функция принадлежности в виде константы.
  13. Функция принадлежности как композиция функций принадлежности.
RuleParser.mqh Класс для анализа нечетких правил.
SugenoFuzzySystem.mqh Класс для создания нечеткой системы типа Сугено.
SugenoVariable.mqh Пакет содержит классы:
  1. LinearSugenoFuction - класс для создания линейных функций.
  2. SugenoVariable - класс для создания нечеткой переменной типа Сугено.

Нечеткие переменные типа Сугено используются при написании правил для системы типа Сугено.

 

Порядок работы с библиотекой FuzzyNet на MQL5

Перед написанием нечеткой системы необходимо детально её представлять. А именно:

  1. Количество входных и выходных значений, которые будут переставляться нечеткими переменными.
  2. Количество терминов и их функций принадлежностей для каждой нечеткой переменной.
  3. Выбрать тип нечеткой системы в зависимости от решаемой задачи.
  4. Количество и содержание нечетких правил, соответствующих выбранной системе.
  5. Индивидуальные параметры и особенности системы.

Процесс создания системы и её расчета:

  1. Создать пустую систему.

    Для системы типа Мамдани:

    MamdaniFuzzySystem *fuzzy_system=new MamdaniFuzzySystem();
    Для системы типа Сугено:
    SugenoFuzzySystem *fuzzy_system=new SugenoFuzzySystem();
  2. Отдельно от системы создать все нечеткие входные переменные, задав им в качестве параметров имя переменной, её максимальное и минимальное значения:
    FuzzyVariable *fuzzy_variable=new FuzzyVariable(const string name,const double min,const double max);
  3. Создать функции нечетких терминов, создать сами нечеткие термины, в качестве параметров передать им их имена и функции принадлежностей, после добавить эти термины в соответствующие переменные. Для уменьшения программного кода этот процесс можно записать как:
    fuzzy_variable.Terms().Add(new FuzzyTerm(const string name,new IMembershipFunction());
  4. Далее необходимо занести входные переменные в систему:
    fuzzy_system.Input().Add(FuzzyVariable fuzzy_variable);
  5. Создаем выходные переменные. При их создании важно обращать внимание на тип вашей системы. Для системы типа Мамдани процесс их создания идентичен пунктам 2 и 3. В случае модели типа Сугено необходимо создавать специальные нечеткие переменные. В качестве параметров они принимают только имя переменной:
    SugenoVariable *sugeno_variable=new SugenoVariable(const string name);
    Вместо нечетких терминов в нечеткую переменную типа Сугено добавляются линейные функции, интерпретирующие линейную комбинацию входных значений. Параметрами линейной функции будут её имя и массив коэффициентов. На основе этого массива будет составлено линейное уравнение, поэтому важно соблюдать порядок элементов в массиве. Длина массива коэффициентов должна быть равна или на один больше количества входных значений. Если длины равны, то свободный член уравнения будет равен нулю. Если же длина массива на один больше, свободный член будет равен значению последнего элемента. Всем остальным элементам массива, начиная с первого, ставится в соответствие нечеткая входная переменная согласно порядку, в котором они заносились в систему.
    sugeno_varriable.Functions().Add(fuzzy_sytem.CreateSugenoFunction(const string name, const double &coeffs[]));
  6. По аналогии с пунктом 4 выходные значения также необходимо добавить в систему:

    Для системы типа Мамдани:

    fuzzy_system.Output().Add(FuzzyVariable fuzzy_variable);

    Для системы типа Сугено:

    fuzzy_system.Output().Add(FuzzyVariable fuzzy_variable);
  7. В соответствии с системой составляем базу правил. Правила задаются в виде обычной строки и автоматически анализируются исходя из ключевых слов. Ключевыми словами являются: "if", "then", "is", "and", "or", "not", "(" , ")", "slightly", "somewhat", "very", "extremely", а также все имена переменных, терминов и функций, имеющихся в вашей системе.

    Для системы типа Мамдани:

    MamdaniFuzzyRule *fuzzy_rule = fuzzy_system.ParseRule(const string rule_text);

    Для системы типа Сугено:

    SugenoFuzzyRule *fuzzy_rule = fuzzy_system.ParseRule(const string rule_text);
  8. Занести все правила в систему:

    Для системы типа Мамдани:

    fuzzy_system.Rules().Add(MamdaniFuzzyRule fuzzy_rule);

    Для системы типа Сугено:

    fuzzy_system.Rules().Add(SugenoFuzzyRule fuzzy_rule);
  9. Подать в систему входные значения переменных для расчета. Для этого их необходимо сформулировать. На вход система принимает список значений, одним из элементов которого будет объект класса Dictionary_Obj_Double. Данный класс описан в файле Dictionary.mqh.
    Dictionary_Obj_Double *p_od_in=new Dictionary_Obj_Double;
    Данный класс реализует в себе метод SetAll(CObject *key, const double value), который принимает два параметра - нечеткую переменную и числовое значение. Этот элемент и представляет собой входное значение системы.
    p_od_in.SetAll(FuzzyVariable fuzzy_variable,const double value);
    По этой же технологии заполняем все остальные входные значения. Создаем список и заносим их все в него:
    CList *in=new CList;
    in.Add(p_od_in);
  10. Также задаем выходные значения:
    Dictionary_Obj_Double *p_od_out=new Dictionary_Obj_Double;   
    CList *out=new CList;
  11. Вызываем функцию Calculate(CList *&list) для нашей системы, которая вернет нам список результатов вычисления системы:
    out=fuzzy_system.Calculate(in);
    Поле этого в списке out хранятся все вычисленные выходные значения в том порядке, в котором они заносились в систему. Нам лишь остается получить эти значения:
    p_od_out=out.GetNodeAtIndex(int index);
    double result=p_od_out.Value();
    Теперь в переменной result хранится результат вычисления системы для выходного значения, занесенного в систему под номером, который указан в index.

Tips Sample (Mamdani)

Тестовый скрипт Tips_Sample_Mamdani.mq5 вычисляет процент чаевых, которые нужно оставить в заведении исходя из качества обслуживания и еды.

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

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

Результатом вычислений будет:

Результат вычислений

Cruise Control Sample (Sugeno)

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

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

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

Результатом вычислений будет:

Результат вычислений

i-BandsPrice_HTF i-BandsPrice_HTF

Индикатор i-BandsPrice с возможностью изменения таймфрейма индикатора во входных параметрах.

HVR_HTF HVR_HTF

Индикатор HVR с возможностью изменения таймфрейма индикатора во входных параметрах.

i-KlPrice_HTF i-KlPrice_HTF

Индикатор i-KlPrice с возможностью изменения таймфрейма индикатора во входных параметрах.

i-BB-Width_HTF i-BB-Width_HTF

Индикатор i-BB-Width с возможностью изменения таймфрейма индикатора во входных параметрах.