DB = MySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag);
No creará una gran carga al llamar por cada tick?????
¿No sería más lógico conectarse a la base de datos en init y luego utilizar el identificador para el acceso?
No creará una gran carga al llamar por cada tick?????
No sería más lógico conectarse a la base de datos en init y luego usar el identificador para acceder ?
Eugene, gracias por el artículo. Material interesante sobre DBMS.
Tengo un problema.
Tengo MetaTrader5, x64, 975 construir.
Al ejecutar el script "MySQL-001", me sale un error:
RL 1 12:41:22.443 MySQL-001 'C:\Program Files\MetaTrader5\MQL5\libraries\MQLMySQL.dll' is not 64-bit version PG 1 12:41:22.474 MySQL-001 (AUDCAD.e,M1) Cannot load 'C:\Program Files\MetaTrader5\MQL5\libraries\MQLMySQL.dll' DK 2 12:41:23.677 MySQL-001 (AUDCAD.e,M1) Cannot call 'cMySqlVersion', '..\libraries\MQLMySQL.dll' is not loaded ID 2 12:41:23.677 MySQL-001 (AUDCAD.e,M1) unresolved import function call
La razón es, según tengo entendido, el sistema está tratando de cargar una biblioteca de 64 bits ...
Eugene, gracias por el artículo. Material interesante sobre DBMS.
Tengo un problema.
Tengo MetaTrader5, x64, 975 construir.
Al ejecutar el script "MySQL-001", me sale un error:
La razón es, según tengo entendido, el sistema está tratando de cargar una biblioteca de 64 bits ...
Sí, el proyecto está compilado para x32 ya que trabajo mayoritariamente con terminales de 32 bits. Entiendo el problema, lo compilaré y probaré bajo MT5 x64 en los próximos días.
Gracias por el comentario.
Versión de la librería para Metatrader 5 - x64
- El proyecto MQLMySQL.DLL es recompilado para x64 (las fuentes no fueron corregidas).
- Standard LibMySQL.DLL es tomado de la última distribución estable de MySQL v5.6.21 x64
En realidad, para aquellos que intentaron ejecutar el proyecto bajo MT5 x64, se puede reemplazar sólo el contenido del directorio MQL5\Libraries. El código fuente de los programas MQL no necesita ser corregido o recompilado.
Gracias de nuevo a Denis (denkir) por su comentario, me olvidé de los usuarios de x64.
Lo leí y lloré. No tengo nada en contra del autor. Espero que trate adecuadamente las críticas. En fin:
1. ¿Por qué escribir un wrapper en forma de otra DLL, si todo funciona bien sin él? El lenguaje MQL no está en esa etapa de desarrollo para escribir tales muletas que a menudo se convierten en rastrillos.
2. ¿Por qué como resultado de todo este trabajo no se escribe una clase que tiene todo lo necesario, y que elimina las deficiencias de los predecesores, que el autor se refiere?
3. Me gustaría señalar especialmente esto:
string SQL; SQL = "INSERT INTO EURUSD(Ask,Bid) VALUES (1.3601,1.3632);"; SQL = SQL + "INSERT INTO EURUSD(Ask,Bid) VALUES (1.3621,1.3643);"; SQL = SQL + "INSERT INTO EURUSD(Ask,Bid) VALUES (1.3605,1.3629);";
En realidad, todo es mucho más simple:
string SQL="INSERT INTO EURUSD(Ask,Bid) VALUES (1.3601,1.3632),(1.3621,1.3643),(1.3605,1.3629);";
En general, el artículo está escrito en el estilo de "¡Mira lo que puedo hacer!" en lugar de "Mira y aprende cómo se debe hacer".
Lo leí y lloré. No tengo nada en contra del autor. Espero que trate adecuadamente las críticas. En fin:
1. ¿Por qué escribir un wrapper en forma de otra DLL, si todo funciona bien sin él? El lenguaje MQL no está en esa etapa de desarrollo para escribir tales muletas que a menudo se convierten en rastrillos.
2. ¿Por qué como resultado de todo este trabajo no se escribe una clase que tiene todo lo necesario, y que elimina las deficiencias de los predecesores, que el autor se refiere?
3. Me gustaría señalar especialmente esto:
En realidad, todo es mucho más simple:
En general, el artículo está escrito en el estilo de "¡Mira lo que puedo hacer!" en lugar de "Mira y aprende cómo se debe hacer".
Responderé por orden.
Debo decir que el proyecto se inició hace bastante tiempo, cuando el lenguaje MQL no estaba en la etapa actual de desarrollo y MQL4 no tenía clases, ni estructuras.
Y la solución de software tenía que funcionar tanto para MQL4 como para MQL5 con costes mínimos para la transición de MQL4 a MQL5 (si fuera necesario). El proyecto se estaba ultimando hasta hace poco.
Por eso el proyecto no fue implementado como una clase. ¿Quieres una clase? No hay problema - ¡escríbala! Nadie te lo prohibe.
Ahora respecto a 3 INSERTs en vez de uno. Lo escribí de esta manera (y tiene copyright) por las siguientes razones:
- no viola el estándar generalmente aceptado SQL'92, SQL'2000 (su variante - peculiaridades de la sintaxis exactamente MySQL bulk insert);
- será más fácil de leer y entender para un programador novato en esta área;
- demostración de ejecución de exactamente 3 instrucciones INSERT, no una.
Las instrucciones múltiples pueden incluir cualquier operación DML/DDL/DCL, su ejemplo se limita a la operación INSERT en una tabla.
P.D. El artículo fue escrito en un estilo "Toma y usa".
Gracias. Voy a examinar su solución en profundidad, puede ser más estable que confiar sólo en MQL.
Sólo para su información hay un puente MQL4-sólo que escribí hace un tiempo para MT4 construir 600+: https://www.mql5.com/es/code/11114

- votos: 12
- 2014.02.10
- Sergey
- www.mql5.com
Gracias. Voy a examinar su solución en profundidad, puede ser más estable que confiar sólo en MQL.
Sólo para su información hay un puente MQL4-sólo que escribí hace un tiempo para MT4 construir 600+: https://www.mql5.com/es/code/11114
Gracias por tu tiempo en leer este artículo. También he comprobado su(https://www.mql5.com/es/code/11114), he encontrado esa solución hace mucho tiempo (antes de MT4 build 600) y me gustó la idea de hacer MQL y MySQL amigable. Pero sólo una cosa que no quiero usar es matrices para retreive los datos de base de datos. Es por eso que he construido esta solución para su uso con MT4 y MT5.
Además, me olvidé de añadir x64 proyecto basado en el artículo, así que usted puede descargar aquí, en la discusión. Nada fue cambiado en las fuentes, sólo DLL ha sido recompilado para x64.
Buena suerte,
Eugene

- votos: 12
- 2014.02.10
- Sergey
- www.mql5.com

- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso
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:
Autor: Eugeniy Lugovoy