Discussão do artigo "Como trocar dados: Um DLL para o MQL5 em 10 minutos"

 

Novo artigo Como trocar dados: Um DLL para o MQL5 em 10 minutos foi publicado:

Agora, não muitos desenvolvedores lembram como escrever um simples DLL e quais são os recursos especiais da diferente ligação do sistema. Usando vários exemplos, vou tentar mostrar todo o processo da criação de um simples DLL em 10 minutos, bem como discutir alguns detalhes técnicos da nossa implementação de ligação. Mostrarei o processo passo-a-passo da criação de DLL no Visual Studio com exemplos de troca de diferentes tipos de variáveis (números, arrys, strings, etc.). Além disso, explicarei como proteger seu terminal do cliente de travamentos nos DLLs personalizados.

Autor: MetaQuotes Software Corp.

 

O artigo é bom, mas levanta algumas preocupações importantes.

5. DLL calls wrapper and loss of speed on calls

As already described above, every call of DLL functions is wrapped into a special wrapper in order to ensure safety. 
This binding masks the basic code, replaces the stack, supports stdcall / cdecl agreements and monitors exceptions within the functions called.

This work inevitably leads to delay of the calling function. 
Therefore, it isn't recommended to perform very frequent DLL function calls (hundreds or thousands of times per second) for small operations. 

It' s better to make infrequent calls.

Sou totalmente a favor de adicionar proteção ao aplicativo, mas não às custas do desempenho. Essa é outra mudança em relação ao MT4, já que as exceções nas dlls fazem com que o MT4 trave, mas um código bem escrito deve lidar com esse cenário. Então, agora, devido a maus hábitos de codificação, todos têm que pagar um custo de desempenho.

Isso é muito ruim se você tiver bibliotecas de algoritmos que são chamadas com base em ticks, eu ousaria dizer que as tornaria inúteis. Considerando que muitos dos comentários que vi sobre o MT5 não são bons, principalmente devido ao fato de as pessoas precisarem reescrever indicadores, etc., esse é apenas mais um item que causa muita frustração e, como isso afeta o desempenho, imagino que outras pessoas, como eu, que fazem uso extensivo de DLLs, ficarão com o MT4 pelo maior tempo possível e procurarão outra plataforma em que isso não seja um problema.

Por que, oh, por que a Metaquotes não poderia simplesmente adicionar um método ligeiramente diferente para invocar as DLLs de forma segura? O desenvolvedor poderia então optar por carregar por meio de carregamento seguro ou carregamento de desempenho e garantir que escrevesse um bom código que capturasse exceções.

"É melhor fazer chamadas pouco frequentes", quero dizer, seriamente, que tipo de afirmação é essa?

 

Compilei a dll usando o Visual C++ Express 2008, mas o interessante é que o terminal não captura a exceção, mas trava dentro de fnReplaceString.

Minha compilação no terminal é 239. Alguma pista?



 
investeo:

Compilei a dll usando o Visual C++ Express 2008, mas o interessante é que o terminal não captura a exceção, mas trava dentro de fnReplaceString.

Minha compilação no terminal é 239. Alguma pista?

Você pode me enviar o ex5 e a dll?
 
pfx:

O artigo é bom, mas levanta algumas preocupações importantes.

Sou totalmente a favor de adicionar proteção ao aplicativo, mas não às custas do desempenho. Essa é outra mudança em relação ao MT4, já que as exceções em dlls fazem com que o MT4 trave, mas um código bem escrito deve lidar com esse cenário. Eu preferiria ver artigos sobre como escrever código seguro em dll's para superar esses tipos de problemas.

Isso é muito ruim se você tiver bibliotecas de algoritmos que são chamadas com base em ticks, eu ousaria dizer que as tornaria inúteis. Dado que muitos dos comentários que vi sobre o MT5 não são bons, principalmente porque as pessoas precisam reescrever indicadores, etc., esse é apenas mais um item que causa muita frustração e, como isso afeta o desempenho, imagino que outras pessoas, como eu, que fazem uso extensivo de DLLs, ficarão com o MT4 pelo maior tempo possível e procurarão outra plataforma em que isso não seja um problema.

Por que, oh, por que a Metaquotes não poderia simplesmente adicionar um método ligeiramente diferente para invocar as DLLs de forma segura? O desenvolvedor poderia então optar por carregar por meio de carregamento seguro ou carregamento de desempenho e garantir que escrevesse um bom código que capturasse exceções.

"É melhor fazer chamadas pouco frequentes", quero dizer, seriamente, que tipo de afirmação é essa?

Não é de se admirar que esta comunidade tenha dificuldade em obter artigos decentes. Qualquer bom escritor não se daria ao trabalho de escrever aqui. Por que deveriam? Eles fazem algo decente, como mostrar como incorporar dlls e estabelecer comunicação, e então alguém aparece e os derruba da árvore.

Pelo que vejo, ele fez um trabalho decente no artigo, portanto, talvez o desempenho não esteja onde deveria estar. MAS a questão ou o problema aqui é: se está tão ruim e você faz parte dessa comunidade, por que não está tentando codificar uma solução para o que você descobriu como um problema óbvio de desempenho?

É muito bom que você fale sobre isso, mas não adianta ninguém reclamar se não estiver disposto a apresentar soluções ou mesmo sugestões sobre como atingir o objetivo.

Se o artigo expôs o risco, sim, acho que até tivemos uma amostra disso quando outra pessoa disse: "Ei, fiz o download e tive esse problema", que é exatamente o problema discutido no artigo.Acho que se eu fosse expandir esse artigo, seria como você disse, PFX, mostrar como interagir com segurança. No entanto, ele expôs o risco, deixando muito espaço para alguém como você expandi-lo pelo próprio conceito do tópico SEGURANÇA.

Uma observação pessoal minha ao autor: ao escrever tópicos, tente evitar termos como novato, que são insultantes e degradantes e não são uma maneira profissional de falar com aqueles que você deseja que sigam sua sabedoria.

 

Estou tentando descobrir se, com essa funcionalidade de importação de dll, poderei importar dlls escritas em outras linguagens, como C#. Isso é possível? Se não, por que não?

Qual é a diferença entre uma dll C++ e uma dll C#?

 
ToolMaker:

Qual é a diferença entre uma dll C++ e uma dll C#?

A principal diferença é o design. O assembly da dll do c# é usado para armazenar código gerenciado, e a dll do c++ contém código nativo.

Mas há um truque que torna possível a importação de assembly: Inverse P/Invoke.

Quanto a mim, estou acostumado a escrever uma dll de wrapper c++\cli para essa finalidade ou a escrever todo o código gerenciado usando c++\cli.

 

Você pode me mostrar a estrutura de importação para a biblioteca C++?

Estou tentando adicionar este código ao MQL5DLLSample.cpp:
------------------------
struct MqlTick

{
INT64 Time;
double Bid;
double Ask;
double Last;
UINT64 Volume;
};

_DLLAPI MqlTick __stdcall MyTick(MqlTick &my)
{
my.Bid = 1;
return(my);
}
------------------------

Em seguida, adiciono este código ao MQL5DLL Test.mq5 (seção de importação)

MqlTick MyTick(MqlTick &tick);

e o chamo em OnTick()

MqlTick tick;
SymbolInfoTick("GBPUSD", tick);
MyTick(tick);
Print("My tick: ",tick.bid);
------------------------

A compilação da biblioteca c++ e do EA não apresenta erros.

Depois de chamar a função MyTick(tick) no terminal, obtenho o erro: MQL5DLL_Test (EURUSD,M1) Violação de acesso, gravação em 0x00000008

 

Olá e obrigado por esse artigo útil.

Tentei criar uma pequena dll para trocar dados entre o mql5 e o mysql.

Segui as diferentes etapas e tive alguns erros.

A dll está em c++

A primeira foi compilada com o minGW

O ex5 não conseguiu abri-la porque não era uma dll compilada em 64 bits

Então, compilei com o minGW 64 bits

Minha primeira dll (que era muito simples) funciona

Ela faz algumas adições, etc.

Quando tento usar a biblioteca mysql, consigo compilar e criar minha dll sem nenhum problema

Mas quando tento abrir o ex5 chamando-o, recebo o seguinte erro:

Cannot open C:\user......\DLLNAME.dll (193)

Você tem alguma ideia para corrigir isso?

Muito obrigado

 

Olá a todos,

ótimo artigo!


Mas gostaria de saber se alguém pode me ajudar a fazer a coisa descrita neste artigo de forma um pouco invertida: obter dados (dados de ticks ou barras) no programa C++ a partir do metatrader?

 

Consegui fazer isso funcionar com uma matriz int padrão, mas é possível passar um CArrayObj / CArrayDouble para o Visual Studio C++?