Bibliotheken: FuzzyNet - ist die Bibliothek für die Arbeit mit der Fuzzy-Logik

 

FuzzyNet - ist die Bibliothek für die Arbeit mit der Fuzzy-Logik:

Die Bibliothek FuzzyNet für die Erstellung der Fuzzy-Modellen wurde in C# geschrieben. Bei der Übertragung in MQL5 wurde zur Bibliothek 8 Zugehörigkeitsfunktionen und 4 Defuzzification-Methoden für die Systeme wie Mamdani hinzugefügt.

Das Ergebnis der Berechnung

Autor: MetaQuotes Software Corp.

 

1. Es ist toll, dass dies jetzt in mt5 verfügbar ist. Verstehe ich das richtig, dass Mathe in Afrika ist und in MT4 funktionieren wird?

2. Ich habe Fuzzi zuerst in Matlab ausprobiert, aber um ehrlich zu sein, ist das schon lange her, und ich habe nie wirklich verstanden, wie man es auf den Devisenhandel mit garantiertem Gewinn anwenden kann. Daraufhin habe ich mich mit Wavelets, Statistik und so weiter beschäftigt.

3) Können Sie Literatur empfehlen, wie man die Fuzzi-Logik in der Praxis anwenden kann? Auch wenn nicht für den Handel.

4. Ich interessiere mich für das Thema, braucht die Seite einen Artikel zu diesem Thema?

 
Alexey Volchanskiy:

1. Es ist toll, dass dies jetzt in mt5 verfügbar ist. Verstehe ich richtig, dass Mathe in Afrika ist Mathe und wird in MT4 arbeiten?

2. Ich habe Fuzzi zuerst in Matlab ausprobiert, aber um ehrlich zu sein, ist das schon lange her, und ich habe nie wirklich verstanden, wie man es auf den Devisenhandel mit garantiertem Gewinn anwenden kann. Daraufhin habe ich mich mit Wavelets, Statistik und so weiter beschäftigt.

3) Können Sie Literatur empfehlen, wie man die Fuzzi-Logik in der Praxis anwenden kann? Auch wenn nicht für den Handel.

4. Ich interessiere mich für das Thema, braucht die Seite einen Artikel zu diesem Thema?

Hallo.

1. Wir werden eine Anpassung für MT4 vornehmen (ein wenig später)

3. 4. Wir werden bald einen Artikel über die Verwendung von FuzzyNet veröffentlichen. Danach schreiben Sie an Service Desk, um das Thema konkreter zu besprechen.

 

Das Thema verdient Aufmerksamkeit. In der Anwendung erfordert es ein Verständnis für das Thema. Und unter diesem Gesichtspunkt sind die Tipp-Beispiele nicht seriös. Der Unterschied zwischen Mamdani- und Sugeno-Systemen sollte zumindest am Rande erklärt werden. Und grundlegende Konzepte der Fuzzy-Logik wären für diejenigen nützlich, die zum ersten Mal von einem solchen Konzept hören.

Irgendwo im Archiv gibt es ein Buch über Fuzzy-Logik auf Russisch (Beschreibung des Programms Fuzzy Logic System). So mit einem Schlag im Archiv nicht zu finden. Später werde ich es posten.

Viel Erfolg

 
Einige Quellen mit Grundkenntnissen zu diesem Thema.
Dateien:
FuzLog.zip  1062 kb
 

Hallo,

Ich mag diese Systeme wie Fuzzy, SVM, Neural, so beobachten um ich fand heraus, dass lib, ich versucht. Die Skripte enthalten sind genug zu verstehen, aber ein paar Fehler beim Kompilieren würde ich gerne bemerken - so auf dem Skript cruise_control_sample_sugeno.mq5 mit sugeno wäre :

//+------------------------------------------------------------------+
//|fuzzynet.mqh |
//| Copyright 2015, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
//| Implementierung der FuzzyNet-Bibliothek in MetaQuotes Language 5(MQL5)|.
//||
Die Funktionen der FuzzyNet-Bibliothek umfassen: //|
//| Mamdani-Fuzzy-Modell erstellen|
//| Sugeno Fuzzy Modell erstellen|
//| Normale Zugehörigkeitsfunktion|
//| Dreieckige Zugehörigkeitsfunktion|
//| - Trapezförmige Zugehörigkeitsfunktion|
//| - Konstante Zugehörigkeitsfunktion|
//| Defuzzification-Methode des Schwerpunkts (COG) |
//| Defuzzification-Methode der Halbierung der Fläche (BOA) |
//| Defuzzification-Methode des Mittelwerts der Maxima (MeOM) |
//||
//| Wenn Sie funktionale Unterschiede zwischen FuzzyNet für MQL5 |
//| und das ursprüngliche FuzzyNet-Projekt, kontaktieren Sie bitte die Entwickler von |
//| MQL5 im Forum unter www.mql5.com.|
//||
//| Sie können Fehler melden, die in den Berechnungsalgorithmen des Programms gefunden wurden.
//| FuzzyNet-Bibliothek durch Benachrichtigung der FuzzyNet-Projektkoordinatoren |
//+------------------------------------------------------------------+
//| QUELL-LIZENZ|
//||
//| Dieses Programm ist freie Software; Sie können es weiterverteilen und/oder weitergeben.
//| Modifizieren Sie es unter den Bedingungen der GNU General Public License als
//| veröffentlicht von der Free Software Foundation(www.fsf.org); entweder |
//| Version 2 der Lizenz, oder (nach Ihrer Wahl) jede spätere Version. |
//||
//| Dieses Programm wird in der Hoffnung verteilt, dass es nützlich sein wird.
//| aber OHNE JEGLICHE GARANTIE; auch nicht ohne die stillschweigende Garantie, dass die
//| MARKTGÄNGIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK. Siehe die |
//| GNU General Public License für weitere Details.
//||
//| Eine Kopie der GNU General Public License ist verfügbar unter
//| 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
//+------------------------------------------------------------------+
//| Bibliotheken verbinden|
//+------------------------------------------------------------------+
#include <Math\FuzzyNet\SugenoFuzzySystem.mqh>
//--- Eingabeparameter
input double   Speed_Error;
input double   Speed_ErrorDot;
//+------------------------------------------------------------------+
//| Skript-Programmstartfunktion|
//+------------------------------------------------------------------+
void OnStart()
  {
//--- Sugeno Fuzzy System
   CSugenoFuzzySystem *fsCruiseControl=new CSugenoFuzzySystem();
//--- Erste Eingabevariablen für das System erstellen
   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);
//--- Zweite Eingabevariablen für das System erstellen
   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);
//--- Ausgabe erstellen
   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);
//--- Craete Sugeno Fuzzy-Regel
   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)");
//--- Sugeno-Fuzzy-Regel im System hinzufügen
   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);
//--- Eingabewert einstellen und Ergebnis erhalten
   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);
//--- Ergebnis erhalten
   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;
  }
//+------------------------------------------------------------------+

Und das Skript mit dem mamdani :

//+------------------------------------------------------------------+
//|fuzzynet.mqh |
//| Copyright 2015, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
//| Implementierung der FuzzyNet-Bibliothek in MetaQuotes Language 5(MQL5)|.
//||
Die Funktionen der FuzzyNet-Bibliothek umfassen: //|
//| Mamdani-Fuzzy-Modell erstellen|
//| Sugeno Fuzzy Modell erstellen|
//| Normale Zugehörigkeitsfunktion|
//| Dreieckige Zugehörigkeitsfunktion|
//| - Trapezförmige Zugehörigkeitsfunktion|
//| - Konstante Zugehörigkeitsfunktion|
//| Defuzzification-Methode des Schwerpunkts (COG) |
//| Defuzzification-Methode der Halbierung der Fläche (BOA) |
//| Defuzzification-Methode des Mittelwerts der Maxima (MeOM) |
//||
//| Wenn Sie funktionale Unterschiede zwischen FuzzyNet für MQL5 |
//| und das ursprüngliche FuzzyNet-Projekt, kontaktieren Sie bitte die Entwickler von |
//| MQL5 im Forum unter www.mql5.com.|
//||
//| Sie können Fehler melden, die in den Berechnungsalgorithmen des Programms gefunden wurden.
//| FuzzyNet-Bibliothek durch Benachrichtigung der FuzzyNet-Projektkoordinatoren |
//+------------------------------------------------------------------+
//| QUELL-LIZENZ|
//||
//| Dieses Programm ist freie Software; Sie können es weiterverteilen und/oder weitergeben.
//| Modifizieren Sie es unter den Bedingungen der GNU General Public License als
//| veröffentlicht von der Free Software Foundation(www.fsf.org); entweder |
//| Version 2 der Lizenz, oder (nach Ihrer Wahl) jede spätere Version. |
//||
//| Dieses Programm wird in der Hoffnung verteilt, dass es nützlich sein wird.
//| aber OHNE JEGLICHE GARANTIE; auch nicht ohne die stillschweigende Garantie, dass die
//| MARKTGÄNGIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK. Siehe die |
//| GNU General Public License für weitere Details.
//||
//| Eine Kopie der GNU General Public License ist verfügbar unter
//| 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
//+------------------------------------------------------------------+
//| Bibliotheken verbinden|
//+------------------------------------------------------------------+
#include <Math\FuzzyNet\MamdaniFuzzySystem.mqh>
//--- Eingabeparameter
input double   Service;
input double   Food;
//+------------------------------------------------------------------+
//| Skript-Programmstartfunktion|
//+------------------------------------------------------------------+
void OnStart()
  {
//--- Mamdani Fuzzy System
   CMamdaniFuzzySystem *fsTips=new CMamdaniFuzzySystem();
//--- Erste Eingabevariablen für das System erstellen
   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);
//--- Zweite Eingabevariablen für das System erstellen
   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);
//--- Ausgabe erstellen
   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);
//--- Drei Mamdani-Fuzzy-Regeln erstellen
   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)");
//--- Drei Mamdani-Fuzzy-Regeln in das System einfügen
   fsTips.Rules().Add(rule1);
   fsTips.Rules().Add(rule2);
   fsTips.Rules().Add(rule3);
//--- Eingabewert einstellen
   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);
//--- Ergebnis erhalten
   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;
  }
//+------------------------------------------------------------------+

Vielen Dank für Ihren Beitrag!

 
Ist es möglich, ein mandani-Modell mit mehr als 02 Eingabevariablen zu erstellen? Ich erhalte Fehler, wenn ich eine dritte Eingabevariable eingebe.
 

Liebe diejenigen, die die Lib unterstützen, gut, oder einfach nur jemand helfen plz.... :) Ich möchte Berechnungen zu beschleunigen. In dem Beispiel beigefügten Skript, das Objekte von Fuzzy-Logik-Klassen erstellt, berechnet das Ergebnis und löscht. Ich möchte, dass die Objekte 1 Mal erstellt werden, und in Calculate() nur neue Werte übergeben und die Ergebnisse nehmen, mit bereits konfigurierten Fuzzy-Logik.

Hier ist das Originalbeispiel, das korrekt funktioniert:

//+------------------------------------------------------------------+
//|Tipps Beispiel.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>
//--- Eingabeparameter
input double   Service;
input double   Food;

//+------------------------------------------------------------------+
//| Experteninitialisierungsfunktion|
//+------------------------------------------------------------------+
int OnInit()
  {
//---
  
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Experten-Deinitialisierungsfunktion|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Experten-Tick-Funktion|
//+------------------------------------------------------------------+
void OnTick()
  {
//---
  //--- Mamdani Fuzzy System 
   CMamdaniFuzzySystem *fsTips=new CMamdaniFuzzySystem();
//--- Erste Eingabevariablen für das System erstellen
   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);
//--- Zweite Eingabevariablen für das System erstellen
   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);
//--- Ausgabe erstellen
   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);
//--- Drei Mamdani-Fuzzy-Regeln erstellen
   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)");
//--- Drei Mamdani-Fuzzy-Regeln in das System einfügen
   fsTips.Rules().Add(rule1);
   fsTips.Rules().Add(rule2);
   fsTips.Rules().Add(rule3);
//--- Eingabewert einstellen
   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);
//--- Ergebnis erhalten
   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;
  }
//+------------------------------------------------------------------+

Und hier ist mein Beispiel, das einen Fehler erzeugt:

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)

Der Code selbst:

//+------------------------------------------------------------------+
//|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;
//+------------------------------------------------------------------+
//| Experteninitialisierungsfunktion|
//+------------------------------------------------------------------+
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);
//--- Zweite Eingabevariablen für das System erstellen
   
   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);
//--- Ausgabe erstellen
  
   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);
//--- Drei Mamdani-Fuzzy-Regeln erstellen
   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);
  }
//+------------------------------------------------------------------+
//| Experten-Deinitialisierungsfunktion|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Experten-Tick-Funktion|
//+------------------------------------------------------------------+
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);
//--- Ergebnis erhalten
   
   result=fsTips.Calculate(in);
   Print("Error");
   p_od_Tips=result.GetNodeAtIndex(0);
   Print("Tips, %: ",p_od_Tips.Value());
   }
  }
//+------------------------------------------------------------------+

Ist die Bibliothek im Allgemeinen so konzipiert, dass sie Objekte erstellen und dann nur die Ergebnisse abrufen kann, z. B. bei jedem neuen Balken? Denn es ist langsam und nicht wirtschaftlich, die Logik jedes Mal neu zu erstellen.

 

Bibliotheksversion mit Korrekturen, jetzt können Fuzzie-Logikobjekte 1 Mal erstellt werden und rufen dann nur noch Calculate() auf

Beispiel prüfen:

//+------------------------------------------------------------------+
//|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;
//+------------------------------------------------------------------+
//| Experteninitialisierungsfunktion|
//+------------------------------------------------------------------+
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);
//--- Erste Eingabevariablen für das System erstellen

   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);
//--- Zweite Eingabevariablen für das System erstellen

   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);
//--- Ausgabe erstellen

   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);
//--- Drei Mamdani-Fuzzy-Regeln erstellen
   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);
  }
//+------------------------------------------------------------------+
//| Experten-Deinitialisierungsfunktion|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- Fuzzy-System löschen
   In.FreeMode(true);  
   delete In;  
   delete FSTips;  
  }
//+------------------------------------------------------------------+
//| Experten-Tick-Funktion|
//+------------------------------------------------------------------+
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);
      //--- Ergebnis erhalten
      CList *result=FSTips.Calculate(In);
      Dic_Tips=result.GetNodeAtIndex(0);
      Print("Tips, %: ",Dic_Tips.Value());
      delete result;
     }
  }
//+------------------------------------------------------------------+
Dateien:
Fuzzy.zip  33 kb
 

h

wenn ich Metatrader auf Build 2342 aktualisiert habe

alle Beispiele mit Fuzzy Logic Library

geben Fehler "incorrect casting of pointers" auf MQL5 \ Include \ Math \ Fuzzy \ RuleParser.mqh Zeile 712

bitte helfen Sie bei der Fehlerbehebung

vielen Dank