Schau, wie man Roboter kostenlos herunterladen kann
Finden Sie uns auf Telegram!
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 - ist die Bibliothek für die Arbeit mit der Fuzzy-Logik - Bibliothek für den MetaTrader 5

Veröffentlicht:
MetaQuotes
Ansichten:
1359
Rating:
(34)
Veröffentlicht:
2016.09.01 16:39
Aktualisiert:
2017.05.19 18:17
Benötigen Sie einen Roboter oder Indikator, der auf diesem Code basiert? Bestellen Sie ihn im Freelance-Bereich Zum Freelance

Der echte Autor

Dmitry Kalyuzhny. Die Web-Seite des Projekts FuzzyNet - http://sourceforge.net/projects/fuzzynet/

Für die Arbeit muss das Archiv im Ordner Verzeichnis_Daten_Terminal dekomprimiert werden.
Die Codes der Bibliothek werden geordnet, im Ordner: <Verzeichnis_Daten_Terminal>\MQL5\Include\Math\FuzzyNet\
Die Beispiele der Test-Skripten kann man im folgenden Ordner finden: <Verzeichnis_Daten_Terminal>\MQL5\Scripts\FuzzyNet\

FuzzyNet - ist eine der beliebtesten mathematischen Bibliothek für die Erstellung der Fuzzy-Modellen

Fuzzy Logic Library Microsoft.Net (FuzzyNet) - ist im Einsatz eine einfache Fuzzy-Logik-Bibliothek, in der die Systeme Fuzzy-Logik-Anzeige Mamdani und Sugeno realisiert sind.

FuzzyNet hat:

  • 5 Zugehörigkeitsfunktionen.
  • Die flexible Schreibform der Regeln für die Fuzzy-Systeme.
  • Das System der Fuzzy-Anzeige Mamdani.
  • Das System der Fuzzy-Anzeige Sugeno.
  • 1 Methode Defuzzification für die Systeme wie Mamdani.
  • Unbegrenzte Anzahl von Eingangs- und Ausgangsvariablen.

Bei der Übertragung der Bibliothek in MQL5 wurden zusätzlich zu der Bibliothek hinzugefügt:

  • 8 neue Zugehörigkeitsfunktionen.
  • 4 neue Defuzzificationsmethoden für die Systeme wie Mamdani.

Die Arbeitsordnung mit der Bibliothek

  1. Je nach der Aufgabenstellung, um ein leeres Fuzzy-System Mamdani oder Sugeno zu erstellen.
  2. Dann erstellen wir die Fuzzy-Ein- und Ausgangsvariablen.
  3. In jeder Fuzzy-Variable wurden ihre Begriffe hinzugefügt. Vor diesem Begriff wird der Name und die Zugehörigkeitsfunktion des Begriffs zu seiner Fuzzy-Variable zugeordnet.
  4. Die Variablen werden zum System hinzugefügt.
  5. Es wird eine Datenbank aus Regeln erstellt.
  6. Die Regeln werden zum System hinzugefügt.
  7. Ins System werden Eingangs-Daten gesendet.
  8. Es wird die Funktion der System-Berechnung aufgerufen.

Hinweis: Die System-Einstellung der Fuzzy-Anzeige des Typs Mamdani kann man in jedem Schritt durchführen, nach ihrer Erstellung und bevor die Funktion der System-Berechnung aufgerufen wird. Wenn das System sich nach der Erstellung seiner Parameter nicht geändert hat, wird das System mit den Standardeinstellungen arbeiten. Nämlich:

  • Die Implikation wird mit dem Operator Min durchgeführt, das heißt, durch die Verringerung der Menge des Fuzzy Sets.
  • Die Aggregation wird mit dem Operator Max durchgeführt, das heißt, das ist die Erhaltung der maximalen Ausgangswerte der Zugehörigkeitsfunktionen, die nach der Implikation bekommen wurden.
  • Die Defuzzification wird nach der Schwerpunktmethode auftreten.

Hier wurde die Konvertierung der Bibliothek FuzzyNet Version 1.2.0. dargestellt

Um die Bibliothek zu verwenden, müssen Sie die Datei MamdaniFuzzySystem.mqh oder SugenoFuzzySystem.mqh je nach dem erstellten System anschließen.

Lesen Sie mehr über die Pakete der Port-Bibliothek FuzzyNet:
Pakete
Beschreibung
Dictionary.mqh
Das Paket enthält erforderliche zusätzliche Klassen für andere Pakete.
FuzzyRule.mqh
Die Klassen für die Erstellung der Fuzzy-Regeln:
  1. GenericFuzzyRule - die Klasse für die Erstellung der klaren Regel.
  2. MamdaniFuzzyRule - die Klasse für die Erstellung des Abschließens einer Fuzzy-Regel des Typs Mamdani.
  3. SugenoFuzzyRule - die Klasse für die Erstellung des Abschließens einer Fuzzy-Regel des Typs Sugeno.

Das Paket enthält zusätzliche Klassen für die Realisierung der anderen Fuzzy-Regeln.

FuzzyTerm.mqh Das Paket für die Erstellung der Fuzzy-Begriffe.
FuzzyVariable.mqh Das Paket für die Erstellung der Fuzzy-Variablen.
GenericFuzzySystem.mqh Eine Klasse, die einen gemeinsamen Funktionsteil von Mamdani und Sugeno Systemen realisiert.
Helper.mqh Das Paket enthält erforderliche zusätzliche Klassen für andere Pakete.
InferenceMethod.mqh Das Paket enthält erforderliche zusätzliche Klassen für andere Pakete.
MamdaniFuzzySystem.mqh Die Klasse für die Erstellung des Fuzzy-Systems des Typs Mamdani.
MembershipFunction.mqh Die Klassen der Zugehörigkeitsfunktionen:
  1. Gauß-Zugehörigkeitsfunktion.
  2. Zweiseitige Gauß-Zugehörigkeitsfunktion.
  3. Die verallgemeinerte glockenförmige Zugehörigkeitsfunktion.
  4. S- förmige Zugehörigkeitsfunktion.
  5. Z-förmige Zugehörigkeitsfunktion.
  6. Pi-förmige Zugehörigkeitsfunktion.
  7. Sigmoid Zugehörigkeitsfunktion.
  8. Die Multiplikation von zwei Sigmoid Zugehörigkeitsfunktionen.
  9. Die Zugehörigkeitsfunktion in Form von der Differenz zwischen zwei Sigmoid Zugehörigkeitsfunktionen.
  10. Trapez - Zugehörigkeitsfunktion.
  11. Die dreieckige Zugehörigkeitsfunktion.
  12. Die Zugehörigkeitsfunktion in Form vom Konstant.
  13. Die Zugehörigkeitsfunktion als eine Komposition von zwei Zugehörigkeitsfunktionen.
RuleParser.mqh Die Klassen für die Analyse der Fuzzy-Regeln.
SugenoFuzzySystem.mqh Die Klasse für die Erstellung des Fuzzy-Systems des Typs Sugeno.
SugenoVariable.mqh Das Paket enthält Klassen:
  1. LinearSugenoFuction - Die Klasse für die Erstellung der Lineale-Funktionen.
  2. SugenoVariable - Die Klasse für die Erstellung der Fuzzy-Variable des Typs Sugeno.

Die Fuzzy-Variablen des Typs Sudeno werden beim Schreiben der Regel für Systeme des Typs Sugeno verwendet.

 

Die Arbeitsordnung mit der Bibliothek FuzzyNet in MQL5

Vor dem Schreiben eines Fuzzy-Systems muss es gründlich dargestellt werden. Nämlich:

  1. Die Anzahl der Eingangs- und Ausgangswerte werden durch Fuzzy-Variablen vertauscht.
  2. Die Anzahl der Begriffe und deren Zugehörigkeitsfunktionen für jede Fuzzy-Variable.
  3. Wählen Sie die Art von Fuzzy-Systemen, je nach der Aufgabe.
  4. Die Anzahl und der Inhalt der Fuzzy-Regeln, die dem ausgewählten System entsprechen.
  5. Eigene Parameter und Merkmale des Systems.

Der Erstellungsprozess des Systems und seiner Berechnung:

  1. Erstellen Sie ein leeres System.

    Für die Systeme des Typs Mamdani:

    MamdaniFuzzySystem *fuzzy_system=new MamdaniFuzzySystem();
    Für die Systeme des Typs Sugeno:
    SugenoFuzzySystem *fuzzy_system=new SugenoFuzzySystem();
  2. Abgesehen vom System erstellen alle Fuzzy-Eingangsvariable, indem sie als Parameter die Variablennamen eingestellt haben, dessen Maximal- und Minimalwerte:
    FuzzyVariable *fuzzy_variable=new FuzzyVariable(const string name,const double min,const double max);
  3. Erstellen Funktionen der Fuzzy-Begriffe, die Fuzzy-Begriffe, ihnen als Parameter ihre Namen und Zugehörigkeitsfunktionen zuordnen, dann fügen Sie diese Begriffe zu entsprechenden Variablen. Um den Programm-Code zu reduzieren, kann man den Prozess so schreiben:
    fuzzy_variable.Terms().Add(new FuzzyTerm(const string name,new IMembershipFunction());
  4. Dann müssen die Eingangsvariable ins System eingetragen werden:
    fuzzy_system.Input().Add(FuzzyVariable fuzzy_variable);
  5. Erstellen wir die Ausgangsvariablen. Bei ihrer Erstellung muss der Typ ihres Systems berücksichtigt werden. Für die Systeme des Typs Mamdani wird der Prozess ihrer Erstellung genauso wie bei Punkten 2 und 3. Im Fall der Modelle des Typs Sugeno muss man die besonderen Fuzzy-Variable erstellen. Als Parameter nehmen Sie nur Variable-Namen:
    SugenoVariable *sugeno_variable=new SugenoVariable(const string name);
    Statt Fuzzy-Begriffe in der Fuzzy-Variable des Typs Sugeno werden lineare Funktionen hinzugefügt, die lineare Kombination von Eingabewerten interpretieren. Die Parameter der linearen Funktion werden ihr Name und ein Array von Koeffizienten sein. Auf dieser Basis des Arrays wird eine lineare Steuerung geprägt, so ist es wichtig, die Reihenfolge der Elemente im Array entsprechend halten. Die Länge des Arrays von Koeffizienten muss gleich oder eins mehr als die Anzahl von Eingangswerten sein. Wenn die Längen gleich sind, dann ist der freie Teil der Steuerung Null. Wenn die Länge des Arrays um eins mehr ist, dann wird der freie Teil dem Wert des letzten Elements gleich. Alle anderen Elemente des Arrays, beginnend mit dem ersten, wird entsprechend der Fuzzy-Eingangsvariable der Reihenfolge zugeordnet, in der sie ins System eingegeben wurden.
    sugeno_varriable.Functions().Add(fuzzy_sytem.CreateSugenoFunction(const string name, const double &coeffs[]));
  6. Ähnlich mit dem Punkt 4 müssen die Ausgangswerte auch zum System hinzugefügt werden:

    Für die Systeme des Typs Mamdani:

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

    Für die Systeme des Typs Sugeno:

    fuzzy_system.Output().Add(FuzzyVariable fuzzy_variable);
  7. Entsprechend dem System erstellen wir eine Datenbank aus Regeln. Die Regeln werden in einer normalen Linie eingegeben und werden automatisch von den Schlüsselwörtern analysiert. Die Schlüsselwörter sind: "if", "then", "is", "and", "or", "not", "(" , ")", "slightly", "somewhat", "very", "extremely", und alle Variablennamen, Begriffe und verfügbaren Funktionen in Ihrem System.

    Für die Systeme des Typs Mamdani:

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

    Für die Systeme des Typs Sugeno:

    SugenoFuzzyRule *fuzzy_rule = fuzzy_system.ParseRule(const string rule_text);
  8. Fügen wir alle Regeln zum System hinzu:

    Für die Systeme des Typs Mamdani:

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

    Für die Systeme des Typs Sugeno:

    fuzzy_system.Rules().Add(SugenoFuzzyRule fuzzy_rule);
  9. Geben Sie die Eingangswerte der Variable für die Berechnung ins System ein. Dafür muss man formulieren. Zur Eingabe akzeptiert dieses System eine Liste von Werten, einer von Elementen wird das Objekt der Klasse Dictionary_Obj_Double. Die Klasse wurde in der Datei Dictionary.mqh. beschrieben
    Dictionary_Obj_Double *p_od_in=new Dictionary_Obj_Double;
    Diese Klasse implementiert eine Methode SetAll (CObject * Schlüssel, const double-Wert), die zwei Parameter übernimmt - die Fuzzy-Variable und einen numerischen Wert. Dieses Element ist ein Systemeingabewert.
    p_od_in.SetAll(FuzzyVariable fuzzy_variable,const double value);
    Nach der gleichen Weise füllen alle verbleibenden Eingangswerte aus. Erstellen wir eine Liste und speichern sie alle darin:
    CList *in=new CList;
    in.Add(p_od_in);
    
  10. Auch geben wir die Ausgangswerte ein:
    Dictionary_Obj_Double *p_od_out=new Dictionary_Obj_Double;   
    CList *out=new CList;
    
  11. Rufen wir die Berechnung-Funktion (Calculate(CList *&list) unseres Systems auf, die uns die Ergebnisse-Liste der Berechnung des Systems zurückgibt:
    out=fuzzy_system.Calculate(in);
    Im Feld out dieser Liste sind alle berechneten Ausgangswerte in der Reihenfolge gespeichert, in der sie ins System eingegeben wurden. Wir müssen nur diese Werte erhalten:
    p_od_out=out.GetNodeAtIndex(int index);
    double result=p_od_out.Value();
    
    Nun wird in der Variable result das Ergebnis der Berechnung des Systems für den Ausgangswert gespeichert, der ins System unter der Nummer eingegeben wurde, die im Index aufgeführt ist.

Tips Sample (Mamdani)

Der Testskript Tips_Sample_Mamdani.mq5 berechnet den Prozentsatz des Trinkgeldes, die man vor Ort abgesehen von der Qualität der Service und des Essen lassen soll.

Geben wir die Eingangsparameter ein:

Eingangsparameter

Das Ergebnis der Berechnung wird:

Das Ergebnis der Berechnung

Cruise Control Sample (Sugeno)

Der Testskript Cruise_Control_Sample_Sugeno.mq5 ist ein Beispiel für den Fuzzy-Regler. Er ist ein System eines Steuersystems der Fahrzeugfahrt, die die erforderliche Beschleunigung für das Fahrzeug berechnet, damit er auf die eingestellte Geschwindigkeit kommt, basierend auf den Daten über die Abweichung und der Schnelligkeit der Änderung dieser Abweichung.

Geben wir die Eingangsparameter ein:

Eingangsparameter

Das Ergebnis der Berechnung wird:

Das Ergebnis der Berechnung

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

FX_Sniper_Ergodic_CCI_HTF FX_Sniper_Ergodic_CCI_HTF

Der Indikator FX_Sniper_Ergodic_CCI mit der Veränderungsmöglichkeit des Timeframes des Indikators in den Eingangsparametern.

FX5_SelfAdjustingMFI_HTF FX5_SelfAdjustingMFI_HTF

Der Indikator FX5_SelfAdjustingMFI mit der Veränderungsmöglichkeit des Timeframes des Indikators in den Eingangsparametern.

Gaus_MA_HTF Gaus_MA_HTF

Der Indikator Gaus_MA mit der Veränderungsmöglichkeit des Timeframes des Indikators in den Eingangsparametern.

GRFLeadingEdge_HTF GRFLeadingEdge_HTF

Der Indikator GRFLeadingEdge mit der Veränderungsmöglichkeit des Timeframes des Indikators in den Eingangsparametern.