Crie sua própria extensão MetaTrader (dll) - página 3

 

Realmente uma pergunta C++...DLL externa para MT4

Olá a todos,

Eu tenho uma DLL externa que escrevi em C++. Entretanto, ainda sou bastante novo no C++, por isso acho que pode ser por isso que estou tendo este problema. Tenho outra versão que escrevi em C# que funciona bem, exceto para tornar as DLLs em C# chamáveis pela MQL, tenho que alterá-las, e esta alteração parece causar pequenos vazamentos de memória. Estou esperando que alguém aqui possa me ajudar com a versão C++. A história é a seguinte:

Tenho desenvolvido lentamente várias bibliotecas para programar estratégias comerciais. Uma das coisas que estou tentando fazer é desenvolver um conjunto consistente de serviços para várias coisas como registro, travamento (acesso seguro a recursos), e notificação de eventos. Portanto, basicamente, estou tentando puxar o MQL para cima por suas bootstraps em um paradigma de programação mais moderno. De qualquer forma, atualmente estou trabalhando em uma biblioteca que permitirá aos EAs receber notificações de vários eventos comerciais (colocados, preenchidos, fechados). Esses eventos podem ser resultado de negócios realizados pela EA ou por outras EAs assinantes de eventos. Para isso, estou utilizando uma DLL externa que basicamente facilita a comunicação entre as EA através da passagem de mensagens. Há uma EA editora que apenas procura novos eventos comerciais e, quando um ocorre, coloca uma mensagem em uma fila para a EA assinante (cada assinante tem sua própria fila).

Portanto, o problema é este... Desde que seja apenas uma mensagem a ser passada de cada vez, tudo funciona bem. Obviamente, isso não é aceitável de forma alguma. Quando mais de uma mensagem é passada de cada vez, o que estou descobrindo é que a primeira mensagem fica corrompida (ela continua retornando a mensagem como "1" quando, em vez disso, deveria ser algo como "FILLED,1005167"). A segunda mensagem está bem, mas a primeira não está. Eu ainda não testei mais de duas mensagens, mas presumivelmente ainda veríamos a mesma coisa.

Eu adoraria se alguém soubesse a resposta para o que estou fazendo de errado e pudesse lançar alguma luz sobre meu problema. Algumas notas: 1) Eventualmente vou liberar este código sob o Apache 2.0 e assim este arquivo fonte também está sendo colocado lá sob o Apache 2.0....pretendo liberar isto para a comunidade quando estiver funcionando razoavelmente bem. 2) Eu tenho dito repetidamente 'fila' aqui, mas se você olhar para o código fonte, você me verá usando um vetor em vez disso, e basicamente usando-o como uma pilha. Originalmente eu tinha uma fila, mas mudei-a para um vetor apenas na hipótese de que eu estava fazendo algo errado com a fila STL que eu não estava ciente. Não tive essa sorte. A verdadeira implementação será uma fila, mas por enquanto nem fila nem vetor estão funcionando corretamente para mim.

Obrigado de antemão por qualquer esclarecimento.

Brandon Wilhite

Arquivos anexados:
 

Desde que aqui estive, pensei em compartilhar minha experiência. O que você quer fazer certamente pode ser feito, e eu mesmo já o fiz muitas vezes.

Quando comecei a escrever DLLs para uso no MT4, nunca consegui fazer com que funcionasse em C++. Acho que o problema foi/é que as configurações do meu projeto estavam sempre incorretas no Visual Studio (há tantos d@$% deles). Recentemente, encontrei um exemplo da CodeGuru, que na verdade consegui compilar e usar. Agora eu basicamente limpei esse projeto e o utilizei como modelo.

Entretanto, tenho escrito DLLs em C# e utilizado esta excelente ferramenta aqui. Basicamente, ele pega o IL e o altera para que possa ser chamado a partir de código não gerenciado. O único problema é que o MT4 parece apresentar um vazamento de memória ao fazer isto. Ainda não determinei definitivamente se isso se deve ao MT4 ou à alteração do IL, ou o quê, mas isso acontece.

Em seguida, estarei aprendendo a escrever invólucros em C++ e/ou simplesmente vou em frente e aprendo C++. Espero que isso resolva a questão da memória.

De qualquer forma, o que você está querendo fazer pode definitivamente ser realizado. Consegui escrever algumas DLLs bem complicadas para o MT4 em C#, incluindo coisas como remotos, tomadas brutas, http, WinForms. Praticamente qualquer coisa que você possa fazer com .NET pode ser chamada a partir do MT4 desta forma (você dá um nome e eu provavelmente já o fiz). E é muito confiável. O único problema é o vazamento de memória relativamente lento.

Magick:
Obrigado Patrick

é uma idéia muito interessante para usar o FTP.

No entanto, eu quero ser capaz de interagir com o MT - enviar as informações do tick e da vela para a aplicação .net e esta aplicação se comunicar de volta ao MT sobre quando negociar.

Achei que isto poderia ajudar - Wrapper Simplificado e Gerador de Interface

Entretanto, sou um programador de nível básico e não aprecio muito o que está envolvido em ter uma camada intermediária de embalagem c++.

Eu estaria interessado em ouvir sua opinião, se você acha que esta poderia ser uma ferramenta útil para ajudar a fazer a ponte entre o c++ e .net?
 
bwilhite:
Desde que eu estava aqui, pensei em compartilhar minha experiência. O que você está querendo fazer certamente pode ser feito, e eu mesmo já o fiz muitas vezes.

Quando comecei a escrever DLLs para uso no MT4, nunca consegui fazer com que funcionasse em C++. Acho que o problema era/é que as configurações do meu projeto estavam sempre incorretas no Visual Studio (há tantos d@$% deles). Recentemente, encontrei um exemplo da CodeGuru, que na verdade consegui compilar e usar. Agora eu basicamente limpei esse projeto e o utilizei como modelo.

Entretanto, tenho escrito DLLs em C# e utilizado esta excelente ferramenta aqui. Basicamente, ele pega o IL e o altera para que possa ser chamado a partir de código não gerenciado. O único problema é que o MT4 parece apresentar um vazamento de memória ao fazer isto. Ainda não determinei definitivamente se isso se deve ao MT4 ou à alteração do IL, ou o quê, mas isso acontece.

Em seguida, estarei aprendendo a escrever invólucros em C++ e/ou simplesmente vou em frente e aprendo C++. Espero que isso resolva a questão da memória.

De qualquer forma, o que você está querendo fazer pode definitivamente ser realizado. Consegui escrever algumas DLLs bastante complicadas para o MT4 em C#, incluindo coisas como remotos, tomadas brutas, http, WinForms. Praticamente qualquer coisa que você possa fazer com .NET pode ser chamada a partir do MT4 desta forma (você dá um nome e eu provavelmente já o fiz). E é muito confiável. O único problema é o vazamento de memória relativamente lento.

bwilhite, você é um salva-vidas! Isso parece ser uma ótima ferramenta. Você, por acaso, tem um projeto em C# que demonstra a comunicação com MT a partir de C#? O que eu quero fazer é que meu aplicativo .net diga à MT quando negociar. Ou talvez você possa recomendar um link que possa ajudar. Qualquer ajuda seria muito apreciada.

 

Muito obrigado!

 

Dll

Hi ,

A DLL pode ser usada para enviar e receber pedidos através de uma planilha de Excel?

Onde posso aprender este aspecto da DLL.

Cumprimentos

Latino

 
codersguru:
Qualquer pessoa interessada em criar sua própria extensão MetaTrader (dll) pode ir até:

Criar sua própria extensão MetaTrader (dll) - Parte 1

Crie sua própria extensão MetaTrader (dll) - Parte 2

Haverá outra parte (ou 2) que eu estou escrevendo!

Espero que goste deles!

Por favor, atualize seu curso para Visual C++ 2008 Express Edition

 
bwilhite:
Desde que estive aqui, pensei em compartilhar minha experiência. O que você quer fazer certamente pode ser feito, e eu mesmo já o fiz muitas vezes.

Quando comecei a escrever DLLs para uso no MT4, nunca consegui fazer com que funcionasse em C++. Acho que o problema era/é que as configurações do meu projeto estavam sempre incorretas no Visual Studio (há tantos d@$% deles). Recentemente, encontrei um exemplo da CodeGuru, que na verdade consegui compilar e usar. Agora eu basicamente limpei esse projeto e o utilizei como modelo.

Entretanto, tenho escrito DLLs em C# e utilizado esta excelente ferramenta aqui. Basicamente, ele pega o IL e o altera para que possa ser chamado a partir de código não gerenciado. O único problema é que o MT4 parece apresentar um vazamento de memória ao fazer isto. Ainda não determinei definitivamente se isso se deve ao MT4 ou à alteração do IL, ou o quê, mas isso acontece.

Em seguida, estarei aprendendo a escrever invólucros em C++ e/ou simplesmente vou em frente e aprendo C++. Espero que isso resolva o problema da memória.

De qualquer forma, o que você está querendo fazer pode definitivamente ser realizado. Consegui escrever algumas DLLs bem complicadas para o MT4 em C#, incluindo coisas como remotos, tomadas brutas, http, WinForms. Praticamente qualquer coisa que você possa fazer com .NET pode ser chamada a partir do MT4 desta forma (você dá um nome e eu provavelmente já o fiz). E é muito confiável. O único problema é o vazamento de memória relativamente lento.

Você já foi capaz de identificar a fonte deste lento vazamento bwilhite? Agradecia sua ajuda nesta área se você ainda estiver disposto a isso. No momento, estou procurando uma simples dll mql que me permitirá enviar e receber mensagens através de soquetes. Estou familiarizado com o básico do c#, então se eu pudesse encontrar uma maneira de tirar proveito do, melhor ainda.

Obrigado.

 
Magick:
bwilhite, você é um salva-vidas! Isso parece ser uma ótima ferramenta. Você, por acaso, tem um projeto c# que demonstra a comunicação com a MT a partir do C#? O que eu quero fazer é que meu aplicativo .net diga à MT quando negociar. Ou talvez você possa recomendar um link que possa ajudar. Qualquer ajuda seria muito apreciada.

Você teve alguma sorte com este Magick? Isto é exatamente o que eu estou procurando fazer também - fazer com que o aplicativo .net diga à MT quando e o que negociar. Por favor, me avise se você encontrou uma solução.

Eu também agradeço e gostaria de ouvir mais da bwihite. Você tem alguma amostra de c# dlls que você poderia compartilhar.

Obrigado!

 

Estive trabalhando em minha própria DLL, e estou encontrando o erro 127.

O arquivo .cpp contém (entre outras coisas):

MT4_EXPFUNC char* _stdcall DLLtest() {

return("testing!");

}

[/CODE]

header file contains:

#define MT4_EXPFUNC __declspec(dllexport)

MT4 file:

[CODE]

#import "mydll.dll"

string DLLtest();

Claro que não é TUDO o que eles contêm, mas essa é a informação pertinente. Agora, baseado em meu entendimento, tenho tudo para tentar chamar a função a partir do MT4.

Por alguma razão, simplesmente não é "ver" que ela existe. Pensei que era o fato de minha DLL não ter um arquivo .def, mas mesmo depois de criá-la manualmente, ela ainda não funciona. Além disso, acredito que a linha MT4_EXPFUNC significa que a função será exportada de qualquer forma, portanto um .def é desnecessário. A coisa toda se compila bem, o EA funciona bem até eu tentar chamar a função (pois não consegue vê-la) e então ele pára.

Eu estou no meu limite. Eu realmente pensei que era uma questão .def, mas quanto mais eu penso sobre isso, mais eu não acredito que seja.

BTW Estou usando o Visual C++ 2008 Express.

Obrigada por qualquer esclarecimento,

-Jason

 

Eu tenho o mesmo 127 erro usando Visual C++ 2008 Express. Ainda sem solução, se eu encontrar uma, eu a postarei.

Razão: