Enviar órdenes a MT4 desde Java vía IP

 

Hola,

¿Hay alguna manera de enviar órdenes simples (sólo COMPRA, VENTA, CIERRE) a MT4 desde otro ordenador (que está ejecutando una aplicación Java) a través de IP?

No necesito una comunicación bidireccional, sólo unidireccional.

Gracias de antemano.

 
Mariop: ¿Hay alguna manera de enviar órdenes simples (sólo COMPRA, VENTA, CIERRE) a MT4 desde otro ordenador (que está ejecutando una aplicación Java) a través de IP? No necesito comunicación bidireccional; sólo unidireccional.

Sí, pero hay que codificar una interfaz para las comunicaciones entre procesos, porque no es algo que esté incorporado. Codificar eso requiere conocimientos y experiencia y no es algo que un principiante como tú pueda abordar muy fácilmente.

Así que dirígete a la sección de Freelance y contrata a alguien cualificado para hacerlo por ti, pero dudo que sea barato.

 
:) Gracias por tu respuesta.
Sin embargo creo que no soy tan principiante, de hecho ya he hecho cosas más complicadas con C# hace años a través de TradePlatform.NET, pero esta vez necesito enviarlas (las órdenes) desde un programa Java. Así que si hay alguna forma de que MT4 sea capaz de recibir órdenes de la forma que he pedido, sigo esperando respuestas más interesantes.
 

Ya le he dado la respuesta más adecuada. Siempre puedes utilizar archivos en red como método de comunicación, pero eso sería lento y engorroso.

El hecho de que hayas hecho esta pregunta, dice que en cuanto al entorno de programación de MetaTrader/MQL, eres una persona relativamente poco competente en MQL/MetaTrader. Digo esto porque si fueras muy competente en MQL y WinAPI, ya habrías conocido las distintas soluciones IPC a través de canales, named pipes, TCP/IP, etc. - la mayoría de las cuales se implementan a través de librerías DLL, pero no necesariamente.

 
La forma más sencilla (aunque no fácil) de conectar MT4 desde Java sería con sockets, hay códigos de ejemplo para MQL en la base de código y artículos.
 
Ovo:
La forma más sencilla (aunque no fácil) de conectar MT4 desde Java sería con sockets, hay códigos de ejemplo para MQL en la base de código y artículos.

Casi no tengo experiencia en Java, pero, si los dos ordenadores están en la misma red local, entonces las tuberías con nombre - soportadas por MQL4 a través de FileOpen() - podrían ser posibles y más simples.

http://stackoverflow.com/questions/634564/how-to-open-a-windows-named-pipe-from-java

 
jjc:

Casi no tengo experiencia en Java, pero, si los dos ordenadores están en la misma red local, entonces las tuberías con nombre - soportadas por MQL4 a través de FileOpen() - podrían ser posibles y más simples.

http://stackoverflow.com/questions/634564/how-to-open-a-windows-named-pipe-from-java

En realidad, no tengo experiencia con named pipes en Java, pero los sockets son muy comunes en Java. Por otra parte, el enlace que has proporcionado parece que no se puede crear la tubería con nombre desde Java, pero sólo para conectarse a uno existente, y consideraron sólo la conexión interproceso en lugar de la solución de red (puede o no puede ser compatible, ni idea).

 
jjc:

Casi no tengo experiencia en Java, pero, si los dos ordenadores están en la misma red local, entonces las tuberías con nombre - soportadas por MQL4 a través de FileOpen() - podrían ser posibles y más simples.

http://stackoverflow.com/questions/634564/how-to-open-a-windows-named-pipe-from-java


Inicialmente ambos ordenadores estarán en la misma LAN, aunque sería interesante hacerlo funcionar también a través de Internet. Pero sí, en la misma LAN sería suficiente ahora mismo.


Ovo:
La forma más sencilla (aunque no fácil) de conectar MT4 desde Java sería con sockets, hay códigos de ejemplo para MQL en la base de código y artículos.


Sí. La mejor solución que he encontrado parece ser la que utiliza mt4-zeromq, pero todavía no he encontrado un ejemplo que muestre cómo utilizarlo para ejecutar una operación. Creo que esta puede ser la mejor manera de hacerlo ya que (¿)no tendría ningún retraso(?) y podría ser utilizado bajo un entorno Linux, por lo que cualquier código de ejemplo simple al respecto sería apreciado.

Sin embargo el principal problema que sigo viendo es el retardo: Cuando desarrollé algo similar pero en sentido contrario (MT4 interactuaba con un servidor externo) no había tal problema ya que no había información nueva entre los ticks del mercado de MT4, pero en este caso no consigo entender cómo MT4 podrá recibir órdenes (y ejecutarlas) entre ticks. ¿No sería un problema? ¿O tal vez me estoy perdiendo algo y esto no será un problema?

 
Ovo:

En realidad, no tengo experiencia con named pipes en Java, pero los sockets son muy comunes en Java. Por otra parte, el enlace que has proporcionado parece que no se puede crear la tubería con nombre desde Java, pero sólo para conectarse a uno existente, y consideraron sólo la conexión interproceso en lugar de la solución de red (puede o no puede ser compatible, ni idea).

Los "Named Pipes" tienen que ser creados por el extremo de MT4 primero, llamando a las funciones WinAPI. Sólo entonces puede ser utilizado por JAVA como un archivo estándar. Esto no debería ser un problema, ya que es exactamente lo que el OP quiere, pero sólo es ideal para una solución LAN.

Sockets, por otro lado es ideal tanto para soluciones LAN como WAN, pero requerirá una envoltura DLL para el WinAPI con funciones de apoyo adicionales para hacer más fácil para MT4 para manejar las cosas.

Sin embargo, el operador sólo tiene que "dejar que sus dedos hagan el trabajo", ya que hay un montón de información por ahí de las posibles soluciones. Sólo tiene que elegir qué método le conviene más, ya sea Named Pips, Mapped Files, Sockets, o lo que sea:
 
Mariop: Sin embargo el principal problema que sigo viendo es el retraso: Cuando desarrollé algo similar pero en sentido contrario (MT4 interactuaba con un servidor externo) no había ese problema ya que no había información nueva entre los ticks del mercado de MT4, pero en este caso no me explico cómo podrá MT4 recibir órdenes (y ejecutarlas) entre ticks. ¿No sería un problema? ¿O tal vez me estoy perdiendo algo y esto no será un problema?

¡Utilizando el manejador de eventos OnTimer() que no depende de los ticks entrantes!

Mariop: La mejor solución que he encontrado parece ser la que utiliza mt4-zeromq, pero todavía no puedo encontrar un ejemplo que muestre cómo utilizarlo para ejecutar una operación.

Trate de no depender de las bibliotecas de terceros. Solo codifica tu propia DLL con funciones de soporte extra para facilitar el manejo de cosas para MT4. Codifique la DLL en C y no en C# ya que tiene dependencias y no es tan eficiente como C.

Además, diseñe su propio formato/protocolo de mensajes adecuado a los requisitos. Hazlo compacto y eficiente y más adelante deberías encriptarlo por seguridad si es necesario.

 
FMIC:

Trate de no depender de las bibliotecas de terceros. Solo codifica tu propia DLL con funciones de soporte extra para facilitar el manejo de cosas para MT4. Codifique la DLL en C y no en C# ya que tiene dependencias y no es tan eficiente como C.

Además, diseñe su propio formato/protocolo de mensajes adecuado a los requisitos. Hágalo compacto y eficiente y más adelante debería encriptarlo por seguridad si es necesario.

Ahora tenemos una respuesta mucho más interesante que la primera. Estoy absolutamente de acuerdo contigo y esos son realmente BUENOS CONSEJOS. Yo dejé MQL hace años ya que desarrollé mi propia plataforma (realmente necesitaba algunas características específicas que no encontraba en ninguna otra plataforma, no era porque tuviera ganas de pasar esa enorme cantidad de horas haciéndolo). Ahora voy a empezar a colaborar con un broker que trabaja exclusivamente con MT4, así que necesito construir un puente para conectarme a él. Por eso me urge hacerlo funcionar cuanto antes.


FMIC:

¡Utilizando el manejador de eventos OnTimer() que no depende de los ticks entrantes!


Es cierto. Gracias. No me acordaba de eso. En realidad no resuelve el problema completamente ya que necesito que las órdenes se ejecuten casi inmediatamente (y creo que con este método sólo puedo comprobarlo cada segundo, pero al menos no cada tick), pero efectivamente puedo construir fácilmente una solución temporal usándolo.

De nuevo, buenos consejos ;)