Discussion de l'article "Comment accéder à la base de données MySQL à partir de MQL5 (MQL4)" - page 7
Vous manquez des opportunités de trading :
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Inscription
Se connecter
Vous acceptez la politique du site Web et les conditions d'utilisation
Si vous n'avez pas de compte, veuillez vous inscrire
Ok, je vois que vous avez écrit un conseiller expert à cette fin, et il est écrit sans les recommandations que j'ai postées dans l'article.
Passons donc à l'étape suivante : 1.
1. l'appel de " DB = cMySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag) ; " devrait être fait dans la fonction standard OnInit() au lieu de OnTick(). au lieu de OnTick(). 2.
2. vous utilisez cMySqlConnect - c'est une fonction importée de la DLL, vous devez utiliser la fonction MySqlConnect au lieu de fonction cMySqlConnect !
3) Vous devez appeler la fonction MySqlDisconnect dans la fonction standard OnDeinit().
4. vous devez vérifier l'identifiant de connexion à la base de données dans la fonction standard OnTick() pour vous assurer que la connexion a réussi.
Au final, le programme ressemblera à ce qui suit.
Ok, je vois que vous avez écrit un conseiller expert à cette fin, et il est écrit sans les recommandations que j'ai postées dans l'article.
Passons donc à l'étape suivante : 1.
1. l'appel de " DB = cMySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag) ; " devrait être fait dans la fonction standard OnInit() au lieu de OnTick(). au lieu de OnTick(). 2.
2. vous utilisez cMySqlConnect - c'est une fonction importée de la DLL, vous devez utiliser la fonction MySqlConnect au lieu de fonction cMySqlConnect !
3) Vous devez appeler la fonction MySqlDisconnect dans la fonction standard OnDeinit().
4. vous devez vérifier l'identifiant de connexion à la base de données dans la fonction standard OnTick() pour vous assurer que la connexion a réussi.
Enfin, le résultat sera le suivant.
Ok, je vois que vous avez écrit un conseiller expert à cette fin, et il est écrit sans les recommandations que j'ai postées dans l'article.
Passons donc à l'étape suivante : 1.
1. l'appel de " DB = cMySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag) ; " devrait être fait dans la fonction standard OnInit() au lieu de OnTick(). au lieu de OnTick(). 2.
2. vous utilisez cMySqlConnect - c'est une fonction importée de la DLL, vous devez utiliser la fonction MySqlConnect au lieu de fonction cMySqlConnect !
3) Vous devez appeler la fonction MySqlDisconnect dans la fonction standard OnDeinit().
4. vous devez vérifier l'identifiant de connexion à la base de données dans la fonction standard OnTick() pour vous assurer que la connexion a réussi.
Finalement, le résultat ressemblera à ce qui suit.
Je l'ai modifié étape par étape, mais le problème persiste lorsque j'utilise l'expert dans un mt4 pour quatre symboles ou plus. il imprime " Access violation read to 0x0000000B dans '.... .MQLMySQL.dll'
"
Le code est le suivant
<--
#include <MQLMySQL.mqh
int MySqlErrorNumber ; // numéro de l'erreur MySQL récente
string MySqlErrorDescription ; // description de l'erreur
//+------------------------------------------------------------------+
//| Fonction d'initialisation de l'expert & nbsp; |
//+------------------------------------------------------------------+
int OnInit()
OnInit() ; int OnInit()
EventSetTimer(timeSeconds) ;
DB = MySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag) ; if( DB == -1 )
if( DB == -1 )
{
Print("La base de données n'est pas connectée...") ; if( DB == -1 ) { print("La base de données n'est pas connectée... ") ; }
}
return(INIT_SUCCEEDED) ; }
}
//+------------------------------------------------------------------+
//| Fonction de désinitialisation de l'expert
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
MySqlDisconnect(DB) ;
EventKillTimer() ;
ObjectsDeleteAll() ;
}
void OnTimer()
{
//Alert(TimeCurrent()) ;
OnTick() ;
}
//+------------------------------------------------------------------+
//| Fonction expert tick & nbsp; |
//+------------------------------------------------------------------+
void OnTick()
{
if( DB == -1 )
{
Alert("La base de données n'est pas connectée ... ") ; return ; { Alert("La base de données n'est pas connectée ...")
return ; }
}
if( IsExpertEnabled() && IsConnected() && AccountNumber() > 0 && DB ! = -1 )
{
int account = AccountNumber() ;
string symbol = Symbol() ; if( cmd !
if( cmd ! = "" && cmd ! = NULL )
{
symbol = cmd ; }
}
symbolOrder = symbol + "_table" ;
double spread = (Ask - Bid) ; } symbolOrder = symbole + "_table" ; }
admission = spread*MathPow(10, Digits).
//int DB = cMySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag) ;
Query = "SELECT * FROM " + symbol + " where AccountNumber = " + (string)AccountNumber() ;
//Print(Query) ;
int Cursor1 = MySqlCursorOpen(DB, Query) ;
if (Cursor1 >= 0)
{
int Rows1 = MySqlCursorRows(Cursor1) ; int Cursor1 = MySqlCursorOpen(DB, Query) ; if (Cursor1 >= 0)
int dataRows1 = Rows1 ;
//Alert(dataRows) ;
if( dataRows1 > 0 )
{
Query = "update " + symbol + " set Bid = " + (string)Bid + ", Ask = " + ( chaîne)Ask
+ ", Spread = " + DoubleToStr(spread, Digits)
+ ", Time = '" + TimeToString(TimeLocal(), TIME_DATE|TIME_SECONDS ) + "' where AccountNumber = "
+ (string)account ; // + "' and Symbol = '" + symbol + "'".
MySqlExecute(DB, Query) ;
MySqlCursorClose(Cursor1) ;
}
else if( dataRows1 == 0 )
{
Query = "CREATE TABLE IF NOT EXISTS " + symbol + " (id int NOT NULL AUTO_ INCREMENT PRIMARY KEY, AccountNumber int, "
+ "Symbol char(20), Bid double, Ask double, Spread double," + "Memo char(50), Bid double, Ask double, Spread double".
+ "Memo char(50), " + "Time datetime) ENGINEE
+ "Time datetime) ENGINE=MEMORY DEFAULT CHARSET=utf8 " ;
MySqlExecute(DB, Query) ;
Query = "INSERT INTO " + symbol + "(AccountNumber, Symbol, Bid, Ask, Spread. Memo, Time) VALUES ("
+ (string)account + ", '" + symbol + "', "+(string)Bid+", "+ (string)Ask + ", "
+ DoubleToStr(spread, Digits)
+ ", '" + (chaîne)AccountCompany()
+ "', \'"+TimeToString(TimeLocal(), TIME_DATE|TIME_SECONDS)+"\')"" ;
if(MySqlExecute(DB, Query) ! = true )
{
//Query = "DROP TABLE IF EXISTS `data_table`" ;
//MySqlExecute(DB, Query) ;
Query = "CREATE TABLE IF NOT EXISTS " + symbol + "(id int NOT NULL AUTO_INCREMENT PRIMARY KEY, AccountNumber int, "
+ "Symbol char(20), Bid double, Ask double, Spread double," + "Memo char(50)
+ "Memo char(50), " + "Time datetime) ENGINEE
+ "Time datetime) ENGINE=MEMORY DEFAULT CHARSET= utf8 " ;
MySqlExecute(DB, Query) ;
}
}
MySqlCursorClose(Cursor1) ; // N'OUBLIEZ JAMAIS DE FERMER LE CURSEUR ! !!!
}
}
}
-->
Ok, je vois que vous avez écrit un conseiller expert à cette fin, et il est écrit sans les recommandations que j'ai postées dans l'article.
Passons donc à l'étape suivante : 1.
1. l'appel de " DB = cMySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag) ; " devrait être fait dans la fonction standard OnInit() au lieu de OnTick(). au lieu de OnTick(). 2.
2. vous utilisez cMySqlConnect - c'est une fonction importée de la DLL, vous devez utiliser la fonction MySqlConnect au lieu de fonction cMySqlConnect !
3) Vous devez appeler la fonction MySqlDisconnect dans la fonction standard OnDeinit().
4. vous devez vérifier l'identifiant de connexion à la base de données dans la fonction standard OnTick() pour vous assurer que la connexion a réussi.
Finalement, le programme ressemblera à ce qui suit.
Le problème est qu'il ne peut pas être utilisé dans un mt4 pour plus de deux symboles, s'il est utilisé pour un seul symbole, c'est normal. S'il est utilisé pour quatre symboles ou plus, il fonctionne bien, mais après quelques minutes, il affiche le problème "OnTick()". Après quelques minutes, il affiche le problème "Access violation read to 0x0000000B in '...MQLMySQL.db'". .MQLMySQL.dll'"
Vous pouvez essayer un expert qui appelle la dll dans quatre symboles ou plus dans un ou deux mt4, vous trouverez peut-être le problème.
La dll a peut être besoin d'une version memeoy ou d'une collection de garbe ?
évacue les fuites après la destruct ion des données statiques, ce qui provoque ο des rapports de fuites erronés pour les objets qui ont alloué de la mémoire avant l'initialisation de MFC et qui sont donc détruits après que MFC a quitté le système . nbsp ;
des rapports de fuites parasites pour les objets qui ont alloué de la mémoire avant l'initialisation du MFC
et qui sont donc détruits après la sortie du MFC. Ce phénomène est
souvent observé lors de l'utilisation de la DLL MFC dans un programme qui utilise également
la DLL d'exécution C++.
Bonjour encore une fois.
D'après le code que vous avez fourni, je suppose que vous êtes novice en matière de MQL.
Je suis désolé, je n'ai pas le temps de vous enseigner, mais j'ai le temps de tester le logiciel que j'ai développé.
Je suis désolé, je n'ai pas le temps de vous enseigner, mais j'ai le temps de tester le logiciel que j'ai développé. Voici donc les logs ci-joints.
J'ai construit un EA de test pour vous, basé sur votre logique : chaque table est définie pour chaque paire de devises et peut conserver les données du marché en ligne pour différents comptes.
Vous pouvez consulter les logs, aucune erreur "Access violation..." n'a été soulevée. Vous pouvez consulter les journaux, aucune erreur "Access violation..." n'a été soulevée.
Le problème n'est pas dans la bibliothèque MQLMySQL.
Test EA.
C'est la bonne logique de l'utilisation de la bibliothèque.
En raison de l'optimisation, vous pouvez même ne pas utiliser l'instruction SELECT, mais simplement exécuter l'instruction UPDATE, puis vérifier si (MySqlRowsAffected()==0) signifie qu'aucune ligne n'a été modifiée. Vous avez ~100% des mises à jour, donc appliquez l'instruction INSERT.
Vous avez ~100% des mises à jour, donc cette solution peut augmenter les performances et réduire le trafic réseau.
Et à la fin, les codes sources complets du projet (y compris le développement de DLL) ont été joints à l'article, vous pouvez les modifier à votre guise.
Si vous pensez que le problème vient de MqlMySQL.DLL, vous pouvez le déboguer et le résoudre vous-même.
Meilleurs vœux, Eugene
Eugène
Excellent travail, merci beaucoup Eugeniy.
Vos codes m'ont beaucoup aidé, j'ai pu gagner beaucoup de temps. J'ai essayé de faire des requêtes INSERT, SELECT, UPDATE et DELETE avec succès. Si je ne me trompe pas, le "Cursor" n'est nécessaire que pour la requête SELECT ? ??
= pedma
Excellent travail, merci beaucoup Eugeniy.
Vos codes m'ont beaucoup aidé, j'ai pu gagner beaucoup de temps. J'ai essayé de faire des requêtes INSERT, SELECT, UPDATE et DELETE avec succès. Si je ne me trompe pas, le "Cursor" n'est nécessaire que pour la requête SELECT ? ??
= pedma
Exactement !
Les curseurs ne sont utilisés que pour la sélection des données parce que nous devons recevoir les données de la base de données dans une variable MQL, et pas seulement pour envoyer la commande sql à la base de données.
Je suis heureux que ma solution vous ait aidé.
Je vous souhaite bonne chance,
Eugène
Bonjour Eugène,
Je me demandais si vous faisiez toujours des projets de développement rémunérés car je cherche à créer un copieur de commerce à distance intégré à un système d'évaluation des risques que je vais vendre.
J'ai regardé sur Upwork et vous ne semblez pas avoir réalisé de projets en freelance récemment.
J'ai moi-même essayé d'utiliser la bibliothèque que vous avez créée, mais cela n'a pas très bien fonctionné. Pourtant, je suis sûr que ce serait facile pour quelqu'un avec vos compétences en programmation !
Merci d'avance,
Jacques
Bonjour Eugène,
Je me demandais si vous faisiez toujours des projets de développement rémunérés car je cherche à créer un copieur de commerce à distance intégré à un système d'évaluation des risques que je vais vendre.
J'ai regardé sur Upwork et vous ne semblez pas avoir réalisé de projets en freelance récemment.
J'ai moi-même essayé d'utiliser la bibliothèque que vous avez créée, mais cela n'a pas très bien fonctionné. Pourtant, je suis sûr que ce serait facile pour quelqu'un avec vos compétences en programmation !
Merci d'avance,
James
Bonjour James,
Je travaille sur Upwork uniquement sur un gros projet en ce moment. Je n'ai donc pas beaucoup de temps libre en ce moment. Quel est votre problème avec les librairies ? Comment puis-je vous aider ?