
RegularExpressions dans MQL5 pour travailler avec des expressions régulières - bibliothèque pour MetaTrader 5
- Publié par:
- MetaQuotes
- Vues:
- 254
- Note:
- votes: 39
- Publié:
- 2022.01.31 10:19
- Mise à jour:
- 2022.11.15 09:56
Véritable auteur :
Microsoft Corporation. Code source extrait de .Net Framework 4.6.1.
Remarque : la bibliothèque fonctionne sur MetaTrader 5 build 1285 et supérieur.
Décompressez l'archive dans le terminal_data_folder.
Les codes de bibliothèque se trouvent dans : <terminal_data_folder>\MQL5\Include\RegularExpressions\
Des exemples de scripts de test sont disponibles dans <terminal_data_folder>\MQL5\Scripts\RegularExpressionsExamples\
Voici une traduction des RegularExpressions de .Net Framework 4.6.1.
Pour travailler avec la bibliothèque, incluez le fichier Regex.mqh du répertoire "\MQL5\Include\RegularExpressions\" dans votre code.
Plusieurs exemples illustratifs sont fournis avec la bibliothèque, qui servent en même temps de cas de test. Tous les échantillons sont tirés du site officiel de Microsoft Corporation, ils démontrent de manière frappante les principales différences par rapport aux expressions régulières en C# et les fonctionnalités de leur utilisation dans le MQL5.
Vous trouverez ci-dessous des informations plus détaillées sur les packages de bibliothèques portés par RegularExpressions MQL5 :
Paquets | Description |
---|---|
CharUnicodeInfo.mqh | Fichier txt archivé pour déterminer les catégories Unicode pour tous les symboles (y compris les caractères non latins). |
RegexCapture.mqh | Représente les résultats d'une seule capture de sous-expression réussie. |
RegexCaptureCollection.mqh | Représente l'ensemble des captures effectuées par un seul groupe de capture. |
RegexGroup.mqh | Représente les résultats d'un seul groupe de capture. |
RegexGroupCollections.mqh | Représente une collection d'objets Group. |
RegexMatch.mqh | Représente les résultats d'une seule correspondance d'expression régulière. |
RegexMatchCollection.mqh | Représente une collection de correspondances réussies trouvées en appliquant de manière itérative le modèle d'expression régulière à la chaîne d'entrée. |
Regex.mqh | Représente une expression régulière immuable |
RegexOptions.mqh | Fournit des valeurs énumérées à utiliser pour définir des options d'expression régulière. |
Les paramètres d'expression régulière du fichier RegexOptions.mqh :
Paramètre | Description |
---|---|
None | Spécifie qu'aucune options n'est définie. |
IgnoreCase | Spécifie une correspondance insensible à la casse. |
Multiline | Spécifie le mode multiligne. |
ExplicitCapture | Ne pas capturer de groupes sans nom. Spécifie que les seules captures valides sont des groupes explicitement nommés ou numérotés de la forme (?<nom> sous-expression). |
Singleline | Spécifie le mode ligne simple. |
IgnorePatternWhitespace | Élimine les espaces blancs non échappés du motif et active les commentaires marqués d'un #. |
RightToLeft | Spécifie que la recherche se fera de droite à gauche au lieu de gauche à droite. |
Debug | Indique que le programme fonctionne en mode débogage. |
ECMAScript | Active le comportement conforme à ECMAScript pour l'expression. Cette valeur ne peut être utilisée qu'avec les valeurs IgnoreCase et Multiline. |
Travailler avec RegularExpressions pour MQL5 :
- Comme pour la version pour .Net, cette bibliothèque implémente un stockage (cache statique) d'expressions régulières. Toutes les expressions régulières créées implicitement (instances de la classe Regex) sont écrites dans ce stockage. Cette approche accélère le fonctionnement des scripts, car elle élimine le besoin de reconstruire l'expression régulière si son modèle correspond à l'un des modèles existants. La taille par défaut du stockage est de 15. La méthode Regex::CacheSize() renvoie ou définit le nombre maximal d'entrées dans le cache statique actuel des expressions régulières conformes.
- La deuxième fonctionnalité du travail avec les expressions régulières dans MQL5 découle directement de la première. Et cela réside dans le fait que le stockage ci-dessus doit être effacé. Pour ce faire, appelez la fonction statique Regex::ClearCache(). Il est recommandé de n'appeler cette fonction qu'une fois le travail avec les expressions régulières terminé, sinon il y a un risque de supprimer les pointeurs nécessaires.
- Contrairement au .Net, le MQL5 n'implémente pas la boucle foreach, et donc la gestion de l'énumération sera différente. Exemple :
//--- Code en C# Regex rx = new Regex(@"\b(?<word>\w+)\s+(\k<word>)\b", RegexOptions.IgnoreCase); string text = "The the quick brown fox fox jumped over the lazy dog dog."; MatchCollection matches = rx.Matches(text); foreach (Match match in matches) { //--- traitement } //--- Code en MQL5 Regex *rx = new Regex("\\b(?<word>\\w+)\\s+(\\k<word>)\\b", RegexOptions::IgnoreCase); string text = "The the quick brown fox fox jumped over the lazy dog dog."; MatchCollection *matches = rx.Matches(text); IEnumerator<Match*> *en = matches.GetEnumerator(); while(en.MoveNext()) { Match *match = en.Current(); //--- gestion } delete rx; delete matches; delete en; Regex::ClearCache();
- Comme le montre l'exemple ci-dessus, la syntaxe C# permet de mettre le symbole '@' devant les chaînes pour ignorer toutes les marques de formatage qu'elle contient. Dans MQL5, cette approche n'est pas fournie, donc tous les caractères de contrôle dans un modèle d'expression régulière doivent être explicitement définis.
Exemple de travail avec RegularExpressions pour MQL5 :
Comme exemple d'expressions régulières, considérons leur application pour analyser l'historique des transactions téléchargé depuis le terminal sous la forme d'un fichier html.
Pour cela, créez un expert avec un seul paramètre d'entrée de type 'string', qui sera le nom du fichier sandbox :
Ce document contient deux tableaux principaux : "Ordres" et "Transactions".
Créez une expression régulière pour analyser le fichier :
Regex *rgx=new Regex("(>)([^<>]*)(<)");
Considérez cette expression régulière :
(>) | Trouvez le caractère '>' |
(^[<>]*) | Tout symbole sauf '>' et '<', répété zéro ou plusieurs fois |
(<) | Trouvez le symbole '<' |
Ensuite, lisez le fichier ligne par ligne et obtenez toutes les correspondances qui correspondent à cette expression régulière :
string str=FileReadString(m_handel); MatchCollection *matches=rgx.Matches(str);
Les chaînes du fichier html, qui sont des entrées (tuples) pour les tableaux "Ordres" et "Transactions", auront le plus de telles correspondances, à savoir 23 et 27 correspondances respectivement. Par conséquent, la seule chose qui reste à faire est d'extraire toutes les informations nécessaires de ces chaînes.
Pour le tableau "Ordres" :
if(matches.Count()==23) { string in[11]; for(int i=0,j=1; i<11; i++,j+=2) { in[i]=StringSubstr(matches[j].Value(),1,StringLen(matches[j].Value())-2); } m_list1.Add(new OrderRecord(in)); }
Il a été confirmé que le nombre de correspondances est de 23, et par conséquent, l'entrée traitée provient du tableau "Ordres". Créez un tableau de chaînes comme représentation initiale de notre entrée. Créez une itération sur toutes les correspondances impaires, obtenez les valeurs de ces correspondances à l'aide de la méthode matches[j][.Value(), coupez le premier et le dernier caractère de chaque correspondance, qui correspondent aux caractères '>' et '<'. Chaque correspondance formatée est écrite dans un tableau in précédemment déclaré. Après cela, créez une instance de la classe OrderRecord(in), qui représente une seule entrée du tableau "Ordres", et ajoutez-la à la liste m_list1. Cette liste interprétera le tableau "Ordres".
Le tableau "Transactions" sera traité de la même manière :
if(matches.Count()==27) { string in[13]; for(int i=0,j=1; i<13; i++,j+=2) { in[i]=StringSubstr(matches[j].Value(),1,StringLen(matches[j].Value())-2); } m_list2.Add(new DealRecord(in)); }
Ici m_list2 est une liste de pointeurs vers la classe DealRecord. Il représente le tableau "Transactions".
Ces deux listes sont membres de la classe TradeHistory. Cette classe est la représentation de l'intégralité du fichier html d'origine. De plus, il permet d'appliquer des filtres simples aux tableaux "Ordres" et "Transactions" en utilisant les méthodes : FindAllOrders(const int columnIndex,const T value) et FindAllDeals(const int columnIndex, valeur const T).
Créez une interface graphique simple dans l'EA pour démontrer ces capacités :
Lorsque vous travaillez avec cette forme, sélectionnez le tableau souhaité, sélectionnez une colonne et sa valeur pour filtrer le tableau. Appuyez sur le bouton Rechercher et le tableau filtré s'affichera ci-dessous, accompagné de quelques statistiques. Le bouton Enregistrer stocke le tableau actuellement affiché dans un fichier csv. Le fichier enregistré sera également situé dans le bac à sable et portera le nom Résultat.csv.
Pour en savoir plus sur les RegularExpressions pour MQL5 et ses fonctionnalités, utilisez l'expert Tests.mqh fourni. Il implémente de nombreux exemples d'utilisation d'expressions régulières, qui couvrent toutes les fonctionnalités principales de la bibliothèque.
Traduit du russe par MetaQuotes Ltd.
Code original : https://www.mql5.com/ru/code/15242

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.

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.

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

Fast way to calculate Simple moving average.