Discussion de l'article "Comment Échanger des Données : Une DLL pour MQL5 en 10 minutes"

 

Un nouvel article Comment Échanger des Données : Une DLL pour MQL5 en 10 minutes a été publié :

Maintenant, peu de développeurs se rappellent de la façon d'écrire une DLL simple et des caractéristiques spéciales des différentes liaisons système. À l'aide de plusieurs exemples, je vais tenter de montrer l'ensemble du processus de création de la DLL simple en 10 minutes, ainsi que de discuter de certains détails techniques de notre implémentation de liaison. Je vais montrer étape par étape le processus de la création de DLL dans Visual Studio avec des exemples d'échange de différents types de variables (nombres, tableaux, chaînes, etc.). En outre, je vais vous expliquer comment protéger votre terminal client des plantages dans les DLL personnalisées.

Exécutez l'assistant d'application Win32 à l'aide du menu 'Fichier -> Nouveau', sélectionnez le type de projet comme 'Visual C++', choisissez le modèle 'Win32 Console Application' et définissez le nom du projet (par exemple, 'MQL5DLLSamples'). Sélectionnez un répertoire racine pour stocker le projet «Emplacement», au lieu de celui proposé par défaut, décochez la case «Créez un répertoire pour la solution» et cliquez sur «OK» :

Auteur : MetaQuotes

 

Il s'agit d'un autre changement par rapport à MT4, car les exceptions dans les dll provoquent le plantage de MT4.

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.

Je suis tout à fait d'accord pour ajouter une protection à l'application, mais pas au détriment des performances. C'est un autre changement par rapport à MT4, car les exceptions dans les dll font planter MT4, mais un code bien écrit devrait gérer ce scénario, je préférerais voir des articles sur l'écriture d'un code sûr dans les dll pour surmonter ce genre de problèmes. Donc maintenant, en raison de mauvaises habitudes de codage, tout le monde doit payer un coût en termes de performances.

Je ne suis pas sûr que ce soit le cas, mais j'ai l'impression qu'il s'agit d'un problème de performance, et j'imagine que ceux qui, comme moi, utilisent beaucoup de DLL resteront sur MT4 aussi longtemps que possible et chercheront une autre plateforme où ce problème ne se posera pas.

Pourquoi Metaquotes ne pourrait-il pas simplement ajouter une méthode légèrement différente pour invoquer les DLL de manière sûre. Le développeur pourrait alors choisir de charger via un chargement sûr ou un chargement performant et s'assurer qu'il écrit un bon code qui attrape les exceptions.

"Il est préférable de faire des appels peu fréquents" Je veux dire sérieusement quel genre d'affirmation est-ce là ?

 

J'ai compilé la dll en utilisant visual c++ express 2008 mais il est intéressant de noter que le terminal n'attrape pas l'exception, mais se plante à l'intérieur de fnReplaceString.

Ma compilation dans le terminal est 239. Des indices ?



 
investeo:

J'ai compilé la dll en utilisant visual c++ express 2008, mais il est intéressant de noter que le terminal n'attrape pas l'exception, mais se plante à l'intérieur de fnReplaceString.

Ma compilation dans le terminal est 239. Des indices ?

Pouvez-vous m'envoyer l'ex5 et la dll ?
 
pfx:

Bon article, mais qui soulève de grandes inquiétudes.

Je suis tout à fait d'accord pour ajouter une protection à l'application, mais pas au détriment des performances. C'est un autre changement par rapport à MT4, car les exceptions dans les dll font planter MT4, mais un code bien écrit devrait gérer ce scénario, je préférerais voir des articles sur l'écriture d'un code sûr dans les dll pour surmonter ce genre de problèmes. Donc maintenant, à cause de mauvaises habitudes de codage, tout le monde doit payer un coût de performance.

Je ne suis pas sûr que ce soit le cas, mais je pense que c'est une bonne chose, et je pense que c'est une bonne chose, et je pense que c'est une bonne chose, mais je pense que c'est une bonne chose, et je pense que c'est une bonne chose, et je pense que c'est une bonne chose, et je pense que c'est une bonne chose, et je pense que c'est une bonne chose, et je pense que c'est une bonne chose, et je pense que c'est une bonne chose, et je pense que c'est une bonne chose, et je pense que c'est une bonne chose, et je pense que c'est une bonne chose, et je pense que c'est une bonne chose, et je pense que c'est une bonne chose, et je pense que c'est une bonne chose, et je pense que c'est une bonne chose.

Pourquoi Metaquotes ne pourrait-il pas simplement ajouter une méthode légèrement différente pour invoquer les DLL de manière sûre. Le développeur pourrait alors choisir de charger via le chargement sécurisé ou le chargement de performance et s'assurer qu'il écrit un bon code qui attrape les exceptions.

"Il est préférable de faire des appels peu fréquents" Je veux dire sérieusement quel genre d'affirmation est-ce là ?

Il n'est pas étonnant que cette communauté ait du mal à obtenir des articles décents. N'importe quel bon écrivain ne prendrait pas la peine de passer du temps à écrire ici. Pourquoi le feraient-ils ? Ils font quelque chose de décent, comme montrer comment incorporer des dll et établir une communication, puis quelqu'un arrive et les fait tomber de l'arbre.

Je ne suis pas sûr qu'il y ait un problème de performance, mais la question est la suivante : si c'est si mauvais et que vous faites partie de cette communauté, pourquoi n'essayez-vous pas de coder une solution à ce que vous avez trouvé comme étant un problème de performance évident ?

C'est très bien que vous en parliez, mais cela ne sert à rien de s'en plaindre si l'on n'est pas prêt à présenter des solutions ou même des suggestions sur la manière d'atteindre l'objectif.

L'article a-t-il exposé des risques, oui, je pense que nous en avons même eu un exemple lorsqu'une autre personne a dit, hé, je l'ai téléchargé et j'ai ce problème avec lui. Ce qui est exactement le problème qui a été discuté dans l'article.Je pense que si je devais développer cet article, ce serait comme vous l'avez dit PFX, montrer comment interagir en toute sécurité. Cependant, il a exposé le risque, laissant beaucoup de place à quelqu'un comme vous pour le développer par le concept même du sujet de la SÉCURITÉ.

Une remarque personnelle à l'auteur, lorsque vous écrivez des sujets, essayez de vous abstenir d'utiliser des termes comme newbie. C'est insultant et dégradant, ce n'est pas une façon professionnelle de parler de ceux que vous souhaitez voir suivre votre sagesse.

 

J'ai essayé de comprendre avec cette fonctionnalité d' importation de dll, si je serais capable d'importer des dll écrites dans d'autres langages comme le C#. Est-ce possible ? Si non, pourquoi ?

Quelle est la différence entre une dll C++ et une dll C#.

 
ToolMaker:

Quelle est la différence entre une dll C++ et une dll C# ?

L'assemblage d'une dll C# est utilisé pour stocker du code géré, tandis qu'une dll C++ contient du code natif.

Mais il existe une astuce qui rend possible l'importation d'assemblages : Inverse P/Invoke.

En ce qui me concerne, j'ai l'habitude d'écrire une dll wrapper c++\cli à cette fin ou d'écrire tout le code géré à l'aide de c++\cli.

 

Pouvez-vous me montrer comment importer une structure dans la bibliothèque C++ ?

J'ajoute ce code à 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) ;
}
------------------------

Ensuite, j'ajoute ce code à la MQL5DLL Test.mq5 (section import)

MqlTick MyTick(MqlTick &tick) ;

et je l'appelle dans OnTick()

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

La compilation de la bibliothèque c++ et de l'EA se fait sans erreur.

Après avoir appelé la fonction MyTick(tick) dans le terminal, j'obtiens une erreur : MQL5DLL_Test (EURUSD,M1) Access violation write to 0x00000008

 

Bonjour et merci pour cet article utile.

J'ai essayé de créer une petite dll pour échanger des données entre mql5 et mysql.

J'ai donc suivi les différentes étapes et j'ai eu quelques erreurs.

La dll est en c++

La première a été compilée avec minGW

L'ex5 ne pouvait pas l'ouvrir car ce n'était pas une dll compilée en 64 bit.

J'ai donc compilé avec minGW 64 bits

Ma première dll (qui était très simple) fonctionne

Elle fait quelques ajouts etc.

Quand j'essaie d'utiliser la bibliothèque mysql, je peux compiler pour construire ma dll sans problème.

Mais quand j'essaie d'ouvrir l'ex5 qui l'appelle, j'ai l'erreur suivante :

Cannot open C:\user......\DLLNAME.dll (193)

Avez-vous une idée pour résoudre ce problème ?

Merci beaucoup.

 

Bonjour à tous,

très bon article !


Mais je me demandais si quelqu'un pouvait m'aider à faire ce qui est décrit dans cet article à l'envers : obtenir des données (ticks ou barres) dans un programme C++ à partir de Metatrader ?

 

J'ai réussi à le faire avec un tableau d'int standard, mais est-il possible de passer un CArrayObj / CArrayDouble dans Visual Studio C++ ?