und werden Sie Mitglied unserer Fangruppe
Veröffentliche einen Link auf das Skript, damit die anderen ihn auch nutzen können
Bewerten Sie es im Terminal MetaTrader 5
![Bibliotheken](https://c.mql5.com/i/code/library.png)
RegularExpressions in MQL5 für die Arbeit mit regulären Ausdrücken - Bibliothek für den MetaTrader 5
- Veröffentlicht:
- MetaQuotes
- Ansichten:
- 1487
- Rating:
- Veröffentlicht:
- 2016.05.20 14:07
- Aktualisiert:
- 2022.11.15 09:54
-
Benötigen Sie einen Roboter oder Indikator, der auf diesem Code basiert? Bestellen Sie ihn im Freelance-Bereich Zum Freelance
Autor des Artikels:
Microsoft Corporation. Quellcodes aus .Net Framework 4.6.1.
Hinweis: die Bibliothek funktioniert im MetaTrader 5 build 1285 und höher.
Entpacken Sie die Zip-Datei in den Dateiordner.
Die Codes der Bibliothek sind im folgenden Ordner zu finden: <Dateiordner>\MQL5\Include\RegularExpressions\
Beispiele von Test-Scripts finden Sie im Ordner: <Dateiordner>\MQL5\Scripts\RegularExpressionsExamples\
Hier ist eine Übersetzung von RegularExpressions aus .Net Framework 4.6.1.
Für die Arbeit mit der Bibliothek fügen Sie Ihrem Code die Datei Regex.mqh aus dem Verzeichnis \MQL5\Include\RegularExpressions\ hinzu.
Die Bibliothek wird durch einige Beispiele ergänzt, die zur Veranschaulichung und gleichzeitig als Testfälle dienen. Alle Beispiele sind der offiziellen Webseite von Microsoft Corporation entnommen. Sie veranschaulichen grundlegende Unterschiede von regulären Ausdrücken in C# sowie die Besonderheiten der Verwendung regulärer Ausdrücke in MQL5.
Nachfolgend finden Sie detaillierte Informationen über die Pakete der portierte Bibliothek RegularExpressions MQL5:
Pakete | Beschreibung |
---|---|
CharUnicodeInfo.mqh | Eine archivierte txt-Datei zum Bestimmen von Unicode-Kategorien für alle Zeichen (nicht-lateinische Zeichen eingeschlossen). |
RegexCapture.mqh | Stellt Ergebnisse einer erfolgreichen Erfassung des Teilausdrucks dar. |
RegexCaptureCollection.mqh | Stellt einen Set der Erfassungen dar, die durch eine Erfassungsruppe getan wurden. |
RegexGroup.mqh | Stellt Ergebnisse einer separaten Erfassungsgruppe dar. |
RegexGroupCollections.mqh | Gibt einen Set von Gruppenobjekten. |
RegexMatch.mqh | Stellt Ergebnisse aus einem separaten Treffer eines regulären Ausdrucks dar. |
RegexMatchCollection.mqh | Stellt einen Set erfolgreicher Treffer dar, die durch eine iterative Anwendung des Musters eines regulären Ausdrucks zur Eingabezeile gefunden wurden dar. |
Regex.mqh | Stellt einen unveränderlichen regulären Ausdruck dar. |
RegexOptions.mqh | Stellt alle aufgezählten Werte bereit, um Parameter regulärer Ausdrücke zu setzen. |
Parameter regulärer Ausdrücke aus der Datei RegexOptions.mqh:
Parameter | Beschreibung |
---|---|
None | Keine Parameter gesetzt. |
IgnoreCase | Klein-bzw. Großschreibung wird nicht berücksichtigt. |
Multiline | Zeigt einen mehrzeiligen Modus an. |
ExplicitCapture | Unbenannte Gruppen nicht erfassen. Die einzig zulässigen Erfassungen sind die explizit benannten oder nummerierten im Format (?<Name> Teilausdruck). |
Singleline | Zeigt einen einzeiligen Modus an. |
IgnorePatternWhitespace | Beseitigt Trennzeichen ohne Escape-Sequenz aus dem Muster und aktiviert die mit dem '#' Zeichen markierten Kommentare. |
RightToLeft | Zeigt, dass die Suche von rechts nach links erfolgt und nicht von links nach rechts. |
Debug | Zeigt, dass das Programm im Debug-Modus läuft. |
ECMAScript | Aktiviert ein ECMAScript-konformes Verhalten für den Ausdruck. Dieser Wert kann nur zusammen mit IgnoreCase und Multiline verwendet werden. |
Umgang mit RegularExpressions für MQL5:
- Ähnlich wie in der .Net Version wurde in dieser Bibliothek ein Speicher (statischer Cache-Speicher) regulärer Ausdrücke umgesetzt. Alle implizit erstellen regulären Ausdrücke (Instanzen der Regex Klasse) werden in diesem Speicher abgelegt. Solche Herangehensweise beschleunigt die Arbeit von Skripts, denn es besteht keine Notwendigkeit, einen regulären Ausdruck zu erstellten, wenn sein Muster mit einem der vorhandenen übereinstimmt. Die Standardgröße des Speichers beträgt 15. Die Regex::CacheSize() Methode gibt zurück oder setzt eine maximale Anzahl an Einträgen im aktuellen statischen Cache-Speicher der kompilierten regulären Ausdrücken.
- Die zweite Besonderheit der Arbeit mit regulären Ausdrücken in MQL5 ist unmittelbar mit der ersten verbunden. Sie besteht darin, dass der oben beschriebene Speicher aufgeräumt werden muss. Dafür muss die statische Funktion Regex::ClearCache() aufgerufen werden. Es ist empfehlenswert, diese Funktion nur dann aufzurufen, wenn die Arbeit mit regulären Ausdrücken beendet wurde, sonst ist das Risiko sehr noch, notwendige Pointer zu löschen.
- Im Gegensatz zu .Net ist in MQL5 die foreach Schleife nicht umgesetzt, und daher unterscheidet sich die Arbeit mit Aufzählungen. Beispiel:
//--- Code in 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) { //--- Bearbeitung } //--- Code in 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(); //--- Bearbeitung } delete rx; delete matches; delete en; Regex::ClearCache();
- Aus dem Beispiel oben folgt, dass die Syntax der Programmiersprache C# erlaubt, das '@' Zeichen vor Zeilen zu setzen, um alle Formatierungszeichen in jeweiligen Zeile zu ignorieren. MQL5 bietet eine solche Herangehensweise nicht, aus diesem Grund müssen alle Kontrollzeichen im Muster regulärer Ausdrücke explizit definiert werden.
Beispiel für die Arbeit mit RegularExpressions für MQL5:
Betrachten wir den Umgang mit regulären Ausdrücken anhand ihrer Anwendung für Parsing von Handelshistorie, die aus dem Terminal als HTML-Datei heruntergeladen wurde.
Dafür erstellen wir einen Experten mit einem Eingabeparameter vom Typ string, der als Name für unsere Datei in der Sandbox dienen wird:
Dieses Dokument beinhaltet zwei Haupttabellen: "Orders" und "Trades".
Erstellen wir einen regulären Ausdruck, um die Datei zu parsen:
Regex *rgx=new Regex("(>)([^<>]*)(<)");
Schauen wir uns den regulären Ausdruck an:
(>) | Das '>' Zeichen finden |
(^[<>]*) | Jedes Zeichen außer '>' und '<', das sich Null und mehrere Male wiederholt |
(<) | Das '<' Zeichen finden |
Dann lesen wir die Datei Zeile für Zeile und erhalten alle Treffer, die mit diesem regulären Ausdruck übereinstimmen:
string str=FileReadString(m_handel); MatchCollection *matches=rgx.Matches(str);
In den Zeilen der HTML-Datei, die zu Erfassungen (Tupel) für "Orders" und "Trades" Tabellen gehören, wird es die meisten Treffer geben nämlich 23 und 27 jeweils. Nun müssen wir alle notwendigen Informationen aus diesen Zeilen herausziehen.
Für die 'Orders' Tabelle:
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)); }
Wir haben sichergestellt, dass die Anzahl der Treffer 23 beträgt, und dies bedeutet, dass wir mit dem Eintrag aus der 'Orders' Tabelle zu tun haben. Erstellen wir ein Array von Strings als anfängliche Darstellung des Eintrags. Alle ungeraden Treffer durchlaufen, anhand der matches[j][.Value() Methode Werte dieser Treffer erhalten und das erste und letzte Zeichen bei den Treffern abschneiden, die den Zeichen '>' und '<' entsprechen. Fügen wir jeden formatierten Treffer dem früher deklarierten Array in hinzu. Danach erstellen wir eine neue Instanz der Klasse OrderRecord(in), das einen Eintrag der 'Orders' Tabelle darstellt, und fügen es der Liste m_list1 hinzu. Diese Liste wird die 'Orders' Tabelle analysieren.
Ähnlich wird die 'Trades' Tabelle bearbeitet:
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)); }
m_list2 ist die Liste der Pointer auf die DealRecord Klasse, die ihrerseits die 'Orders' Tabelle darstellt.
Beide Listen sind Mitglieder der Klasse TradeHistory. Diese Klasse repräsentiert die ganze HTML-Quelldatei. Darüber hinaus kann man anhand dieser Klasse die 'Orders' und 'Trades' Tabellen mithilfe der folgenden Methoden sortieren: FindAllOrders(const int columnIndex,const T value) und FindAllDeals(const int columnIndex,const T value).
Erstellen wir ein einfaches graphisches Interfaces in unserem Experten, um dies zu demonstrieren:
Bei der Arbeit mit dieser Form wählen wir die gewünschte Tabelle, Spalte und den Wert, nach dem die Tabelle gefiltert wird. Klicken Sie auf Find und die gefilterte Tabelle wird unten mit einigen statistischen Daten angezeigt. Der Save Button speichert die aktuell angezeigte Tabelle in einer CSV-Datei. Die gespeicherte Datei wird auch in der Sandbox unter dem Namen Result.csv abgelegt.
Um mehr über die Bibliothek RegularExpressions für MQL5 und ihre Möglichkeiten zu erfahren, nutzen Sie den Expert Advisor Tests.mqh. Der EA setzt viele Beispiele für reguläre Ausdrücke um, die die ganze Funktionsvielfalt der Bibliothek umfassen.
Übersetzt aus dem Russischen von MetaQuotes Ltd.
Originalpublikation: https://www.mql5.com/ru/code/15242
![Exp_AltrTrend_Signal_v2_2](https://c.mql5.com/i/code/expert.png)
Ein Handelssystem das den AltrTrend_Signal_v2_2 semaphore signal Indikator verwendet.
![BW-wiseMan-1](https://c.mql5.com/i/code/indicator.png)
Signalindikator, basierend auf Bill Williams' Alligator Indikator.
![Price Channel](https://c.mql5.com/i/code/indicator.png)
In der CodeBase gibt es bereits einen Price Channel Indikator, mir persönlich gefällt er aber nicht, weil er den ganzen Raum zwischen den oberen und unteren Grenzen färbt. Die angebotene Version des Price Channel Indikators sieht wie im MetaTrader 4 aus.
![iCrossClose](https://c.mql5.com/i/code/indicator.png)
Der Indikator ermöglicht es Ihnen, jegliche Rechenarten mit Schlusskursen von zwei Symbolen auszuführen und das Ergebnis auf jedem anderen Chart anzuzeigen. So kann man den Wert des Kreuzkurses (Multiplikation und Division) und des Spreads (Subtraktion) erhalten oder einfach Daten eines Symbols auf dem Chart des anderen anzeigen.