Discussão do artigo "Como acessar o banco de dados MySQL a partir do MQL5 (MQL4)" - página 7
Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
Ok, vejo que você criou um consultor especialista para esse fim e ele foi criado sem as recomendações que publiquei no artigo.
Então, vamos seguir passo a passo: 1.
1) A chamada de " DB = cMySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag); " deve ser feita dentro da função padrão OnInit() em vez de OnTick(). 2.
2) Você está usando cMySqlConnect - é uma função importada da DLL, você precisa usar a função MySqlConnect em vez de função cMySqlConnect !
3. você precisa chamar a função MySqlDisconnect dentro da função padrão OnDeinit().
4. você deve verificar o identificador de conexão do banco de dados dentro da função padrão OnTick() para ter certeza de que a conexão foi bem-sucedida.
Por fim, o resultado será semelhante a.
Ok, vejo que você criou um consultor especialista para esse fim e ele foi criado sem as recomendações que publiquei no artigo.
Então, vamos seguir passo a passo: 1.
1) A chamada de " DB = cMySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag); " deve ser feita dentro da função padrão OnInit() em vez de OnTick(). 2.
2) Você está usando cMySqlConnect - é uma função importada da DLL, você precisa usar a função MySqlConnect em vez de função cMySqlConnect !
3. você precisa chamar a função MySqlDisconnect dentro da função padrão OnDeinit().
4. você deve verificar o identificador de conexão do banco de dados dentro da função padrão OnTick() para ter certeza de que a conexão foi bem-sucedida.
Finalmente, o resultado será semelhante.
Ok, vejo que você criou um consultor especialista para esse fim e ele foi criado sem as recomendações que publiquei no artigo.
Então, vamos seguir passo a passo: 1.
1) A chamada de " DB = cMySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag); " deve ser feita dentro da função padrão OnInit() em vez de OnTick(). 2.
2) Você está usando cMySqlConnect - é uma função importada da DLL, você precisa usar a função MySqlConnect em vez de função cMySqlConnect !
3) Você precisa chamar a função MySqlDisconnect dentro da função padrão OnDeinit().
4. você deve verificar o identificador de conexão do banco de dados dentro da função padrão OnTick() para ter certeza de que a conexão foi bem-sucedida.
Finalmente, o resultado será semelhante.
Eu mudei passo a passo, mas o problema ainda existe quando uso o expert em um mt4 para quatro ou mais símbolos. ele imprime " Access violation read to 0x0000000B em '... .MQLMySQL.dll'
"
O código é o seguinte
<--
#include <MQLMySQL.mqh
int MySqlErrorNumber; // número de erro recente do MySQL
string MySqlErrorDescription; // descrição do erro
//+------------------------------------------------------------------+
//| Função de inicialização especializada & nbsp; |
//+------------------------------------------------------------------+
int OnInit()
OnInit(); int OnInit()
EventSetTimer(timeSeconds);
DB = MySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag); if( DB == -1 )
if( DB == -1 )
{
Print("O banco de dados não está conectado..."); if( DB == -1 ) { print("O banco de dados não está conectado... "); }
}
return(INIT_SUCCEEDED); }
}
//+------------------------------------------------------------------+
//| Função de desinicialização especializada |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
MySqlDisconnect(DB);
EventKillTimer();
ObjectsDeleteAll();
}
void OnTimer()
{
//Alertar(TimeCurrent());
OnTick();
}
//+------------------------------------------------------------------+
//| Função Expert tick & nbsp; |
//+------------------------------------------------------------------+
void OnTick()
{
if( DB == -1 )
{
Alert("O banco de dados não está conectado... "); return; { Alert("O banco de dados não está conectado...")
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 = symbol + "_table"; }
admissão = 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;
//Alerta(dataRows);
if( dataRows1 > 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);
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), "
+ "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(Cursor1); // NUNCA ESQUEÇA DE FECHAR O CURSOR !!!!
}
}
}
-->
Ok, vejo que você criou um consultor especialista para esse fim e ele foi criado sem as recomendações que publiquei no artigo.
Então, vamos seguir passo a passo: 1.
1) A chamada de " DB = cMySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag); " deve ser feita dentro da função padrão OnInit() em vez de OnTick(). 2.
2) Você está usando cMySqlConnect - é uma função importada da DLL, você precisa usar a função MySqlConnect em vez de função cMySqlConnect !
3. você precisa chamar a função MySqlDisconnect dentro da função padrão OnDeinit().
4. você deve verificar o identificador de conexão do banco de dados dentro da função padrão OnTick() para ter certeza de que a conexão foi bem-sucedida.
Finalmente, o resultado será semelhante.
O problema é que ele não pode ser usado em um mt4 para mais de dois símbolos; se for usado em apenas um símbolo, está normal; quando usado em quatro ou mais, funciona bem, mas, após alguns minutos, ele imprime o problema "OnTick()". Depois de alguns minutos, ele imprime o problema "Access violation read to 0x0000000B in '...MQLMySQL.db'". .MQLMySQL.dll'"
Você pode tentar um especialista chamar a dll em quatro ou mais símbolos em um ou dois mt4, talvez encontre o problema.
Será que a dll precisa de uma versão memeoy ou de uma coleção de garbe?
CRT descarregue vazamentos ap ós a destruição de dados estáticos, e isso causa "relatórios de vazamento espúrios do para objetos que alocaram memória antes da inicialização do MFC e que, portanto, são destruídos após a saída do MFC". nbsp;
relatórios de vazamentos espúrios para objetos que alocaram memória antes da inicialização do MFC
e que, portanto, são destruídos após a saída do MFC. Isso é
comumente observado ao usar a DLL do MFC em um programa que também usa
a DLL de tempo de execução do C++.
Olá mais uma vez.
Com base no código que você forneceu, acho que você é novo em MQL.
Desculpe-me, não tenho tempo para ensiná-lo, mas tenho tempo para testar o software que desenvolvi.
Desculpe-me, não tenho tempo para ensiná-lo, mas tenho tempo para testar o software que desenvolvi. Portanto, aqui estão os registros anexados.
Criei um EA de teste para você, com base em sua lógica: cada tabela definida para cada par de moedas e pode manter os dados do mercado on-line para diferentes contas.
Você pode inspecionar os registros, nenhum erro "Access violation..." foi gerado. Você pode inspecionar os registros, nenhum erro "Access violation..." foi levantado.
O problema não está na biblioteca MQLMySQL.
Testando o EA.
Essa é a lógica correta do uso da biblioteca.
Devido à otimização, você pode até mesmo não usar a instrução SELECT, apenas executar a instrução UPDATE e, em seguida, verificar se (MySqlRowsAffected()==0) significa que nenhuma linha foi afetada. Você tem ~100% de atualizações, portanto, aplique o comando INSERT.
Como você tem cerca de 100% das atualizações, essa solução alternativa pode aumentar o desempenho e reduzir o tráfego da rede.
E, no final, os códigos-fonte completos do projeto (incluindo o desenvolvimento da DLL) foram anexados ao artigo, para que você possa alterá-los de sua própria maneira.
Se você achar que o problema está no MqlMySQL.DLL, poderá depurá-lo e corrigi-lo por conta própria.
Parabéns, Eugene
Eugênio
Excelente trabalho, muito obrigado , Eugeniy.
Seus códigos me ajudam muito e posso economizar muito tempo. Tentei fazer consultas INSERT, SELECT, UPDATE e DELETE com sucesso. Se não estou enganado, o "Cursor" é necessário apenas para a consulta SELECT ??
= pedma
Excelente trabalho, muito obrigado , Eugeniy.
Seus códigos me ajudam muito e posso economizar muito tempo. Tentei fazer consultas INSERT, SELECT, UPDATE e DELETE com sucesso. Se não estou enganado, o "Cursor" é necessário apenas para a consulta SELECT ??
= pedma
Exatamente, cara!
Os cursores são usados somente para a seleção de dados porque precisamos receber dados do banco de dados em uma variável MQL, e não apenas para enviar o comando sql ao banco de dados.
Fico feliz que minha solução o tenha ajudado.
Boa sorte,
Eugênio
Oi Eugênio,
Gostaria de saber se você ainda faz projetos de desenvolvimento pagos, pois estou querendo criar uma copiadora de comércio remoto que seja integrada a um EA que estarei vendendo.
Dei uma olhada no Upwork e parece que você não concluiu nenhum projeto como freelancer recentemente.
Eu mesmo tentei usar a biblioteca que você criou, mas não deu muito certo. Embora eu tenha certeza de que seria fácil para alguém com sua habilidade de programação!
Desde já, obrigado,
James
Oi Eugênio,
Gostaria de saber se você ainda faz projetos de desenvolvimento pagos, pois estou querendo criar uma copiadora de comércio remoto que seja integrada a um EA que estarei vendendo.
Dei uma olhada no Upwork e parece que você não concluiu nenhum projeto como freelancer recentemente.
Eu mesmo tentei usar a biblioteca que você criou, mas não deu muito certo. Embora eu tenha certeza de que seria fácil para alguém com sua habilidade de programação!
Desde já, obrigado,
James
Olá, James,
Estou trabalhando no Upwork apenas em um grande projeto no momento. Portanto, não tenho muito tempo livre atualmente. Qual é o problema que você tem com as bibliotecas? Como posso ajudá-lo?