Ставь лайки и следи за новостями
Поставь на него ссылку - пусть другие тоже оценят
Оцени его работу в терминале MetaTrader 5
Fuzzy - библиотека для работы с нечеткой логикой - библиотека для MetaTrader 5
- Опубликовал:
- MetaQuotes
- Просмотров:
- 6764
- Рейтинг:
- Опубликован:
- 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 новых метода дефаззификации для систем типа Мамдани.
Порядок работы с библиотекой
- В зависимости от решаемой задачи создать пустую нечеткую систему типа Мамдани или Сугено.
- Далее создаем нечеткие входные и выходные переменные.
- В каждую нечеткую переменную добавляются её термины. Перед этим термину присваивается имя и функция принадлежности термина к своей нечеткой переменной.
- Переменные добавляются в систему.
- Создается база правил.
- Правила добавляются в систему.
- В систему посылаются входные данные.
- Вызывается функция расчета системы.
Примечание: Настройку системы логического вывода типа Мамдани можно производить на любом этапе после её создания и до вызова функции расчета системы. Если после создания системы её параметры не изменялись, то система будет работать с параметрами по умолчанию. А именно:
- Импликация будет происходить с использованием оператора Min, то есть путем усечения выходного нечеткого множества.
- Агрегация будет происходить с использованием оператора Max, то есть получение максимальных значений выходных функций принадлежностей, полученных после импликации.
- Дефаззификация будет происходить по методу центра тяжести.
Здесь представлена конвертация библиотеки 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);
- Создаем выходные переменные. При их создании важно обращать внимание на тип вашей системы. Для системы типа Мамдани процесс их создания идентичен пунктам 2 и 3. В случае модели типа Сугено необходимо создавать специальные нечеткие переменные. В качестве параметров они принимают только имя переменной:
SugenoVariable *sugeno_variable=new SugenoVariable(const string name);
Вместо нечетких терминов в нечеткую переменную типа Сугено добавляются линейные функции, интерпретирующие линейную комбинацию входных значений. Параметрами линейной функции будут её имя и массив коэффициентов. На основе этого массива будет составлено линейное уравнение, поэтому важно соблюдать порядок элементов в массиве. Длина массива коэффициентов должна быть равна или на один больше количества входных значений. Если длины равны, то свободный член уравнения будет равен нулю. Если же длина массива на один больше, свободный член будет равен значению последнего элемента. Всем остальным элементам массива, начиная с первого, ставится в соответствие нечеткая входная переменная согласно порядку, в котором они заносились в систему.sugeno_varriable.Functions().Add(fuzzy_sytem.CreateSugenoFunction(const string name, const double &coeffs[]));
- По аналогии с пунктом 4 выходные значения также необходимо добавить в систему:
Для системы типа Мамдани:
fuzzy_system.Output().Add(FuzzyVariable fuzzy_variable);
Для системы типа Сугено:
fuzzy_system.Output().Add(FuzzyVariable fuzzy_variable);
- В соответствии с системой составляем базу правил. Правила задаются в виде обычной строки и автоматически анализируются исходя из ключевых слов. Ключевыми словами являются: "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);
- Занести все правила в систему:
Для системы типа Мамдани:
fuzzy_system.Rules().Add(MamdaniFuzzyRule fuzzy_rule);
Для системы типа Сугено:
fuzzy_system.Rules().Add(SugenoFuzzyRule fuzzy_rule);
- Подать в систему входные значения переменных для расчета. Для этого их необходимо сформулировать. На вход система принимает список значений, одним из элементов которого будет объект класса 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);
- Также задаем выходные значения:
Dictionary_Obj_Double *p_od_out=new Dictionary_Obj_Double; CList *out=new CList;
- Вызываем функцию 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 с возможностью изменения таймфрейма индикатора во входных параметрах.
HVR_HTFИндикатор HVR с возможностью изменения таймфрейма индикатора во входных параметрах.
Индикатор i-KlPrice с возможностью изменения таймфрейма индикатора во входных параметрах.
i-BB-Width_HTFИндикатор i-BB-Width с возможностью изменения таймфрейма индикатора во входных параметрах.