Discussion de l'article "Comment accéder à la base de données MySQL à partir de MQL5 (MQL4)"

 

Un nouvel article Comment accéder à la base de données MySQL à partir de MQL5 (MQL4) a été publié :

L'article décrit le développement d'une interface entre MQL et la base de données MySQL. Il traite des solutions pratiques existantes et offre un moyen plus pratique d'implémenter une bibliothèque pour travailler avec des bases de données. L'article contient une description détaillée des fonctions, la structure de l'interface, des exemples et certaines des fonctionnalités spécifiques de l'utilisation de MySQL. Comme pour les solutions logicielles, les pièces jointes des articles incluent les fichiers de bibliothèques dynamiques, de la documentation et des exemples de scripts pour les langages MQL4 et MQL5.

L'interaction entre le terminal MetaTrader (via les programmes MQL) peut être mise en œuvre à l'aide des composants ci-dessous :

 schéma d'interaction MQL et MySQL

1. La bibliothèque d'interface MQLMySQL.mqh. Elle est ajoutée au projet à l'aide du répertoire #include et peut être modifiée à votre convenance.

Elle contient les directives d'import des fonctions de la bibliothèque dynamique MQLMySQL.dll, ainsi que les fonctions d'appel et de gestion des erreurs.

2. La bibliothèque dynamique MQLMySQL.dll. C'est un wrapper pour accéder aux fonctionnalités de la bibliothèque standard libmysql.dll.

De plus, la bibliothèque MQLMySQL.dll traite les résultats des opérations et l'accès partagé aux connexions et curseurs de la base de données. Cela signifie que vous pouvez créer et utiliser plusieurs connexions à la fois (à partir d'un ou plusieurs programmes MQL), garder quelques curseurs ouverts, avec des requêtes vers une ou plusieurs bases de données. Les mutex sont utilisés pour séparer l'accès aux ressources partagées.

3. La bibliothèque dynamique standard libmysql.dll est un pilote d'accès natif. Vous pouvez la copier à partir de n'importe quelle distribution de base de données MySql dans C:\Windows\Sytem32 ou <Terminal>\MQL5\Libraries (pour MetaTrader 4 dans <Terminal>\MQL4\Libraries).

En fait, elle est chargée d'envoyer des requêtes à la base de données et d'en récupérer les résultats.

Attardons-nous sur les points principaux, tels que : l'ouverture/fermeture de la connexion, l'exécution de requêtes DML/DDL et la sélection de données.

Auteur : Eugeniy Lugovoy

 
DB = MySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag);

Cela ne va-t-il pas créer une charge importante lors de l'appel de chaque tick????? ?

Ne serait-il pas plus logique de se connecter à la base de données dans l'init et d'utiliser l'identifiant pour l'accès ?

 
DKeN:

Cela ne va-t-il pas créer une charge importante lors de l'appel de chaque tick ????? ?

Ne serait-il pas plus logique de se connecter à la base de données dans l'init et d'utiliser ensuite l'identifiant pour l'accès ?

Salutations. Pour les Expert Advisors et les Indicators, la connexion à la base de données se fait dans la fonction d'initialisation. L'article ne contient aucune recommandation sur la manière d'établir une connexion avec la base de données à chaque tic-tac. Seuls des exemples de scripts sont donnés, et les scripts, vous l'aurez compris, n'ont pas d'initialisation.
 

Eugène, merci pour cet article. C'est un document intéressant sur les SGBD.

J'ai un problème de ce type.

J'ai MetaTrader5, x64, 975 build.

Lorsque j'exécute le script "MySQL-001", j'obtiens une erreur :

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 raison est, si j'ai bien compris, que le système essaie de charger une bibliothèque 64 bits...

 
denkir:

Eugène, merci pour cet article. C'est un document intéressant sur les SGBD.

J'ai un problème de ce type.

J'ai MetaTrader5, x64, 975 build.

Lorsque j'exécute le script "MySQL-001", j'obtiens une erreur :

La raison est, si j'ai bien compris, que le système essaie de charger une bibliothèque 64 bits...

Oui, le projet est compilé pour x32 car je travaille principalement avec des terminaux 32 bits. Je comprends le problème, je vais le compiler et le tester sous MT5 x64 dans les prochains jours.

Merci pour votre commentaire.

 

Version de la bibliothèque pour Metatrader 5 - x64

- Le projet MQLMySQL.DLL est recompilé pour x64 (les sources n'ont pas été corrigées).

- La librairie standard LibMySQL.DLL provient de la dernière distribution stable de MySQL v5.6.21 x64.

En fait, pour ceux qui ont essayé d'exécuter le projet sous MT5 x64, vous ne pouvez remplacer que le contenu du répertoire MQL5\Libraries. Le code source des programmes MQL n'a pas besoin d'être corrigé ou recompilé.

Merci encore à Denis (denkir) pour sa remarque, j'avais oublié les utilisateurs de x64.

Dossiers :
 

Je l'ai lu et j'ai pleuré. Je n'ai rien contre l'auteur. J'espère qu'il traite les critiques de manière adéquate. Quoi qu'il en soit :

1. Pourquoi écrire un wrapper sous la forme d'une autre DLL, si tout fonctionne bien sans ? Le langage MQL n'est pas à ce stade de développement pour écrire de telles béquilles qui se transforment souvent en râteaux.

2. Pourquoi, à la suite de tout ce travail, n'a-t-on pas écrit une classe qui contient tout ce qui est nécessaire et qui élimine les défauts des classes précédentes, auxquelles l'auteur fait référence ?

3) Je tiens à souligner ce point :

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 fait, tout est beaucoup plus simple :

string SQL="INSERT INTO EURUSD(Ask,Bid) VALUES (1.3601,1.3632),(1.3621,1.3643),(1.3605,1.3629);";

En général, l'article est écrit dans le style "Regardez ce que je peux faire !" au lieu de "Regardez et apprenez comment il faut faire".

 
avoitenko:

Je l'ai lu et j'ai pleuré. Je n'ai rien contre l'auteur. J'espère qu'il traite les critiques de manière adéquate. Quoi qu'il en soit :

1. Pourquoi écrire un wrapper sous la forme d'une autre DLL, si tout fonctionne bien sans ? Le langage MQL n'est pas à ce stade de développement pour écrire de telles béquilles qui se transforment souvent en râteaux.

2. Pourquoi, à la suite de tout ce travail, n'a-t-on pas écrit une classe qui contient tout ce qui est nécessaire et qui élimine les défauts des classes précédentes, auxquelles l'auteur fait référence ?

3) Je tiens à souligner ce point :

En fait, tout est beaucoup plus simple :

En général, l'article est écrit dans le style "Regardez ce que je peux faire !" au lieu de "Regardez et apprenez comment il faut faire".

Je répondrai dans l'ordre.

Je dois dire que le projet a été lancé il y a assez longtemps, alors que le langage MQL n'était pas au stade actuel de développement et que MQL4 n'avait pas de classes, pas de structures.

La solution logicielle devait fonctionner à la fois pour MQL4 et MQL5, avec des coûts minimaux pour la transition de MQL4 à MQL5 (si nécessaire). Le projet était en cours de finalisation jusqu'à récemment.

C'est pourquoi le projet n'a pas été mis en œuvre sous la forme d'un cours. Vous voulez une classe ? Pas de problème, écrivez-la ! Personne ne vous l'interdit.

Maintenant, concernant 3 INSERTs au lieu d'un seul. Je l'ai écrit de cette façon (et c'est un copyright) pour les raisons suivantes :

- elle ne viole pas la norme généralement acceptée SQL'92, SQL'2000 (votre variante - particularités de la syntaxe exactement MySQL bulk insert) ;

- elle sera plus facile à lire et à comprendre pour un programmeur novice dans ce domaine ;

- démonstration de l'exécution d'exactement 3 instructions INSERT, et non d'une seule.

Les instructions multiples peuvent inclure toutes les opérations DML/DDL/DCL, votre exemple est limité à l'opération INSERT sur une table.

P.S. L'article a été rédigé dans un style "à prendre et à utiliser".

 

Je vous remercie. Je vais examiner votre solution en profondeur, elle pourrait être plus stable que de s'appuyer uniquement sur MQL.

Pour information, il existe un pont MQL4 que j'ai écrit il y a quelque temps pour MT4 build 600+ : https://www.mql5.com/fr/code/11114

MySQL for new MQL4 (tested in build 600)
MySQL for new MQL4 (tested in build 600)
  • votes : 12
  • 2014.02.10
  • Sergey
  • www.mql5.com
Connecting to MySQL server from new MQL4
 
lukins:

Je vous remercie. Je vais examiner votre solution en profondeur, elle pourrait être plus stable que de s'appuyer uniquement sur MQL.

Pour information, il existe un pont MQL4 que j'ai écrit il y a quelques temps pour MT4 build 600+ : https://www.mql5.com/fr/code/11114

Merci d'avoir pris le temps de lire cet article. J'ai également vérifié votre(https://www.mql5.com/fr/code/11114), j'ai trouvé une telle solution il y a longtemps (avant MT4 build 600) et j'ai aimé l'idée de rendre MQL et MySQL compatibles. Mais il y a une chose que je ne veux pas utiliser, ce sont les tableaux pour récupérer les données de la base de données. C'est pourquoi j'ai créé cette solution pour MT4 et MT5.

J'ai également oublié d'ajouter le projet basé sur x64 à l'article, vous pouvez donc le télécharger ici, dans la discussion. Rien n'a été changé dans les sources, seule la DLL a été recompilée pour x64.

Bonne chance,

Eugène

MySQL for new MQL4 (tested in build 600)
MySQL for new MQL4 (tested in build 600)
  • votes : 12
  • 2014.02.10
  • Sergey
  • www.mql5.com
Connecting to MySQL server from new MQL4
 
Pour les plates-formes x64, utilisez les bibliothèques suivantes (avec discussion)