Cree su propia extensión de MetaTrader (dll) - página 3

 

Realmente una pregunta de C++...DLL externa para MT4

Hola a todos,

Tengo una DLL externa que he escrito en C++. Sin embargo, todavía soy bastante nuevo en C++, así que creo que puede ser por eso que estoy teniendo este problema. Tengo otra versión que he escrito en C# que funciona bien, excepto que para hacer que las DLL de C# sean invocables por MQL tengo que alterarlas, y esta alteración parece causar pequeñas fugas de memoria. Espero que alguien aquí pueda ayudarme con la versión en C++. La historia es la siguiente:

He estado desarrollando lentamente varias bibliotecas para programar estrategias de trading. Una de las cosas que estoy tratando de hacer es desarrollar un conjunto consistente de servicios para varias cosas como el registro, el bloqueo (el acceso a los recursos a prueba de hilos), y la notificación de eventos. Así que, básicamente, estoy tratando de tirar de MQL por sus botas en un paradigma de programación más moderno. De todos modos, actualmente estoy trabajando en una biblioteca que permitirá a los EAs recibir notificaciones de varios eventos de comercio (colocado, llenado, cerrado). Estos eventos pueden ser el resultado de operaciones realizadas por el EA suscriptor del evento o de otros EAs. Para lograr esto, estoy utilizando una DLL externa que básicamente facilita la comunicación entre los EAs a través del paso de mensajes. Hay un EA publicador que sólo busca nuevos eventos de comercio y cuando uno ocurre, pone un mensaje en una cola para el EA suscriptor (cada suscriptor tiene su propia cola).

Así que el problema es el siguiente... Siempre y cuando sea sólo un mensaje que se pasa a la vez, todo funciona bien. Obviamente eso no es aceptable en absoluto. Cuando se pasa más de un mensaje a la vez, lo que encuentro es que el primer mensaje se corrompe (sigue devolviendo el mensaje como "1" cuando en su lugar debería ser algo como "FILLED,1005167"). El segundo mensaje está bien, pero el primero no. Todavía no he probado más de dos mensajes, pero es de suponer que seguiría ocurriendo lo mismo.

Me encantaría que alguien supiera la respuesta a qué es lo que estoy haciendo mal y pudiera arrojar algo de luz a mi problema. Algunas notas: 1) Eventualmente voy a liberar este código bajo Apache 2.0 y por lo tanto este archivo fuente también está siendo puesto allí bajo Apache 2.0... Tengo la intención de liberar esto a la comunidad cuando está trabajando sin problemas. 2) He dicho repetidamente 'cola' aquí, pero si miras el código fuente verás que uso un vector en su lugar, y básicamente lo uso como una pila. Originalmente tenía una cola, pero la cambié por un vector sólo por la posibilidad de que estuviera haciendo algo mal con la cola STL de lo que no era consciente. No hubo suerte. La implementación real será una cola, pero por ahora ni la cola ni el vector me funcionan correctamente.

Gracias de antemano por cualquier idea.

Brandon Wilhite

Archivos adjuntos:
 

Ya que estuve aquí, pensé en compartir mi experiencia. Lo que quieres hacer ciertamente se puede hacer, y yo mismo lo he hecho muchas veces.

Cuando empecé a escribir DLLs para su uso en MT4 nunca pude conseguir que funcionara en C++. Creo que el problema era/es que la configuración de mi proyecto era siempre incorrecta en Visual Studio (hay tantos d@$% de ellos). Hace poco encontré un ejemplo de CodeGuru, que realmente pude compilar y utilizar. Ahora básicamente limpié ese proyecto y lo uso como plantilla.

Mientras tanto, he estado escribiendo C# DLLs y usando esta excelente herramienta aquí. Básicamente toma el IL y lo altera para que pueda ser llamado desde código no administrado. El único problema es que MT4 parece exhibir una fuga de memoria al hacer esto. No he determinado definitivamente si eso es debido a MT4 o la alteración de la IL, o qué, pero sucede.

A continuación, voy a aprender a escribir envolturas en C ++ y / o simplemente seguir adelante y aprender C ++. Esperemos que eso solucione el problema de la memoria.

De todos modos, lo que usted está queriendo hacer definitivamente se puede lograr. He logrado escribir algunas DLLs bastante complicadas para MT4 en C#, incluyendo cosas como remoting, raw sockets, http, WinForms. Casi todo lo que se puede hacer con .NET puede ser llamado desde MT4 de esta manera (lo que sea, y probablemente lo he hecho). Y es muy fiable. El único problema es la fuga de memoria relativamente lenta.

Magick:
Gracias Patrick

es una idea muy interesante para utilizar el FTP.

Sin embargo, quiero ser capaz de interactuar con MT - para enviar la información de la garrapata y la vela a la aplicación .net y esta aplicación se comunican de nuevo a MT en el momento de comercio.

Encontré esto que pensé que podría ayudar - Simplified Wrapper and Interface Generator

Sin embargo, soy un programador de nivel de entrada, y no apreciar plenamente lo que está involucrado en tener una capa intermedia envoltura c ++.

Me interesaría saber tu opinión, si crees que esto podría ser una herramienta útil para ayudar a tender un puente entre el c++ y el .net?
 
bwilhite:
Ya que estaba aquí, pensé en compartir mi experiencia. Lo que usted está queriendo hacer ciertamente se puede hacer, y lo he hecho muchas veces a mí mismo.

Cuando empecé a escribir DLLs para su uso en MT4 nunca pude conseguir que funcionara en C++. Creo que el problema era/es que la configuración de mi proyecto era siempre incorrecta en Visual Studio (hay tantos d@$% de ellos). Hace poco encontré un ejemplo de CodeGuru, que realmente pude compilar y utilizar. Ahora básicamente limpié ese proyecto y lo uso como plantilla.

Mientras tanto, he estado escribiendo C# DLLs y usando esta excelente herramienta aquí. Básicamente toma el IL y lo altera para que pueda ser llamado desde código no administrado. El único problema es que MT4 parece exhibir una fuga de memoria al hacer esto. No he determinado definitivamente si eso es debido a MT4 o la alteración de la IL, o qué, pero sucede.

Lo próximo que haré será aprender a escribir wrappers en C++ y/o simplemente seguir adelante y aprender C++. Esperemos que eso solucione el tema de la memoria.

De todos modos, lo que usted está queriendo hacer definitivamente se puede lograr. He logrado escribir algunas DLLs bastante complicadas para MT4 en C#, incluyendo cosas como remoting, raw sockets, http, WinForms. Casi todo lo que puedes hacer con .NET puede ser llamado desde MT4 de esta manera (lo que sea, y probablemente lo he hecho). Y es muy fiable. El único problema es la fuga de memoria relativamente lenta.

¡bwilhite eres un salvavidas! Parece una gran herramienta. ¿Por casualidad tienes un proyecto en c# que demuestre la comunicación con MT desde C#? Lo que quiero hacer es que mi aplicación .net le diga a MT cuándo operar. O tal vez usted puede recomendar un enlace que podría ayudar. Cualquier ayuda sería muy apreciada.

 

Muchas gracias.

 

Dll

Hola ,

¿Se puede utilizar la DLL para enviar y recibir pedidos a través de una hoja de cálculo Excel?

Donde puedo aprender este aspecto de la DLL.

Saludos cordiales

Latino

 
codersguru:
Cualquier persona interesada en crear su propia extensión MetaTrader (dll) puede ir a:

Crear su propia extensión MetaTrader (dll) - Parte 1

Crea tu propia extensión MetaTrader (dll) - Parte 2

¡Habrá otra parte (o 2) que las estoy escribiendo!

¡Espero que los disfrutes!

Por favor, actualiza tu curso a Visual C++ 2008 Express Edition

 
bwilhite:
Ya que estaba aquí, pensé en compartir mi experiencia. Lo que quieres hacer ciertamente se puede hacer, y yo mismo lo he hecho muchas veces.

Cuando empecé a escribir DLLs para su uso en MT4 nunca pude conseguir que funcionara en C++. Creo que el problema era/es que la configuración de mi proyecto era siempre incorrecta en Visual Studio (hay tantos d@$% de ellos). Hace poco encontré un ejemplo de CodeGuru, que realmente pude compilar y utilizar. Ahora básicamente limpié ese proyecto y lo uso como plantilla.

Mientras tanto, he estado escribiendo C# DLLs y usando esta excelente herramienta aquí. Básicamente toma el IL y lo altera para que pueda ser llamado desde código no administrado. El único problema es que MT4 parece exhibir una fuga de memoria al hacer esto. No he determinado definitivamente si eso es debido a MT4 o la alteración de la IL, o qué, pero sucede.

Lo próximo que haré será aprender a escribir wrappers en C++ y/o simplemente seguir adelante y aprender C++. Esperemos que eso solucione el problema de la memoria.

De todos modos, lo que usted está queriendo hacer definitivamente se puede lograr. He logrado escribir algunas DLLs bastante complicadas para MT4 en C#, incluyendo cosas como remoting, raw sockets, http, WinForms. Casi todo lo que puedes hacer con .NET puede ser llamado desde MT4 de esta manera (lo que sea, y probablemente lo he hecho). Y es muy fiable. El único problema es la fuga de memoria relativamente lenta.

¿Has sido capaz de identificar la fuente de esta fuga lenta bwilhite? Apreciaría tu ayuda en esta área si todavía estás dispuesto. Por el momento, estoy buscando una simple dll mql que me permita enviar y recibir mensajes a través de sockets. Estoy familiarizado con los fundamentos de c#, así que si pudiera encontrar una forma de aprovechar el, mejor.

Gracias.

 
Magick:
¡bwilhite eres un salvavidas! Parece una gran herramienta. ¿Por casualidad tienes un proyecto en c# que demuestre la comunicación con MT desde C#? Lo que estoy queriendo hacer es que mi aplicación .net le diga a MT cuando operar. O tal vez usted puede recomendar un enlace que podría ayudar. Cualquier ayuda sería muy apreciada.

¿Has tenido suerte con esto Magick? Esto es exactamente lo que estoy buscando hacer también - tener la aplicación .net decirle a MT cuándo y qué negociar. Por favor, hágame saber si usted ha encontrado una solución.

También aprecio y me gustaría escuchar más de bwihite. ¿Tiene alguna muestra de c # dlls que usted podría compartir.

¡Gracias!

 

He estado trabajando en mi propia DLL, y me encuentro con el error 127.

El archivo .cpp contiene (entre otras cosas):

MT4_EXPFUNC char* _stdcall DLLtest() {

return("testing!");

}

[/CODE]

header file contains:

#define MT4_EXPFUNC __declspec(dllexport)

MT4 file:

[CODE]

#import "mydll.dll"

string DLLtest();

Por supuesto que eso no es TODO lo que contienen, pero esa es la información pertinente. Ahora, basado en mi entendimiento, tengo todo allí para tratar de llamar a la función de MT4.

Por alguna razón, no es "ver" que existe. Pensé que era el hecho de que mi DLL carecía de un archivo .def, pero incluso después de crear manualmente uno todavía no funciona. Además, creo que la línea MT4_EXPFUNC significa que la función se exportará de todos modos, por lo que un .def es innecesario. Todo el asunto compila bien, el EA se ejecuta bien hasta que intento llamar a la función (ya que no puede verla) y entonces se detiene.

Estoy desesperado. Realmente pensé que era un problema de .def, pero cuanto más lo pienso, no creo que lo sea.

Por cierto, estoy usando Visual C++ 2008 Express...

Gracias por cualquier idea,

-Jason

 

Tengo el mismo error 127 usando Visual C++ 2008 Express. Todavía no hay solución, si encuentro una, la publicaré.