Discussão do artigo "Como acessar o banco de dados MySQL a partir do MQL5 (MQL4)"

 

Novo artigo Como acessar o banco de dados MySQL a partir do MQL5 (MQL4) foi publicado:

Este artigo descreve o desenvolvimento de uma interface entre o banco de dados MySQL e a linguagem MQL. Ele discute soluções práticas existentes e oferece uma maneira mais conveniente de implementar uma biblioteca para trabalhar com o bancos de dados. O artigo contém uma descrição detalhada das funções, a estrutura da interface, exemplos e algumas características específicas de se trabalhar com o MySQL. Quanto às soluções de software, encontramos em anexo no artigo os arquivos de bibliotecas dinâmicas, documentação e exemplos de script para as linguagem MQL4 e MQL5.

O problema de interação entre o MQL e com os bancos de dados não são novos, no entanto, é algo ainda relevante. O uso de bancos de dados podem aumentar consideravelmente as possibilidades do MetaTrader: armazenamento e análise do histórico de preços, copiar negociações de uma plataforma de negociação para outra, fornecer cotações/negociações em tempo real, realizar cálculos computacionais analíticos ​​no lado do servidor e/ou usar uma agenda, monitoramento remoto e controle de contas utilizando a tecnologia web.

De qualquer forma, houve muitas tentativas para se beneficiar da combinação do MQL e MySQL, algumas soluções estão disponíveis na Base de código.

Por exemplo, o projeto "MySQL wrapper -biblioteca para MetaTrader 4", do qual muitos programadores iniciaram seus próprios desenvolvimentos adicionando mais recursos. Na minha opinião, um dos inconvenientes desta solução é atribuição de arrays especiais para a leitura de dados a partir do banco de dados.

Outro projeto "MySQL logger 1 - EA para MetaTrader 4" é altamente especializado, ele não utiliza o wrapper para acessar a biblioteca padrão libmysql.dll. Portanto ele não funciona no MetaTrader4 build 600+, uma vez que os caracteres do tipo char foram substituídos por wchar_t, e a utilização do tipo int, em vez da estrutura do ponteiro TMYSQL fez com que houvessem vazamentos de memória no projeto (a memória alocada não podia ser controlada/liberada).

Outro projeto interessante é o projeto "EAX_Mysql - MySQL library - biblioteca para MetaTrader 5". É uma implementação muito boa. A lista de desvantagens indicadas pelo autor impõe algumas restrições ao seu uso.

Qualquer um que nunca precisou usa bancos de dados em seus projetos MQL tem duas opções: ou desenvolver sua própria solução e saber cada parte dela, ou usar / adaptar qualquer solução de terceiros, aprender a usá-la e detectar todos os seus defeitos que podem dificultar de alguma maneira o seu projeto.

Eu enfrentei tal necessidade enquanto eu desenvolvia um robô de negociação bem complexo. Tendo procurado por projetos existentes e estudado um número muito grande de soluções, eu percebi que nenhuma das implementações encontradas poderiam me ajudar a levar o meu robô de negociação para o "nível profissional".

Além disso, houve também soluções absurdas, por exemplo: as operações DML/DDL (inserir/atualizar/remover dados, criar objetos/excluir do banco de dados) foram realizadas utilizando a libmysql.dll padrão, e a seleção de dados (SELECT) foi realmente implementada como um solicitação HTTP (utilizando inet.dll) para um script PHP localizado no servidor web no lado do servidor MySQL. As consultas em SQL foram escritas no script em PHP.

Em outras palavras, para executar o projeto, era preciso manter os seguintes componentes disponíveis, configurado e em execução: servidor MySQL, o servidor web Apache/IIS, os scripts PHP/ASP no lado do servidor... Uma combinação de um número bem grande de tecnologias. É claro que, em algumas circunstâncias, isto pode ser aceitável, mas apenas quando a tarefa é a de selecionar os dados a partir do banco de dados - isto é um absurdo. Além disso, o suporte de uma solução tão complicada é demorada.

A maioria das soluções não tinha problemas na inserção de dados, criação de objetos e similares. O problema foi a seleção de dados, como os dados devem ser devolvidos para o ambiente de chamada.

Eu pensei em usar arrays para este fim, mas era pouco prático e inconveniente, simplesmente porque durante o desenvolvimento/depuração/suporte do projeto principal, as consultas selecionadas para o banco de dados podem ser alteradas, enquanto que você também deve controlar a alocação de memória correta para os arrays... Bom, isto pode e deve ser evitado.

A seguir eu discuto a interface MQL <-> MySql que é baseada em uma abordagem típica utilizada em Oracle PL/SQL, MS SQL T-SQL, AdoDB - trabalhando com cursores. Esta interface foi desenvolvida com objetivo de facilitar a programação e manutenção, além de minimizar seus componentes. Ela é implementada como um DLL wrapper para a biblioteca padrão libmysql.dll e um conjunto de funções de interface como um arquivo em ".mqh".


1. A Interface MQL <-> MySQL

A interação entre o terminal MetaTrader (através dos programas MQL) pode ser implementada com a ajuda dos componentes abaixo:

O esquema de interação MQL e MySQL

Autor: Eugeniy Lugovoy

 
Para MetaTrader5 x64 utilize a seguinte biblioteca (anexado na discussão):
Arquivos anexados:
 
em qual pasta eu salvo os a DLL?
 
Ana Fonseca:
em qual pasta eu salvo os a DLL?
Aqui está o pacote completo de atualização da DLL: https://github.com/elugovoy/MQLMySQL-Project
inclui dlls compiladas localizadas na estrutura de pastas do metatrader
Razão: