Hola a todos!!!. Viennesete, es correcto lo que dices, yo también lo intente, la historia comienza asi:
Con un amigo, somos programadores (yo C/C++/Python, y mi amigo php y Visual basic). Un dia, nos contacto una persona preguntando si sabiamos programar para metatrader. La realidad es que yo en el trading soy un novato total (justamente abri un hilo en este foro y estamos desarrollando un EA junto con algunos amigos del foro, yo aportando lo que puedo sobre programación y ellos sobre estrategias). Pero esta persona ya tenía la idea de un asesor experto para arbitraje, es decir, aprovechar las diferentes cotizaciones que puede haber entre dos o mas brokers, y hacer un beneficio de esas diferencias. El problema que se le habia planteado y por el cual nos contacto, es porque necesitaba correr un EA en cada terminal (distintos brokers), y comunicarlos entre si, para que se pasen las cotizaciones de cada broker. El primer intento fracaso inmediatamente: Las variables globales. Sospechabamos que no funcionaria, pero queriamos verificarlo, Metatrader se ejecuta dentro de un proceso como cualquier programa, y crea un hilo o thread por cada asesor experto o script que se esta ejecutando.Las variables globales son gestionadas por el terminal, a nivel de proceso, por lo que se pueden compartir entre todos los EAs, siempre que esten en el mismo terminal.
El segundo intento fueron los archivos compartidos. No nos pareció una idea muy elegante, pero queriamos tener algo rápido funcionando para que nuestro cliente pudiese probar la estrategia, y mientras tanto buscabamos otra alternativa.
Nuevamente, el fracaso rotundo. Por los problemas que mencionas: Dependiendo de la carga que tiene el sistema, los archivos pueden tardar mucho en abrirse y cerrarse, y en arbitraje, las diferencias pueden durar segundos, por lo que la comunicación debía ser confiable y rápida.
Entonces, optamos por la tercera alternativa: TCP/IP.
El lenguaje MQL4 no dispone de funciones para comunicación TCP, por lo que la unica alternativa era usar una dll. En la web mql5.com hay ejemplos usando winsock, pero dicen que no es muy estable. El otro problema es que mql no permite el uso de punteros, y la mayoría de las dlls medianamente interesantes para usar con metatrader estan hechas en c/C++ y usan punteros.
Por ello, lo que hicimos fue crear una librería dll propia, que hiciera de "puente" entre el asesor experto en lenguaje mql y que solo requiriese de este el intercambio de datos simples (enteros, strings, doubles, etc). Internamente la librería llevaría registro de todos los punteros, estructuras, etc necesarios para pasar como parámetros a la libería de comunicaciones en si.
Buscando alternativas a winsock, que es bastante dificil de usar, encontramos ZeroMQ, que es una librería de comunicaciones muy robusta y eficiente (se utiliza entre otras cosas para computación distribuida, asi que su rendimiento es muy bueno).
Entonces, nuestra librería (que bautizamos MetaComm), presenta ante el asesor experto una serie de funciones muy sencillas (crear cliente, crear server, conectar cliente a un server en la ipuerto determinados, enviar un mensaje con respuesta, etc) siempre empleando tipos de datos nativos de mql (enteros, strings y arrays), e internamente crea las estructuras, punteros, etc necesarios para la librería ZeroMQ.
Esa es mi experiencia. No te puedo enviar la librería porque es un proyecto comercial que no depende solo de mi, pero te puedo indicar el camino a seguir, si tienes experiencia en programación c++ con visual studio puedes programar una dll sin mucho esfuerzo.
Cualquier otra consulta estoy a tu disposicion.
SaludosForo de Forex Trading United