Discusión sobre el artículo "Trabajo con el SGBD MySQL desde MQL5 (MQL4)"

 

Artículo publicado Trabajo con el SGBD MySQL desde MQL5 (MQL4):

Este artículo está dedicado al desarrollo de la interfaz entre MQL y SGBD MySQL. En el artículo se consideran las soluciones prácticas que existen en actualidad y se propone la versión más cómoda de ejecución de la biblioteca para el trabajo con SGBD. El artículo contiene la descripción detallada de las funciones, estructura de la interfaz, se dan los ejemplos y se describen algunas detalles a la hora de trabajar con MySQL. En cuanto a la solución de programa, han sido adjuntados los archivos con bibliotecas dinámicas, documentación y los ejemplos de los scripts para los lenguajes MQL4 y MQL5.

El problema de interacción de MQL con las bases de datos se ha tocado desde hace tiempo y todavía sigue siendo de actualidad. El uso de los SGBD amplia considerablemente las posibilidades de la plataforma MetaTrader: el almacenamiento y el análisis del historial de cotizaciones, el copiado de las operaciones de una plataforma comercial a la otra, la transmisión de las cotizaciones/operaciones en tiempo real, la ejecución de los cálculos analíticos voluminosos en el lado del servidor y/o según el horario, el monitoreo y control remoto con el uso de las tecnologías Web.

De una manera u otra, se hacían los intentos de amistar MQL y MySQL y las soluciones se publicaban regularmente en CodeBase.

Por ejemplo, "MySQL wrapper - biblioteca para MetaTrader 4" es el proyecto a partir del cual muchos programadores empezaban sus propios desarrollos con algunas adiciones. Según mi opinión, una de las desventajas de esta solución es la asignación de los arrays especiales para recibir los datos de las base de datos.

El proyecto "MySQL logger 1 - Asesor Experto para MetaTrader4" es de carácter estrechamente especializado, no utiliza el envoltorio (wrapper) para dirigirse a la biblioteca estándar libmysql.dll. Por eso ya no va a trabajar con MetaTrader4 Build 600+ porque los tipos de caracteres char han sido reemplazados por wchar_t. Además, el uso del tipo int en vez del puntero a la estructura TMYSQL causa en el proyecto así llamados memory leaks (resulta imposible controlar/liberar la memoria asignada).

Otro proyecto que llama la atención es "EAX_Mysql - MySQL library - biblioteca para MetaTrader 5". Tiene bastante buena implementación a un alto nivel. La lista de faltas que menciona el autor impone ciertas limitaciones en su uso.

Cualquier programador que necesita utilizar los SGBD en sus proyectos MQL siempre tiene dos opciones: desarrollar su propia solución y conocerla al detalle, o bien, usar/adoptar alguna solución ajena, aprender a utilizarla y detectar todos los defectos que afectan el trabajo de su proyecto.

Me he encontrado ante la misma necesidad teniendo estas dos opciones durante el desarrollo de un robot comercial bastante complejo. Después de buscar y estudiar una cantidad bastante importante de diferentes soluciones, he llegado a la conclusión que ninguna de las implementaciones encontradas me valen para llevar mi robot a un «nivel profesional».

Es más, había incluso algunas soluciones absurdas, por ejemplo: las operaciones DML/DDL (inserción/edición/eliminación de datos, creación/eliminación de los objetos en la base de datos) se realizaban usando la biblioteca estándar libmysql.dll, y la selección de datos (SELECT) se realizaba prácticamente mediante la consulta HTTP (usando inet.dll) al script PHP ubicado en el servidor Web en el lado del servidor MySQL. Las consultas SQL estaban escritas en el script PHP.

En otras palabras, para iniciar este proyecto, había que tener configurados e iniciados: el servidor MySQL, el servidor Web Apache/IIS, los scripts PHP/ASP en el lado del servidor... Como ven se trata de un número bastante grande de tecnologías en la misma combinación. Naturalmente, en algunas circunstancias eso puede ser aceptable, pero cuando la tarea consiste en la selección de datos de la base de datos- es un sin sentido. Además, el soporte de una embarazosa solución como ésta va a requerir mucho tiempo.

En la mayoría de las soluciones no surgía ningún problema con la inserción de datos, creación de objetos, etc. El problema consistía precisamente con la selección de datos puesto que era necesario devolver los datos en el entorno invocable.

El uso de los arrays para estos propósitos lo he considerado inconveniente e incómodo simplemente porque durante el desarrollo/depuración/soporte del proyecto principal las consultas para la selección a la base de datos pueden cambiarse, y si además habrá que controlar también la asignación correcta de la memoria para los arrays, pues... En fin, se puede y hay que evitarlo.

La interfaz MQL <-> MySql de la que se trata a continuación se basa en el enfoque típico que se utiliza en Oracle PL/SQL, MS SQL T-SQL, AdoDB, es decir, el trabajo con los cursors. Esta interfaz ha sido desarrollada desde el punto de vista de la comodidad de programación y de mantenimiento, más un mínimo de componentes. Está implementada como el envoltorio DLL para la biblioteca estándar libmysql.dll y un conjunto de funciones de interfaz en forma del archivo .mqh.


1. Interfaz MQL <-> MySQL

La interacción entre el terminal MetaTrader (mediante los programas MQL) se implementa usando los siguientes componentes:

Esquema de interacción de MQL con MySQL

Autor: Eugeniy Lugovoy

Razón de la queja: