O artigo Integração do MQL Expert Advisor e bancos de dados (SQL Server, .NET e C#) foi publicado:
Autor: Sergey Tkachenko
Obrigado pelo artigo. Recentemente, discutimos no fórum como conectar a DLL C# diretamente à MQL5. Antes disso, eu usava uma DLL C++. Sergey, o Entity Framework pode ser usado com essa tecnologia? O CodeFirst é especialmente interessante.
Infelizmente, não posso dizer nada sobre o Entity Framework - nunca trabalhei com ele. E tenho pouca experiência com as tecnologias C# e .NET relativamente novas.
Se eu tivesse que fazer isso, eu tentaria. Presumivelmente, isso funcionará. Especialmente se você não usar recursos avançados dentro de funções estáticas exportadas, mas envolvê-las em funções privadas de algumas classes auxiliares e aplicá-las lá. Em um de meus projetos, usei classes do System.Collections.Generic.
Infelizmente, não posso dizer nada sobre o Entity Framework - nunca trabalhei com ele. E tenho pouca experiência com as tecnologias C# e .NET relativamente novas em geral.
Se eu tivesse que fazer isso, eu tentaria. Presumivelmente, isso funcionará. Especialmente se você não usar recursos avançados dentro de funções estáticas exportadas, mas envolvê-las em funções privadas de algumas classes auxiliares e aplicá-las lá. Eu usei classes do System.Collections.Generic em um de meus projetos.
Entendo, tenho experiência, tentarei fazer isso se tiver uma chance. Em geral, você notou alguma desvantagem em exportar funções de arquivos DLL do .NET para código não gerenciado? Quero dizer que o Renat F. fala muito sobre essas coisas. Ele apresenta os argumentos mais gerais em nível de histórias assustadoras.
Você notou as desvantagens? Por exemplo, redução do desempenho, aumento do consumo de memória, etc.
Só podemos falar sobre as desvantagens em comparação com outra coisa.
Se compararmos os EAs que usam a exportação de funções da DLL com os EAs que não usam e trabalham com MQL puro, tudo dependerá da implementação de um determinado EA e das tarefas que ele executa. Se houver dois EAs que fazem exatamente a mesma coisa, é difícil dizer. Presumo que aquele que usa DLL será mais rápido devido à melhor otimização do código pelos compiladores ao criar DLLs. Mas isso é apenas uma suposição, pois não comparei diretamente. Geralmente, eu fazia em DLL apenas o que é mais difícil ou impossível de fazer em MQL (por exemplo, o trabalho com o banco de dados descrito no artigo). Portanto, meus Expert Advisors feitos com e sem acesso à DLL executavam tarefas diferentes.
Os Expert Advisors que usam DLLs têm uma desvantagem: menos confiabilidade. Às vezes, embora raramente, eles recebem o erro "Access violation at 0x08364576" (os dígitos do endereço de memória são diferentes). Os robôs baseados em MQL puro não apresentam esses erros. É claro que tudo depende de uma DLL específica - como ela é implementada, quão complexa ela é, se todos os locais potencialmente perigosos em termos de erros de memória foram verificados. Mas meus Expert Advisors têm uma situação em que tudo funciona bem por dois ou três meses e, ao reiniciar, um dos cinco Expert Advisors em execução em um MT apresenta esse erro no registro. No caso do MQL puro, isso não acontece.
Se compararmos a exportação de funções de DLLs em C# com a exportação de DLLs comuns - digamos, em C++ -, cada abordagem tem suas próprias vantagens e desvantagens. Criei outra DLL em C++ e Qt. Ela também estava funcionando com um banco de dados, mas com o SQLite, e não com o SQL Server. Também havia erros de acesso à memória, e com muito mais frequência do que na DLL .NET. No entanto, se o projeto for "limpo", se os ponteiros para null forem verificados em todos os lugares onde for necessário, se a memória for liberada e assim por diante, talvez o oposto seja mais confiável. Mas em C# é mais fácil, pois tudo é verificado e liberado automaticamente. Não notei nenhuma diferença no desempenho. No entanto, meu projeto C++/Qt não foi muito explorado.
As desvantagens aqui só podem ser mencionadas em comparação com qualquer outra coisa.
Se compararmos os EAs que usam a exportação de funções da DLL com os EAs que não usam e trabalham com MQL puro, tudo dependerá da implementação de um determinado EA e das tarefas que ele executa. Se houver dois EAs que fazem exatamente a mesma coisa, é difícil dizer. Presumo que o que usa DLL será mais rápido devido à melhor otimização do código pelos compiladores ao criar DLLs. Mas isso é apenas uma suposição, pois não comparei diretamente. Geralmente, eu fazia em DLL apenas o que é mais difícil ou impossível de fazer em MQL (por exemplo, o trabalho com o banco de dados descrito no artigo). Portanto, meus Expert Advisors feitos com e sem acesso à DLL executavam tarefas diferentes.
Os Expert Advisors que usam DLLs têm uma desvantagem: menos confiabilidade. Às vezes, embora raramente, eles recebem o erro "Access violation at 0x08364576" (os dígitos do endereço de memória são diferentes). Os robôs baseados em MQL puro não apresentam esses erros. É claro que tudo depende de uma DLL específica - como ela é implementada, quão complexa ela é, se todos os locais potencialmente perigosos em termos de erros de memória foram verificados. Mas meus Expert Advisors têm uma situação em que tudo funciona bem por dois ou três meses e, ao reiniciar, um dos cinco Expert Advisors em execução em um MT apresenta esse erro no registro. No caso do MQL puro, isso não acontece.
Se compararmos a exportação de funções de DLLs em C# com a exportação de DLLs comuns - digamos, em C++ -, cada abordagem tem suas próprias vantagens e desvantagens. Criei outra DLL em C++ e Qt. Ela também estava funcionando com um banco de dados, mas com o SQLite, e não com o SQL Server. Também havia erros de acesso à memória, e com muito mais frequência do que na DLL .NET. No entanto, se o projeto for "limpo", se os ponteiros para null forem verificados em todos os lugares onde for necessário, se a memória for liberada e assim por diante, talvez o oposto seja mais confiável. Mas em C# é mais fácil, pois tudo é verificado e liberado automaticamente. Não notei nenhuma diferença no desempenho. No entanto, meu projeto C++/Qt não foi muito explorado.
E outra pergunta, talvez você já tenha feito isso. É possível iniciar um painel de controle interativo a partir de uma DLL C# ou é necessário criar o painel como um programa separado e fornecer comunicação com a DLL de alguma forma, por exemplo, por meio de mapeamento de memória ou WCF?
Agora estou falando de um computador local.
Não, infelizmente não trabalhei com painéis interativos. Posso apenas especular. E não entendo muito bem o que significa "painel interativo".
É necessário abrir alguma janela do MetaTrader? Aqui não sei como isso pode ser feito ou se pode ser feito.
Devo simplesmente abrir alguma janela e receber informações do usuário? Eu também não fiz isso, mas acho que provavelmente não é difícil. Crie uma classe que defina uma janela normal do Windows Forms. Nessa classe, crie uma função estática exportável que crie a janela, mostre-a ao usuário no modo de diálogo e, em seguida, libere-a. Isso deve funcionar. Isso deve funcionar.
Adorei o artigo - muito obrigado pela discussão aprofundada.
Espero que alguém possa me ajudar com um problema durante o período de construção.
C:\Users\user\source\repos\mql\MqlSqlDemo\packages\UnmanagedExports.1.2.7\tools\RGiesecke.DllExport.targets(58,3): error : Microsoft.Build.Utilities.ToolLocationHelper could not find ildasm.exe
Basicamente, o utilitário UnmanagedExports não consegue encontrar o executável do desmontador necessário para realizar seu trabalho.
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
Novo artigo Integração de um EA em MQL e bancos de dados (SQL Server, .NET e C#) foi publicado:
Este artigo descreve como adicionar a um EA um recurso para trabalhar com o servidor de banco de dados Microsoft SQL Server. São importadas funções de uma DLL. Para criar a DLL, é implementada a plataforma Microsoft .NET e a linguagem C#. Com pequenas alterações, os métodos usados no artigo também são adequados para EAs escritos em MQL4.
Nos fóruns, ocasionalmente há perguntas sobre como integrar o trabalho com bancos de dados a EAs escritos em MQL5. O interesse neste tópico não é surpreendente. Os bancos de dados são muito bons como meio para salvar dados. Ao contrário dos logs de terminal, os dados não desaparecem dos bancos de dados. Eles são fáceis de classificar e filtrar. Através do banco de dados, o EA pode enviar as informações, por exemplo, certos comandos. E o mais importante é que os dados obtidos podem ser tanto analisados de diferentes ângulos quanto processados estatisticamente. Por exemplo, a fim de descobrir o lucro médio e o lucro total de um tempo especificado para cada par de moedas, basta escrever uma solicitação numa linha, o que leva literalmente um minuto. Agora imagine quanto tempo leva calculá-lo manualmente usando o histórico da conta no terminal de negociação.
Infelizmente, não existem meios regulares para interagir com os servidores do banco de dados nos terminais MetaTrader. O problema é resolvido apenas através da importação de funções a partir de arquivos DLL. Embora a tarefa não seja fácil, é realizável.
Iniciamos o EA alterando os dados da cadeia de conexão nos parâmetros para os parâmetros de acesso ao nosso servidor de banco de dados. Se tudo for feito corretamente, o EA registrará as seguintes entradas:
2018.07.10 20:36:22.187 MqlSqlDemo (EURUSD,H1) Tabela criada no banco de dados.
2018.07.10 20:36:22.427 MqlSqlDemo (EURUSD,H1) Dados registrados na tabela.
2018.07.10 20:36:22.569 MqlSqlDemo (EURUSD,H1) Número lido no banco de dados: 1
2018.07.10 20:36:22.586 MqlSqlDemo (EURUSD,H1) String lida no banco de dados: Test
Conexão ao banco de dados, execução de comandos SQL, registro e leitura de dados — tudo bem-sucedido.
Autor: Сергей Ткаченко