Enviar pedidos para o MT4 a partir de Java via IP

 

Olá,

Existe alguma maneira de enviar pedidos simples (apenas COMPRAR, VENDER, FECHAR) para o MT4 a partir de outro computador (que está rodando um aplicativo Java) via IP?

Não é necessária comunicação bidirecional; apenas unidirecional.

Obrigado de antemão.

 
Mariop: Existe alguma maneira de enviar pedidos simples (apenas COMPRAR, VENDER, FECHAR) para o MT4 a partir de outro computador (que está rodando um aplicativo Java) via IP? Não é necessária comunicação bidirecional; apenas uni-direcional.

Sim, mas uma interface para comunicação inter-processo precisa ser codificada, porque não é algo disponível embutido. Codificação que requer conhecimento e experiência e não é algo que um iniciante como você será capaz de enfrentar muito facilmente.

Portanto, dirija-se à seção Freelance e contrate alguém qualificado para fazê-lo por você, mas duvido que seja barata.

 
:) Obrigado por sua resposta.
No entanto, acho que não sou tão iniciante, na verdade já fiz coisas mais complicadas com C# anos atrás via TradePlatform.NET, mas desta vez preciso enviá-las (as ordens) a partir de um programa Java. Portanto, se houver alguma maneira de que o MT4 possa receber ordens da maneira que eu pedi, ainda estou esperando por respostas mais interessantes.
 

Já lhe dei a resposta mais apropriada! Você sempre pode usar arquivos em uma rede para servir como método de comunicação, mas isso seria lento e incômodo.

O fato de você ter feito esta pergunta, diz que, quanto ao ambiente de programação MetaTrader/MQL, você é relativamente menos proficiente na MQL/MetaTrader. Digo isto porque se você fosse muito proficiente na MQL e WinAPI, você já teria conhecido as várias soluções IPC através de canais, tubos nomeados, TCP/IP, etc. - a maioria das quais são implementadas através de bibliotecas DLL, mas não necessariamente.

 
A maneira mais fácil (embora não fácil) de conectar o MT4 de Java seria com soquetes, existem exemplos de códigos para MQL na base de códigos e artigos.
 
Ovo:
A maneira mais fácil (embora não fácil) de conectar o MT4 de Java seria com soquetes, existem exemplos de códigos para MQL na base de códigos e artigos.

Quase não tenho experiência com Java, mas, se os dois computadores estiverem na mesma rede local, então os tubos nomeados - suportados pela MQL4 via FileOpen() - podem ser possíveis e mais simples.

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

 
jjc:

Quase não tenho experiência com Java, mas, se os dois computadores estiverem na mesma rede local, então os tubos nomeados - suportados pela MQL4 via FileOpen() - podem ser possíveis e mais simples.

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

Na verdade, eu não tenho experiência com tubos nomeados em Java, mas os soquetes são muito comuns em Java. Além disso, o link que você forneceu parece não poder criar o tubo nomeado a partir de Java, mas apenas para conectar a um já existente, e eles consideraram apenas a conexão interprocessada e não a solução de rede (pode ou não ser compatível, nenhuma idéia).

 
jjc:

Quase não tenho experiência com Java, mas, se os dois computadores estiverem na mesma rede local, então os tubos nomeados - suportados pela MQL4 via FileOpen() - podem ser possíveis e mais simples.

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


Inicialmente ambos os computadores estarão na mesma LAN, embora fosse interessante fazê-lo funcionar também através da Internet. Mas sim, na mesma LAN seria suficiente neste momento.


Ovo:
A maneira mais fácil (embora não fácil) de conectar o MT4 de Java seria com soquetes, existem exemplos de códigos para MQL na base de códigos e artigos.


Sim. A melhor solução que encontrei parece ser aquela que usa mt4-zeromq, mas ainda não encontrei um exemplo mostrando como usá-lo para executar uma troca. Acho que esta pode ser a melhor maneira de fazê-lo uma vez que (¿)não teria nenhum atraso(?) e poderia ser usado sob um ambiente Linux, então qualquer código de exemplo simples sobre ele seria apreciado.

No entanto, o principal problema que ainda estou vendo é o atraso: Quando eu desenvolvi algo semelhante, mas na direção oposta (o MT4 estava interagindo com um servidor externo) não havia tal problema, pois não havia novas informações entre os ticks do mercado MT4, mas neste caso eu não consigo descobrir como o MT4 será capaz de receber ordens (e executá-las) entre os ticks. Não seria um problema? Ou talvez eu esteja perdendo algo e isto não será um problema?

 
Ovo:

Na verdade, eu não tenho experiência com tubos nomeados em Java, mas os soquetes são muito comuns em Java. Além disso, o link que você forneceu parece não poder criar o tubo nomeado a partir de Java, mas apenas para conectar a um já existente, e eles consideraram apenas a conexão interprocessada e não a solução de rede (pode ou não ser compatível, nenhuma idéia).

Os "Tubos Nomeados" têm que ser criados pela extremidade MT4 primeiro, chamando as funções WinAPI. Somente então ela pode ser usada pela JAVA como um arquivo padrão. Isso não deve ser um problema, pois é exatamente isso que o OP quer, mas é apenas ideal para uma solução LAN.

Os soquetes, por outro lado, são ideais tanto para soluções LAN quanto WAN, mas exigirão um invólucro DLL para o WinAPI com funções extras de suporte para facilitar o manuseio do MT4.

No entanto, o OP só precisa "deixar seus dedos fazerem a caminhada", pois há muitas informações sobre possíveis soluções. Ele só tem que escolher qual método lhe convém melhor, seja Pips nomeados, arquivos mapeados, soquetes, ou qualquer outro:
 
Mariop: Entretanto, o principal problema que ainda estou vendo é o atraso: Quando eu desenvolvi algo semelhante, mas na direção oposta (o MT4 estava interagindo com um servidor externo) não havia tal problema, pois não havia novas informações entre os ticks do mercado MT4, mas neste caso eu não consigo descobrir como o MT4 será capaz de receber ordens (e executá-las) entre os ticks. Não seria um problema? Ou talvez eu esteja perdendo algo e isto não será um problema?

Usando o manipulador de eventos OnTimer() que não depende de carrapatos recebidos!

Mariop: A melhor solução que encontrei parece ser aquela que utiliza o mt4-zeromq, mas ainda não encontrei um exemplo mostrando como utilizá-lo para executar uma negociação.

Tente não depender de bibliotecas de terceiros. Basta codificar sua própria DLL com funções extras de suporte para facilitar o manuseio do MT4. Codifique a DLL em C e não em C#, pois ela tem dependências e não é tão eficiente quanto C.

Também crie seu próprio formato/protocolo de mensagem apropriado aos requisitos. Torne-o compacto e eficiente e mais tarde você deve codificá-lo para segurança, se necessário.

 
FMIC:

Tente não depender de bibliotecas de terceiros. Basta codificar sua própria DLL com funções extras de suporte para facilitar o manuseio das coisas para o MT4. Codifique a DLL em C e não em C#, pois ela tem dependências e não é tão eficiente quanto C.

Também crie seu próprio formato/protocolo de mensagem apropriado aos requisitos. Torne-o compacto e eficiente e mais tarde você deve codificá-lo para segurança, se necessário.

Agora temos uma resposta muito mais interessante do que a sua primeira. Eu concordo plenamente com você e esses são realmente BONS CONSELHOS. Deixei a MQL anos atrás desde que desenvolvi minha própria plataforma (eu REALMENTE precisava de algumas características específicas que não encontrei em nenhuma outra plataforma, não foi porque eu estava com vontade de passar aquela quantidade enorme de horas fazendo isso). Agora vou começar a colaborar com um corretor que trabalha exclusivamente com o MT4, portanto, preciso construir uma ponte para me conectar a ele. É por isso que estou com pressa de fazê-lo funcionar o mais rápido possível.


FMIC:

Usando o manipulador de eventos OnTimer() que não depende de carrapatos recebidos!


É verdade. Obrigado. Eu não me lembrava disso. Na verdade, isso não resolve o problema completamente, pois preciso que as ordens sejam executadas quase imediatamente (e acho que com este método só posso verificá-lo a cada segundo, mas pelo menos não a cada carrapato), mas de fato posso facilmente construir uma solução temporária usando-o.

Novamente, bons conselhos ;)