Voir comment télécharger gratuitement des robots de trading
Retrouvez-nous sur Telegram !
Rejoignez notre page de fans
Un script intéressant ?
Poster un lien vers celui-ci -
laisser les autres l'évaluer
Vous avez aimé le script ? Essayez-le dans le terminal MetaTrader 5
Bibliothèque

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

Publié par:
MetaQuotes
Vues:
455
Note:
(34)
Publié:
2022.01.31 10:19
Besoin d'un robot ou d'un indicateur basé sur ce code ? Commandez-le sur Freelance Aller sur Freelance

Véritable auteur

Dmitry Kalyuzhny. Site Web du projet FuzzyNet - http://sourceforge.net/projects/fuzzynet/

Décompressez l'archive dans le terminal_data_folder.
Les codes de la bibliothèque sont situés dans le <terminal_data_folder>\MQL5\Include\Math\FuzzyNet\
Des exemples de scripts de test sont disponibles dans <terminal_data_folder>\MQL5\Scripts\FuzzyNet\

FuzzyNet est l'une des bibliothèques mathématiques les plus populaires pour créer des modèles flous

La bibliothèque de logique floue pour Microsoft.Net (FuzzyNet) est un composant facile à utiliser qui implémente les systèmes d'inférence floue de Mamdani et Sugeno.

FuzzyNet comprend :

  • 5 fonctions d'appartenance.
  • Forme flexible pour développer des règles de système flou.
  • Système d'inférence floue de Mamdani.
  • Système d'inférence floue de Sugeno.
  • Une méthode de defuzzification pour les systèmes de type Mamdani.
  • Quantité illimitée de variables d'entrée et de sortie.

Les ajouts suivants ont été effectués lors de la conversion de la bibliothèque en MQL5 :

  • 8 nouvelles fonctions d'appartenance.
  • 4 nouvelles méthodes de défuzzification pour les systèmes de type Mamdani.

Utilisation de la bibliothèque

  1. En fonction de votre tâche, créez un système flou vide de type Mamdani ou Sugeno.
  2. Créez des variables d'entrée et de sortie floues.
  3. Des termes appropriés sont ajoutés à chaque variable floue. Avant cela, un nom et une fonction d'appartenance sont attribués à un terme.
  4. Des variables sont ajoutées au système.
  5. Un ensemble de règles est créé.
  6. Les règles sont ajoutées au système.
  7. Les données d'entrée sont envoyées au système.
  8. La fonction de calcul du système est appelée.

Remarque : Le système d'inférence de type Mamdani peut être configuré à n'importe quelle étape après sa création avant l'appel de la fonction de calcul du système. Si les paramètres système n'ont pas été modifiés après sa création, le système fonctionne avec les paramètres par défaut :

  • L'Implication est effectuée à l'aide de l'opérateur Min (un ensemble flou en sortie est tronqué).
  • L'Agrégation est effectuée à l'aide de l'opérateur Max (recevant les valeurs maximales des fonctions d'appartenance de sortie obtenues après implication).
  • La défuzzification est effectuée en utilisant la méthode du centre de gravité.

La conversion de la bibliothèque FuzzyNet (v. 1.2.0) est affichée ci-dessous.

Pour travailler avec la bibliothèque, incluez le fichier MamdaniFuzzySystem.mqh ou SugenoFuzzySystem.mqh selon le système que vous créez.

Vous trouverez ci-dessous des informations plus détaillées sur les packages de bibliothèque portés par FuzzyNet :
Paquets
Description
Dictionary.mqh
Le package contient des classes supplémentaires nécessaires pour d'autres packages.
FuzzyRule.mqh
Classes pour créer des règles floues :
  1. GenericFuzzyRule - classe pour créer une condition de règle non floue.
  2. MamdaniFuzzyRule - classe pour créer une conclusion de règle floue de type Mamdani.
  3. SugenoFuzzyRule - classe pour créer une conclusion de règle floue de type Sugeno.

Le package contient également des classes auxiliaires pour la mise en œuvre des règles floues.

FuzzyTerm.mqh Package pour la création de termes flous.
FuzzyVariable.mqh Package de création de variables floues.
GenericFuzzySystem.mqh La classe implémente les fonctionnalités communes des systèmes Mamdani et Sugeno.
Helper.mqh Le package contient des classes supplémentaires nécessaires pour d'autres packages.
InferenceMethod.mqh Le package contient des classes supplémentaires nécessaires pour d'autres packages.
MamdaniFuzzySystem.mqh La classe pour créer un système flou de type Mamdani.
MembershipFunction.mqh Classes de fonctions d'appartenance :
  1. Fonction d'appartenance gaussienne.
  2. Fonction d'appartenance gaussienne bilatérale.
  3. Fonction d'appartenance en forme de cloche généralisée.
  4. Fonction d'adhésion en forme de S.
  5. Fonction d'appartenance en forme de Z.
  6. Fonction d'adhésion en forme de Pi.
  7. Fonction d'appartenance sigmoïde.
  8. Produit de deux fonctions d'appartenance sigmoïde.
  9. Fonction d'appartenance sous la forme d'une différence entre deux fonctions sigmoïdes.
  10. Fonction d'appartenance trapézoïdale.
  11. Fonction d'appartenance triangulaire.
  12. Fonction d'appartenance sous la forme d'une constante.
  13. Fonction d'appartenance sous la forme d'une composition de fonctions d'adhésion.
RuleParser.mqh Classe d'analyse des règles floues.
SugenoFuzzySystem.mqh Classe de création d'un système flou de type Sugeno.
SugenoVariable.mqh Le package contient les classes suivantes :
  1. LinearSugenoFuction - classe pour créer des fonctions linéaires.
  2. SugenoVariable - classe pour créer une variable floue de type Sugeno.

Les variables floues de type Sugeno sont utilisées lors du développement de règles pour un système de type Sugeno.

 

Utilisation de la bibliothèque FuzzyNet dans MQL5

Avant d'écrire un système flou, vous devez avoir une vision claire de ses éléments, notamment :

  1. Le nombre de valeurs d'entrée et de sortie à réarranger par variables floues.
  2. Le nombre de termes et leurs fonctions d'appartenance pour chaque variable floue.
  3. Le type de système flou en fonction de votre tâche.
  4. Le nombre et le contenu des règles floues correspondant au système sélectionné.
  5. Les paramètres et caractéristiques spécifiques du système.

Le développement et le calcul du système :

  1. Créez un système vide.

    Pour un système de type Mamdani :

    MamdaniFuzzySystem *fuzzy_system=new MamdaniFuzzySystem();
    Pour un système de type Sugeno :
    SugenoFuzzySystem *fuzzy_system=new SugenoFuzzySystem();
  2. Créez toutes les variables d'entrée floues séparément du système en attribuant un nom et des valeurs maximum/minimum à toutes les variables en tant que paramètres :
    FuzzyVariable *fuzzy_variable=new FuzzyVariable(const string name,const double min,const double max);
  3. Créez des fonctions de termes flous, créez des termes flous eux-mêmes et transmettez-leur des noms et des fonctions d'appartenance appropriés. Après cela, ajoutez les termes aux variables correspondantes. Pour réduire le code du programme, le processus peut être écrit comme suit :
    fuzzy_variable.Terms().Add(new FuzzyTerm(const string name,new IMembershipFunction());
  4. Saisissez les variables d'entrée dans le système :
    fuzzy_system.Input().Add(FuzzyVariable fuzzy_variable);
  5. Créez des variables d'entrée en faisant attention au type de votre système. Pour un système de type Mamdani, la création est similaire aux étapes 2 et 3. Pour un modèle de type Sugeno, créez des variables floues spéciales n'acceptant qu'un nom de variable comme paramètres :
    SugenoVariable *sugeno_variable=new SugenoVariable(const string name);
    Les fonctions linéaires interprétant la combinaison linéaire des valeurs d'entrée sont ajoutées à une variable floue de type Sugeno au lieu de termes flous. Un nom et un tableau de coefficients sont utilisés comme paramètres de fonction linéaire. Une équation linéaire est formée sur la base de ce tableau, par conséquent, il est important de respecter l'ordre des éléments dans le tableau. La longueur d'un tableau de coefficients doit être égale à la quantité de valeurs d'entrée ou la dépasser d'une unité. Si les longueurs sont égales, un terme absolu d'une équation est égal à zéro. Si la longueur du tableau dépasse le montant de un, un terme absolu est égal à la valeur du dernier élément. Tous les autres éléments du tableau commençant par le premier sont affectés à des variables d'entrée floues dans l'ordre dans lequel ils ont été entrés dans le système.
    sugeno_varriable.Functions().Add(fuzzy_sytem.CreateSugenoFunction(const string name, const double &coeffs[]));
  6. De façon similaire à l'étape 4, les variables de sortie doivent également être ajoutées au système :

    Pour un système de type Mamdani :

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

    Pour un système de type Sugeno :

    fuzzy_system.Output().Add(FuzzyVariable fuzzy_variable);
  7. Organisez un ensemble de règles en fonction du système. Les règles sont définies comme une chaîne commune et analysées automatiquement en fonction de mots-clés. Les mots-clés sont "if", "then", "is", "and", "or", "not", "(" , ")", "slightly", "somewhat", "very" and "extremely" , ainsi que tous les noms de variables, termes et fonctions disponibles dans votre système.

    Pour un système de type Mamdani :

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

    Pour un système de type Sugeno :

    SugenoFuzzyRule *fuzzy_rule = fuzzy_system.ParseRule(const string rule_text);
  8. Saisissez toutes les règles dans le système :

    Pour un système de type Mamdani :

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

    Pour un système de type Sugeno :

    fuzzy_system.Rules().Add(SugenoFuzzyRule fuzzy_rule);
  9. Transmettez les valeurs d'entrée des variables au système pour le calcul. Pour ce faire, ils doivent être définis. A son entrée, le système accepte la liste de valeurs incluant l'objet de classe Dictionary_Obj_Double. La classe est décrite dans le fichier Dictionary.mqh.
    Dictionary_Obj_Double *p_od_in=new Dictionary_Obj_Double;
    La classe implémente la méthode SetAll(CObject *key, const double value) acceptant deux paramètres - une variable floue et une valeur numérique. Cet élément est une variable d'entrée du système.
    p_od_in.SetAll(FuzzyVariable fuzzy_variable,const double value);
    Toutes les autres valeurs d'entrée sont remplies de la même manière. Créez la liste et ajoutez-y toutes les valeurs :
    CList *in=new CList;
    in.Add(p_od_in);
  10. Les valeurs de sortie doivent également être spécifiées :
    Dictionary_Obj_Double *p_od_out=new Dictionary_Obj_Double;   
    CList *out=new CList;
  11. Appelez la fonction Calculate(CList *&list) pour notre système en renvoyant la liste des résultats des calculs du système :
    out=fuzzy_system.Calculate(in);
    Après cela, la liste out stocke toutes les valeurs de sortie calculées dans l'ordre dans lequel elles ont été entrées dans le système. Il nous suffit de les recevoir :
    p_od_out=out.GetNodeAtIndex(int index);
    double result=p_od_out.Value();
    Désormais, la variable résultat stocke le résultat du calcul du système pour une valeur de sortie saisie dans le système sous un nombre spécifié dans l'index.

Exemples de scripts

Exemple de pourboire (Mamdani)

Tips_Sample_Mamdani.mq5 calcule le pourcentage de pourboire que vous devez payer en fonction de la qualité du service et de la nourriture.

Saisissez les paramètres d'entrée :

Paramètres d'entrée

Résultats du calcul :

Résultats du calcul

Exemple de régulateur de vitesse (Sugeno)

L'exemple de script Cruise_Control_Sample_Sugeno.mq5 est un exemple de régulateur flou. Il représente un système de régulateur de vitesse de voiture qui calcule l'accélération nécessaire en utilisant les données sur l'écart actuel et le taux de variation de déviation afin que la voiture atteigne la vitesse souhaitée.

Saisissez les paramètres d'entrée :

Paramètres d'entrée

Résultats du calcul :

Résultats du calcul

Traduit du russe par MetaQuotes Ltd.
Code original : https://www.mql5.com/ru/code/13697

Publication automatique avec WebRequest() Publication automatique avec WebRequest()

Exemple de publication d'un message contenant une image sur le site Web MQL5.com à l'aide de la fonction WebRequest(). Voici un exemple d'autorisation à l'aide d'un login et d'un mot de passe, et d'insertion d'une image dans un SMS.

QuotesDemo QuotesDemo

Exemple d'obtention de cotations des indices mondiaux de Google Finance.

RegularExpressions dans MQL5 pour travailler avec des expressions régulières RegularExpressions dans MQL5 pour travailler avec des expressions régulières

Les expressions régulières fournissent un langage formel pour un traitement rapide et flexible des textes. Chaque expression régulière est un modèle (masque), pour lequel le moteur d'expression régulière essaie de trouver des correspondances dans le texte source. Un modèle se compose d'un ou plusieurs caractères littéraux, opérateurs ou constructions.

RatesCompressor RatesCompressor

Rates Version of a script https://www.mql5.com/en/code/30791