Библиотеки: FuzzyNet - библиотека для работы с нечеткой логикой

 

FuzzyNet - библиотека для работы с нечеткой логикой:

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

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

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

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

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

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

Автор: MetaQuotes Software Corp.

 

1. Замечательно, что это теперь есть в мт5. Правильно ли я понимаю, что математика - она и в Африке математика и будет работать в МТ4?

2. Впервые фуззи попробовал в Матлабе, но, честно говоря, это было давно и я так толком и не понял, как это применить к трейдингу на форекс с гарантированной прибылью. В результате ушел в направлениях вейвлетов, статистики и прочее.

3. Можете подсказать литературу по применению фуззи-логики на практике? Пусть и не в трейдинге.

4. Мне интересна тема, статья на эту тему нужна сайту?

 
Alexey Volchanskiy:

1. Замечательно, что это теперь есть в мт5. Правильно ли я понимаю, что математика - она и в Африке математика и будет работать в МТ4?

2. Впервые фуззи попробовал в Матлабе, но, честно говоря, это было давно и я так толком и не понял, как это применить к трейдингу на форекс с гарантированной прибылью. В результате ушел в направлениях вейвлетов, статистики и прочее.

3. Можете подсказать литературу по применению фуззи-логики на практике? Пусть и не в трейдинге.

4. Мне интересна тема, статья на эту тему нужна сайту?

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

1. Мы сделаем адаптацию для МТ4 (несколько позже)

3. 4. Скоро выпустим статью по использованию FuzzyNet. После этого напишите в Сервисдеск, чтобы обсудить тематику более конректно.

 

Тема заслуживает внимания. В применении требует понимания предмета. И с этой точки зрения примеры с чаевыми - несерьезно. Хотя бы  вскользь нужно было бы пояснить различие между системами Мамдани и Сугено. Да и базовые понятия по нечеткой логике не помещали бы для тех кто впервые слышит о таком понятии.

Где то в архиве есть книга по нечеткой логике на русском(описание программы Fuzzy Logic System ). Так с ходу в архиве не найду. Позже выложу.

Удачи

 
Несколько источников с базовыми знаниями по предмету.
Файлы:
FuzLog.zip  1062 kb
 

Привет,

Мне нравятся такие системы, как Fuzzy, SVM, Neural, так что, наблюдая вокруг, я нашел эту либу, я попытался. Прилагаемые скрипты достаточно понятны, однако несколько ошибок при компиляции я бы хотел заметить - так на скрипте cruise_control_sample_sugeno.mq5 с sugeno было бы :

//+------------------------------------------------------------------+
//|fuzzynet.mqh |
//| Copyright 2015, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
//| Реализация библиотеки FuzzyNet на языке MetaQuotes Language 5(MQL5)|
//||
//| Особенности библиотеки FuzzyNet включают:|
//| - Создание нечеткой модели Мамдани|
//| - Создание нечеткой модели Сугено|
//| - Нормальная функция членства|
//| - Треугольная функция членства|
//| - Трапециевидная функция членства|
//| - Постоянная функция членства|
//| - Метод дефаззификации центра тяжести (COG)|
//| - Метод дефаззификации по биссектрисе площади (BOA)|
//| - Метод дефаззификации среднего значения максимумов (MeOM)|
//||
//| Если вы обнаружили какие-либо функциональные различия между FuzzyNet для MQL5 |
//| и оригинальный проект FuzzyNet, пожалуйста, свяжитесь с разработчиками |
//| MQL5 на форуме www.mql5.com.|
//||
//| Вы можете сообщить об ошибках, найденных в алгоритмах вычислений |
//| Библиотеку FuzzyNet, уведомив координаторов проекта FuzzyNet |
//+------------------------------------------------------------------+
//| ЛИЦЕНЗИЯ НА ИСТОЧНИК|
//||
//| Эта программа является свободным программным обеспечением; вы можете распространять ее и/или |
//| измените его в соответствии с условиями Стандартной общественной лицензии GNU, как |
//| Опубликовано Фондом свободного программного обеспечения(www.fsf.org); либо |
//| версию 2 Лицензии или (по вашему выбору) любую более позднюю версию. |
//||
//| Эта программа распространяется в надежде, что она окажется полезной,|
//| но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии |.
//| MERCHANTABILITY или FITNESS FOR A PARTICULAR PURPOSE. См.
//| GNU General Public License для более подробной информации.|
//||
//| Копия Стандартной общественной лицензии GNU доступна по адресу |
//| http://www.fsf.org/licensing/licenses                            |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property script_show_inputs
//+------------------------------------------------------------------+
//| Подключение библиотек|
//+------------------------------------------------------------------+
#include <Math\FuzzyNet\SugenoFuzzySystem.mqh>
//--- входные параметры
input double   Speed_Error;
input double   Speed_ErrorDot;
//+------------------------------------------------------------------+
//| Функция запуска программы сценария|
//+------------------------------------------------------------------+
void OnStart()
  {
//--- Нечеткая система Сугено
   CSugenoFuzzySystem *fsCruiseControl=new CSugenoFuzzySystem();
//--- Создайте первые входные переменные для системы
   CFuzzyVariable *fvSpeedError=new CFuzzyVariable("SpeedError",-20.0,20.0);
   fvSpeedError.Terms().Add(new CFuzzyTerm("slower",new CTriangularMembershipFunction(-35.0,-20.0,-5.0)));
   fvSpeedError.Terms().Add(new CFuzzyTerm("zero", new CTriangularMembershipFunction(-15.0, -0.0, 15.0)));
   fvSpeedError.Terms().Add(new CFuzzyTerm("faster", new CTriangularMembershipFunction(5.0, 20.0, 35.0)));
   fsCruiseControl.Input().Add(fvSpeedError);
//--- Создайте вторые входные переменные для системы
   CFuzzyVariable *fvSpeedErrorDot=new CFuzzyVariable("SpeedErrorDot",-5.0,5.0);
   fvSpeedErrorDot.Terms().Add(new CFuzzyTerm("slower", new CTriangularMembershipFunction(-9.0, -5.0, -1.0)));
   fvSpeedErrorDot.Terms().Add(new CFuzzyTerm("zero", new CTriangularMembershipFunction(-4.0, -0.0, 4.0)));
   fvSpeedErrorDot.Terms().Add(new CFuzzyTerm("faster", new CTriangularMembershipFunction(1.0, 5.0, 9.0)));
   fsCruiseControl.Input().Add(fvSpeedErrorDot);
//--- Создать вывод
   CSugenoVariable *svAccelerate=new CSugenoVariable("Accelerate");
   double coeff1[3]={0.0,0.0,0.0};
   svAccelerate.Functions().Add(fsCruiseControl.CreateSugenoFunction("zero",coeff1));
   double coeff2[3]={0.0,0.0,1.0};
   svAccelerate.Functions().Add(fsCruiseControl.CreateSugenoFunction("faster",coeff2));
   double coeff3[3]={0.0,0.0,-1.0};
   svAccelerate.Functions().Add(fsCruiseControl.CreateSugenoFunction("slower",coeff3));
   double coeff4[3]={-0.04,-0.1,0.0};
   svAccelerate.Functions().Add(fsCruiseControl.CreateSugenoFunction("func",coeff4));
   fsCruiseControl.Output().Add(svAccelerate);
//--- Нечеткое правило Крейта-Сугено
   CSugenoFuzzyRule *rule1 = fsCruiseControl.ParseRule("if (SpeedError is slower) and (SpeedErrorDot is slower) then (Accelerate is faster)");
   CSugenoFuzzyRule *rule2 = fsCruiseControl.ParseRule("if (SpeedError is slower) and (SpeedErrorDot is zero) then (Accelerate is faster)");
   CSugenoFuzzyRule *rule3 = fsCruiseControl.ParseRule("if (SpeedError is slower) and (SpeedErrorDot is faster) then (Accelerate is zero)");
   CSugenoFuzzyRule *rule4 = fsCruiseControl.ParseRule("if (SpeedError is zero) and (SpeedErrorDot is slower) then (Accelerate is faster)");
   CSugenoFuzzyRule *rule5 = fsCruiseControl.ParseRule("if (SpeedError is zero) and (SpeedErrorDot is zero) then (Accelerate is func)");
   CSugenoFuzzyRule *rule6 = fsCruiseControl.ParseRule("if (SpeedError is zero) and (SpeedErrorDot is faster) then (Accelerate is slower)");
   CSugenoFuzzyRule *rule7 = fsCruiseControl.ParseRule("if (SpeedError is faster) and (SpeedErrorDot is slower) then (Accelerate is faster)");
   CSugenoFuzzyRule *rule8 = fsCruiseControl.ParseRule("if (SpeedError is faster) and (SpeedErrorDot is zero) then (Accelerate is slower)");
   CSugenoFuzzyRule *rule9 = fsCruiseControl.ParseRule("if (SpeedError is faster) and (SpeedErrorDot is faster) then (Accelerate is slower)");
//--- Добавьте нечеткое правило Сугено в систему
   fsCruiseControl.Rules().Add(rule1);
   fsCruiseControl.Rules().Add(rule2);
   fsCruiseControl.Rules().Add(rule3);
   fsCruiseControl.Rules().Add(rule4);
   fsCruiseControl.Rules().Add(rule5);
   fsCruiseControl.Rules().Add(rule6);
   fsCruiseControl.Rules().Add(rule7);
   fsCruiseControl.Rules().Add(rule8);
   fsCruiseControl.Rules().Add(rule9);
//--- Установите входное значение и получите результат
   CList *in=new CList;
   CDictionary_Obj_Double *p_od_Error=new CDictionary_Obj_Double;
   CDictionary_Obj_Double *p_od_ErrorDot=new CDictionary_Obj_Double;
   p_od_Error.SetAll(fvSpeedError,Speed_Error);
   p_od_ErrorDot.SetAll(fvSpeedErrorDot,Speed_ErrorDot);
   in.Add(p_od_Error);
   in.Add(p_od_ErrorDot);
//--- Получите результат
   CList *result;
   CDictionary_Obj_Double *p_od_Accelerate;
   result=fsCruiseControl.Calculate(in);
   p_od_Accelerate=result.GetNodeAtIndex(0);
   Alert("Accelerate, %: ",p_od_Accelerate.Value()*100);
   delete in;
   delete result;
   delete fsCruiseControl;
  }
//+------------------------------------------------------------------+

А скрипт с мамдани :

//+------------------------------------------------------------------+
//|fuzzynet.mqh |
//| Copyright 2015, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
//| Реализация библиотеки FuzzyNet на языке MetaQuotes Language 5(MQL5)|
//||
//| Особенности библиотеки FuzzyNet включают:|
//| - Создание нечеткой модели Мамдани|
//| - Создание нечеткой модели Сугено|
//| - Нормальная функция членства|
//| - Треугольная функция членства|
//| - Трапециевидная функция членства|
//| - Постоянная функция членства|
//| - Метод дефаззификации центра тяжести (COG)|
//| - Метод дефаззификации по биссектрисе площади (BOA)|
//| - Метод дефаззификации среднего значения максимумов (MeOM)|
//||
//| Если вы обнаружили какие-либо функциональные различия между FuzzyNet для MQL5 |
//| и оригинальный проект FuzzyNet, пожалуйста, свяжитесь с разработчиками |
//| MQL5 на форуме www.mql5.com.|
//||
//| Вы можете сообщить об ошибках, найденных в алгоритмах вычислений |
//| Библиотеку FuzzyNet, уведомив координаторов проекта FuzzyNet |
//+------------------------------------------------------------------+
//| ЛИЦЕНЗИЯ НА ИСТОЧНИК|
//||
//| Эта программа является свободным программным обеспечением; вы можете распространять ее и/или |
//| измените его в соответствии с условиями Стандартной общественной лицензии GNU, как |
//| Опубликовано Фондом свободного программного обеспечения(www.fsf.org); либо |
//| версию 2 Лицензии или (по вашему выбору) любую более позднюю версию. |
//||
//| Эта программа распространяется в надежде, что она окажется полезной,|
//| но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии |.
//| MERCHANTABILITY или FITNESS FOR A PARTICULAR PURPOSE. См.
//| GNU General Public License для более подробной информации.|
//||
//| Копия Стандартной общественной лицензии GNU доступна по адресу |
//| http://www.fsf.org/licensing/licenses&nbsp;                           |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property script_show_inputs
//+------------------------------------------------------------------+
//| Подключение библиотек|
//+------------------------------------------------------------------+
#include <Math\FuzzyNet\MamdaniFuzzySystem.mqh>
//--- входные параметры
input double   Service;
input double   Food;
//+------------------------------------------------------------------+
//| Функция запуска программы сценария|
//+------------------------------------------------------------------+
void OnStart()
  {
//--- Нечеткая система Мамдани
   CMamdaniFuzzySystem *fsTips=new CMamdaniFuzzySystem();
//--- Создайте первые входные переменные для системы
   CFuzzyVariable *fvService=new CFuzzyVariable("service",0.0,10.0);
   fvService.Terms().Add(new CFuzzyTerm("poor", new CTriangularMembershipFunction(-5.0, 0.0, 5.0)));
   fvService.Terms().Add(new CFuzzyTerm("good", new CTriangularMembershipFunction(0.0, 5.0, 10.0)));
   fvService.Terms().Add(new CFuzzyTerm("excellent", new CTriangularMembershipFunction(5.0, 10.0, 15.0)));
   fsTips.Input().Add(fvService);
//--- Создайте вторые входные переменные для системы
   CFuzzyVariable *fvFood=new CFuzzyVariable("food",0.0,10.0);
   fvFood.Terms().Add(new CFuzzyTerm("rancid", new CTrapezoidMembershipFunction(0.0, 0.0, 1.0, 3.0)));
   fvFood.Terms().Add(new CFuzzyTerm("delicious", new CTrapezoidMembershipFunction(7.0, 9.0, 10.0, 10.0)));
   fsTips.Input().Add(fvFood);
//--- Создать вывод
   CFuzzyVariable *fvTips=new CFuzzyVariable("tips",0.0,30.0);
   fvTips.Terms().Add(new CFuzzyTerm("cheap", new CTriangularMembershipFunction(0.0, 5.0, 10.0)));
   fvTips.Terms().Add(new CFuzzyTerm("average", new CTriangularMembershipFunction(10.0, 15.0, 20.0)));
   fvTips.Terms().Add(new CFuzzyTerm("generous", new CTriangularMembershipFunction(20.0, 25.0, 30.0)));
   fsTips.Output().Add(fvTips);
//--- Создайте три нечетких правила Мамдани
   CMamdaniFuzzyRule *rule1 = fsTips.ParseRule("if (service is poor )  or (food is rancid) then tips is cheap");
   CMamdaniFuzzyRule *rule2 = fsTips.ParseRule("if ((service is good)) then tips is average");
   CMamdaniFuzzyRule *rule3 = fsTips.ParseRule("if (service is excellent) or (food is delicious) then (tips is generous)");
//--- Добавьте в систему три нечетких правила Мамдани
   fsTips.Rules().Add(rule1);
   fsTips.Rules().Add(rule2);
   fsTips.Rules().Add(rule3);
//--- Установите входное значение
   CList *in=new CList;
   CDictionary_Obj_Double *p_od_Service=new CDictionary_Obj_Double;
   CDictionary_Obj_Double *p_od_Food=new CDictionary_Obj_Double;
   p_od_Service.SetAll(fvService, Service);
   p_od_Food.SetAll(fvFood, Food);
   in.Add(p_od_Service);
   in.Add(p_od_Food);
//--- Получите результат
   CList *result;
   CDictionary_Obj_Double *p_od_Tips;
   result=fsTips.Calculate(in);
   p_od_Tips=result.GetNodeAtIndex(0);
   Alert("Tips, %: ",p_od_Tips.Value());
   delete in;
   delete result;
   delete fsTips;
  }
//+------------------------------------------------------------------+

Спасибо, что поделились!

 
Можно ли создать модель Мандани с более чем 02 входными переменными? У меня возникают ошибки при вводе третьей входной переменной.
[Удален]  

Уважаемые те, кто поддерживает либу, ну или просто кто-нибудь помогите плз.. :) Хочу ускорить расчеты. В примере приложен скрипт, который создает объекты классов нечеткой логики, рассчитывает результат и удаляет. Я хочу сделать, что бы объекты можно было создать 1 раз, а в ф-ю Calculate() передавать только новые значения и забирать результаты, при уже настроенной нечеткой логике.

Вот исходный пример, который работает корректно:

//+------------------------------------------------------------------+
//|                                                  tips sample.mq5 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#include <Math\Fuzzy\MamdaniFuzzySystem.mqh>
//--- input parameters
input double   Service;
input double   Food;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
  
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
  //--- Mamdani Fuzzy System  
   CMamdaniFuzzySystem *fsTips=new CMamdaniFuzzySystem();
//--- Create first input variables for the system
   CFuzzyVariable *fvService=new CFuzzyVariable("service",0.0,10.0);
   fvService.Terms().Add(new CFuzzyTerm("poor", new CTriangularMembershipFunction(-5.0, 0.0, 5.0)));
   fvService.Terms().Add(new CFuzzyTerm("good", new CTriangularMembershipFunction(0.0, 5.0, 10.0)));
   fvService.Terms().Add(new CFuzzyTerm("excellent", new CTriangularMembershipFunction(5.0, 10.0, 15.0)));
   fsTips.Input().Add(fvService);
//--- Create second input variables for the system
   CFuzzyVariable *fvFood=new CFuzzyVariable("food",0.0,10.0);
   fvFood.Terms().Add(new CFuzzyTerm("rancid", new CTrapezoidMembershipFunction(0.0, 0.0, 1.0, 3.0)));
   fvFood.Terms().Add(new CFuzzyTerm("delicious", new CTrapezoidMembershipFunction(7.0, 9.0, 10.0, 10.0)));
   fsTips.Input().Add(fvFood);
//--- Create Output
   CFuzzyVariable *fvTips=new CFuzzyVariable("tips",0.0,30.0);
   fvTips.Terms().Add(new CFuzzyTerm("cheap", new CTriangularMembershipFunction(0.0, 5.0, 10.0)));
   fvTips.Terms().Add(new CFuzzyTerm("average", new CTriangularMembershipFunction(10.0, 15.0, 20.0)));
   fvTips.Terms().Add(new CFuzzyTerm("generous", new CTriangularMembershipFunction(20.0, 25.0, 30.0)));
   fsTips.Output().Add(fvTips);
//--- Create three Mamdani fuzzy rule
   CMamdaniFuzzyRule *rule1 = fsTips.ParseRule("if (service is poor )  or (food is rancid) then tips is cheap");
   CMamdaniFuzzyRule *rule2 = fsTips.ParseRule("if ((service is good)) then tips is average");
   CMamdaniFuzzyRule *rule3 = fsTips.ParseRule("if (service is excellent) or (food is delicious) then (tips is generous)");
//--- Add three Mamdani fuzzy rule in system
   fsTips.Rules().Add(rule1);
   fsTips.Rules().Add(rule2);
   fsTips.Rules().Add(rule3);
//--- Set input value
   CList *in=new CList;
   CDictionary_Obj_Double *p_od_Service=new CDictionary_Obj_Double;
   CDictionary_Obj_Double *p_od_Food=new CDictionary_Obj_Double;
   p_od_Service.SetAll(fvService, Service);
   p_od_Food.SetAll(fvFood, Food);
   in.Add(p_od_Service);
   in.Add(p_od_Food);
//--- Get result
   CList *result;
   CDictionary_Obj_Double *p_od_Tips;
   result=fsTips.Calculate(in);
   p_od_Tips=result.GetNodeAtIndex(0);
   Print("Tips, %: ",p_od_Tips.Value());
   delete in;
   delete result;
   delete fsTips;
  }
//+------------------------------------------------------------------+

А вот мой пример, который выдает ошибку:

2017.09.07 14:28:56.949 Core 1  2017.07.03 00:00:00   Input values count is incorrect.
2017.09.07 14:28:56.949 Core 1  2017.07.03 00:00:00   invalid pointer access in 'MamdaniFuzzySystem.mqh' (172,42)

Сам код:

//+------------------------------------------------------------------+
//|                                                   TipsSample.mq5 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

#include <Math\Fuzzy\MamdaniFuzzySystem.mqh>

input double   Service;
input double   Food;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
CMamdaniFuzzySystem *fsTips=new CMamdaniFuzzySystem();
CFuzzyVariable *fvService=new CFuzzyVariable("service",0.0,10.0);
CFuzzyVariable *fvFood=new CFuzzyVariable("food",0.0,10.0);
CFuzzyVariable *fvTips=new CFuzzyVariable("tips",0.0,30.0);
CMamdaniFuzzyRule *rule1, *rule2, *rule3;

CList *in=new CList;
CDictionary_Obj_Double *p_od_Service=new CDictionary_Obj_Double;
CDictionary_Obj_Double *p_od_Food=new CDictionary_Obj_Double;

CList *result;
CDictionary_Obj_Double *p_od_Tips;
   
int OnInit()
  {
//---
   
   fvService.Terms().Add(new CFuzzyTerm("poor", new CTriangularMembershipFunction(-5.0, 0.0, 5.0)));
   fvService.Terms().Add(new CFuzzyTerm("good", new CTriangularMembershipFunction(0.0, 5.0, 10.0)));
   fvService.Terms().Add(new CFuzzyTerm("excellent", new CTriangularMembershipFunction(5.0, 10.0, 15.0)));
   fsTips.Input().Add(fvService);
//--- Create second input variables for the system
   
   fvFood.Terms().Add(new CFuzzyTerm("rancid", new CTrapezoidMembershipFunction(0.0, 0.0, 1.0, 3.0)));
   fvFood.Terms().Add(new CFuzzyTerm("delicious", new CTrapezoidMembershipFunction(7.0, 9.0, 10.0, 10.0)));
   fsTips.Input().Add(fvFood);
//--- Create Output
  
   fvTips.Terms().Add(new CFuzzyTerm("cheap", new CTriangularMembershipFunction(0.0, 5.0, 10.0)));
   fvTips.Terms().Add(new CFuzzyTerm("average", new CTriangularMembershipFunction(10.0, 15.0, 20.0)));
   fvTips.Terms().Add(new CFuzzyTerm("generous", new CTriangularMembershipFunction(20.0, 25.0, 30.0)));
   fsTips.Output().Add(fvTips);
//--- Create three Mamdani fuzzy rule
   rule1 = fsTips.ParseRule("if (service is poor )  or (food is rancid) then tips is cheap");
   rule2 = fsTips.ParseRule("if ((service is good)) then tips is average");
   rule3 = fsTips.ParseRule("if (service is excellent) or (food is delicious) then (tips is generous)");
   
   fsTips.Rules().Add(rule1);
   fsTips.Rules().Add(rule2);
   fsTips.Rules().Add(rule3);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  { 
   int ir; 
   for(ir=1; ir<10; ir++)
   { 
   p_od_Service.SetAll(fvService, ir);
   p_od_Food.SetAll(fvFood, ir);
   Print(CheckPointer(in));
   in.Clear();
   in.Add(p_od_Service);
   in.Add(p_od_Food);
//--- Get result
   
   result=fsTips.Calculate(in);
   Print("Error");
   p_od_Tips=result.GetNodeAtIndex(0);
   Print("Tips, %: ",p_od_Tips.Value());
   }
  }
//+------------------------------------------------------------------+

Вообще рассчитана ли либа на то что бы можно было создать объекты и затем просто получать результаты, допустим, на каждом новом баре? Потому что каждый раз пересоздавать логику это медленно и не экономно. 

[Удален]  

Версия библиотеки с исправлениями, теперь объекты фаззи логики можно создать 1 раз, и затем вызывать только Calculate()

Проверочный пример:

//+------------------------------------------------------------------+
//|                                                   TipsSample.mq5 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

#include <Math\Fuzzy\MamdaniFuzzySystem.mqh>

input double   Service;
input double   Food;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
CMamdaniFuzzySystem *FSTips=new CMamdaniFuzzySystem();
CFuzzyVariable *FVService=new CFuzzyVariable("service",0.0,10.0);
CFuzzyVariable *FVFood=new CFuzzyVariable("food",0.0,10.0);
CFuzzyVariable *FVTips=new CFuzzyVariable("tips",0.0,30.0);
CMamdaniFuzzyRule *Rule1,*Rule2,*Rule3;

CList *In=new CList;
CDictionary_Obj_Double *Dic_Service=new CDictionary_Obj_Double;
CDictionary_Obj_Double *Dic_Food=new CDictionary_Obj_Double;
CDictionary_Obj_Double *Dic_Tips;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   In.FreeMode(false);
//--- Create first input variables for the system

   FVService.Terms().Add(new CFuzzyTerm("poor", new CTriangularMembershipFunction(-5.0, 0.0, 5.0)));
   FVService.Terms().Add(new CFuzzyTerm("good", new CTriangularMembershipFunction(0.0, 5.0, 10.0)));
   FVService.Terms().Add(new CFuzzyTerm("excellent", new CTriangularMembershipFunction(5.0, 10.0, 15.0)));
   FSTips.Input().Add(FVService);
//--- Create second input variables for the system

   FVFood.Terms().Add(new CFuzzyTerm("rancid", new CTrapezoidMembershipFunction(0.0, 0.0, 1.0, 3.0)));
   FVFood.Terms().Add(new CFuzzyTerm("delicious", new CTrapezoidMembershipFunction(7.0, 9.0, 10.0, 10.0)));
   FSTips.Input().Add(FVFood);
//--- Create Output

   FVTips.Terms().Add(new CFuzzyTerm("cheap", new CTriangularMembershipFunction(0.0, 5.0, 10.0)));
   FVTips.Terms().Add(new CFuzzyTerm("average", new CTriangularMembershipFunction(10.0, 15.0, 20.0)));
   FVTips.Terms().Add(new CFuzzyTerm("generous", new CTriangularMembershipFunction(20.0, 25.0, 30.0)));
   FSTips.Output().Add(FVTips);
//--- Create three Mamdani fuzzy rule
   Rule1 = FSTips.ParseRule("if (service is poor )  or (food is rancid) then tips is cheap");
   Rule2 = FSTips.ParseRule("if ((service is good)) then tips is average");
   Rule3 = FSTips.ParseRule("if (service is excellent) or (food is delicious) then (tips is generous)");

   FSTips.Rules().Add(Rule1);
   FSTips.Rules().Add(Rule2);
   FSTips.Rules().Add(Rule3);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- delete fuzzy system
   In.FreeMode(true);  
   delete In;  
   delete FSTips;  
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   for(int ir=1; ir<10; ir++)
     {
      Dic_Service.SetAll(FVService,ir);
      Dic_Food.SetAll(FVFood,ir);
      In.Clear();
      In.Add(Dic_Service);
      In.Add(Dic_Food);
      //--- Get result
      CList *result=FSTips.Calculate(In);
      Dic_Tips=result.GetNodeAtIndex(0);
      Print("Tips, %: ",Dic_Tips.Value());
      delete result;
     }
  }
//+------------------------------------------------------------------+
Файлы:
Fuzzy.zip  33 kb
 

h

когда я обновил metatrader до build 2342

все примеры с библиотекой нечеткой логики

возвращают ошибку "некорректное приведение указателей" на MQL5 \ Include \ Math \ Fuzzy \ RuleParser.mqh Line 712

пожалуйста, помогите исправить ошибку

большое спасибо