Sviluppato una libreria di funzioni API per MetaTrader 4 - pagina 5

 
A proposito, ora quello che offre Min è più simile a quello che si può comprare di prima. <br / translate="no"> Puramente imho :)

Grazie! In attesa di suggerimenti commerciali. Buona fortuna!
 
È difficile chiamarlo API. Biblioteca + EA. Funziona MOLTO lentamente.
 
...
 
Domanda allo sviluppatore della libreria: perché la velocità di ottenere le citazioni quando si usa la vostra libreria è ancora più lenta di quando si lavora attraverso i file temporanei? Qual è allora il vantaggio di usare la memoria condivisa? <br/ translate="no">

Cosa intende per velocità di ottenere preventivi? Se si tratta di ottenere tick allora ho già scritto che lavorare con i tick delle quotazioni anche direttamente in MT4 è difficile.
La biblioteca non è stata originariamente progettata per catturare le zecche. Ha a che fare con il fatto che il sistema può semplicemente bloccarsi quando il mercato è molto attivo, perché non può stare al passo con i tick. Ecco perché la biblioteca ha una protezione software incorporata contro la valanga di zecche.
I vantaggi di usare la memoria condivisa sono l'alta affidabilità di un tale sistema e l'assenza di intasamento del disco rigido. Inoltre, diversi programmi possono accedere alla libreria, e non hanno bisogno di "sapere" la posizione esatta dei file temporanei. Buona fortuna!
 
Quando il mercato è molto attivo, il sistema può semplicemente bloccarsi a causa dell'incapacità di tenere il passo con i tick. Ecco perché nella libreria c'è una protezione software incorporata contro la valanga di tick.


sembra che l'autore abbia esagerato :)
per quanto ho capito, se l'EA è all'interno della funzione start() (e da lì invia informazioni su un tick al client API), allora MT non darà un nuovo tick finché l'EA non lascia la funzione start(). Ecco perché non è chiaro come possa verificarsi una valanga di tick?

se l'EA è in loop e riceve i tick tramite RefreshRates, allora prima dovrebbe uscire dall'API client, e poi avverrà la chiamata di RefreshRates. Ecco perché nemmeno qui c'è posto per congelare.

Il vantaggio di usare la memoria condivisa è l'alta affidabilità di un tale sistema

sembra bello, ma non è l'unico modo di comunicazione tra processi.
così l'argomento "Qual è il punto dell'uso della memoria condivisa?" non è risolto :)

imho, MMF è buono solo in un caso in cui è necessario pompare grandi quantità di dati tra i processi - la velocità di pompaggio è ~150Mb/sec. (un paio di mesi fa ho dovuto fare tale meccanismo solo con MMF, perché secondo i test questo è il modo più veloce).

in questo compito (parametri di trasferimento per OrderSend ecc.) - è come un uccello attraverso una piuma, più facile creare una finestra e usare SendMessage con wm_copydata.
 
sembra solido, ma non è l'unico modo di comunicazione interprocesso. <br / translate="no"> quindi l'argomento "...Qual è il vantaggio di usare la memoria condivisa allora?" non è risolto :)

Non credo di sostenere che l'algoritmo utilizzato sia il migliore. Questo è il bello della programmazione, che un tale problema può essere risolto in almeno una dozzina di modi. Anche la variante con i file temporanei era completamente funzionante. Il mio compito era quello di sviluppare un sostituto affidabile, funzionante e completamente funzionale per l'API MT3. Ora la biblioteca lavora con il programma di trading pratico per circa mezzo anno. E il problema principale qui non era il raggiungimento della massima velocità, ma l'affidabilità e la corretta risposta a un gran numero di situazioni di emergenza. Quindi, grazie per i vostri commenti, sono abbastanza appropriati, ma questa è "un'altra storia". Buona fortuna!
 
Ciao, quindi il problema principale al momento è il collegamento:

Includere la libreria di importazione Mforex2.lib nel progetto (per Delpi - basta descrivere le funzioni della libreria),
Specificare il file header Mforex.h nel programma principale (per esempio: #include "Mforex.h" - solo per Builder C++);

Questi 2 punti sono misteriosi per me perché Omega è un programma pronto, tutti gli altri file li ho messi come descritto, ho prescritto la funzione per avviare MT4, e all'inizio ho ricevuto il messaggio che è necessario prescrivere il percorso esatto, ma ho anche prescritto il percorso. Non so cosa fare dopo.
 
Includere nel progetto importare la libreria Mforex2.lib (per Delpi - descrivere solo le funzioni della libreria),<br/ translate="no"> Specificare nel file header del programma principale Mforex.h (per esempio: #include "Mforex.h" - solo per Builder C++);
Questi 2 punti mi lasciano perplesso perché Omega è un programma già pronto, tutti gli altri file li ho messi come descritto, ho prescritto la funzione di avvio di MT4 e all'avvio ho ricevuto il messaggio che è necessario prescrivere il percorso esatto, ma anche io ho prescritto il percorso. Non so cosa fare dopo.

Omega ha la possibilità di importare funzioni da DLL esterne. Pertanto, dovreste specificare Mforex2.dll come libreria esterna. Allo stesso tempo, questo file dovrebbe essere nel "campo visivo" dei programmi Omega. Nelle procedure di chiamata, specificate il nome delle funzioni importate dalla DLL, come indicato nella documentazione. Notate anche che Omega "non conosce" le definizioni del file Mforex.h. Cioè, per esempio, quando si chiama la funzione di apertura di una posizione, è necessario specificare il codice dell'operazione, per esempio, Sell - 1, piuttosto che OP_SELL, ecc. Per maggiori dettagli, vedere la documentazione di DevKit, che descrive il modo in cui omega lavora con le librerie esterne.
Buona fortuna!
 
<br / translate="no"> È possibile importare funzioni da DLL esterne in Omega. Pertanto Mforex2.dll dovrebbe essere specificato come libreria esterna. Allo stesso tempo, questo file deve essere "in vista" dei programmi Omega. Nelle procedure di chiamata, specificate il nome delle funzioni importate dalla DLL, come indicato nella documentazione. Notate anche che Omega "non conosce" le definizioni del file Mforex.h. Cioè, per esempio, quando si chiama la funzione di apertura di una posizione, è necessario specificare il codice dell'operazione, per esempio, Sell - 1, piuttosto che OP_SELL, ecc. Per maggiori dettagli, vedere la documentazione di DevKit, che descrive il modo in cui omega lavora con le librerie esterne.
Buona fortuna!


Così ho prescritto il seguente in Omega:

DefineDLLfunc: "Mforex2.dll", int, "Start"; {chiamataDLL}
_gbp = Start(); {funzione di avvio del terminale}

Ma tu dici che qui dovremmo scrivere qualcos'altro invece di "Start()", ho capito bene?
 
<br/ translate="no"> Così ho prescritto il seguente in Omega:

DefineDLLfunc: "Mforex2.dll", int, "Start"; {call DLL}
_gbp = Start(); {funzione di avvio del terminale}

Ma tu dici che invece di "Start()" si dovrebbe scrivere qualcos'altro, ho ragione?

Mi rispondo da solo: non dovresti scrivere qualcos'altro al posto di "Start()" - è vero, Omega avvia MT4 senza problemi.

Ma è un po' più complicato nella funzione di apertura della posizione, quindi ho prescritto la funzione:

Input: Symbol(NumericSimple), Order(NumericSimple), Lot(NumericSimple),
price(NumericSimple), sl(NumericSimple), tp(NumericSimple);


DefineDLLfunc: "Mforex2.dll", int, "NewPos",char, int, int, double, double, double;

_NewPos = NewPos(Symbol, Order, Lot, price, sl, tp);

Logicamente tutto corrisponde alla descrizione del produttore, ma in pratica abbiamo problemi: tutto è impostato in numeri...
Motivazione: