Discussão do artigo "Como acessar o banco de dados MySQL a partir do MQL5 (MQL4)" - página 6

 
elugovoy:

Olá, qual versão do terminal MT5 você está usando?

Qual versão do terminal MT5 você está usando?

Tente a atualização mais recente das bibliotecas MQLMySQL, anexada aqui.

Usei a versão mais recente do MT4 e, quando uso apenas uma chamada, está tudo bem. mesmo tempo, o MT4 imprime o erro "Access violation read to 0x65D6954".
 
elugovoy:

Olá, qual versão do terminal MT5 você está usando?

Qual versão do terminal MT5 você está usando?

Tente a atualização mais recente das bibliotecas MQLMySQL, anexada aqui.

Se o mqlmysql.dll for
chamada singleton, o mesmo mt4 não pode fazer chamadas múltiplas dessa dll
 

Talvez você tenha o libmysql.dll em locais diferentes do seu sistema operacional.

Se você tiver libmysql.dll na pasta %WINDOWS%\SYSTEM32, será necessário excluí-la da pasta MT4\MQL4\Experts\Libraries

para que apenas uma dll seja usada.

O único terminal anexa a biblioteca uma vez, mesmo que o consultor especialista seja usado para gráficos diferentes.

A MQLMySQL.dll usa mutexes para acessar dados compartilhados internos, portanto, esse também não pode ser o motivo.

Se puder, forneça-me o código MQL que você está usando para criar essa situação e o número de compilação do MT4, tentarei testá-lo e apresentar a solução.

Tentarei testá-lo e apresentar a solução.

 
elugovoy:

Talvez você tenha o libmysql.dll em locais diferentes do seu sistema operacional.

Se você tiver libmysql.dll na pasta %WINDOWS%\SYSTEM32, será necessário excluí-la da pasta MT4\MQL4\Experts\Libraries

para que apenas uma dll seja usada.

O único terminal anexa a biblioteca uma vez, mesmo que o consultor especialista seja usado para gráficos diferentes.

A MQLMySQL.dll usa mutexes para acessar dados compartilhados internos, portanto, esse também não pode ser o motivo.

Se puder, forneça-me o código MQL que você está usando para criar essa situação e o número de compilação do MT4, tentarei testá-lo e apresentar a solução.

Vou tentar testá-lo e apresentar a solução.

O CÓDIGO MQL está coletando dados do MT4 para a tabela mysql; quando usado em um MT4, em apenas um, está tudo bem; quando usado em quatro ou mais MT4, em dois, ele imprime Access violation read para 0x00000002 em ... \MQLMySQL.dll'


Arquivos anexados:
sendData.mq4  11 kb
 
elugovoy:

Talvez você tenha o libmysql.dll em locais diferentes do seu sistema operacional.

Se você tiver libmysql.dll na pasta %WINDOWS%\SYSTEM32, será necessário excluí-la da pasta MT4\MQL4\Experts\Libraries

para que apenas uma dll seja usada.

O único terminal anexa a biblioteca uma vez, mesmo que o consultor especialista seja usado para gráficos diferentes.

A MQLMySQL.dll usa mutexes para acessar dados compartilhados internos, portanto, esse também não pode ser o motivo.

Se puder, forneça-me o código MQL que você está usando para criar essa situação e o número de compilação do MT4, tentarei testá-lo e apresentar a solução.

Vou tentar testá-lo e apresentar a solução.

Usei a tabela de memória do mysql, qual é o problema? ENGINE=MEMORY
 
yukaixie:
Usei a tabela de memória do mysql, é esse o problema? ENGINE=MEMORY
Alterei o mecanismo do tipo de tabela de memória para Innodb, mas o problema ainda existe. 2015.04.08 15:31:59.296 Violação de acesso lida para 0x00000004 em '. .MQLMySQL.dll'

 
yukaixie:

O MQL CODE coleta dados do mt4 para a tabela do mysql; quando usado em um mt4 em apenas um, está tudo bem; quando usado em quatro ou mais em dois mt4, ele imprime Access violation read para 0x00000002 em ... \MQLMySQL.dll'


MySqlDisconnect(DB);

a desconexão do banco de dados é necessária, mas ainda não resolve o problema.

 
Você pode fornecer o código-fonte do seu EA/Script?
 
elugovoy:
Você pode fornecer o código-fonte de seu EA/Script?

O CÓDIGO MQL coleta dados do mt4 para a tabela mysql; quando usado em um mt4, em apenas um, está tudo bem; quando usado em quatro ou mais, em dois mt4, ele imprime Access violation read para 0x00000002 em ... \MQLMySQL.dll'


Arquivos adicionais:

senddata.mq4 11 kb

O sendata.mq4 é meu código-fonte do EA carregado.

 
elugovoy:
Você pode fornecer o código-fonte de seu EA/Script?
//+------------------------------------------------------------------+
//|& nbsp; Database Operations.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 do servidor, por exemplo, 192.168.1.210, localhost
input string User = "root"; /Nome do usuário de login do banco de dados MySQL
input string Password = "root"; /Senha do banco de dados MySQL
input string Database = "test"; /Nome do banco de dados MySQL
input string Socket = "0"; //credenciais do banco de dados
input int Port = 3306; // número da porta do banco de dados mysql
input int ClientFlag = 0; // credenciais do banco de dados

int DB = 0; // identificador do banco de dados//---
int timeSeconds = 1; // cronômetro
#include <MQLMySQL.mqh

string Query; int i,Cursor,Rector

int i,Cursor,Rows; //Include <MQLMySQL.mqh> string Query.
//+------------------------------------------------------------------+
//| Função de inicialização especializada & nbsp; |
//+------------------------------------------------------------------+
int OnInit()
OnInit()
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Função de desinicialização especializada |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{

}
//+------------------------------------------------------------------+
//| Função de tique de especialista & nbsp; |
//+------------------------------------------------------------------+
void OnTick()
{
se( IsExpertEnabled() && IsConnected() && AccountNumber() > 0 )
{
int account = AccountNumber();
string symbol = Symbol();
//int syDB = 0; // identificador do banco de dados//---
DB = cMySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag); //inst syDB = 0; // identificador do banco de dados//---
//Alerta(DB);
double spread = (Ask - Bid);
//Alerta (símbolo).
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;
//Alerta(dataRows);
if( dataRows > 0 )
{
Query = "update " + symbol + " set Bid = " + (string)Bid + ", Ask = " + ( string)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), "
+ "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)
+ ", '" + (string)AccountCompany()
+ "', \'"+TimeToString(TimeLocal(), TIME_DATE|TIME_SECONDS)+"\')"";
Se(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), "
+ "Time datetime) ENGINE=MEMORY DEFAULT CHARSET= utf8 ";
MySqlExecute(DB, Query);
}
}
MySqlCursorClose(Cursor); // NUNCA ESQUEÇA DE FECHAR O CURSOR !!!!
}
}
}
//+------------------------------------------------------------------+

Usei três conexões de banco de dados, mas usei o mesmo banco de dados. É necessário criar um novo banco de dados para qualquer CRUD de banco de dados novo?


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