EA MT4 TradeIsBusy

 

Publi

TradeIsBusy

 

Publi

Resultados 1 al 6 de 6


  1. #1




    Reputación:
    Poder de reputación: 10

    Mensajes: 26
    Créditos: 1.634

    Re: TradeIsBusy


    Publi
    Cita Iniciado por viennesete Ver mensaje
    Hola a todos, MCSoft gracias por contestar. Disculpas por la ortografia, escribo desde el movil.
    Por profundizar un poco en la comunicacion entre dos terminales distintos. Yo alguna vez lo intente a traves de archivos csv. Un terminal crea o actualiza un archivo y el otro terminal lee el archivo y contesta volviendo a actualizar el mismo archivo. Esto que en teoria tiene muy buena pinta, en la practica fue un fracaso debido al tiempo que se toma MT4 para abrir y cerrar un archivo, varios segundos. Dependiendo del uso, si necesitas rapidamente la informacion de un terminal para tomar decisiones en otro terminal, no funciona. Me gustaria que explicaras un poco mas tu solucion a traves de TCP/IP.
    Saludos
    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.
    Saludos
    Foro de Forex Trading United

  2. Publi
    Publi


  3. #2




    Reputación:
    Poder de reputación: 11

    Mensajes: 1
    Créditos: 150

    Re: TradeIsBusy

    Tu aportación es de mucho nivel dentro de los EA, por cierto estoy intentando montar un grupo para avanzar en la selección y optimización de EA's, si te puede interesar me lo comentas. Saludos
    Foro de Forex Trading United

  4. #3




    Reputación:
    Poder de reputación: 12

    Espana
    Mensajes: 44
    Créditos: 606

    Re: TradeIsBusy

    Me respondo yo solo por si alguien tiene que manejar varias cuentas simultáneas desde el mismo PC.
    Pues bien,las cuentas no se estorban. Las variables globales con el mismo nombre en plataformas diferentes, son variables diferentes con un espacio de memoria diferente.
    He realizado la prueba con tres demos. Se abrieron seis operaciones a las 03:00:00 en cada una de las plataformas con una perfecta sincronización entre las seis y de forma independiente en las tres plataformas a la misma hora.
    Me falta realizar la prueba definitiva con cuentas reales....

    Saludos
    Foro de Forex Trading United

  5. #4




    Reputación:
    Poder de reputación: 10

    Mensajes: 26
    Créditos: 1.634

    Re: TradeIsBusy

    Cita Iniciado por viennesete Ver mensaje
    Me respondo yo solo por si alguien tiene que manejar varias cuentas simultáneas desde el mismo PC.
    Pues bien,las cuentas no se estorban. Las variables globales con el mismo nombre en plataformas diferentes, son variables diferentes con un espacio de memoria diferente.
    He realizado la prueba con tres demos. Se abrieron seis operaciones a las 03:00:00 en cada una de las plataformas con una perfecta sincronización entre las seis y de forma independiente en las tres plataformas a la misma hora.
    Me falta realizar la prueba definitiva con cuentas reales....

    Saludos
    Saludos a todos!!!. Viennesete, ya respondiste solo tu pregunta, pero aporto mi granito de arena por si te resulta util a ti o a alguien mas:
    - Las variables globales son globales dentro del mismo proceso, y cada terminal es un proceso, con espacio de memoria independiente, por lo que las variables globales no se comparten entre terminales
    - Las DLLs cargadas en un terminal por un indicador o EA, cargan una copia independiente de los datos en cada proceso. Cada terminal es un proceso, y cada EA es un thread, por lo que los EAs "ven" las variables globales de la DLL como compartidas entre si.
    Esto lo vivi en carne propia porque un cliente me pidio a mi y a un amigo hace un tiempo desarrollar una dll para comunicar dos o mas EAs en terminales distintos (queria hacer hedging y arbitaje entre terminales), y yo en un principio desarrolle una dll que intercambiaba mensajes en memoria, pero no me resulto, porque el terminal crea un espacio de memoria unico para la dll y no lo comparte con otro terminal. La unica forma eficaz que encontre de comunicar dos EAs en distintos terminales fue empleando TCP/IP.
    Espero que este dato les sirva por si alguna vez se encuentran con un problema similar.
    Saludos!!!!
    Foro de Forex Trading United

  6. #5




    Reputación:
    Poder de reputación: 12

    Espana
    Mensajes: 44
    Créditos: 606

    TradeIsBusy

    Hola a tod@s.
    Os deseo que ganéis muchos pips en 2014, y si no son muchos, que los aprovechéis adecuadamente.
    Ahí va mi pregunta. He descargado e instalado MT4 en diferentes rutas en mi disco duro. Cada plataforma maneja una cuenta diferente. En cada plataforma se ejecuta un EA sobre diferentes pares. Para controlar la apertura, modificación y cierre de operaciones he implementado el semáforo TradeIsBusy, prácticamente calcado de MQL4 Articles. Esto funciona como la exclusión mutua en la programación concurrente, cuando un proceso coge el control de la operativa para abrir una operación, pone el semáforo en rojo y si otro proceso (un EA ejecutándose sobre otro par) pretende abrir una operación en ese mismo instante, espera hasta que el semáforo se pone verde.
    Hasta aquí todo ok.
    Esto me funciona perfectamente a través de la variable global TradeIsBusy con una sola plataforma poniendo el EA sobre ocho pares diferentes.
    También funciona bien la coexistencia de diferentes plataformas con EA en cada una de ellas.
    Preguntas:
    ¿Las variables globales se establecen a nivel de plataforma o a nivel del sistema operativo?
    ¿Sería posible tener varias plataformas MT4 funcionando a la vez y en todas ellas tener la misma variable global?
    Si se establecen a nivel de plataforma, imagino que sí. La variable TradeIsBusy en la plataforma 1, tendrá un espacio de direcciones en memoria diferente a la variable TradeIsBusy en la plataforma 2. Si se establece a nivel del sistema operativo, el espacio de direcciones sería el mismo y desde todas las plataformas se interactuaría con la misma variable.
    ¿Cuando se genera una petición de apertura de una orden al servidor del broker en una cuenta determinada. Sería independiente de la apertura de otra orden al mismo servidor en una cuenta diferente lanzada desde la misma IP, o sea desde mi mismo PC?.
    ¿Tendría que establecer también un semáforo entre las diferentes plataformas que coexistan en mi PC trabajando sobre cuentas diferentes?.

    Espero haberme explicado bien.
    Mis gracias anticipadas.

    Saludos:
    Foro de Forex Trading United

  7. #6




    Reputación:
    Poder de reputación: 12

    Espana
    Mensajes: 44
    Créditos: 606

    Re: TradeIsBusy


    Publi
    Hola a todos, MCSoft gracias por contestar. Disculpas por la ortografia, escribo desde el movil.
    Por profundizar un poco en la comunicacion entre dos terminales distintos. Yo alguna vez lo intente a traves de archivos csv. Un terminal crea o actualiza un archivo y el otro terminal lee el archivo y contesta volviendo a actualizar el mismo archivo. Esto que en teoria tiene muy buena pinta, en la practica fue un fracaso debido al tiempo que se toma MT4 para abrir y cerrar un archivo, varios segundos. Dependiendo del uso, si necesitas rapidamente la informacion de un terminal para tomar decisiones en otro terminal, no funciona. Me gustaria que explicaras un poco mas tu solucion a traves de TCP/IP.
    Saludos
    Foro de Forex Trading United

This website uses cookies
Utilizamos cookies propias y de terceros para elaborar información estadística y mostrarle publicidad personalizada a través del análisis de su navegación. Si continúa navegando acepta su uso. Más información y política de cookies.
     

 

Publi


Aviso Legal
Ley Orgánica 15/1999, de 13 de diciembre, de Protección de Datos de Carácter Personal