Pon "Me gusta" y sigue las noticias
Deje un enlace a él, ¡qué los demás también lo valoren!
Evalúe su trabajo en el terminal MetaTrader 5

RegularExpressions en MQL5 para trabajar con expresiones frecuentes - librería para MetaTrader 5
- Publicado por:
- MetaQuotes
- Visualizaciones:
- 1623
- Ranking:
- Publicado:
- 2016.05.20 13:44
- Actualizado:
- 2022.11.15 09:54
-
¿Necesita un robot o indicador basado en este código? Solicítelo en la bolsa freelance Pasar a la bolsa
Autor real:
Microsoft Corporation. Los códigos fuente se han tomado de .Net Framework 4.6.1.
Advertencia: la Biblioteca funciona en MetaTrader 5 build 1285 y superior.
Para que funcione, es necesario descomprimir el archivo en la carpeta catálogo_de_datos_del_terminal.
Los códigos de la biblioteca se ubican en la carpeta: <catálogo_de_datos_del_terminal>\MQL5\Include\RegularExpressions\
Podrá encontrar ejemplos de scripts de texto en la carpeta: <catálogo_de_datos_del_terminal>\MQL5\Scripts\RegularExpressionsExamples\
Aquí se presenta la traducción de RegularExpressions con .Net Framework 4.6.1.
Para trabajar con la biblioteca es necesario conectar a su código el archivo Regex.mqh del directorio \MQL5\Include\RegularExpressions\.
Además, junto con la biblioteca existen varios ejemplos demostrativos que a la vez cumplen el papel de casos ejemplares. Todos los jemplos han sido tomados de la página oficial de Microsoft Corporation, y muestran de forma muy clara las diferencias principales de las expresiones regulares en C#, así como las peculiaridades de su uso en MQL5.
Obtenga más información sobre los paquetes de la biblioteca portada RegularExpressions MQL5:
Paquetes | Descripción |
---|---|
CharUnicodeInfo.mqh | txt archivado para determinar las categorías Unicode para todos los caracteres (incluyendo los caracteres no latinos). |
RegexCapture.mqh | Representa los resultados de un registro con éxito de parte de la expresión. |
RegexCaptureCollection.mqh | Representa un conjunto de registros hechos de un grupo de registros. |
RegexGroup.mqh | Representa los resultados de un grupo de registro aparte. |
RegexGroupCollections.mqh | Retorna un conjunto de grupos registrados en la misma yuxtaposición. |
RegexMatch.mqh | Representa los resultados de una correspondencia separada de una expresión regular. |
RegexMatchCollection.mqh | Representa un conjunto de coincidencias exitosas detectadas mediante la aplicación iterativa de un patrón de expresión regular para la secuencia de entrada. |
Regex.mqh | Representa una expresión regular inmutable. |
RegexOptions.mqh | Representa valores enumerados que luego se usarán al definir los parámetros de las expresiones regulares. |
Parámetros de expresiones regulares a partir del archivo RegexOptions.mqh:
Parámetro | Descripción |
---|---|
None | Parámetros no establecidos. |
IgnoreCase | El registro no se tiene en cuenta al buscar coincidencias. |
Multiline | Representa el modo multilínea. |
ExplicitCapture | No abarcar grupos sin nombre. Las únicas selecciones admitidas son grupos claramente denominados o numerados en el formato (?<nombre> parte de la expresión). |
Singleline | Indica el modo de línea única. |
IgnorePatternWhitespace | Quita del patrón los separadores sin la secuencia escape y activa los comentarios marcados con el símbolo "#". |
RightToLeft | Indica que la búsqueda se realizará de derecha a izquierda, y no izquierda a derecha. |
Debug | Indica que el programa funciona en el modo depuración. |
ECMAScript | Activa el comportamiento compatible ECMAScript para la expresión. Este valor puede ser utilizado solo de forma conjunta con los valores IgnoreCase y Multiline. |
Características del trabajo con RegularExpressions para MQL5:
- Como en la versión .Net, en esta biblioteca se ha implementado un repositorio (memoria cache estática) de las expresiones regulares. Todas las expresiones regulares creadas de forma implícita (ejemplares de la clase Regex) se insertan en este repositorio. Este enfoque acelera el funcionamiento de los scripts, con lo que desaparece la necesidad de construir de nuevo las expresiones regulares, si su patrón coincide con uno de los ya existentes. Por defecto, el tamaño del repositorio es igual a 15. El método Regex::CacheSize() retorna o establece la cantidad máxima de entradas en la actual memoria cache invariable de las expresiones regulares compiladas.
- La segunda característica a la hora de trabajar con expresiones regulares en MQL5 surge directamente de la primera. Y se trata de la necesidad de limpiar el repositorio mencionado más arriba. Para ello es imprescindible llamar a la función invariable Regex::ClearCache(). Es recomendable llamar a esta función solo cuando finalice el trabajo con las expresiones regulares, de lo contrario, la probabilidad de eliminar indicadores necesarios será muy elevada.
- A diferencia de .Net, en MQL5 no se ha implementado el ciclo foreach, y por consiguiente, el trabajo con las enumeraciones será diferente. Ejemplo:
//--- Código 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) { //--- procesamiento } //--- Código 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(); //--- procesamiento } delete rx; delete matches; delete en; Regex::ClearCache();
- Como se puede ver en el ejemplo de más arriba, el lenguaje C# permite introducir delante de las líneas el símbolo '@' para ignorar todas las señales de formateo en ella. En MQL5 este enfoque no está previsto, por eso todos los símbolos de сontrol en el patrón de expresiones regulares deben escribirse con claridad.
Ejemplo de trabajo con RegularExpressions para MQL5:
Como ejemplo de funcionamiento de las expresiones regulares, veremos su aplicación para analizar el historial comercial descargado desde el terminal en forma de archivo html.
Para ello, crearemos un experto con un parámetro de entrada del tipo string, que será el nombre de nuestro archivo en el área local:
Este documento contiene dos recuadros principales: "Órdenes" y "Operaciones".
Creamos una experisón regular para analizar el archivo:
Regex *rgx=new Regex("(>)([^<>]*)(<)");
Analizamos la expresión regular:
(>) | Búsqueda del símbolo '>' |
(^[<>]*) | Cualquier símbolo, excepto '>' y '<', que se repita cero o más veces |
(<) | Búsqueda del símbolo '<' |
A continuación, leemos el archivo y obtenemos todas las coincidencias que correspondan a esta expresión regular:
string str=FileReadString(m_handel); MatchCollection *matches=rgx.Matches(str);
En las líneas del archivo html que sean registros (secuencias) para los recuadros "Órdenes" y "Operaciones", habrá más coincidencias de este tipo, 23 y 27 respectivamente. Por consiguiente, solo queda obtener la información que necesitamos de estas líneas.
Para el recuadro "Órdenes":
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)); }
Estamos seguros de que la cantidad de coincidencias es igual a 23, y, por lo tanto, nos encontramos ante una entrada del recuadro "Órdenes". Creamos una matriz de líneas como presentación inicial de nuestro registro. Organizamos una pasada por todas las coincidencias impares y obtenemos los valores de estas coincidencias, usando el método matches[j][.Value(), y cortamos a las coincidencias el primer símbolo y el último, que corresponden a los símbolos '>' y '<'. Cada coincidencia formateada la introducimos en la matriz declarada con anterioridad in. A continuación, creamos un ejemplar de la clase OrderRecord(in), que presenta una entrada del recuadro "Órdenes", y la añadimos a la lista m_list1. Esta lista interpretará el recuadro "Órdenes".
El recuadro "Operaciones" se procesará de forma análoga:
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)); }
Aquí m_list2 corresponde a la lista de indicadores para la clase DealRecord, que representa a su vez el recuadro "Operaciones".
Ambas listas son miembros de la clase TradeHistory. Esta clase es una representación de todo nuestro archivo html inicial. Además, permite usar filtros sencillos en los recuadros "Órdenes" y "Operaciones" con la ayuda de los métodos: FindAllOrders(const int columnIndex,const T value) y FindAllDeals(const int columnIndex,const T value).
Creamos en nuestro experto una sencilla interfaz gráfica para demostrar estas posibilidades:
Al trabajar con esta forma, elegimos el recuadro que nos interese, seleccionamos una columna y el valor de la misma conforme al que se filtrará el recuadro. Pulsamos el botón Find y el recuadro filtrado se representará más abajo, junto con algunas estadísticas sobre el mismo. El botón Save guarda el recuadro representado actual en un archivo csv. El archivo guardado se ubicará igualmente en el área local y tendrá el nombre Result.csv.
Para obtener más información sobre la biblioteca RegularExpressions para MQL5 y sus posibilidades, se ha creado el experto Tests.mqh. En él se ha implementado una mayor cantidad de ejemplos de uso de expresiones regulares que tocan la funcionalidad principal de la biblioteca al completo.
Traducción del ruso realizada por MetaQuotes Ltd
Artículo original: https://www.mql5.com/ru/code/15242

Indicador Envelopes clásico con uso de algoritmos de promediación universal y función para dar un color determinado al fondo del canal.

El legendario Ilan 1.6 Dynamic pertenece a la serie de los llamados "promediadores". Gracias a sus avanazadas fórmulas de gestión de capital, permite salir con beneficios incluso de una posición que a ciencia cierta tendría pérdidas. Ahora Ilan 1.6 Dynamic está disponible en los códigos fuente para MetaTrader 5.

Indicador Fisher Transform. Muestra los movimientos actuales, los niveles establecidos a menudo actúan como punto de inflexión.

Indicador Volume_Weighted_MA_StDev con posibilidad de cambiar el marco temporal del indicador en los parámetros de entrada.