Bibliothèque: Fuzzy - bibliothèque pour développer des modèles flous

 

Fuzzy - bibliothèque pour développer des modèles flous:

La bibliothèque FuzzyNet pour le développement de modèles flous a été écrite en C#. Lors de la conversion en MQL5, 8 fonctions d'appartenance et 4 méthodes de défuzzification pour les systèmes de type Mamdani ont été ajoutées à la bibliothèque.

Fuzzy - bibliothèque pour développer des modèles flous

Auteur : MetaQuotes

 

1. C'est génial que cela soit maintenant disponible dans mt5. Est-ce que j'ai bien compris que les maths sont des maths en Afrique et qu'elles fonctionneront dans MT4 ?

2. J'ai d'abord essayé Fuzzi dans Matlab, mais pour être honnête, c'était il y a longtemps et je n'ai jamais vraiment compris comment l'appliquer au trading du forex avec un profit garanti. En conséquence, je me suis orienté vers les ondelettes, les statistiques, etc.

3) Pouvez-vous nous suggérer des ouvrages sur la manière d'appliquer la logique floue dans la pratique ? Même si ce n'est pas pour le trading.

4. Le sujet m'intéresse, le site a-t-il besoin d'un article sur ce sujet ?

 
Alexey Volchanskiy:

1. C'est génial que cela soit maintenant disponible dans mt5. Est-ce que je comprends bien que les maths sont des maths en Afrique et qu'elles fonctionneront dans MT4 ?

2. J'ai d'abord essayé Fuzzi dans Matlab, mais, pour être honnête, c'était il y a longtemps et je n'ai jamais vraiment compris comment l'appliquer au trading du forex avec un profit garanti. En conséquence, je me suis orienté vers les ondelettes, les statistiques, etc.

3) Pouvez-vous nous suggérer des ouvrages sur la manière d'appliquer la logique floue dans la pratique ? Même si ce n'est pas pour le trading.

4. Je suis intéressé par le sujet, est-ce que le site a besoin d'un article sur ce sujet ?

Bonjour.

1. Nous ferons une adaptation pour MT4 (un peu plus tard)

3. 4. Nous publierons bientôt un article sur l'utilisation de FuzzyNet. Ensuite, écrivez au Service Desk pour discuter du sujet plus concrètement.

 

Le sujet mérite une attention particulière. Sa mise en œuvre nécessite une compréhension du sujet. Et de ce point de vue, les exemples de conseils ne sont pas sérieux. La différence entre les systèmes de Mamdani et de Sugeno devrait être expliquée au moins en passant. Et les concepts de base de la logique floue seraient utiles pour ceux qui entendent parler d'un tel concept pour la première fois.

Quelque part dans les archives se trouve un livre sur la logique floue en russe (description du programme Fuzzy Logic System). Je ne le trouverai donc pas en fouillant dans les archives. Je le posterai plus tard.

Je vous souhaite bonne chance.

 
Quelques sources ayant une connaissance de base du sujet.
Dossiers :
FuzLog.zip  1062 kb
 

Bonjour,

J'aime bien ces systèmes comme Fuzzy, SVM, Neural, donc en regardant autour de moi j'ai trouvé cette lib, j'ai essayé. Les scripts inclus sont assez compréhensibles, cependant quelques erreurs à la compilation que je voudrais juste noter - ainsi sur le script cruise_control_sample_sugeno.mq5 avec sugeno serait :

//+------------------------------------------------------------------+
//|fuzzynet.mqh |
//| Copyright 2015, MetaQuotes Software Corp. |
//| https ://www.mql5.com
//+------------------------------------------------------------------+
//| Implémentation de la bibliothèque FuzzyNet dans le langage MetaQuotes 5 (MQL5) //| Implémentation de la bibliothèque FuzzyNet dans le langage MetaQuotes 5 (MQL5)
//||
//| Les caractéristiques de la bibliothèque FuzzyNet sont les suivantes : |
//| - Créer un modèle flou de Mamdani|
//| - Créer un modèle flou de Sugeno|
//| - Fonction d'appartenance normale|
//| - Fonction d'appartenance triangulaire|
//| - Fonction d'appartenance trapézoïdale|
//| - Fonction d'appartenance constante|
//| - Méthode de défuzzification du centre de gravité (COG) |
//| - Méthode de défuzzification de la bissectrice de l'aire (BOA) //| - Méthode de défuzzification de la bissectrice de l'aire (BOA)
//| - Méthode de défuzzification de la moyenne des maxima (MeOM) |
//||
//| Si vous trouvez des différences fonctionnelles entre FuzzyNet et MQL5 | //| Si vous trouvez des différences fonctionnelles entre FuzzyNet et MQL5
//| et le projet FuzzyNet original, veuillez contacter les développeurs du projet FuzzyNet.
//| MQL5 sur le Forum à www.mql5.com.|
//||
//| Vous pouvez signaler les bogues trouvés dans les algorithmes de calcul de l'outil.
//| La bibliothèque FuzzyNet en informant les coordinateurs du projet FuzzyNet.
//+------------------------------------------------------------------+
//| LICENCE SOURCE|
//||
//| Ce programme est un logiciel libre ; vous pouvez le redistribuer et/ou || le modifier.
//| le modifier selon les termes de la Licence Publique Générale de GNU comme || l'a fait l'auteur.
//| publié par la Free Software Foundation(www.fsf.org); soit |
//| version 2 de la licence, ou (à votre choix) toute version ultérieure. |
//||
//| Ce programme est distribué dans l'espoir qu'il sera utile, //| Ce programme est distribué dans l'espoir qu'il sera utile, |
//| mais SANS AUCUNE GARANTIE ; sans même la garantie implicite de l'existence d'un droit d'auteur.
//| MERCHANTABILITY ou FITNESS FOR A PARTICULAR PURPOSE. Voir la page
//| Licence Publique Générale de GNU pour plus de détails. |
//||
//| Une copie de la licence publique générale de GNU est disponible à l'adresse suivante
//| 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
//+------------------------------------------------------------------+
//| Connexion des bibliothèques|
//+------------------------------------------------------------------+
#include <Math\FuzzyNet\SugenoFuzzySystem.mqh>
//--- paramètres d'entrée
input double   Speed_Error;
input double   Speed_ErrorDot;
//+------------------------------------------------------------------+
//| Fonction de démarrage du programme de script|
//+------------------------------------------------------------------+
void OnStart()
  {
//--- Système flou de Sugeno
   CSugenoFuzzySystem *fsCruiseControl=new CSugenoFuzzySystem();
//--- Créer les premières variables d'entrée du système
   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);
//--- Créer des variables d'entrée secondaires pour le système
   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);
//--- Créer une sortie
   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);
//--- Règle floue de Craete Sugeno
   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)");
//--- Ajouter une règle floue de Sugeno dans le système
   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);
//--- Définir la valeur d'entrée et obtenir le résultat
   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);
//--- Obtenir le résultat
   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;
  }
//+------------------------------------------------------------------+

Et le script avec le mamdani :

//+------------------------------------------------------------------+
//|fuzzynet.mqh |
//| Copyright 2015, MetaQuotes Software Corp. |
//| https ://www.mql5.com
//+------------------------------------------------------------------+
//| Implémentation de la bibliothèque FuzzyNet dans le langage MetaQuotes 5 (MQL5) //| Implémentation de la bibliothèque FuzzyNet dans le langage MetaQuotes 5 (MQL5)
//||
//| Les caractéristiques de la bibliothèque FuzzyNet sont les suivantes : |
//| - Créer un modèle flou de Mamdani|
//| - Créer un modèle flou de Sugeno|
//| - Fonction d'appartenance normale|
//| - Fonction d'appartenance triangulaire|
//| - Fonction d'appartenance trapézoïdale|
//| - Fonction d'appartenance constante|
//| - Méthode de défuzzification du centre de gravité (COG) |
//| - Méthode de défuzzification de la bissectrice de l'aire (BOA) //| - Méthode de défuzzification de la bissectrice de l'aire (BOA)
//| - Méthode de défuzzification de la moyenne des maxima (MeOM) |
//||
//| Si vous trouvez des différences fonctionnelles entre FuzzyNet et MQL5 | //| Si vous trouvez des différences fonctionnelles entre FuzzyNet et MQL5
//| et le projet FuzzyNet original, veuillez contacter les développeurs du projet FuzzyNet.
//| MQL5 sur le Forum à www.mql5.com.|
//||
//| Vous pouvez signaler les bogues trouvés dans les algorithmes de calcul de l'outil.
//| La bibliothèque FuzzyNet en informant les coordinateurs du projet FuzzyNet.
//+------------------------------------------------------------------+
//| LICENCE SOURCE|
//||
//| Ce programme est un logiciel libre ; vous pouvez le redistribuer et/ou || le modifier.
//| le modifier selon les termes de la Licence Publique Générale de GNU comme || l'a fait l'auteur.
//| publié par la Free Software Foundation(www.fsf.org); soit |
//| version 2 de la licence, ou (à votre choix) toute version ultérieure. |
//||
//| Ce programme est distribué dans l'espoir qu'il sera utile, //| Ce programme est distribué dans l'espoir qu'il sera utile, |
//| mais SANS AUCUNE GARANTIE ; sans même la garantie implicite de l'existence d'un droit d'auteur.
//| MERCHANTABILITY ou FITNESS FOR A PARTICULAR PURPOSE. Voir la page
//| Licence Publique Générale de GNU pour plus de détails. |
//||
//| Une copie de la licence publique générale de GNU est disponible à l'adresse suivante
//| 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
//+------------------------------------------------------------------+
//| Connexion des bibliothèques|
//+------------------------------------------------------------------+
#include <Math\FuzzyNet\MamdaniFuzzySystem.mqh>
//--- paramètres d'entrée
input double   Service;
input double   Food;
//+------------------------------------------------------------------+
//| Fonction de démarrage du programme de script|
//+------------------------------------------------------------------+
void OnStart()
  {
//--- Système flou de Mamdani
   CMamdaniFuzzySystem *fsTips=new CMamdaniFuzzySystem();
//--- Créer les premières variables d'entrée du système
   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);
//--- Créer des variables d'entrée secondaires pour le système
   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);
//--- Créer une sortie
   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);
//--- Créer trois règles floues de Mamdani
   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)");
//--- Ajouter trois règles floues de Mamdani dans le système
   fsTips.Rules().Add(rule1);
   fsTips.Rules().Add(rule2);
   fsTips.Rules().Add(rule3);
//--- Définir la valeur d'entrée
   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);
//--- Obtenir le résultat
   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;
  }
//+------------------------------------------------------------------+

Merci pour votre partage !

 
Est-il possible de créer un modèle mandani avec plus de 02 variables d'entrée ? Je fais des erreurs lorsque j'introduis une troisième variable d'entrée.
[Supprimé]  

Cher ceux qui soutiennent la lib, bien, ou tout simplement n'importe qui, de l'aide plz.... :) Je veux accélérer les calculs. Dans l'exemple ci-joint, un script crée des objets de classes de logique floue, calcule le résultat et le supprime. Je veux faire en sorte que les objets puissent être créés 1 fois, et dans Calculate() ne passer que les nouvelles valeurs et prendre les résultats, avec une logique floue déjà configurée.

Voici l'exemple original, qui fonctionne correctement :

//+------------------------------------------------------------------+
//|exemples de conseils.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>
//--- paramètres d'entrée
input double   Service;
input double   Food;

//+------------------------------------------------------------------+
//| Fonction d'initialisation de l'expert|
//+------------------------------------------------------------------+
int OnInit()
  {
//---
  
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Fonction de désinitialisation de l'expert|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Fonction de tic-tac expert|
//+------------------------------------------------------------------+
void OnTick()
  {
//---
  //--- Système flou de Mamdani 
   CMamdaniFuzzySystem *fsTips=new CMamdaniFuzzySystem();
//--- Créer les premières variables d'entrée du système
   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);
//--- Créer des variables d'entrée secondaires pour le système
   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);
//--- Créer une sortie
   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);
//--- Créer trois règles floues de Mamdani
   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)");
//--- Ajouter trois règles floues de Mamdani dans le système
   fsTips.Rules().Add(rule1);
   fsTips.Rules().Add(rule2);
   fsTips.Rules().Add(rule3);
//--- Définir la valeur d'entrée
   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);
//--- Obtenir le résultat
   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;
  }
//+------------------------------------------------------------------+

Et voici mon exemple qui donne une erreur :

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)

Le code lui-même :

//+------------------------------------------------------------------+
//|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;
//+------------------------------------------------------------------+
//| Fonction d'initialisation de l'expert|
//+------------------------------------------------------------------+
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);
//--- Créer des variables d'entrée secondaires pour le système
   
   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);
//--- Créer une sortie
  
   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);
//--- Créer trois règles floues de Mamdani
   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);
  }
//+------------------------------------------------------------------+
//| Fonction de désinitialisation de l'expert|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Fonction de tic-tac expert|
//+------------------------------------------------------------------+
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);
//--- Obtenir le résultat
   
   result=fsTips.Calculate(in);
   Print("Error");
   p_od_Tips=result.GetNodeAtIndex(0);
   Print("Tips, %: ",p_od_Tips.Value());
   }
  }
//+------------------------------------------------------------------+

En général, la librairie est-elle conçue pour pouvoir créer des objets et ensuite récupérer les résultats, disons, à chaque nouvelle barre ? Parce qu'il est lent et peu économique de recréer la logique à chaque fois.

[Supprimé]  

Version de la bibliothèque avec corrections, maintenant les objets logiques fuzzie peuvent être créés 1 fois et ensuite seulement appeler Calculate()

Vérifier l'exemple :

//+------------------------------------------------------------------+
//|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;
//+------------------------------------------------------------------+
//| Fonction d'initialisation de l'expert|
//+------------------------------------------------------------------+
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);
//--- Créer les premières variables d'entrée du système

   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);
//--- Créer des variables d'entrée secondaires pour le système

   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);
//--- Créer une sortie

   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);
//--- Créer trois règles floues de Mamdani
   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);
  }
//+------------------------------------------------------------------+
//| Fonction de désinitialisation de l'expert|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- supprimer le système flou
   In.FreeMode(true);  
   delete In;  
   delete FSTips;  
  }
//+------------------------------------------------------------------+
//| Fonction de tic-tac expert|
//+------------------------------------------------------------------+
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);
      //--- Obtenir le résultat
      CList *result=FSTips.Calculate(In);
      Dic_Tips=result.GetNodeAtIndex(0);
      Print("Tips, %: ",Dic_Tips.Value());
      delete result;
     }
  }
//+------------------------------------------------------------------+
Dossiers :
Fuzzy.zip  33 kb
 

h

lorsque j'ai mis à jour metatrader à la build 2342

tous les échantillons avec la bibliothèque de logique floue

retournent l'erreur "incorrect casting of poiners" sur MQL5 \NInclure \NMath \NMath \NFluzzy \NFluzzy \NRegleParser . mqh Ligne 712 Fuzzy \N RuleParser.mqh Ligne 712

Veuillez m'aider à corriger le bogue

Merci beaucoup.