Inviare ordini a MT4 da Java via IP

 

Salve,

C'è un modo per inviare semplici ordini (solo BUY, SELL, CLOSE) a MT4 da un altro computer (che sta eseguendo un'applicazione Java) via IP?

Non ho bisogno di una comunicazione bidirezionale, solo unidirezionale.

Grazie in anticipo.

 
Mariop: C'è un modo per inviare semplici ordini (solo BUY, SELL, CLOSE) a MT4 da un altro computer (che esegue un'applicazione Java) via IP? Non ho bisogno di una comunicazione bidirezionale, solo unidirezionale.

Sì, ma un'interfaccia per le comunicazioni tra processi deve essere codificata, perché non è qualcosa di disponibile built-in. Una codifica che richiede conoscenza ed esperienza e non è qualcosa che un principiante come te sarà in grado di affrontare molto facilmente.

Quindi andate nella sezione Freelance e assumete qualcuno qualificato che lo faccia per voi, ma dubito che sarà economico.

 
:) Grazie per la tua risposta.
Tuttavia penso di non essere un principiante, infatti ho già fatto cose più complicate con C# anni fa tramite TradePlatform.NET, ma questa volta ho bisogno di inviarli (gli ordini) da un programma Java. Quindi se c'è un modo che MT4 sia in grado di ricevere ordini nel modo che ho chiesto, sto ancora aspettando risposte più interessanti.
 

Vi ho già dato la risposta più appropriata! È sempre possibile utilizzare i file in rete come metodo di comunicazione, ma questo sarebbe lento e ingombrante.

Il fatto che lei abbia fatto questa domanda, dice che per quanto riguarda l'ambiente di programmazione MetaTrader/MQL, lei è relativamente meno esperto di MQL/MetaTrader. Dico questo perché se tu fossi molto abile in MQL e WinAPI, avresti già conosciuto le varie soluzioni IPC tramite canali, named pipes, TCP/IP, ecc. - la maggior parte delle quali sono implementate tramite librerie DLL, ma non necessariamente.

 
Il modo più semplice (anche se non facile) per collegare MT4 da Java sarebbe con i socket, ci sono codici di esempio per MQL nella base di codice e articoli.
 
Ovo:
Il modo più semplice (anche se non facile) per collegare MT4 da Java sarebbe con i socket, ci sono codici di esempio per MQL nella base di codice e negli articoli.

Non ho quasi nessuna esperienza di Java, ma, se i due computer sono sulla stessa rete locale, allora le named pipes - supportate da MQL4 tramite FileOpen() - potrebbero essere possibili e più semplici.

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

 
jjc:

Non ho quasi nessuna esperienza di Java, ma, se i due computer sono sulla stessa rete locale, allora le named pipes - supportate da MQL4 tramite FileOpen() - potrebbero essere possibili e più semplici.

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

In realtà, non ho esperienza di named pipes in Java, ma i socket sono molto comuni in Java. Inoltre, il link che hai fornito sembra che non si possa creare la named pipe da Java, ma solo connettersi a una esistente, e hanno considerato solo la connessione interprocesso piuttosto che la soluzione di networing (potrebbe essere compatibile o meno, non ne ho idea).

 
jjc:

Non ho quasi nessuna esperienza di Java, ma, se i due computer sono sulla stessa rete locale, allora le named pipes - supportate da MQL4 tramite FileOpen() - potrebbero essere possibili e più semplici.

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


Inizialmente entrambi i computer saranno sulla stessa LAN, anche se sarebbe interessante farlo funzionare anche attraverso Internet. Ma sì, sulla stessa LAN sarebbe sufficiente per ora.


Ovo:
Il modo più semplice (anche se non facile) per collegare MT4 da Java sarebbe con i socket, ci sono codici di esempio per MQL nella base di codice e articoli.


Sì. La soluzione migliore che ho trovato sembra essere quella che usa mt4-zeromq, ma non ho ancora trovato un esempio che mostri come usarlo per eseguire un trade. Penso che questo possa essere il modo migliore per farlo poiché (¿)non avrebbe alcun ritardo(?) e potrebbe essere usato sotto un ambiente Linux, quindi qualsiasi semplice esempio di codice sarebbe apprezzato.

Comunque il problema principale che sto ancora vedendo è il ritardo: Quando ho sviluppato qualcosa di simile ma nella direzione opposta (MT4 stava interagendo con un server esterno) non c'era questo problema poiché non c'erano nuove informazioni tra i tick di mercato di MT4, ma in questo caso non riesco a capire come MT4 sarà in grado di ricevere ordini (ed eseguirli) tra i tick. Non sarebbe un problema? O forse mi manca qualcosa e questo non sarà un problema?

 
Ovo:

In realtà, non ho esperienza con le named pipe in Java, ma i socket sono molto comuni in Java. Inoltre, il link che hai fornito sembra che non si possa creare la named pipe da Java, ma solo connettersi a una esistente, e hanno considerato solo la connessione interprocesso piuttosto che la soluzione di networing (potrebbe essere compatibile o meno, non ne ho idea).

Le "Named Pipes" devono essere create prima dall'estremità di MT4, chiamando le funzioni WinAPI. Solo allora può essere usato da JAVA come file standard. Questo non dovrebbe essere un problema, perché è esattamente quello che vuole l'OP, ma è ideale solo per una soluzione LAN.

Sockets, d'altra parte è ideale sia per soluzioni LAN che WAN, ma richiederà un wrapper DLL per la WinAPI con funzioni di supporto extra per rendere più facile per MT4 gestire le cose.

Comunque, l'OP ha solo bisogno di "lasciare che le sue dita facciano il loro lavoro" dato che ci sono un sacco di informazioni là fuori sulle possibili soluzioni. Deve solo scegliere quale metodo gli conviene di più, che sia Named Pips, Mapped Files, Sockets o altro:
 
Mariop: Comunque il problema principale che continuo a vedere è il ritardo: Quando ho sviluppato qualcosa di simile ma nella direzione opposta (MT4 stava interagendo con un server esterno) non c'era questo problema poiché non c'erano nuove informazioni tra i tick del mercato MT4, ma in questo caso non riesco a capire come MT4 sarà in grado di ricevere ordini (ed eseguirli) tra i tick. Non sarebbe un problema? O forse mi manca qualcosa e questo non sarà un problema?

Usando il gestore di eventi OnTimer() che non dipende dai tick in arrivo!

Mariop: La migliore soluzione che ho trovato sembra essere quella che usa mt4-zeromq, ma non ho ancora trovato un esempio che mostri come usarlo per eseguire un trade.

Cerca di non dipendere da librerie di terze parti. Semplicemente codificate la vostra DLL con funzioni di supporto extra per facilitare la gestione delle cose per MT4. Codificate la DLL in C e non in C# perché ha dipendenze e non è efficiente come il C.

Inventate anche il vostro formato/protocollo di messaggio appropriato ai requisiti. Rendetelo compatto ed efficiente e in seguito dovreste crittografarlo per la sicurezza, se necessario.

 
FMIC:

Cercate di non dipendere da librerie di terze parti. Semplicemente codificate la vostra DLL con funzioni di supporto extra al fine di facilitare la gestione delle cose per MT4. Codificate la DLL in C e non in C# perché ha dipendenze e non è efficiente come il C.

Inventate anche il vostro formato/protocollo di messaggio appropriato ai requisiti. Rendetelo compatto ed efficiente e in seguito dovreste crittografarlo per la sicurezza, se necessario.

Ora abbiamo una risposta molto più interessante della tua prima. Sono assolutamente d'accordo con te e questi sono davvero BUONI CONSIGLI. Ho lasciato MQL anni fa perché ho sviluppato la mia piattaforma (avevo DAVVERO bisogno di alcune caratteristiche specifiche che non ho trovato su nessun'altra piattaforma, non perché fossi dell'umore di spendere un'enorme quantità di ore per farlo). Ora sto per iniziare a collaborare con un broker che lavora esclusivamente con MT4, quindi ho bisogno di costruire un ponte per collegarmi ad esso. Ecco perché ho fretta di farlo funzionare il prima possibile.


FMIC:

Utilizzando il gestore di eventi OnTimer() che non dipende dai tick in arrivo!


È vero. Grazie. Non me lo ricordavo. In realtà non risolve completamente il problema poiché ho bisogno che gli ordini siano eseguiti quasi immediatamente (e penso che con questo metodo posso controllarlo solo ogni secondo, ma almeno non ogni tick), ma in effetti posso facilmente costruire una soluzione temporanea usandolo.

Di nuovo, buoni consigli ;)

Motivazione: