Unisciti alla nostra fan page

RegularExpressions in MQL5 per lavorare con le espressioni regolari - libreria per MetaTrader 5
- Pubblicati da::
- MetaQuotes
- Visualizzazioni:
- 821
- Valutazioni:
- Pubblicato:
- 2021.11.15 16:28
- Aggiornato:
- 2022.11.15 09:56
-
Hai bisogno di un robot o indicatore basato su questo codice? Ordinalo su Freelance Vai a Freelance
Autore:
Microsoft Corporation. Il codice sorgente è stato preso da .Net Framework 4.6.1.
Nota: La libreria lavora su MetaTrader 5 build 1285 e superiore.
Scompatta l'archivio in terminal_data_folder.
I codici della libreria sono posizionati in: <terminal_data_folder>\MQL5\Include\RegularExpressions\
Gli script d'esempio possono essere trovati in <terminal_data_folder>\MQL5\Scripts\RegularExpressionsExamples\
Qui c'è una traduzione della RegularExpressions da .Net Framework 4.6.1.
Per lavorare con la libreria, includere il file Regex.mqh dalla directory "\MQL5\Include\RegularExpressions\" nel tuo codice.
Con la libreria sono forniti diversi esempi illustrativi, che allo stesso tempo fungono da casi test. Tutti gli esempi sono stati presi dal sito ufficiale di Microsoft Corporation, dimostrano chiaramente le principali differenze dalle espressioni regolari in C# e le caratteristiche del loro utilizzo in MQL5.
Di seguito informazioni più dettagliate circa i pacchetti della libreria RegularExpressions portata a MQL5:
Pacchetti | Descrizione |
---|---|
CharUnicodeInfo.mqh | File txt archiviato per determinare le categorie Unicode per tutti i simboli (compresi i caratteri non latini). |
RegexCapture.mqh | Rappresenta i risultati di acquisizione di una singola sottoespressione avvenuta con successo. |
RegexCaptureCollection.mqh | Rappresenta l'insieme di acquisizioni effettuate da un singolo gruppo di acquisizioni. |
RegexGroup.mqh | Rappresenta i risultati di un singolo gruppo di acquisizione. |
RegexGroupCollections.mqh | Rappresenta una raccolta di oggetti Group. |
RegexMatch.mqh | Rappresenta i risultati di una singola corrispondenza di espressione regolare. |
RegexMatchCollection.mqh | Rappresenta una raccolta di corrispondenze riuscite trovate applicando in modo iterativo il modello di espressione regolare alla stringa di input. |
Regex.mqh | Rappresenta un'espressione regolare immutabile |
RegexOptions.mqh | Fornisce valori enumerati da utilizzare per impostare le opzioni delle espressioni regolari. |
I parametri delle espressioni regolari dal file RegexOptions.mqh:
Parametri | Descrizione |
---|---|
None | Specifica che nessuna delle opzioni sono impostate. |
IgnoreCase | Specifica corrispondenze nei case-insensitive. |
Multiline | Specifica la modalità multilinea. |
ExplicitCapture | Non acquisisce gruppi senza nome. Specifica che le uniche acquisizioni valide sono i gruppi esplicitamente denominati o numerati nella forma (?<nome> sottoespressione). |
Singleline | Specifica la modalità linea singola: |
IgnorePatternWhitespace | Elimina gli spazi bianchi senza caratteri di escape dal modello e abilita i commenti contrassegnati con #. |
RightToLeft | Specifica che la ricerca sarà da destra a sinistra anzichè da sinistra a destra. |
Debug | Specifica che il programma lavora in modalità debug. |
ECMAScript | Abilita il comportamento conforme a ECMA Script per l'espressione. Questo valore può essere utilizzato solo insieme ai valori IgnoreCase e Multiline. |
Lavorando con RegularExpressions per MQL5:
- Come con la versione per .Net, questa libreria implementa una memorizzazione (cache statica) di espressioni regolari. Tutte le espressioni regolari create implicitamente (istanze della classe Regex) vengono scritte in quella memoria. Questo approccio velocizza il funzionamento degli script, in quanto elimina la necessità di ricostruire l'espressione regolare se il suo pattern corrisponde a uno di quelli esistenti. La dimensione predefinita della memoria è 15. Il metodo Regex::CacheSize() restituisce o imposta il numero massimo di voci nell'attuale cache statica delle espressioni regolari rispettate.
- La seconda caratteristica di lavorare con le espressioni regolari in MQL5 segue direttamente dalla prima. E sta nel fatto che la memoria di cui sopra deve essere cancellata. Per fare questo, chiamare la funzione statica Regex::ClearCache(). E' raccomandato chiamare questa funzione solo dopo che il lavoro con l'espressione regolare è stato completato, altrimenti c'è il rischio di cancellare i puntatori necessari.
- A differenza di .Net, MQL5 non implementa il ciclo foreach e quindi la gestione dell'enumerazione sarà diversa. Esempio:
//--- 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) { //--- handling } //--- 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(); //--- handling } delete rx; delete matches; delete en; Regex::ClearCache();
- Come si può notare dall'esempio sopra, la sintassi del C# consente di inserire il simbolo "@" davanti alle stringhe per ignorare tutti i segni di formattazzione in esso. In MQL5, questo approccio non è fornito, quindi tutti i caratteri di controllo in un modello di espressione regolare dovrebbero essere definiti in modo esplicito.
Esempio di lavoro con RegularExpressions per MQL5:
Come esempio di espressioni regolari, considera la loro applicazione per analizzare la cronologia di trading scaricata dal terminale sotto forma di file html.
Per fare ciò, crea un expert con un singolo parametro di input di tipo 'stringa', che sarà il nome del file sandbox:
Questo documento contiene due tabelle principali "Orders" e "Deals".
Crea un'espressione regolare per analizzare il file:
Regex *rgx=new Regex("(>)([^<>]*)(<)");
Considera questa espressione regolare:
(>) | Cerca il carattere ">" |
(^[<>]*) | Qualsiasi simbolo tranne '>' e '<', ripetuto zero o più volte |
(<) | Cerca il simbolo '<' |
Quindi, leggi il file riga per riga e ottieni tutte le corrispondenze che corrispondono a questa espressione regolare:
string str=FileReadString(m_handel); MatchCollection *matches=rgx.Matches(str);
Le stringhe del file html, che sono voci (tuple) per le tabelle "Orders" e "Deals", avranno la maggior parte di tali corrispondenze, rispettivamente 23 e 27 corrispondenze. Pertanto, l'unica cosa che resta da fare è estrarre tutte le informazioni necessarie da queste stringhe.
Per la tabella "Orders":
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)); }
È stato confermato che il numero di corrispondenze è 23 e, pertanto, la voce gestita proviene dalla tabella "Orders". Crea un array di stringhe come rappresentazione iniziale della nostra voce. Crea l'iterazione su tutte le corrispondenze dispari, ottieni i valori di tali corrispondenze utilizzando il metodo matches[j][.Value(), taglia il primo e l'ultimo carattere di ciascuna corrispondenza, che corrispondono ai caratteri '>' e '<'. Ogni corrispondenza formattata viene scritta in un array in precedentemente dichiarato. Successivamente creare un'istanza della classe OrderRecord(in), che rappresenta una singola voce della tabella "Orders", e aggiungerla all'elenco m_list1. Questo elenco interpreterà la tabella "Orders".
La tabella "Deals" sarà processata in modo simile:
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)); }
Qui m_list2 è una lista di puntatori alla classe DealRecord. Rappresenta la tabella "Deals".
Entrambe queste liste sono membri della classe TradeHistory. Questa classe è la rappresentazione dell'intero file html originale. Inoltre, permette di applicare semplici filtri alle tabelle "Orders" e "Deals" utilizzando i metodi: FindAllOrders(const int columnIndex,const T value) e FindAllDeals(const int columnIndex, valore T costante).
Crea una semplice interfaccia grafica nell'EA per dimostrare queste capacità:
Quando si lavora con questo modulo, selezionare la tabella desiderata, selezionare una colonna e il relativo valore per filtrare la tabella. Premi il pulsante Trova e la tabella filtrata verrà visualizzata di seguito, insieme ad alcune statistiche su di essa. Il pulsante Salva salva la tabella attualmente visualizzata in un file csv. Anche il file salvato si troverà nella sandbox e avrà il nome Result.csv.
Per ulteriori informazioni su RegularExpressions per MQL5 e sulle sue funzionalità, utilizza l'esperto Tests.mqh fornito. Implementa numerosi esempi di utilizzo delle espressioni regolari, che coprono tutte le principali funzionalità della libreria.
Tradotto dal russo da MetaQuotes Ltd.
Codice originale https://www.mql5.com/ru/code/15242

La libreria FuzzyNet per lo sviluppo di modelli fuzzy è stata scritta in C#. Durante la conversione a MQL5, sono state aggiunte alla libreria 8 funzioni di appartenenza e 4 metodi di defuzzificazione per i sistemi di tipo Mamdani.

Un esempio della pubblicazione di un messaggio contenente un'immagine sul sito web MQL5.com utilizzando la funzione WebRequest(). Questo è un esempio di come autorizzare utilizzando login e password, e inserire un'immagine in un messaggio di testo

Script semplice con dimostrazione dell'utilizzo della funzione ChartNavigate().

Vengono considerati i segnali di trading basati sul pattern di candele "Dark Cloud Cover/Piercing Line", confermato dall'indicatore stocastico. Il codice dell'Expert Advisor basato su questa strategia può essere generato automaticamente utilizzando il Wizard MQL5.