Реальный автор
Дмитрий Калюжный. Сайт проекта FuzzyNet - http://sourceforge.net/projects/fuzzynet/
Для работы нужно распаковать архив в папку каталог_данных_терминала.
Коды библиотеки размещаются в папке: <каталог_данных_терминала>\MQL5\Include\Math\FuzzyNet\
Примеры тестовых скриптов можно найти в папке: <каталог_данных_терминала>\MQL5\Scripts\FuzzyNet\
FuzzyNet - одна из самых популярных математических библиотек для создания нечетких моделей
Fuzzy Logic Library Microsoft.Net (FuzzyNet) - это простая в использовании библиотека нечеткой логики, в которой реализованы системы нечеткого логического вывода Мамдани и Сугено.
FuzzyNet включает в себя:
При переводе библиотеки на MQL5 дополнительно в библиотеку было добавлено:
Порядок работы с библиотекой
Примечание: Настройку системы логического вывода типа Мамдани можно производить на любом этапе после её создания и до вызова функции расчета системы. Если после создания системы её параметры не изменялись, то система будет работать с параметрами по умолчанию. А именно:
Здесь представлена конвертация библиотеки FuzzyNet версии 1.2.0.
Для работы с библиотекой необходимо подключить файл MamdaniFuzzySystem.mqh или SugenoFuzzySystem.mqh в зависимости от создаваемой системы.
Подробнее о пакетах портированной библиотеки FuzzyNet:| Пакеты | Описание |
|---|---|
| Dictionary.mqh | Пакет содержит вспомогательные классы, необходимые для других пакетов. |
| FuzzyRule.mqh | Классы для создания нечетких правил:
Пакет также содержит вспомогательные классы для реализации нечетких правил. |
| FuzzyTerm.mqh | Пакет для создания нечетких терминов. |
| FuzzyVariable.mqh | Пакет для создания нечетких переменных. |
| GenericFuzzySystem.mqh | Класс, реализующий общую функциональную часть для систем Мамдани и Сугено. |
| Helper.mqh | Пакет содержит вспомогательные классы, необходимые для других пакетов. |
| InferenceMethod.mqh | Пакет содержит вспомогательные классы, необходимые для других пакетов. |
| MamdaniFuzzySystem.mqh | Класс для создания нечеткой системы типа Мамдани. |
| MembershipFunction.mqh | Классы функций принадлежностей:
|
| RuleParser.mqh | Класс для анализа нечетких правил. |
| SugenoFuzzySystem.mqh | Класс для создания нечеткой системы типа Сугено. |
| SugenoVariable.mqh | Пакет содержит классы:
Нечеткие переменные типа Сугено используются при написании правил для системы типа Сугено. |
Порядок работы с библиотекой FuzzyNet на MQL5
Перед написанием нечеткой системы необходимо детально её представлять. А именно:
Процесс создания системы и её расчета:
Для системы типа Мамдани:
MamdaniFuzzySystem *fuzzy_system=new MamdaniFuzzySystem();Для системы типа Сугено:
SugenoFuzzySystem *fuzzy_system=new SugenoFuzzySystem();
FuzzyVariable *fuzzy_variable=new FuzzyVariable(const string name,const double min,const double max);
fuzzy_variable.Terms().Add(new FuzzyTerm(const string name,new IMembershipFunction());
fuzzy_system.Input().Add(FuzzyVariable fuzzy_variable);
SugenoVariable *sugeno_variable=new SugenoVariable(const string name);Вместо нечетких терминов в нечеткую переменную типа Сугено добавляются линейные функции, интерпретирующие линейную комбинацию входных значений. Параметрами линейной функции будут её имя и массив коэффициентов. На основе этого массива будет составлено линейное уравнение, поэтому важно соблюдать порядок элементов в массиве. Длина массива коэффициентов должна быть равна или на один больше количества входных значений. Если длины равны, то свободный член уравнения будет равен нулю. Если же длина массива на один больше, свободный член будет равен значению последнего элемента. Всем остальным элементам массива, начиная с первого, ставится в соответствие нечеткая входная переменная согласно порядку, в котором они заносились в систему.
sugeno_varriable.Functions().Add(fuzzy_sytem.CreateSugenoFunction(const string name, const double &coeffs[]));
Для системы типа Мамдани:
fuzzy_system.Output().Add(FuzzyVariable fuzzy_variable);
Для системы типа Сугено:
fuzzy_system.Output().Add(FuzzyVariable fuzzy_variable);
Для системы типа Мамдани:
MamdaniFuzzyRule *fuzzy_rule = fuzzy_system.ParseRule(const string rule_text);
Для системы типа Сугено:
SugenoFuzzyRule *fuzzy_rule = fuzzy_system.ParseRule(const string rule_text);
Для системы типа Мамдани:
fuzzy_system.Rules().Add(MamdaniFuzzyRule fuzzy_rule);
Для системы типа Сугено:
fuzzy_system.Rules().Add(SugenoFuzzyRule fuzzy_rule);
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);
Dictionary_Obj_Double *p_od_out=new Dictionary_Obj_Double; CList *out=new CList;
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 с возможностью изменения таймфрейма индикатора во входных параметрах.
HVR_HTF
Индикатор HVR с возможностью изменения таймфрейма индикатора во входных параметрах.
i-KlPrice_HTF
Индикатор i-KlPrice с возможностью изменения таймфрейма индикатора во входных параметрах.
i-BB-Width_HTF
Индикатор i-BB-Width с возможностью изменения таймфрейма индикатора во входных параметрах.