Crea la tua estensione MetaTrader (dll) - pagina 3

 

Davvero una domanda su C++...DLL esterna per MT4

Ciao a tutti,

Ho una DLL esterna che ho scritto in C++. Tuttavia, sono ancora abbastanza nuovo al C++, quindi penso che questo potrebbe essere il motivo per cui sto avendo questo problema. Ho un'altra versione che ho scritto in C# che funziona bene, tranne che per rendere le DLL C# richiamabili da MQL devo alterarle, e questa alterazione sembra causare piccole perdite di memoria. Spero che qualcuno qui possa aiutarmi con la versione C++. Ecco la storia:

Sto lentamente sviluppando varie librerie per programmare strategie di trading. Una delle cose che sto cercando di fare è sviluppare un insieme coerente di servizi per varie cose come il logging, il locking (accesso thread-safe alle risorse) e la notifica degli eventi. Quindi, in pratica, sto cercando di tirare su MQL con le sue cinghie in un paradigma di programmazione più moderno. Comunque, attualmente sto lavorando su una libreria che permetterà agli EA di ricevere la notifica di vari eventi commerciali (piazzato, riempito, chiuso). Questi eventi potrebbero essere il risultato di transazioni prese dall'EA sottoscrittore dell'evento o da altri EA. Per realizzare questo, sto usando una DLL esterna che fondamentalmente facilita la comunicazione tra gli EA tramite il passaggio di messaggi. C'è un EA di pubblicazione che cerca solo nuovi eventi commerciali e quando se ne verifica uno, mette un messaggio in una coda per l'EA sottoscrittore (ogni sottoscrittore ha la sua coda).

Quindi il problema è questo... Finché viene passato un solo messaggio alla volta, tutto funziona bene. Ovviamente questo non è assolutamente accettabile. Quando viene passato più di un messaggio alla volta, quello che sto trovando è che il primo messaggio viene corrotto (continua a restituire il messaggio come "1" quando invece dovrebbe essere qualcosa come "FILLED,1005167"). Il secondo messaggio va bene, ma il primo no. Non ho ancora testato più di due messaggi, ma presumibilmente vedremmo ancora la stessa cosa.

Mi piacerebbe molto se qualcuno sapesse la risposta a ciò che sto sbagliando e potesse far luce sul mio problema. Alcune note: 1) Alla fine rilascerò questo codice sotto Apache 2.0 e quindi anche questo file sorgente viene messo là fuori sotto Apache 2.0... ho intenzione di rilasciarlo alla comunità quando funziona abbastanza bene. 2) Ho detto ripetutamente 'coda' qui, ma se guardate il codice sorgente vedrete che sto usando un vettore invece, e fondamentalmente lo uso come uno stack. Originariamente avevo una coda, ma l'ho cambiata in un vettore solo nella remota possibilità che stessi facendo qualcosa di sbagliato con la coda STL di cui non ero a conoscenza. Non ho avuto questa fortuna. La vera implementazione sarà una coda, ma per ora né la coda né il vettore funzionano correttamente per me.

Grazie in anticipo per qualsiasi intuizione.

Brandon Wilhite

File:
 

Visto che ero qui, ho pensato di condividere la mia esperienza. Quello che vuoi fare può certamente essere fatto, e io stesso l'ho fatto molte volte.

Quando ho iniziato a scrivere DLL da usare in MT4 non sono mai riuscito a farlo funzionare in C++. Penso che il problema fosse/è che le mie impostazioni di progetto erano sempre sbagliate in Visual Studio (ce ne sono così tante). Solo recentemente ho trovato un esempio da CodeGuru, che sono stato effettivamente in grado di compilare e usare. Ora ho praticamente ripulito quel progetto e lo uso come modello.

Nel frattempo, ho scritto DLL C# e ho usato questo eccellente strumento qui. Fondamentalmente prende l'IL e lo altera in modo che possa essere chiamato da codice non gestito. L'unico problema è che MT4 sembra mostrare una perdita di memoria quando lo fa. Non ho determinato definitivamente se questo è dovuto a MT4 o all'alterazione dell'IL, o cosa, ma succede.

Il prossimo passo sarà imparare a scrivere wrapper su C++ e/o semplicemente andare avanti e imparare il C++. Speriamo che questo risolva il problema della memoria.

Comunque, quello che vuoi fare può essere sicuramente realizzato. Sono riuscito a scrivere alcune DLL piuttosto complicate per MT4 in C#, includendo cose come remoting, raw sockets, http, WinForms. Praticamente tutto ciò che si può fare con .NET può essere chiamato da MT4 in questo modo (lo nomini e probabilmente l'ho fatto). Ed è molto affidabile. L'unico problema è la perdita di memoria relativamente lenta.

Magick:
Grazie Patrick

Questa è un'idea molto interessante per usare l'FTP.

Tuttavia voglio essere in grado di interagire con MT - per inviare le informazioni di tick e candele all'app .net e questa app comunica di nuovo a MT su quando fare trading.

Ho trovato questo che pensavo potesse aiutare - Wrapper semplificato e generatore di interfaccia

Tuttavia io sono un programmatore piuttosto entry level, e non apprezzo appieno ciò che è coinvolto nell'avere un wrapper middle layer in c++.

Sarei interessato a sentire la tua opinione, se pensi che questo possa essere uno strumento utile da usare per aiutare a fare da ponte tra il c++ e .net?
 
bwilhite:
Visto che ero qui, ho pensato di condividere la mia esperienza. Quello che vuoi fare può certamente essere fatto, e io stesso l'ho fatto molte volte.

Quando ho iniziato a scrivere DLL da usare in MT4 non sono mai riuscito a farle funzionare in C++. Penso che il problema fosse/è che le mie impostazioni di progetto erano sempre sbagliate in Visual Studio (ce ne sono così tante). Solo recentemente ho trovato un esempio da CodeGuru, che sono stato effettivamente in grado di compilare e usare. Ora ho praticamente ripulito quel progetto e lo uso come modello.

Nel frattempo, ho scritto DLL C# e ho usato questo eccellente strumento qui. Fondamentalmente prende l'IL e lo altera in modo che possa essere chiamato da codice non gestito. L'unico problema è che MT4 sembra mostrare una perdita di memoria quando lo fa. Non ho determinato definitivamente se questo è dovuto a MT4 o all'alterazione dell'IL, o cosa, ma succede.

Il prossimo passo sarà imparare a scrivere wrapper su C++ e/o semplicemente andare avanti e imparare il C++. Speriamo che questo risolva il problema della memoria.

Comunque, quello che vuoi fare può sicuramente essere realizzato. Sono riuscito a scrivere alcune DLL piuttosto complicate per MT4 in C#, comprese cose come il remoting, raw sockets, http, WinForms. Praticamente tutto ciò che si può fare con .NET può essere chiamato da MT4 in questo modo (lo nomini e probabilmente l'ho fatto). Ed è molto affidabile. L'unico problema è la perdita di memoria relativamente lenta.

bwilhite sei un salvatore di vita! Sembra un grande strumento. Hai, per caso, un progetto in c# che dimostri la comunicazione con MT da C#? Quello che voglio fare è che la mia applicazione .net dica a MT quando fare trading. O forse puoi raccomandare un link che potrebbe aiutare. Qualsiasi aiuto sarebbe molto apprezzato.

 

Molte molte grazie!

 

Dll

Ciao,

La DLL può essere utilizzata per inviare e ricevere ordini tramite un foglio di calcolo excel?

Dove posso imparare questo aspetto della DLL.

Cordiali saluti

Latino

 
codersguru:
Chiunque sia interessato a creare la propria estensione MetaTrader (dll) può andare su:

Creare la propria estensione MetaTrader (dll) - Parte 1

Creare la propria estensione MetaTrader (dll) - Parte 2

Ci sarà un'altra parte (o 2) che sto scrivendo!

Spero che vi piacciano!

Per favore, aggiorna il tuo corso a Visual C++ 2008 Express Edition

 
bwilhite:
Visto che ero qui, ho pensato di condividere la mia esperienza. Quello che vuoi fare può certamente essere fatto, e io stesso l'ho fatto molte volte.

Quando ho iniziato a scrivere DLL da usare in MT4 non sono mai riuscito a farle funzionare in C++. Penso che il problema fosse/è che le mie impostazioni di progetto erano sempre sbagliate in Visual Studio (ce ne sono così tante). Solo recentemente ho trovato un esempio da CodeGuru, che sono stato effettivamente in grado di compilare e usare. Ora ho praticamente ripulito quel progetto e lo uso come modello.

Nel frattempo, ho scritto DLL C# e ho usato questo eccellente strumento qui. Fondamentalmente prende l'IL e lo altera in modo che possa essere chiamato da codice non gestito. L'unico problema è che MT4 sembra mostrare una perdita di memoria quando lo fa. Non ho determinato definitivamente se questo è dovuto a MT4 o all'alterazione dell'IL, o cosa, ma succede.

Il prossimo passo sarà imparare a scrivere wrapper su C++ e/o semplicemente andare avanti e imparare il C++. Speriamo che questo risolva il problema della memoria.

Comunque, quello che vuoi fare può sicuramente essere realizzato. Sono riuscito a scrivere alcune DLL piuttosto complicate per MT4 in C#, comprese cose come il remoting, raw sockets, http, WinForms. Praticamente tutto ciò che si può fare con .NET può essere chiamato da MT4 in questo modo (lo nomini e probabilmente l'ho fatto). Ed è molto affidabile. L'unico problema è la perdita di memoria relativamente lenta.

Sei mai stato in grado di identificare la fonte di questa perdita lenta bwilhite? Apprezzerei il tuo aiuto in questo campo, se sei ancora disposto. Al momento, sto cercando una semplice DLL mql che mi permetta di inviare e ricevere messaggi tramite socket. Ho familiarità con le basi del c#, quindi se potessi trovare un modo per trarne vantaggio, tanto meglio.

Grazie.

 
Magick:
bwilhite sei un salvatore di vita! Sembra un grande strumento. Hai, per caso, un progetto c# che dimostri la comunicazione con MT da C#? Quello che voglio fare è che la mia applicazione .net dica a MT quando fare trading. O forse puoi raccomandare un link che potrebbe aiutare. Qualsiasi aiuto sarebbe molto apprezzato.

Hai avuto fortuna con questo Magick? Questo è esattamente quello che sto cercando di fare anch'io - avere l'applicazione .net che dice a MT quando e cosa scambiare. Per favore fammi sapere se hai trovato una soluzione.

Apprezzo anche e vorrei sentire di più da bwihite. Hai qualche esempio di dll in c# che potresti condividere.

Grazie!

 

Sto lavorando alla mia DLL e mi sto imbattendo nell'errore 127.

Il file .cpp contiene (tra le altre cose):

MT4_EXPFUNC char* _stdcall DLLtest() {

return("testing!");

}

[/CODE]

header file contains:

#define MT4_EXPFUNC __declspec(dllexport)

MT4 file:

[CODE]

#import "mydll.dll"

string DLLtest();

Naturalmente non è TUTTO ciò che contengono, ma queste sono le informazioni pertinenti. Ora, in base alla mia comprensione, ho tutto lì per provare a chiamare la funzione da MT4.

Per qualche ragione, semplicemente non "vede" che esiste. Ho pensato che fosse il fatto che alla mia DLL mancasse un file .def, ma anche dopo averlo creato manualmente non funziona. Inoltre, credo che la linea MT4_EXPFUNC significhi che la funzione sarà esportata comunque, quindi un .def non è necessario. Il tutto si compila bene, l'EA funziona bene fino a quando non provo a chiamare la funzione (perché non può vederla) e poi si ferma.

Non so più cosa fare. Pensavo davvero che fosse un problema di .def, ma più ci penso, non credo che lo sia.

BTW sto usando Visual C++ 2008 Express...

Grazie per qualsiasi intuizione,

-Jason

 

Ho lo stesso errore 127 usando Visual C++ 2008 Express. Nessuna soluzione ancora, se ne trovo una, la posterò.