Discussão do artigo "Interação entre o MetaTrader 5 e MATLAB"

 

Novo artigo Interação entre o MetaTrader 5 e MATLAB foi publicado:

Este artigo cobre os detalhes da interação entre o MetaTrader 5 e o pacote matemático MatLab. Ele mostra o mecanismo da conversão de dados, o processo de desenvolvimento de uma biblioteca universal para interagir com o desktop MatLab. Ele também cobre o uso do DLL gerado pelo ambiente MatLab. Este artigo é destinado a leitores experientes que conhecem C++ e MQL5.

Figura 1. Esquema de bloco do algoritmo da biblioteca

Autor: Andrey Emelyanov

 

Segui suas instruções cuidadosamente, mas não consigo fazer isso funcionar com o Matlab 2007b. Continuo recebendo esses erros ao tentar usar seus exemplos pré-construídos com o Terminal MT5.

2010.08.29 10:33:30 TestMLEngine (EURUSD,H1) Não é possível abrir 'C:\Users\QuantFX\AppData\Roaming\MetaQuotes\Terminal\216E2BD2BB8CE60176A41ADF6AC1C76D\MQL5\Libraries\LibMlEngine.dll' (126)

2010.08.29 10:33:47 TestDllMatlab (EURUSD,H1) Não é possível abrir 'C:\Users\QuantFX\AppData\Roaming\MetaQuotes\Terminal\216E2BD2BB8CE60176A41ADF6AC1C76D\MQL5\Libraries\nnSMA.dll' (126)

Não sei bem o que pensar sobre isso, pois consigo obter o projeto mencionado no artigo"How to Exchange Data: Uma DLL para MQL5 em 10 minutos " encontrado aqui https://www.mql5.com/en/articles/18 funcionando sem problemas.

2010.08.29 10:44:16 MQL5DLL_Test (EURUSD,H1) Violação de acesso à gravação em 0x00000000 em 'C:\Users\QuantFX\AppData\Roaming\MetaQuotes\Terminal\216E2BD2BB8CE60176A41ADF6AC1C76D\MQL5\Libraries\MQL5DLLSamples.dll'

2010.08.29 10:44:16 MQL5DLL_Test (EURUSD,H1) Replace: Um gato marrom rápido pula sobre o cachorro preguiçoso

2010.08.29 10:44:16 MQL5DLL_Test (EURUSD,H1) Array: 0 1 2 3 4 5 6 7 8 9
2010.08.29 10:44:16 MQL5DLL_Test (EURUSD,H1) Time 297 msec, int: -752584127 double: 17247836076609

Portanto, o terminal obviamente não tem problemas com violações de acesso à pasta \Libraries, e tenho certeza de que as "Opções" do Expert Advisor permitem a importação de dll e a negociação automática... Qualquer ajuda seria muito bem-vinda, pois estou perplexo com isso desde que li este artigo pela primeira vez. Desde já, obrigado

How to Exchange Data: A DLL for MQL5 in 10 Minutes
  • 2010.01.27
  • MetaQuotes Software Corp.
  • www.mql5.com
Now not so many developers remember how to write a simple DLL, and what are special features of different system binding. Using several examples, I will try to show the entire process of the simple DLL's creation in 10 minutes, as well as to discuss some technical details of our binding implementation. I will show the step-by-step process of DLL creation in Visual Studio with examples of exchanging different types of variables (numbers, arrays, strings, etc.). Besides I will explain how to protect your client terminal from crashes in custom DLLs.
 

Finalmente consegui fazer isso funcionar... Excelente artigo, devo dizer. Não tenho muita experiência com o Visual Studio e sou novato na programação do Metatrader. Portanto, isso pareceu um desafio com todos os erros que eu estava recebendo. Embora seja muito fácil a longo prazo para todas as versões do Matlab e do Visual Studio.Para quem estiver fazendo suas primeiras tentativas de conectar o Metatrader e o Matlab, sugiro que faça o seguinte para ter uma ideia, caso nunca tenha trabalhado com o mecanismo do matlab ou com as bibliotecas externas do Metatrader. 1. Crie o projeto que vem com o matlab, encontrado em matlabroot\externs\examples\eng_mat\engwindemo.c seguindo este artigo. http://www.mathworks.com/support/solutions/en/data/1-78077S/index.html?product=ML&solution=1-78077S Compile-o e, se tiver problemas, como arquivos dll ausentes, use o dependency walker, encontrado aqui http://www.dependencywalker.com/para determinar quais arquivos ausentes precisam ser colocados na pasta C:\Windows\System 32 para que a versão do mecanismo matlab que você está usando funcione. Talvez seja bom observar que você pode acabar tendo que colocar muitos arquivos na pasta system 32 ou saber os locais certos para vinculá-los em seu projeto. Embora a maioria das dlls seja encontrada na pasta matlabroot\bin\win(32 ou 64), depois de colocar os primeiros arquivos dll necessários, volte e tente criar o projeto novamente. Talvez você descubra que não precisa fazer tudo o que o dependency walker sugere. Se você conseguir compilar e executar o projeto, então está quase pronto... 2. Compile o projeto sugerido no artigo How to Exchange Data: A DLL for MQL5 in 10 Minutes https://www.mql5.com/en/articles/18 . Se esse projeto funcionar, lembre-se de que, ao criar o projeto acima, você estará combinando os dois. Lembre-se de todas as etapas que você seguiu e, quando estiver pronto para compilar esse projeto, certifique-se de que "stdafx.h" seja o primeiro cabeçalho #include em DLLUnit.cpp e que você tenha desativado os cabeçalhos pré-compilados antes da compilação. O uso dos arquivos acima como estão pode gerar alguns avisos que podem ser facilmente corrigidos, mas o projeto deve funcionar sem problemas. Meus dois centavos adicionados aqui podem parecer o guia do idiota para esse projeto, mas fazer essas coisas pode economizar algumas horas do seu tempo livre se você precisar construir esse projeto com outra versão do matlab ou usar o visual studio.

Abraços

 

Se não me engano, o tipo de matrizes do Matlab na Tabela 1 está incorreto. A letra u está faltando. Ou seja, por exemplo, o tipo uint16 é responsável pelo intervalo de 0 a 65535, não o tipo int16. E assim por diante...

Classe

Intervalo de valores

Função de conversão

Inteiro de 8 bits com sinal

-27 a27-1

int8

Inteiro de 16 bits com sinal

-215 a215-1

int16

Inteiro de 32 bits com sinal

-231 a231-1

int32

Inteiro de 64 bits com sinal

-263 a263-1

int64

Inteiro de 8 bits sem sinal

0 a28-1

uint8

Número inteiro sem sinal de 16 bits

0 a216-1

uint16

Número inteiro de 32 bits sem sinal

0 a232-1

uint32

Número inteiro sem sinal de 64 bits

0 a264-1

uint64

 

Boa tarde, obrigado pelo excelente artigo, muito útil!

No entanto, surgiu um problema. Talvez alguém já tenha se deparado com ele.

Ao fechar um Expert Advisor, o MT5 trava completamente quando eu o fecho. Eu uso o MS Visual Studio 2010 + Matlab r2011a.

O que você acha que pode ser o motivo? Desde já, obrigado!

 

Boa tarde, fiz tudo como no artigo, mas ao executar o script TestMlEngine, apareceu um erro:

2011.12.17 15:55:23 TestMLEngine(EURUSD,H1) Não é possível abrir 'C:\Users\H_F_M\AppData\Roaming\MetaQuotes\Terminal\DEA4AAFB99C996D79821EC8BDBADDC3C\MQL5\Libraries\LibMlEngine.dll' (126)

e depois imediatamente:

2011.12.17 15:55:23 TestMLEngine (EURUSD,H1) Não é possível encontrar 'mlxGetSizeOfName' em 'LibMlEngine.dll'
2011.12.17 15:55:23 TestMLEngine (EURUSD,H1) Não é possível encontrar 'mlxGetLogical' em 'LibMlEngine.dll'
2011.12.17 15:55:23 TestMLEngine (EURUSD,H1) Não é possível encontrar 'mlxGetInt' em 'LibMlEngine.dll'
2011.12.17 15:55:23 TestMLEngine (EURUSD,H1) Não é possível encontrar 'mlxGetDouble' em 'LibMlEngine.dll'
2011.12.17 15:55:23 TestMLEngine (EURUSD,H1) Não é possível encontrar 'mlxInputLogical' em 'LibMlEngine.dll'
2011.12.17 15:55:23 TestMLEngine (EURUSD,H1) Não é possível encontrar 'mlxInputInt' em 'LibMlEngine.dll'
2011.12.17 15:55:23 TestMLEngine (EURUSD,H1) Não é possível encontrar 'mlxInputDouble' em 'LibMlEngine.dll'
2011.12.17 15:55:23 TestMLEngine (EURUSD,H1) Não é possível encontrar 'mlxInputChar' em 'LibMlEngine.dll'
2011.12.17 15:55:23 TestMLEngine (EURUSD,H1) Não é possível encontrar 'mlxOpen' em 'LibMlEngine.dll'
2011.12.17 15:55:23 TestMLEngine (EURUSD,H1) Não é possível encontrar 'mlxClose' em 'LibMlEngine.dll'

Em algum lugar do fórum, descobri que isso se deve à falta de dlls. Com a ajuda do depends.exe, descobri o que estava faltando, coloquei-o na mesma pasta, o que ajudou, mas não totalmente:

2011.12.17 15:57:59 TestMLEngine (EURUSD,H1) Cannot open 'C:\Users\H_F_M\AppData\Roaming\MetaQuotes\Terminal\DEA4AAFB99C996D79821EC8BDBADDC3C\MQL5\Libraries\LibMlEngine.dll' (127).

e a lista continua com "Cannot find...". Você pode me dizer qual é o problema? Já estou lutando há uma semana...

Sim, tenho o Win7 + Matlab R2011a + VS201.


.

[Excluído]  
H_F_M:

Boa tarde, fiz tudo como no artigo, mas ao executar o script TestMlEngine, apareceu um erro:

2011.12.17 15:55:23 TestMLEngine (EURUSD,H1) Não é possível abrir 'C:\Users\H_F_M\AppData\Roaming\MetaQuotes\Terminal\DEA4AAFB99C996D79821EC8BDBADDC3C\MQL5\Libraries\LibMlEngine.dll' (126)

e depois imediatamente:

2011.12.17 15:55:23 TestMLEngine (EURUSD,H1) Não é possível encontrar 'mlxGetSizeOfName' em 'LibMlEngine.dll'
2011.12.17 15:55:23 TestMLEngine (EURUSD,H1) Não é possível encontrar 'mlxGetLogical' em 'LibMlEngine.dll'
2011.12.17 15:55:23 TestMLEngine (EURUSD,H1) Não é possível encontrar 'mlxGetInt' em 'LibMlEngine.dll'
2011.12.17 15:55:23 TestMLEngine (EURUSD,H1) Não é possível encontrar 'mlxGetDouble' em 'LibMlEngine.dll'
2011.12.17 15:55:23 TestMLEngine (EURUSD,H1) Não é possível encontrar 'mlxInputLogical' em 'LibMlEngine.dll'
2011.12.17 15:55:23 TestMLEngine (EURUSD,H1) Não é possível encontrar 'mlxInputInt' em 'LibMlEngine.dll'
2011.12.17 15:55:23 TestMLEngine (EURUSD,H1) Não é possível encontrar 'mlxInputDouble' em 'LibMlEngine.dll'
2011.12.17 15:55:23 TestMLEngine (EURUSD,H1) Não é possível encontrar 'mlxInputChar' em 'LibMlEngine.dll'
2011.12.17 15:55:23 TestMLEngine (EURUSD,H1) Não é possível encontrar 'mlxOpen' em 'LibMlEngine.dll'
2011.12.17 15:55:23 TestMLEngine (EURUSD,H1) Não é possível encontrar 'mlxClose' em 'LibMlEngine.dll'

Em algum lugar do fórum, descobri que isso se deve à falta de dlls. Com a ajuda do depends.exe, descobri o que estava faltando, coloquei-o na mesma pasta, o que ajudou, mas não totalmente:

2011.12.17 15:57:59 TestMLEngine (EURUSD,H1) Cannot open 'C:\Users\H_F_M\AppData\Roaming\MetaQuotes\Terminal\DEA4AAFB99C996D79821EC8BDBADDC3C\MQL5\Libraries\LibMlEngine.dll' (127).

e a lista continua com "Cannot find...". Você pode me dizer qual é o problema? Já estou lutando há uma semana...

Sim, tenho o Win7 + Matlab R2011a + VS201.

Quando instalei o Matlab, o caminho do sistema era apenas "C:\Program Files\MATLAB\R2011b\bin". Eu adicionei "C:\Program Files\MATLAB\R2011b\bin\win32". As Dlls do diretório Matlab ficaram visíveis e o Matlab Engine foi iniciado. Antes disso, escrevi que não conseguia ver as dlls.

 

Bom dia) Estou com outro problema - por algum motivo, o catálogo "Borland" não é encontrado na pasta <MATLAB>\extern\lib\win32\, embora o Borland C++ Builder 6 esteja instalado. Dessa forma, os arquivos libeng.lib e libmx.lib também não podem ser conectados ao projeto. Far fornece o seguinte no comando "implib libeng libeng.lib libeng.dll":

)

E a pasta Borland não estava lá e ainda não está... Alguém pode me dizer como lidar com esse problema? Ou, pelo menos, como lançar esses dois arquivos?:-)

 

Em geral, por favor, me ajude, pois não entendo algo....

Para a pureza do experimento, instalei o VMware, onde instalei 2 sistemas - XP e 7.

Em seguida, instalei o Matlab R2011b, instalei o MCR, instalei a versão mais recente do MT5. A partir do arquivo anexado ao artigo, todos os arquivos foram espalhados em pastas, conforme escrito nas instruções do arquivo. Compilei os arquivos mq5 em ex5 (ou seja, excluí os arquivos ex5 existentes no arquivo e coloquei os recém-compilados em seu lugar). Iniciei o MT5, iniciei o Matlab (tentei não iniciá-lo - o resultado é o mesmo), no terminal, cliquei em TestMlEngine e ele me deu:

TestMLEngine (EURUSD,H1) 13:44:58 Não é possível abrir 'C:\Users\User\AppData\Roaming\MetaQuotes\Terminal\DEA4AAFB99C996D79821EC8BDBADDC3C\MQL5\Libraries\LibMlEngine.dll' (126)
TestMLEngine (EURUSD,H1) 13:44:58 Não é possível encontrar 'mlxClose' em 'LibMlEngine.dll'
TestMLEngine (EURUSD,H1) 13:44:58 Não é possível encontrar 'mlxOpen' em 'LibMlEngine.dll'
TestMLEngine (EURUSD,H1) 13:44:58 Não é possível encontrar 'mlxInputChar' em 'LibMlEngine.dll'
TestMLEngine (EURUSD,H1) 13:44:58 Não é possível encontrar 'mlxInputDouble' em 'LibMlEngine.dll'
TestMLEngine (EURUSD,H1) 13:44:58 Não é possível encontrar 'mlxInputInt' em 'LibMlEngine.dll'
TestMLEngine (EURUSD,H1) 13:44:58 Não é possível encontrar 'mlxInputLogical' em 'LibMlEngine.dll'
TestMLEngine (EURUSD,H1) 13:44:58 Não é possível encontrar 'mlxGetDouble' em 'LibMlEngine.dll'
TestMLEngine (EURUSD,H1) 13:44:58 Não é possível encontrar 'mlxGetInt' em 'LibMlEngine.dll'
TestMLEngine (EURUSD,H1) 13:44:58 Não é possível encontrar 'mlxGetLogical' em 'LibMlEngine.dll'
TestMLEngine (EURUSD,H1) 13:44:58 Não é possível encontrar 'mlxGetSizeOfName' em 'LibMlEngine.dll'.

Não sei o que fazer. Tentei tudo o que pude. Experimentei a DLL do artigo "Como escrever uma biblioteca DLL para MQL5 e trocar dados em 10 minutos?(https://www.mql5.com/ru/articles/18)- ela funciona sem problemas.

Alguém pode me dizer de que outra forma posso acessá-la? O que estou fazendo de errado?

Desde já agradeço.

Как за 10 минут написать DLL библиотеку для MQL5 и обмениваться данными?
Как за 10 минут написать DLL библиотеку для MQL5 и обмениваться данными?
  • 2010.01.27
  • MetaQuotes Software Corp.
  • www.mql5.com
Так уж сложилось, что сейчас мало кто из разработчиков помнит, как написать простую DLL библиотеку и в чем особенности связывания разнородных систем. Я постараюсь за 10 минут на примерах продемонстрировать весь процесс создания простых DLL библиотек и раскрою некоторые технические детали нашей реализации связывания. Покажу пошаговый процесс создания DLL библиотеки в Visual Studio с примерами передачи разных типов переменных (числа, массивы, строки и т.д.) и защиту клиентского терминала от падений в пользовательских DLL.
 
neuro_robot:

Quando instalei o Matlab, o caminho do sistema era apenas "C:C:\Program Files\MATLAB\R2011b\bin". Adicionei "C:\Program Files\MATLAB\R2011b\bin\win32". As Dlls do diretório Matlab ficaram visíveis e o Matlab Engine foi iniciado. Antes disso, escrevi que não conseguia ver as dlls.

Se você se refere à variável de ambiente Path, adicionei "C:\Program Files\MATLAB\R2011b\bin\win32" a ela, mas a situação não mudou :-(
[Excluído]  
H_F_M:
Se você se refere à variável de ambiente Path, adicionei "C:\Program Files\MATLAB\R2011b\bin\win32" a ela, mas a situação não mudou :-(
Além disso, algumas bibliotecas dll estavam faltando. Verifique em "depends.exe" o que está faltando para a inicialização.