Créez votre propre extension MetaTrader (dll) - page 3

 

Une question sur le C++... DLL externe pour MT4

Bonjour à tous,

J'ai une DLL externe que j'ai écrite en C++. Cependant, je suis encore assez novice en C++, donc je pense que c'est peut-être la raison pour laquelle j'ai ce problème. J'ai une autre version que j'ai écrite en C# et qui fonctionne bien, sauf que pour rendre les DLL C# appelables par MQL, je dois les modifier, et cette modification semble causer de petites fuites de mémoire. J'espère que quelqu'un ici pourra m'aider avec la version C++. Voici l'histoire :

J'ai lentement développé diverses bibliothèques pour la programmation de stratégies de trading. L'une des choses que j'essaie de faire est de développer un ensemble cohérent de services pour diverses choses comme la journalisation, le verrouillage (accès aux ressources sans risque pour les fils) et la notification d'événements. En gros, j'essaie de tirer MQL par les bretelles vers un paradigme de programmation plus moderne. Quoi qu'il en soit, je travaille actuellement sur une bibliothèque qui permettra aux EA de recevoir une notification de divers événements de transaction (placé, rempli, fermé). Ces événements peuvent être le résultat de transactions effectuées par l'EA qui s'abonne aux événements ou par d'autres EA. Pour ce faire, j'utilise une DLL externe qui facilite essentiellement la communication entre les EA via le passage de messages. Il existe un EA de publication qui se contente de rechercher les nouveaux événements commerciaux et, lorsqu'un événement se produit, il place un message dans une file d'attente pour l'EA d'abonnement (chaque abonné a sa propre file d'attente).

Le problème est le suivant... Tant qu'un seul message est transmis à la fois, tout fonctionne bien. Mais évidemment, ce n'est pas du tout acceptable. Lorsque plus d'un message est transmis à la fois, je constate que le premier message est corrompu (il renvoie le message comme "1" alors qu'il devrait être quelque chose comme "FILLET,1005167"). Le deuxième message est correct, mais pas le premier. Je n'ai pas encore testé plus de deux messages, mais je présume que la même chose se produirait.

J'aimerais beaucoup que quelqu'un sache ce que je fais de travers et puisse m'éclairer sur mon problème. Quelques notes : 1) Je vais éventuellement publier ce code sous Apache 2.0 et donc ce fichier source est également mis en ligne sous Apache 2.0... J'ai l'intention de le diffuser à la communauté quand il fonctionnera assez bien. 2) J'ai dit à plusieurs reprises 'queue' ici, mais si vous regardez le code source, vous verrez que j'utilise un vecteur à la place, et que je l'utilise essentiellement comme une pile. A l'origine, j'avais une file d'attente, mais je l'ai changé en vecteur juste au cas où je ferais quelque chose de mal avec la file d'attente STL dont je n'étais pas conscient. Pas de chance. L'implémentation réelle sera une file d'attente, mais pour l'instant, ni la file d'attente ni le vecteur ne fonctionnent correctement pour moi.

Merci d'avance pour toute information complémentaire.

Brandon Wilhite

Dossiers :
 

Puisque j'étais ici, j'ai pensé que je pourrais partager mon expérience. Ce que vous voulez faire est certainement réalisable, et je l'ai moi-même fait à plusieurs reprises.

Lorsque j'ai commencé à écrire des DLL pour MT4, je n'ai jamais réussi à les faire fonctionner en C++. Je pense que le problème était/est que mes paramètres de projet étaient toujours incorrects dans Visual Studio (il y en a tellement de d@$%). Tout récemment, j'ai trouvé un exemple de CodeGuru, que j'ai pu compiler et utiliser. Maintenant, j'ai essentiellement nettoyé ce projet et je l'utilise comme modèle.

Entre-temps, j'ai écrit des DLL en C# et j'ai utilisé cet excellent outil ici. Il prend essentiellement l'IL et le modifie pour qu'il puisse être appelé à partir d'un code non géré. Le seul problème est que MT4 semble présenter une fuite de mémoire lors de cette opération. Je n'ai pas encore déterminé avec certitude si cela est dû à MT4 ou à la modification de l'IL, ou quoi que ce soit, mais cela arrive.

Ensuite, je vais soit apprendre à écrire des wrappers sur C++, soit me lancer et apprendre le C++. J'espère que cela résoudra le problème de la mémoire.

Quoi qu'il en soit, ce que vous voulez faire est tout à fait réalisable. J'ai réussi à écrire des DLLs assez compliquées pour MT4 en C#, incluant des choses comme le remoting, les sockets bruts, http, WinForms. A peu près tout ce que vous pouvez faire avec .NET peut être appelé depuis MT4 de cette façon (vous le dites, et je l'ai probablement fait). Et c'est très fiable. Le seul problème est la fuite de mémoire relativement lente.

Magick:
Merci Patrick

C'est une idée très intéressante d'utiliser le FTP.

Cependant, je veux être en mesure d'interagir avec MT - pour envoyer les informations tick et candle à l'application .net et que cette application communique en retour à MT pour savoir quand trader.

J'ai trouvé ceci qui pourrait m'aider - Simplified Wrapper and Interface Generator (Générateur d'interface et de wrapper simplifié)

Cependant, je suis un programmeur plutôt débutant, et je n'apprécie pas pleinement ce qu'implique une couche intermédiaire de wrapper c++.

Je serais intéressé d'entendre votre opinion, si vous pensez que cela pourrait être un outil utile à utiliser pour aider à faire le pont entre le c++ et le .net ?
 
bwilhite:
Puisque j'étais ici, j'ai pensé que je pourrais partager mon expérience. Ce que vous voulez faire peut certainement être fait, et je l'ai fait moi-même à plusieurs reprises.

Lorsque j'ai commencé à écrire des DLL pour MT4, je n'ai jamais réussi à les faire fonctionner en C++. Je pense que le problème était/est que mes paramètres de projet étaient toujours incorrects dans Visual Studio (il y en a tellement de d@$%). Tout récemment, j'ai trouvé un exemple de CodeGuru, que j'ai pu compiler et utiliser. Maintenant, j'ai essentiellement nettoyé ce projet et je l'utilise comme modèle.

Entre-temps, j'ai écrit des DLL en C# et j'ai utilisé cet excellent outil ici. Il prend essentiellement l'IL et le modifie pour qu'il puisse être appelé à partir de code non géré. Le seul problème est que MT4 semble présenter une fuite de mémoire lors de cette opération. Je n'ai pas encore déterminé avec certitude si cela est dû à MT4 ou à la modification de l'IL, ou quoi que ce soit, mais cela arrive.

Ensuite, je vais soit apprendre à écrire des wrappers sur C++, soit me lancer et apprendre le C++. J'espère que cela résoudra le problème de la mémoire.

Quoi qu'il en soit, ce que vous voulez faire peut certainement être accompli. J'ai réussi à écrire des DLLs assez compliquées pour MT4 en C#, y compris des choses comme le remoting, les sockets bruts, http, WinForms. A peu près tout ce que vous pouvez faire avec .NET peut être appelé depuis MT4 de cette façon (vous le dites, et je l'ai probablement fait). Et c'est très fiable. Le seul problème est la fuite de mémoire relativement lente.

bwilhite, vous me sauvez la vie ! Cet outil a l'air génial. Avez-vous, par hasard, un projet C# qui démontre la communication avec MT depuis C# ? Ce que je veux faire, c'est que mon application .net dise à MT quand négocier. Ou peut-être pouvez-vous me recommander un lien qui pourrait m'aider. Toute aide serait grandement appréciée.

 

Merci beaucoup !

 

Dll

Bonjour ,

La DLL peut-elle être utilisée pour envoyer et recevoir des ordres via une feuille de calcul Excel ?

Où puis-je apprendre cet aspect de la DLL ?

Bien à vous

Latino

 
codersguru:
Toute personne intéressée par la création de sa propre extension MetaTrader (dll) peut se rendre sur le site :

Créer votre propre extension MetaTrader (dll) - Partie 1

Créer votre propre extension MetaTrader (dll) - Partie 2

Il y aura une autre partie (ou 2) que je suis en train d'écrire !

J'espère que vous les apprécierez !

S'il vous plaît, mettez à jour votre cours à Visual C++ 2008 Express Edition

 
bwilhite:
Puisque j'étais ici, j'ai pensé que je pourrais partager mon expérience. Ce que vous voulez faire peut certainement être fait, et je l'ai fait moi-même à plusieurs reprises.

Lorsque j'ai commencé à écrire des DLL pour MT4, je n'ai jamais réussi à les faire fonctionner en C++. Je pense que le problème était/est que mes paramètres de projet étaient toujours incorrects dans Visual Studio (il y en a tellement de d@$%). Tout récemment, j'ai trouvé un exemple de CodeGuru, que j'ai pu compiler et utiliser. Maintenant, j'ai essentiellement nettoyé ce projet et je l'utilise comme modèle.

Pendant ce temps, j'ai écrit des DLL en C# et j'ai utilisé cet excellent outil ici. Il prend essentiellement l'IL et le modifie pour qu'il puisse être appelé à partir d'un code non géré. Le seul problème est que MT4 semble présenter une fuite de mémoire lors de cette opération. Je n'ai pas encore déterminé avec certitude si cela est dû à MT4 ou à la modification de l'IL, ou quoi que ce soit, mais cela arrive.

Ensuite, je vais soit apprendre à écrire des wrappers sur C++, soit me lancer et apprendre le C++. J'espère que cela résoudra le problème de la mémoire.

Quoi qu'il en soit, ce que vous voulez faire peut certainement être accompli. J'ai réussi à écrire des DLLs assez compliquées pour MT4 en C#, y compris des choses comme le remoting, les sockets bruts, http, WinForms. Pratiquement tout ce que vous pouvez faire avec .NET peut être appelé à partir de MT4 de cette façon (vous le dites, et je l'ai probablement fait). Et c'est très fiable. Le seul problème est la fuite de mémoire relativement lente.

Avez-vous été en mesure d'identifier la source de cette fuite lente bwilhite ? J'apprécierais votre aide dans ce domaine si vous êtes toujours disposé à le faire. Pour l'instant, je cherche une simple dll mql qui me permettra d'envoyer et de recevoir des messages via des sockets. Je suis familier avec les bases de c#, donc si je pouvais trouver un moyen d'en tirer profit, tant mieux.

Merci.

 
Magick:
bwilhite vous êtes un sauveur de vie ! Cet outil a l'air génial. Avez-vous, par hasard, un projet c# qui démontre la communication avec MT depuis C# ? Ce que je veux faire, c'est que mon application .net dise à MT quand négocier. Ou peut-être pouvez-vous me recommander un lien qui pourrait m'aider. Toute aide serait grandement appréciée.

Avez-vous eu de la chance avec cette Magick ? C'est exactement ce que je cherche à faire aussi - avoir l'application .net qui dit à MT quand et quoi négocier. Faites-moi savoir si vous avez trouvé une solution.

J'apprécie également et j'aimerais en savoir plus sur bwihite. Avez-vous des exemples de dlls c# que vous pourriez partager ?

Merci !

 

J'ai travaillé sur ma propre DLL, et je rencontre l'erreur 127.

Le fichier .cpp contient (entre autres choses) :

MT4_EXPFUNC char* _stdcall DLLtest() {

return("testing!");

}

[/CODE]

header file contains:

#define MT4_EXPFUNC __declspec(dllexport)

MT4 file:

[CODE]

#import "mydll.dll"

string DLLtest();

Bien sûr, ce n'est pas TOUT ce qu'il contient, mais c'est l'information pertinente. Maintenant, d'après ce que j'ai compris, j'ai tout ce qu'il faut pour essayer d'appeler la fonction à partir de MT4.

Pour une raison quelconque, il ne "voit" pas qu'elle existe. Je pensais que c'était dû au fait que ma DLL n'avait pas de fichier .def, mais même après en avoir créé un manuellement, cela ne fonctionne toujours pas. De plus, je crois que la ligne MT4_EXPFUNC signifie que la fonction sera exportée de toute façon, donc un fichier .def n'est pas nécessaire. Le tout se compile bien, l'EA fonctionne bien jusqu'à ce que j'essaie d'appeler la fonction (car elle ne peut pas la voir) et ensuite elle s'arrête.

Je ne sais plus où donner de la tête. Je pensais vraiment que c'était un problème de .def, mais plus j'y pense, plus je crois que ce n'est pas le cas.

En passant, j'utilise Visual C++ 2008 Express...

Merci pour votre aide,

-Jason

 

J'ai obtenu la même erreur 127 en utilisant Visual C++ 2008 Express. Pas encore de solution, si j'en trouve une, je la posterai.