Schau, wie man Roboter kostenlos herunterladen kann
Finden Sie uns auf Facebook!
und werden Sie Mitglied unserer Fangruppe
Interessantes Skript?
Veröffentliche einen Link auf das Skript, damit die anderen ihn auch nutzen können
Hat Ihnen das Skript gefallen?
Bewerten Sie es im Terminal MetaTrader 5
Bibliotheken

Fuzzy - Bibliothek für das Arbeiten mit Fuzzy Logik - Bibliothek für den MetaTrader 4

Veröffentlicht:
MetaQuotes
Ansichten:
1560
Rating:
(51)
Veröffentlicht:
2016.04.18 10:37
Aktualisiert:
2016.11.22 07:34
Benötigen Sie einen Roboter oder Indikator, der auf diesem Code basiert? Bestellen Sie ihn im Freelance-Bereich Zum Freelance

Urheber:

Dmitry Kalyuzhny. FuzzyNet project website - http://sourceforge.net/projects/fuzzynet/

Entpacken Sie das Archiv in das Verzeichnis terminal_data_folder.
Der Programmcode befindet sich in den folgenden Verzeichnis <terminal_data_folder>\MQL4\Include\Math\FuzzyNet\
Ein Beispielscript finden Sie in den folgenden Verzeichnis:<terminal_data_folder>\MQL4\Scripts\FuzzyNet\

Die FuzzyNet Bibliothek ist eine der bekanntesten mathematischen Bibliotheken für die Erzeugung von Fuzzy-Modellen.

Die Fuzzy-Logik Bibliothek von Microsoft.net (vasi.net) ist eine einfach zu verwendende Komponente welche die Mandami und Sugeno Fuzzy Systeme beinhaltet.

FuzzyNet beinhaltet:

  • 5 zugehörige Funktionen.
  • Eine sehr flexible Möglichkeit für die Entwicklung von Fuzzy-System-Regeln.
  • Mamdani Fuzzy Inferenz System.
  • Sugeno Fuzzy Inferenz System.
  • Eine Defuzzifikations Methode für Mamdani-Type Systeme.
  • Eine unbegrenzte Menge an Eingabe- und Ausgabe-Variablen.

Folgendes wurde während der Konvertierung zu MQL4 noch hinzugefügt:

  • 8 neue Funktionen.
  • 4 neue Defuzzifikations-Methoden für Mamdani-Systems.

Verbindung der Bibliothek

  1. Je nach Art ihre Aufgabe, erstellen Sie eine leeres Fuzzy-Mandami oder ein Sogeno-System.
  2. Erstellen Sie die Ein- und Ausgabeparameter.
  3. Geben Sie eine Kurzbeschreibung zu jeder Variablen an. Davor wird ein Name und die zugehörige Funktion zu einem Term hinzugefügt.
  4. Variablen werden zu den System hinzugefügt.
  5. Eine Gruppe von Regeln wird erzeugt.
  6. Die Regeln werden den System hinzugefügt.
  7. Die Eingabe Daten werden zu dem System geschick.
  8. Und die Funktionen für die Berechnung werden aufgerufen.

Hinweis: Das Mamdani-Inferenz-System kann nach seiner Erzeugung und vor dem Aufruf der Funktion konfiguriert werden. Wenn die Parameter des Systems nicht geändert werden, nachdem es erzeugt worden ist, dann verwendet das System die voreingestellten Werte:

  • Implikation wird mit dem Min operator ausgeführt. (Die Ausgabe des Fuzzy-Set wird gekürzt).
  • Aggregation wird mit dem Max operator ausgeführt.(Nach der Implikation erhält man die größten Werte der zugehörigen Funktion).
  • Die Defuzzification wird mit der Methode "Zentrum der Gravitation" durchgeführt.

Die Konvertierung der fuzzyNet Bibliothek (v. 1.2.0) wird unten dargestellt.

Um mit dieser Bibliothek arbeiten zu können, müssen Sie die MamdaniFuzzySystem.mqh oder SugenoFuzzySystem.mqh file in Ihr System einbinden (#include)

Es folgt eine detaillierte Information über die konvertierte fuzzyNet Bibliothek:
Pakete
Beschreibung:
Dictionary.mqh
Dieses Paket enthält weitere Klassen, die für andere Pakete notwendig sind.
FuzzyRule.mqh
Klasse für die Erzeugung der Fuzzy-Regeln:
  1. GenericFuzzyRule - Eine Klasse für die Erschaffung von "non-fuzzy" Regelbedingungen.
  2. MamdaniFuzzyRule - Klasse für die Erstellung einer Mamdani-Fuzzy-Regel.
  3. SugenoFuzzyRule - Klasse für die Erstellung einer Sugeno-Fuzzy-Regel.

Dieses Paket beinhaltet zudem externe Klassen für die Implementierung von Fuzzy-Regeln.

FuzzyTerm.mqh Paket für die Erzeugung von Fuzzy-Terms.
FuzzyVariable.mqh Paket für die Erzeugung von Fuzzy-Variablen.
GenericFuzzySystem.mqh Diese Klasse implementiert die grundlegende Funktionalität für Mamdani und Sugeno Systeme.
Helper.mqh Dieses Paket enthält weitere Klassen, die für andere Pakete notwendig sind.
InferenceMethod.mqh Dieses Paket enthält weitere Klassen, die für andere Pakete notwendig sind.
MamdaniFuzzySystem.mqh Eine Klasse um ein Mamdani-Fuzzy-System zu erstellen.
MembershipFunction.mqh Eine Klasse mit zugehörigen Funktionen:
  1. Gauss-Funktion.
  2. Doppelseitige Gauss-Funktion.
  3. Generalisierte Bell-Form Funktion.
  4. S-Form Funktion.
  5. Z-Form Funktion.
  6. Pi-shaped membership function.
  7. Sigmoid Funktion.
  8. Das Produkt von zwei Sigmoid Funktionen.
  9. Funktion über die Differenz zwischen zwei Sigmoid Functionen.
  10. Trapez-Funktion.
  11. Dreiecks-Funktion.
  12. Funktion in der Form einer Konstante.
  13. Eine Funktion für eine Zusammenstellung von Funktionen.
RuleParser.mqh Eine Klasse für das Analysieren von Fuzzy-Regeln.
SugenoFuzzySystem.mqh Eine Klasse für das Erzeugen eines Sugeno-Fuzzy-Systems.
SugenoVariable.mqh Dieses Paket beinhaltet die folgenden Klassen:
  1. LinearSugenoFuction - Eine Klasse für die Erstellung von linearen Funktionen.
  2. SugenoVariable - Eine Klasse für die Erstellung einer Sugeno-Fuzzy-Variable.

Sugeno-type fuzzy Variablen werden bei der Entwicklung für die Regeln eines Sugeno-Systems gebraucht.

 

Die Verwendung der FuzzyNet-Bibliothek in MQL4

Bevor sie ein Fuzzy-System schreiben, sollten Sie eine klare Vorstellung von seinen Elementen haben:

  1. Die Anzahl der Ein- und Ausgabewerten, die über die Fuzzy-Parameter neu angeordnet werden.
  2. Die Anzahl der Gleichungen und deren zugehörigen Funktionen für jeden Fuzzy-Parameter.
  3. Die Art des Fuzzy-Systems in Abhängigkeit ihrer Aufgabe.
  4. Die Anzahl und der Inhalt der Fuzzy-Regeln dem das ausgewählte System entspricht.
  5. Spezielle Parameter und Eigenschaften des Systems.

Die Entwicklung des Systems und die Berechnung:

  1. Erstellen Sie ein leeres System.

    Für ein Mamdani-System:

    MamdaniFuzzySystem *fuzzy_system=new MamdaniFuzzySystem();
    Für ein Sugeno-System:
    SugenoFuzzySystem *fuzzy_system=new SugenoFuzzySystem();
  2. Erstellen Sie alle Fuzzy-Eingabeparameter separat von dem System, indem sie den Namen und Minimum/Maximum-Werte zu allen Variablen als Parameter zuweisen:
    FuzzyVariable *fuzzy_variable=new FuzzyVariable(const string name,const double min,const double max);
  3. Erstellen Sie Funktionen mit Fuzzy-Gleichungen, die Gleichungen selbst mit passenden Namen und zugehörigen Funktionen. Anschließend fügen Sie die Gleichungen den zugehörigen Variablen hinzu. Um den Programmcode zu vereinfachen kann der ganze Prozess wie folgt geschrieben werden:
    fuzzy_variable.Terms().Add(new FuzzyTerm(const string name,new IMembershipFunction());
  4. Geben Sie die Eingabevariablen in das System ein:
    fuzzy_system.Input().Add(FuzzyVariable fuzzy_variable);
  5. Erzeugung von Eingabevariablen in Abhängigkeit von Ihrem System. Für ein Mamdani-System, ist die Erzeugung gleich den Schritten 2 und 3. Für ein Sugeno-Model, erzeugen Sie spezielle Fuzzy-Variablen, welche nur einen Namen als Parameter akzeptieren:
    SugenoVariable *sugeno_variable=new SugenoVariable(const string name);
    Bei einem Sugeno-Typ werden lineare Funktionen, welche die lineare Kombination von Eingabeparametern interpretieren, anstelle von Fuzzy-Gleichungen übergeben. Ein Name und ein array aus Koeffizienten werden hierzu als Parameter verwendet. Über die Elemente in dem Array wird eine lineare Gleichung gebildet. Daher ist es wichtig die Reihenfolge der Elemente in dem Array einzuhalten. Die Länge des arrays mit Koeffizienten sollte gleich der Menge der Eingabeparameter sein, oder die Zahl um einen überschreiten. If the lengths are equal, an absolute term of an equation is equal to zero. Wenn das Array die Größe um einen überschreitet, dann ist das letzte Element gleich dem Vorherigen. Alle anderen Elementen der Anordnung, beginnend mit dem ersten, wird eine Fuzzy-Eingangsvariable entsprechend der Reihenfolge zugeordnet, wie sie in das System eingegeben wurden.
    sugeno_varriable.Functions().Add(fuzzy_sytem.CreateSugenoFunction(const string name, const double &coeffs[]));
  6. Wie auch im Schritt 4, müssen ebenso die Ausgangsvariablen einem System hinzugefügt werden:

    Für ein Mamdani-System:

    fuzzy_system.Output().Add(FuzzyVariable fuzzy_variable);

    Für ein Sugeno-System:

    fuzzy_system.Output().Add(FuzzyVariable fuzzy_variable);
  7. Eine Gruppe von Regeln, entsprechend dem System. Die Regeln werden als ein String definiert und automatisch über Keywörter analysiert. Die Schlüsselwürter sind "if", "then", "is", "and", "or", "not", "(" , ")", "slightly", "somewhat", "very" and "extremely", so wie die Namen aller Funktionen, Gleichungen und Variablen in Ihrem System.

    Für ein Mamdani-System:

    MamdaniFuzzyRule *fuzzy_rule = fuzzy_system.ParseRule(const string rule_text);

    Für ein Sugeno-System:

    SugenoFuzzyRule *fuzzy_rule = fuzzy_system.ParseRule(const string rule_text);
  8. Enter all rules into the system:

    Für ein Mamdani-System:

    fuzzy_system.Rules().Add(MamdaniFuzzyRule fuzzy_rule);

    Für ein Sugeno-System:

    fuzzy_system.Rules().Add(SugenoFuzzyRule fuzzy_rule);
  9. Für die Berechnung übergeben Sie die Werte der Eingabeparameter. Diese sollten definiert sein. Als seinen Eingabewert akzeptiert das System die Liste der Werte einschließlich der Dictionary_Obj_Double Klassen-Objekte. Die Klasse wird in der Datei Dictionary.mqh beschrieben.
    Dictionary_Obj_Double *p_od_in=new Dictionary_Obj_Double;
    Die Klasse implementiert die SetAll(CObject *key, const double value) Methode, welche zwei Parameter akzeptiert - eine Fuzzy Variable und einen numerischen Wert. Dieses Element ist eine Eingabe-Variable des Systems.
    p_od_in.SetAll(FuzzyVariable fuzzy_variable,const double value);
    Alle anderen Eingabewerte werden auf die gleiche Weise eingegeben. Erstellen Sie die Liste und fügen Sie alle Werte hinzu:
    CList *in=new CList;
    in.Add(p_od_in);
    
  10. Die Ausgabewerte müssen ebenfalls angegeben werden:
    Dictionary_Obj_Double *p_od_out=new Dictionary_Obj_Double;   
    CList *out=new CList;
    
  11. Der Aufruf der Calculate(CList *&list)-Funktion unseres Systems führt zu folgenden Ergebnissen:
    out=fuzzy_system.Calculate(in);
    Anschließend beinhaltet die out Liste alle berechneten Werte in der Reihenfolge, wie sie in das System eingegeben worden sind. Wir müssen Sie jetzt nur noch empfangen:
    p_od_out=out.GetNodeAtIndex(int index);
    double result=p_od_out.Value();
    
    Nun beinhaltet die result Variable das Ergebnis einer Berechnung eines Output-Wertes entsprechend des index-Wertes.

Beispiel-Skript

Trinkgeld Beispiel (Mamdani)

Tips_Sample_Mamdani.mq4 berechnet die prozentuale Menge an Trinkgeld, welche sie entsprechend der Servicequalität und der Qualität des Essens bezahlen müssen.

Geben Sie die Eingabeparameter an:

Eingabeparameter

Berechnungsergebnisse:

Berechnungsergebnisse:

Cruise Control Sample (Sugeno)

Das Cruise_Control_Sample_Sugeno.mq4 Beispielskript ist ein Beispiel für eine Fuzzy-Regelung. Dieses repräsentiert eine Geschwindigkeitsregelung, welche die notwendige Beschleunigung aufgrund der aktuellen Entfernung und der Veränderung der Entfernung berechnet, damit ein Auto die gewünschte Geschwindigkeit erreicht.

Geben Sie die Eingabeparameter an:

Eingabeparameter

Berechnungsergebnisse:

Berechnungsergebnisse:

Übersetzt aus dem Russischen von MetaQuotes Ltd.
Originalpublikation: https://www.mql5.com/ru/code/13717

MySQL library for MQL4 with proper memory management MySQL library for MQL4 with proper memory management

Diese Bibliothek bietet Funktionen für das Management von MetaTrader4 zu mySQL Datenbank-Verbindungen. Das Problem der Speicherverwaltung in der vorherigen Bibliothek wurde behoben.

COrdersManager class COrdersManager class

Eine einfache Möglichkeit ihre Orders zu kontrollieren.

Histogram Blanket Histogram Blanket

Diese neue Darstellung hilft Ihnen Charts aus einem ganz anderen Blickwinkel zu betrachten.

ATR 3 LWMA ATR 3 LWMA

Dieser Indikator zeigt drei Perioden ATR LWMA.