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

 
elugovoy:

Bonjour, Quelle version du terminal MT5 utilisez-vous ?

Quelle version du terminal MT5 utilisez-vous ?

Veuillez essayer la dernière mise à jour des bibliothèques MQLMySQL, jointe ici.

J'ai utilisé la dernière version de MT4, lorsque je n'utilise qu'un seul appel, tout va bien, mais lorsque l'expéditeur envoie des données et que le destinataire reçoit des données sur le même MT4 en même temps, le MT4 affiche l'erreur "Access violation" (violation d'accès). Mais lorsque l'émetteur envoie des données et que le récepteur reçoit des données sur le même MT4 en même temps, le MT4 affiche l'erreur "Access violation read to 0x65D6954".
 
elugovoy:

Bonjour, Quelle version du terminal MT5 utilisez-vous ?

Quelle version du terminal MT5 utilisez-vous ?

Veuillez essayer la dernière mise à jour des bibliothèques MQLMySQL, jointe ici.

Si la bibliothèque mqlmysql.dll est
appel singleton, le même mt4 ne peut pas multicall cette dll
 

Il est possible que libmysql.dll se trouve à différents endroits de votre système d'exploitation.

Si vous avez libmysql.dll dans le dossier %WINDOWS%\SYSTEM32, vous devez le supprimer de MT4\MQL4\Experts\Libraries

afin qu'une seule dll soit utilisée.

Le terminal n'attache la bibliothèque qu'une seule fois, même si le conseiller expert est utilisé pour différents graphiques. La raison est donc différente.

La dll MQLMySQL.dll utilise des mutex pour accéder aux données partagées internes, ce qui ne peut pas non plus être une raison.

Si vous le pouvez, veuillez m'indiquer le code MQL que vous utilisez pour provoquer cette situation ainsi que le numéro de build de MT4, j'essaierai de le tester et de vous fournir la solution.

Je vais essayer de le tester et de vous fournir la solution.

 
elugovoy:

Il est possible que libmysql.dll se trouve à différents endroits de votre système d'exploitation.

Si vous avez libmysql.dll dans le dossier %WINDOWS%\SYSTEM32, vous devez le supprimer de MT4\MQL4\Experts\Libraries

afin qu'une seule dll soit utilisée.

Le terminal n'attache la bibliothèque qu'une seule fois, même si le conseiller expert est utilisé pour différents graphiques. La raison est donc différente.

La dll MQLMySQL.dll utilise des mutex pour accéder aux données partagées internes, ce qui ne peut pas non plus être une raison.

Si vous le pouvez, veuillez m'indiquer le code MQL que vous utilisez pour provoquer cette situation ainsi que le numéro de build de MT4, j'essaierai de le tester et de vous fournir la solution.

Je vais essayer de le tester et de vous fournir la solution.

Le code MQL collecte les données mt4 dans la table mysql, lorsqu'il est utilisé dans un seul mt4, tout va bien, lorsqu'il est utilisé dans deux mt4 ou plus, il affiche Access violation read à 0x00000002 dans ... \MQLMySQL.dll'


Dossiers :
sendData.mq4  11 kb
 
elugovoy:

Il est possible que libmysql.dll se trouve à différents endroits de votre système d'exploitation.

Si vous avez libmysql.dll dans le dossier %WINDOWS%\SYSTEM32, vous devez le supprimer de MT4\MQL4\Experts\Libraries

afin qu'une seule dll soit utilisée.

Le terminal n'attache la bibliothèque qu'une seule fois, même si le conseiller expert est utilisé pour différents graphiques. La raison est donc différente.

La dll MQLMySQL.dll utilise des mutex pour accéder aux données partagées internes, ce qui ne peut pas non plus être une raison.

Si vous le pouvez, veuillez m'indiquer le code MQL que vous utilisez pour provoquer cette situation ainsi que le numéro de build de MT4, j'essaierai de le tester et de vous fournir la solution.

Je vais essayer de le tester et de vous fournir la solution.

J'ai utilisé la table mysql memory, est-ce que c'est le problème ? ENGINE=MEMORY
 
yukaixie:
J'ai utilisé une table mysql memory, est-ce le problème ? ENGINE=MEMORY
J'ai changé le moteur de type de table de mémoire à Innodb, le problème existe toujours. 2015.04.08 15:31:59.296 Access violation read to 0x00000004 in '. .MQLMySQL.dll'

 
yukaixie:

Le CODE MQL collecte les données mt4 dans la table mysql, lorsqu'il est utilisé dans un seul mt4, tout va bien, lorsqu'il est utilisé dans deux mt4 ou plus, il y a une violation d'accès à la lecture. à 0x00000002 dans ... \MQLMySQL.dll'


MySqlDisconnect(DB) ;

la déconnexion de la base de données est nécessaire, mais le problème n'est toujours pas résolu.

 
Pouvez-vous fournir le code source de votre EA/Script ?
 
elugovoy:
Pouvez-vous fournir le code source de votre EA/Script ?

Le CODE MQL collecte les données mt4 dans la table mysql, lorsqu'il est utilisé dans un seul mt4, tout va bien, lorsqu'il est utilisé dans deux mt4 ou plus, il affiche Access violation read à 0x00000002 dans ... \MQLMySQL.dll'


Fichiers supplémentaires :

senddata.mq4 11 kb

Le fichier sendata.mq4 est le code source de l'EA que j'ai téléchargé.

 
elugovoy:
Pouvez-vous fournir le code source de votre EA/Script ?
//+------------------------------------------------------------------+
//|& nbsp ; Opérations de base de données.mq4
//| Copyright 2015, MetaQuotes Software Corp.
//| & nbsp nbsp ; https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict


input string Host = "localhost" ; //IP du serveur, par exemple 192.168.1.210, localhost
input string User = "root" ; //mysql nom d'utilisateur de connexion à la base de données
input string Password = "root" ; //Mysql Database Password
input string Database = "test" ; //Nom de la base de données MySql
input string Socket = "0" ; // informations d'identification de la base de données
input int Port = 3306 ; // numéro de port de la base de données mysql
input int ClientFlag = 0 ; // informations d'identification de la base de données

int DB = 0 ; // identifiant de la base de données//---
int timeSeconds = 1 ; // timer
#include <MQLMySQL.mqh

string Query ; int i,Cursor,Rector

int i,Cursor,Rows ; //Include <MQLMySQL.mqh> string Query.
//+------------------------------------------------------------------+
//| Fonction d'initialisation de l'expert & nbsp; |
//+------------------------------------------------------------------+
int OnInit()
OnInit()
return(INIT_SUCCEEDED) ;
}
//+------------------------------------------------------------------+
//| Fonction de désinitialisation de l'expert
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{

}
//+------------------------------------------------------------------+
//| Fonction Expert tick & nbsp; |
//+------------------------------------------------------------------+
void OnTick()
{
if( IsExpertEnabled() && IsConnected() && AccountNumber() > 0 )
{
int account = AccountNumber() ;
string symbol = Symbol() ;
//int syDB = 0 ; // identifiant de la base de données//---
DB = cMySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag) ; //inst syDB = 0 ; // identifiant de la base de données//---
//Alert(DB) ;
double spread = (Ask - Bid) ;
//Alert(symbol).
Query = "SELECT * FROM " + symbol + " where AccountNumber = " + (string)AccountNumber() ;
//Print(Query) ;
Cursor = MySqlCursorOpen(DB, Query) ;
if (Cursor >= 0)
{
Rows = MySqlCursorRows(Cursor) ; if (Cursor >= 0) { Rows = MySqlCursorRows(Cursor)
int dataRows = Rows ;
//Alert(dataRows) ;
if( dataRows > 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) ;
}
else if( dataRows == 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(Cursor) ; // N'OUBLIEZ JAMAIS DE FERMER LE CURSEUR ! !!!
}
}
}
//+------------------------------------------------------------------+

J'ai utilisé trois bases de données, mais j'ai utilisé la même base de données. Est-il nécessaire de créer une nouvelle base de données pour toute nouvelle base de données CRUD ?


自动交易和策略测试
自动交易和策略测试
  • www.mql5.com
MQL5:MetaTrader 5客户端内置的交易策略语言。语言允许编写您自己的自动交易系统,技术指标,脚本和函数程序库