- Métodos de almacenamiento de la información: texto y binario
- Escritura y lectura de archivos en modo simplificado
- Abrir y cerrar archivos
- Gestión de descriptores de archivo
- Seleccionar una codificación para el modo texto
- Escritura y lectura de arrays
- Escritura y lectura de estructuras (archivos binarios)
- Escritura y lectura de variables (archivos binarios)
- Escritura y lectura de variables (archivos de texto)
- Gestión de la posición en un expediente
- Obtención de las propiedades de un archivo
- Forzar escritura de caché en disco
- Eliminación de un archivo y comprobación de su existencia
- Copia y desplazamiento de archivos
- Búsqueda de archivos y carpetas
- Trabajar con carpetas
- Cuadro de diálogo de selección de archivos o carpetas
Trabajar con archivos
Es difícil encontrar un programa que no utilice entrada-salida de datos. Ya sabemos que los programas MQL pueden recibir ajustes a través de variables de entrada y enviar información al registro, ya que utilizamos este último en casi todos los scripts de prueba. Pero en la mayoría de los casos, esto no es suficiente.
Por ejemplo, una parte bastante significativa de la personalización de programas incluye cantidades de datos que no pueden acomodarse en los parámetros de entrada. Puede ser necesario integrar un programa con algunas herramientas analíticas externas, es decir, cargar información de mercado en un formato estándar o especializado, procesarla y luego cargarla en el terminal de una forma nueva, en concreto, como señales de trading, un conjunto de pesos de redes neuronales o coeficientes de árboles de decisión. Además, puede ser conveniente mantener un registro separado para un programa MQL.
El subsistema de archivos ofrece las posibilidades más universales para este tipo de tareas. La API de MQL5 proporciona una amplia gama de funciones para trabajar con archivos, incluidas funciones para crear, eliminar, buscar, escribir y leer los archivos. Abordaremos todo ello en este capítulo.
Todas las operaciones de archivo en MQL5 se limitan a un área especial en el disco, que se denomina «sandbox». Esto se hace por razones de seguridad, a fin de que ningún programa MQL pueda ser utilizado con fines maliciosos y dañar su ordenador o sistema operativo.
Los usuarios avanzados pueden evitar esta limitación utilizando medidas especiales, de las que hablaremos más adelante, pero ello sólo debe hacerse en casos excepcionales, adoptando precauciones y asumiendo plena responsabilidad.
Para cada instancia del terminal instalada en el ordenador, el directorio raíz de la «sandbox» se encuentra en <terminal_data_folder>/MQL5/Files/. Desde el MetaEditor puede abrir la carpeta de datos utilizando el comando Archivo -> Abrir carpeta de datos. Si tiene suficientes derechos de acceso en el ordenador, este directorio suele ser el lugar en el que está instalado el terminal. Si no dispone de los permisos necesarios, la ruta tendrá el siguiente aspecto:
X:/Users/<user_name>/AppData/Roaming/MetaQuotes/Terminal/<instance_id>/MQL5/Files/ |
Aquí, X es la letra de una unidad en la que está instalado el sistema, <user_name> es el nombre de usuario de Windows, e <instance_id> es un identificador único de la instancia del terminal. La carpeta Users también tiene un alias: «Documents and Settings».
Tenga en cuenta que, en el caso de una conexión remota a un ordenador a través de RDP (Remote Desktop Protocol), el terminal siempre utilizará el directorio Roaming y sus subdirectorios, incluso si tiene derechos de administrador.
Recordemos que la carpeta MQL5 del directorio de datos es el lugar en el que se almacenan todos los programas MQL, tanto sus códigos fuente como los archivos ex5 compilados. Cada tipo de programa MQL, incluidos indicadores, Asesores Expertos, scripts y demás, tiene una subcarpeta dedicada en la carpeta MQL5. Así que la carpeta Files para los archivos de trabajo está junto a ellos.
Además de esta «sandbox» individual de cada copia del terminal en el ordenador, existe una «sandbox» común y compartida para todos los terminales: pueden comunicarse a través de él. La ruta a la misma pasa por la carpeta de inicio del usuario de Windows y puede variar según la versión del sistema operativo. Por ejemplo, en instalaciones estándar de Windows 7, 8 y 10, tiene este aspecto:
X:/Users/<user_name>/AppData/Roaming/MetaQuotes/Terminal/Common/Files/ |
De nuevo, se puede acceder fácilmente a la carpeta a través de MetaTrader: ejecute el comando Archivo -> Abrir carpeta de datos compartida y se encontrará dentro de la carpeta Common.
Algunos tipos de programas MQL (Asesores Expertos e indicadores) pueden ejecutarse no sólo en el terminal, sino también en el probador. Cuando se ejecuta en él, la «sandbox» compartida sigue siendo accesible, y en lugar de una «sandbox» de instancia única, se utiliza una carpeta dentro del agente de pruebas. Por regla general, su aspecto es el siguiente:
X:/<terminal_path>/Tester/Agent-IP-port/MQL5/Files/ |
Esto puede no ser visible en el propio programa MQL, es decir, todas las funciones de archivo funcionan exactamente de la misma manera. Sin embargo, desde el punto de vista del usuario, puede parecer que hay algún tipo de problema. Por ejemplo, si el programa guarda los resultados de su trabajo en un archivo, éste se borrará en la carpeta del agente del probador una vez finalizada la ejecución (como si el archivo nunca se hubiera creado). Este enfoque rutinario está diseñado para evitar que los datos potencialmente valiosos de un programa se filtren a otro programa que pueda probarse en el mismo agente algún tiempo después (sobre todo porque los agentes pueden compartirse). Se proporcionan otras tecnologías para transferir archivos a los agentes y devolver resultados de los agentes al terminal, que trataremos en la quinta parte del libro.
Para evitar la limitación de la «sandbox» puede utilizar la capacidad de Windows para asignar enlaces simbólicos a objetos del sistema de archivos. En nuestro caso, las conexiones (junction) son las más adecuadas para redirigir el acceso a las carpetas del ordenador local. Se crean utilizando el siguiente comando (es decir, la línea de comandos de Windows):
mklink /J new_name existing_target |
El parámetro new_name es el nombre de la nueva carpeta virtual que apuntará a la carpeta real existing_target.
Para crear conexiones a carpetas externas fuera de la «sandbox» se recomienda crear una carpeta dedicada dentro de MQL5/Archivos, por ejemplo, Links. A continuación, una vez introducido, puede ejecutar el comando anterior seleccionando new_name y sustituyendo la ruta real fuera de la «sandbox» por existing_target. Por ejemplo, el siguiente comando creará en la carpeta Links un nuevo enlace llamado Settings, que dará acceso a la carpeta MQL5/Presets:
mklink /J Settings "..\..\Presets\" |
La ruta relativa «..\..\» asume que el comando se ejecuta en la carpeta MQL5/Files/Links especificada. Una combinación de dos puntos «..» indica el paso de la carpeta actual a la carpeta padre. Si se especifica dos veces, esta combinación indica que se debe subir dos veces en la jerarquía de la ruta. Como resultado, la carpeta de destino (existing_target) se generará como MQL5/Presets, pero en el parámetro existing_target también puede especificar una ruta absoluta.
Puede eliminar enlaces simbólicos como si fueran archivos normales (pero, por supuesto, primero debe asegurarse de que es la carpeta con el icono de la flecha en su esquina inferior izquierda la que se está eliminando, es decir, el enlace, y no la carpeta original). Se recomienda hacer esto inmediatamente, tan pronto como ya no necesite ir más allá de la «sandbox». El hecho es que las carpetas virtuales creadas están disponibles para todos los programas MQL, no sólo para el suyo, y no se sabe cómo los programas de otras personas pueden utilizar la libertad adicional.
Muchas secciones del capítulo tratan de los nombres de los archivos. Actúan como identificadores de elementos del sistema de archivos y tienen reglas similares, incluidas algunas restricciones.
Tenga en cuenta que el nombre del archivo no puede contener algunos caracteres que desempeñan funciones especiales en el sistema de archivos ('<', '>', '/', '\\', '"', ':', '|', '* ', '?'), así como cualquier carácter con códigos del 0 al 31, ambos incluidos.
Los siguientes nombres de archivo también están reservados para un uso especial en el sistema operativo y no se pueden utilizar: CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, LPT9.
Debe tenerse en cuenta que el sistema de archivos de Windows no ve la diferencia fundamental entre letras en distintos casos, por lo que nombres como «Nombre», «NOMBRE» y «nombre» se refieren al mismo elemento.
Windows permite utilizar tanto barras invertidas '\\' como barras inclinadas '/' como carácter separador entre los componentes de la ruta (subcarpetas y archivos). No obstante, la barra diagonal inversa debe protegerse (es decir, en realidad hay que escribirla dos veces) en las cadenas MQL5, porque el carácter '\' en sí es especial: se utiliza para construir secuencias de caracteres de control, como '\r', '\n', '\t' y otros (véase la sección Tipos de caracteres). Por ejemplo, las siguientes rutas son equivalentes: «MQL5Book/file.txt» y «MQL5Book\file.txt».
El carácter de punto '.' sirve de separador entre el nombre y la extensión. Si un elemento del sistema de archivos tiene varios puntos en su identificador, la extensión es el fragmento situado a la derecha del punto situado más a la derecha, y todo lo situado a la izquierda es el nombre. El título (antes del punto) o la extensión (después del punto) pueden estar vacíos. Por ejemplo, el nombre de archivo sin extensión es «text», y el archivo sin nombre (sólo con la extensión) es «.txt».
La longitud total de la ruta y el nombre del archivo en Windows tiene limitaciones. Al mismo tiempo, para administrar archivos en MQL5 hay que tener en cuenta que a su ruta y nombre se añadirá la ruta a la «sandbox», es decir, se asignará aún menos espacio para los nombres de los objetos de archivo en las llamadas a funciones MQL. Por defecto, el límite de longitud total es la constante del sistema MAX_PATH, que es igual a 260. A partir de Windows 10 (versión 1607), puede aumentar este límite a 32767. Para ello, debe guardar el siguiente texto en un archivo .reg y ejecutarlo añadiéndolo al Registro de Windows.
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem]
"LongPathsEnabled"=dword:00000001
Para otras versiones de Windows puede utilizar soluciones alternativas desde la línea de comandos. En concreto, puede acortar la ruta utilizando las conexiones comentadas anteriormente (creando una carpeta virtual con una ruta corta). También puede utilizar el comando shell -subst; por ejemplo, subst z: c:\very\long\path (consulte la Ayuda de Windows para obtener más detalles).