Discussione sull’articolo "Come Scambiare i Dati: Una DLL per MQL5 in 10 minuti"

 

Il nuovo articolo Come Scambiare i Dati: Una DLL per MQL5 in 10 minuti è stato pubblicato:

Ora, non sono così tanti gli sviluppatori che ricordano come scrivere una semplice DLL e quali sono le caratteristiche speciali dei diversi binding di sistema. Usando diversi esempi, cercherò di mostrare l'intero processo di creazione della semplice DLL in 10 minuti, oltre a discutere alcuni dettagli tecnici della nostra implementazione vincolante. Mostrerò il processo passo dopo passo della creazione di DLL in Visual Studio con esempi di scambio di diversi tipi di variabili (numeri, array, stringhe, ecc.). Inoltre spiegherò come proteggere il tuo terminale client da arresti anomali nelle DLL personalizzate.

Eseguire la procedura guidata dell'applicazione Win32 utilizzando il menu "File -> Nuovo", selezionare il tipo di progetto come "Visual C++", scegliere il modello "Applicazione console Win32" e definire il nome del progetto (ad esempio, "MQL5DLLSamples"). Selezionare una directory principale per la memorizzazione del progetto "Posizione", invece di quella offerta di default, disabilitare la casella di controllo "Crea directory per soluzione" e fare clic su "OK":

Autore: MetaQuotes

 

Un buon articolo, ma che solleva alcune grandi preoccupazioni.

5. DLL calls wrapper and loss of speed on calls

As already described above, every call of DLL functions is wrapped into a special wrapper in order to ensure safety. 
This binding masks the basic code, replaces the stack, supports stdcall / cdecl agreements and monitors exceptions within the functions called.

This work inevitably leads to delay of the calling function. 
Therefore, it isn't recommended to perform very frequent DLL function calls (hundreds or thousands of times per second) for small operations. 

It' s better to make infrequent calls.

Sono favorevole all'aggiunta di protezione per l'applicazione, ma non a scapito delle prestazioni. Questo è un altro cambiamento rispetto a MT4, in quanto le eccezioni nelle dll causano il crash di MT4, ma il codice ben scritto dovrebbe gestire questo scenario, preferirei vedere articoli sulla scrittura di codice sicuro nelle dll per superare questo tipo di problemi. Quindi ora, a causa di cattive abitudini di codifica, tutti devono pagare un costo in termini di prestazioni.

Questo è molto negativo se si dispone di librerie di algoritmi che vengono richiamati su base tick, oserei dire che li rende inutili. Dato che molti dei feedback che ho visto su MT5 non sono buoni, soprattutto a causa della necessità di riscrivere gli indicatori, ecc. questo è solo un altro elemento che causa molta frustrazione, e dato che ha un impatto sulle prestazioni immagino che altri, come me, che fanno un uso estensivo delle DLL, rimarranno con MT4 il più a lungo possibile e cercheranno un'altra piattaforma dove questo non sia un problema.

Perché Metaquotes non potrebbe aggiungere un metodo leggermente diverso per invocare le DLL in modo sicuro. Lo sviluppatore potrebbe quindi scegliere se caricarle tramite il caricamento sicuro o il caricamento ad alte prestazioni e assicurarsi di scrivere un buon codice che catturi le eccezioni.

"È meglio fare chiamate poco frequenti": che razza di affermazione è questa?

 

Ho compilato la dll usando visual c++ express 2008 ma è interessante notare che il terminale non cattura l'eccezione, ma si blocca all'interno di fnReplaceString.

La mia build del terminale è 239. Qualche indizio?



 
investeo:

Ho compilato la dll usando visual c++ express 2008 ma è interessante notare che il terminale non cattura l'eccezione, ma si blocca all'interno di fnReplaceString.

La mia build del terminale è 239. Qualche indizio?

Potete inviarmi ex5 e dll?
 
pfx:

Un buon articolo, ma che solleva alcune grandi preoccupazioni.

Sono favorevole all'aggiunta di protezione per l'applicazione, ma non a scapito delle prestazioni. Si tratta di un altro cambiamento rispetto a MT4, in quanto le eccezioni nelle dll causano il crash di MT4, ma il codice ben scritto dovrebbe gestire questo scenario; preferirei vedere articoli sulla scrittura di codice sicuro nelle dll per superare questo tipo di problemi. Quindi ora, a causa di cattive abitudini di codifica, tutti devono pagare un costo in termini di prestazioni.

Questo è molto negativo se si dispone di librerie di algoritmi che vengono richiamati su base tick, oserei dire che li rende inutili. Dato che molti dei feedback che ho visto su MT5 non sono buoni, soprattutto a causa della necessità di riscrivere gli indicatori ecc. questo è solo un altro elemento che causa molta frustrazione, e visto che ha un impatto sulle prestazioni, immagino che altri come me che fanno un uso estensivo delle DLL rimarranno con MT4 il più a lungo possibile e cercheranno un'altra piattaforma dove questo non sia un problema.

Perché Metaquotes non potrebbe aggiungere un metodo leggermente diverso per invocare le DLL in modo sicuro. Lo sviluppatore potrebbe quindi scegliere se caricarle tramite il caricamento sicuro o il caricamento ad alte prestazioni e assicurarsi di scrivere un buon codice che catturi le eccezioni.

"È meglio fare chiamate poco frequenti", cioè, seriamente, che razza di affermazione è questa?

Non c'è da stupirsi che questa comunità abbia difficoltà a trovare articoli decenti. Qualsiasi buon scrittore non si prenderebbe la briga di dedicare del tempo a scrivere qui. Perché dovrebbero? Fanno qualcosa di decente come mostrare come incorporare le dll e stabilire una comunicazione, poi arriva qualcuno e li butta giù dall'albero.

Da quello che posso vedere, ha fatto un lavoro decente sull'articolo, quindi forse le prestazioni non sono quelle che dovrebbero essere, ma la domanda o il problema qui è: se è così brutto e voi fate parte di questa comunità, perché non cercate di codificare una soluzione a quello che avete trovato come un ovvio problema di prestazioni?

Va bene che ne parliate, ma non serve a nulla lamentarsi se non si è disposti a presentare soluzioni o suggerimenti su come raggiungere l'obiettivo.

L'articolo ha messo in luce dei rischi, sì, credo che ne abbiamo avuto anche un esempio quando un'altra persona ha detto: "Ehi, l'ho scaricato e ho questo problema", che è esattamente il problema di cui si parlava nell'articolo.Credo che se dovessi ampliare l'articolo, sarebbe come hai detto tu PFX, mostrando come interagire in modo sicuro. Tuttavia, l'autore ha esposto il rischio, lasciando molto spazio a qualcuno come te per ampliarlo, grazie al concetto stesso di SICUREZZA.

Una nota personale per l'autore: quando scrivete di argomenti cercate di evitare termini come newbie, che sono offensivi e degradanti e non sono un modo professionale di parlare di coloro che volete far seguire alla vostra saggezza.

 

Sto cercando di capire se con questa funzionalità di importazione di dll sarò in grado di importare dll scritte in altri linguaggi come C#. È possibile? Se no, perché no?

Qual è la differenza tra una dll C++ e una dll C#.

 
ToolMaker:

Qual è la differenza tra una dll in C++ e una dll in C#.

La differenza principale è la progettazione. L'assembly della dll in C# è usato per memorizzare codice gestito, mentre la dll in C++ contiene codice nativo.

Ma c'è un trucco che rende possibile l'importazione di assembly: Inverse P/Invoke.

Per quanto mi riguarda, sono abituato a scrivere il wrapper dll di c++ per questo scopo o a scrivere tutto il codice gestito usando c++.

 

Potete mostrarmi come importare la struttura nella libreria C++?

Vorrei aggiungere questo codice a MQL5DLLSample.cpp:
------------------------
struct MqlTick

{
INT64 Time;
double Bid;
double Ask;
double Last;
UINT64 Volume;
};

_DLLAPI MqlTick __stdcall MyTick(MqlTick &my)
{
my.Bid = 1;
return(my);
}
------------------------

Poi, aggiungo questo codice a MQL5DLL Test.mq5 (sezione import)

MqlTick MyTick(MqlTick &tick);

e lo chiamo in OnTick()

MqlTick tick;
SymbolInfoTick("GBPUSD", tick);
MyTick(tick);
Print("My tick: ",tick.bid);
------------------------

La compilazione della libreria c++ e dell'EA avviene senza errori.

Dopo aver chiamato la funzione MyTick(tick) nel terminale ottengo un errore: MQL5DLL_Test (EURUSD,M1) Violazione dell'accesso in scrittura a 0x00000008

 

Salve e grazie per questo utile articolo.

Ho provato a creare una piccola dll per scambiare dati tra mql5 e mysql.

Ho seguito i vari passaggi e ho avuto alcuni errori.

La dll è in c++

La prima è stata compilata con minGW

Ex5 non poteva aprirla perché non era una dll compilata a 64 bit.

Quindi ho compilato con minGW a 64 bit

La mia prima dll (che era molto semplice) funziona

Fa qualche aggiunta ecc.

Quando provo a usare la libreria mysql, posso compilare la mia dll senza problemi.

Ma quando provo ad aprire l'ex5 chiamandolo ottengo il seguente errore:

Impossibile aprire C:\user......\DLLNAME.dll (193)

Avete qualche idea per risolvere questo problema?

Grazie mille

 

Ciao a tutti,

ottimo articolo!


ma mi chiedevo se qualcuno può aiutarmi a fare la cosa descritta in questo articolo un po' al contrario: ottenere i dati (ticks o barre) nel programma C++ da metatrader?

 

Ho ottenuto questo risultato con un array int standard, ma è possibile passare un CArrayObj / CArrayDouble in Visual Studio C++?