- Principios de las operaciones de base de datos en MQL5
- Conceptos básicos de SQL
- Estructura de las tablas: tipos de datos y restricciones
- POO (MQL5) e integración SQL: concepto de ORM
- Crear, abrir y cerrar bases de datos
- Ejecutar consultas sin enlace de datos MQL5
- Comprobar si una tabla existe en la base de datos
- Preparar consultas vinculadas: DatabasePrepare
- Borrar y reiniciar consultas preparadas
- Vincular datos a parámetros de consulta: DatabaseBind/Array
- Ejecutar consultas preparadas: DatabaseRead/Bind
- Leer campos por separado: funciones DatabaseColumn
- Ejemplos de operaciones CRUD en SQLite mediante objetos ORM
- Transacciones
- Importar y exportar tablas de bases de datos
- Imprimir tablas y consultas SQL en registros
- Ejemplo de búsqueda de una estrategia de trading mediante SQLite
Base de datos SQLite
MetaTrader 5 proporciona compatibilidad nativa para la base de datos SQLite. Se trata de un sistema de gestión de bases de datos (SGBD) ligero pero plenamente funcional. Tradicionalmente, este tipo de sistemas se centran en el tratamiento de tablas de datos, en las que se almacenan registros del mismo tipo con un conjunto común de atributos, y se pueden establecer distintas correspondencias (enlaces o relaciones) entre registros de distintos tipos (es decir, tablas), por lo que este tipo de bases de datos también se denominan relacionales. Ya hemos considerado ejemplos de este tipo de conexiones entre estructuras del calendario económico, pero la base de datos del calendario se almacena dentro del terminal, y las funciones de esta sección le permitirán crear bases de datos arbitrarias a partir de programas MQL.
La especialización del SGBD en estas estructuras de datos permite optimizar (acelerar y simplificar) muchas operaciones habituales, como ordenar, buscar, filtrar, sumar o calcular otras funciones agregadas para grandes cantidades de datos.
Sin embargo, esto tiene otra cara: La programación del SGBD requiere su propio SQL (Structured Query Language), y el conocimiento de MQL5 puro no será suficiente. A diferencia de MQL5, que se refiere a los lenguajes imperative (aquellos que utilizan operadores que indican qué, cómo y en qué secuencia hacer), SQL es declarative, es decir, describe los datos iniciales y el resultado deseado, sin especificar cómo y en qué secuencia realizar los cálculos. El significado del algoritmo en SQL se describe en forma de consultas SQL. Una consulta es un análogo de un operador MQL5 separado, formado como una cadena utilizando una sintaxis especial.
En lugar de programar complejos bucles y comparaciones, podemos simplemente llamar a funciones SQLite (por ejemplo, DatabaseExecute o Database Prepare) pasándoles consultas SQL. Para obtener los resultados de la consulta en una estructura MQL5 ya preparada, puede utilizar la función DatabaseReadBind. Esto le permitirá leer todos los campos del registro (estructura) a la vez en una sola llamada.
Con la ayuda de las funciones de base de datos, es fácil crear tablas, añadirles registros, realizar modificaciones y efectuar selecciones según condiciones complejas, por ejemplo, para tareas como:
- Obtener el historial de trading y cotizaciones
- Guardar los resultados de la optimización y la simulación
- Preparar e intercambiar datos con otros paquetes de análisis
- Analizar los datos del calendario económico
- Almacenar ajustes y estados de programas MQL5
Además, en las consultas SQL puede utilizarse una amplia gama de funciones comunes, estadísticas y matemáticas. Además, las expresiones con su participación pueden calcularse incluso sin crear una tabla.
SQLite no requiere una aplicación, configuración y administración independientes, no exige muchos recursos y admite la mayoría de los comandos del popular estándar SQL92. Una ventaja añadida es que toda la base de datos reside en un único archivo en el disco duro del ordenador del usuario y puede transferirse o copiarse fácilmente. Sin embargo, para acelerar las operaciones de lectura, escritura y modificación, la base de datos también puede abrirse/crearse en RAM con el indicador DATABASE_OPEN_MEMORY; sin embargo, en este caso, dicha base de datos sólo estará disponible para este programa concreto y no podrá utilizarse para el trabajo conjunto de varios programas.
Es importante señalar que la relativa simplicidad de SQLite, en comparación con los SGBD completos, conlleva algunas limitaciones. En particular, SQLite no tiene un proceso dedicado (servicio del sistema o aplicación) que proporcione acceso centralizado a la base de datos y a la API de gestión de tablas, por lo que no está garantizado el acceso paralelo y compartido a la misma base de datos (archivo) desde distintos procesos. Por lo tanto, si necesita leer y escribir simultáneamente en la base de datos desde agentes de optimización que ejecutan instancias del mismo Asesor Experto, tendrá que escribir código en él para sincronizar el acceso (de lo contrario, los datos que se escriban y lean estarán en un estado inconsistente: al fin y al cabo, el orden de escritura, modificación, borrado y lectura de procesos concurrentes no sincronizados es aleatorio). Además, los intentos de modificar la base de datos al mismo tiempo pueden hacer que el programa MQL reciba errores de «base de datos ocupada» (y no se realice la operación solicitada). El único escenario que no requiere sincronización de operaciones paralelas con SQLite es cuando sólo se trata de operaciones de lectura.
Sólo presentaremos los fundamentos de SQL en la medida necesaria para empezar a aplicarlo. Una descripción completa de la sintaxis y el funcionamiento de SQL queda fuera del alcance de este libro. Consulte la documentación en el sitio web de SQLite. No obstante, tenga en cuenta que MQL5 y MetaEditor apoyan un subconjunto limitado de comandos y construcciones sintácticas SQL.
MQL Wizard en MetaEditor tiene una opción incrustada para crear una base de datos, que inmediatamente ofrece crear la primera tabla definiendo una lista de sus campos. Asimismo, Navigator ofrece una pestaña independiente para trabajar con bases de datos.
Utilizando Wizard o el menú contextual de Navigator puede crear una base de datos vacía (un archivo en disco, situado por defecto, en el directorio MQL5/Files) de formatos compatibles (*.db, *.sql, *.sqlite y otros). Además, en el menú contextual, puede importar toda la base de datos desde un archivo sql o tablas individuales desde archivos csv.
Una base de datos existente o creada puede abrirse fácilmente a través del mismo menú. A continuación, sus tablas aparecerán en Navigator, y en la zona derecha de la ventana se mostrará un panel con herramientas para depurar consultas SQL y una tabla con los resultados. Por ejemplo, al hacer doble clic en el nombre de una tabla se realiza una consulta rápida de todos los campos del registro, lo que corresponde a la sentencia «SELECT * FROM 'tabla'» que aparece en el campo de entrada de la parte superior.
Visualización de la base de datos SQLite en MetaEditor
Puede editar la solicitud y hacer clic en el botón Execute para activarla. Los posibles errores de sintaxis SQL se muestran en el registro.
Para obtener más detalles sobre Wizard, la importación/exportación de bases de datos y el trabajo interactivo con ellas, consulte Documentación de MetaEditor.