FuzzyNet - библиотека для работы с нечеткой логикой:
Автор: MetaQuotes Software Corp.
1. Замечательно, что это теперь есть в мт5. Правильно ли я понимаю, что математика - она и в Африке математика и будет работать в МТ4?
2. Впервые фуззи попробовал в Матлабе, но, честно говоря, это было давно и я так толком и не понял, как это применить к трейдингу на форекс с гарантированной прибылью. В результате ушел в направлениях вейвлетов, статистики и прочее.
3. Можете подсказать литературу по применению фуззи-логики на практике? Пусть и не в трейдинге.
4. Мне интересна тема, статья на эту тему нужна сайту?
1. Замечательно, что это теперь есть в мт5. Правильно ли я понимаю, что математика - она и в Африке математика и будет работать в МТ4?
2. Впервые фуззи попробовал в Матлабе, но, честно говоря, это было давно и я так толком и не понял, как это применить к трейдингу на форекс с гарантированной прибылью. В результате ушел в направлениях вейвлетов, статистики и прочее.
3. Можете подсказать литературу по применению фуззи-логики на практике? Пусть и не в трейдинге.
4. Мне интересна тема, статья на эту тему нужна сайту?
Здравствуйте.
1. Мы сделаем адаптацию для МТ4 (несколько позже)
3. 4. Скоро выпустим статью по использованию FuzzyNet. После этого напишите в Сервисдеск, чтобы обсудить тематику более конректно.
Тема заслуживает внимания. В применении требует понимания предмета. И с этой точки зрения примеры с чаевыми - несерьезно. Хотя бы вскользь нужно было бы пояснить различие между системами Мамдани и Сугено. Да и базовые понятия по нечеткой логике не помещали бы для тех кто впервые слышит о таком понятии.
Где то в архиве есть книга по нечеткой логике на русском(описание программы Fuzzy Logic System ). Так с ходу в архиве не найду. Позже выложу.
Удачи
Привет,
Мне нравятся такие системы, как 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 |
//+------------------------------------------------------------------+
#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;
}
//+------------------------------------------------------------------+
Спасибо, что поделились!
Уважаемые те, кто поддерживает либу, ну или просто кто-нибудь помогите плз.. :) Хочу ускорить расчеты. В примере приложен скрипт, который создает объекты классов нечеткой логики, рассчитывает результат и удаляет. Я хочу сделать, что бы объекты можно было создать 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; } } //+------------------------------------------------------------------+
h
когда я обновил metatrader до build 2342
все примеры с библиотекой нечеткой логики
возвращают ошибку "некорректное приведение указателей" на MQL5 \ Include \ Math \ Fuzzy \ RuleParser.mqh Line 712
пожалуйста, помогите исправить ошибку
большое спасибо
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
FuzzyNet - библиотека для работы с нечеткой логикой:
FuzzyNet - одна из самых популярных математических библиотек для создания нечетких моделей.
Fuzzy Logic Library Microsoft.Net (FuzzyNet) - это простая в использовании библиотека нечеткой логики, в которой реализованы системы нечеткого логического вывода Мамдани и Сугено.
FuzzyNet включает в себя:
При переводе библиотеки на MQL5 дополнительно в библиотеку было добавлено:
Автор: MetaQuotes Software Corp.