Création d'une interface graphique pour les MQL en mode graphique. - page 5

 

Voici un exemple d'une forme simple tirée en Sharpe en 10 minutes avec un EA. Le formulaire reçoit les ticks du graphique, directement de EA comme de la dll native, sans sockets, fichiers et autres choses. Et le formulaire est joint au tableau. Il y a un problème avec l'attachement qui doit être résolu. Mais il est possible de ne pas l'attacher, comme bon vous semble.

 
Алексей Барбашин:

Voici un exemple d'une forme simple tirée en Sharpe en 10 minutes avec un EA. Le formulaire reçoit les ticks du graphique, directement de EA comme de la dll native, sans sockets, fichiers et autres choses. Et le formulaire est joint au tableau. Il y a un problème avec l'attachement qui doit être résolu. Mais il ne peut pas être attaché - comme vous voulez.

Dites-moi quel compilateur de GitHub vous avez utilisé. Ou avez-vous édité des compilations pointues à la main ? Je n'en ai pas besoin. Il est plus facile d'écrire une DLL C++ en code mixte (géré + non géré).

 
Yuriy Asaulenko:

Dites-moi quel compilateur de GitHub vous avez utilisé. Ou avez-vous modifié la compilation sharded à la main ? Ce n'est pas une bonne idée. Il est plus facile d'écrire une DLL C++ en code mixte (géré + non géré).

J'ai écrit dans le post précédent : tout est fait avec les outils internes de VS. J'utilise VS 2017 Community. Juste au début du projet, la bibliothèque DllExport avec Nuget est connectée à celui-ci. Rien ne doit être finalisé manuellement après la compilation du projet, à partir du mot TOTALLY.

Je ne recommande pas le modèle deR.Giesecke. Ici, avec lui, il y a un vrai tambourin, si tant est qu'il soit possible de commencer. Avec cette bibliothèque, vous ne sentirez même pas la différence. Votre dll elle-même "devient native" pendant la compilation normale.

 
Алексей Барбашин:

J'ai écrit dans le post précédent : tout est fait avec les outils internes de VS. J'utilise VS 2017 Community. Au début du projet, la bibliothèque DllExport avec Nuget y est connectée. Rien ne doit être finalisé manuellement après la compilation du projet, pas du tout.

Oui, oui, exactement avec Nuget. Cela n'a pas fonctionné pour moi, mais il y avait une DLL non standard pour l'interaction avec le C-API, + plus de fonctions de rappel. Je ne sais pas, pour une raison quelconque, je me suis souvenu que c'était un compilateur, ou c'était une solution différente.

Et dans ce cas, la solution est vraiment bonne et simple.

 
Алексей Барбашин:

Pourquoi celui de gauche ? Tout est fait avec les outils internes de VS. Nuget dispose de la bibliothèque DllExport, qui modifie une fois la classe System.Runtime.InteropServices, et ensuite tout se compile normalement. Il n'est donc pas nécessaire de danser le tambourin, ni d'utiliser des emballages. Il est beaucoup plus facile de créer des formulaires en c# que de les écrire dans un fichier supplémentaire, comme le suggère Maxim. Je respecte Maxim et son travail, mais dans ce cas, le monde du Net nous est ouvert sans difficultés supplémentaires.

C'est intéressant, l'avez-vous vérifié vous-même ? Je faisais une connexion MT4 - C++dll - C#dll, je ne pouvais pas charger C#dll directement.

https://www.nuget.org/packages/DllExport/, c'est ça ?

DllExport 1.6.0
DllExport 1.6.0
  • www.nuget.org
The open implementation of unmanaged exports for .NET ( DllExport )        Source code and all details here: https://github.com/3F/DllExport                To configure projects via current package:        ========================================================        DllExport -action Configure -dxp-version 1.6.0...
 
Алексей Барбашин:

J'ai écrit dans le post précédent : tout est fait avec les outils internes de VS. J'utilise VS 2017 Community. Au début du projet, la bibliothèque DllExport avec Nuget y est connectée. Rien ne doit être finalisé manuellement après avoir compilé le projet, le mot TOTALEMENT.

Je ne recommande pas le modèle deR.Giesecke. Ici, avec lui, il y a un vrai tambourin, si tant est qu'il soit possible de commencer. Avec cette bibliothèque, vous ne sentirez même pas la différence. Votre dll "deviendra native" lors de la compilation normale.

Tzek, pouvez-vous développer ? La tâche de l'exemple est de créer un panneau en C# qui reçoit des informations de l'EA et lui envoie des commandes. Comment utiliser dllexport pour cela ?

Il n'est pas nécessaire de l'expliquer en détail, il suffit d'indiquer les étapes, les éléments et les réactions des uns et des autres.

 
Alexey Volchanskiy:

C'est intéressant, l'avez-vous vérifié vous-même ? J'avais l'habitude de faire le lien MT4 - C++dll - C#dll, je ne pouvais pas charger C#dll directement.

https://www.nuget.org/packages/DllExport/, c'est ça ?

Bien sûr, je l'ai vérifié. J'ai donné un exemple de création de dll avec formulaire ci-dessus.

 
Алексей Барбашин:

Bien sûr que oui. J'ai donné un exemple de dll avec un formulaire ci-dessus.

Cette photo est-elle un exemple ?

Très bien, je vais m'en occuper moi-même.

 
Alexey Volchanskiy:

Tezka, pouvez-vous développer ? La tâche de l'exemple est de créer un panneau en C#, qui reçoit des informations de l'EA et lui envoie des commandes. Comment utiliser dllexport pour cela ?

Il n'est pas nécessaire de l'expliquer en détail, il suffit d'indiquer les étapes, les éléments et la manière dont ils réagissent les uns avec les autres.

1. Créer un projet en c# Class Library (net Framework)

2. Ajoutez la bibliothèque DllExport de NuGet au projet. Il est préférable de le télécharger depuis le serveur. Placez le fichier batch dans le dossier du projet.

3. Nous avons lancé la bibliothèque via la ligne de commande (il y a une vidéo sur le hub) et modifié la classe System.Runtime.InteropServices.

À ce stade, tous les préparatifs sont terminés. Redémarrer le projet

4. Créez une fonction d'exportation et ajoutez le modificateur [DllExport]y devant celle-ci. Si l'étape 3 est correctement exécutée, le compilateur ne se plaindra pas du modificateur.

5. Ajoutez le formulaire au projet et complétez-le comme vous le souhaitez.

6. Ajouter à la classe des fonctions exportées (créées à l'étape 1) la fonction d'ouverture du formulaire, par exemple, Démarrer

7. Créer une fonction pour ouvrir le formulaire, par exemple OpenDialog, comme cela est fait dans la fonction principale lors de la création d'une application sur un formulaire Windows.

8. Dans la fonction Start, créez un thread pour lequel nous spécifions la fonction OpenDialog comme méthode exécutable.

9. Créez un EA/indicateur/script et connectez la dll comme d'habitude. ))

10. appeler la fonction Start de mql

Le formulaire sera lancé dans un fil distinct et n'arrêtera pas le processus dans mql comme le ferait une boîte de dialogue modale normale.

Le transfert de données de mql vers un formulaire se fait de la même manière que le transfert de données entre les classes et les threads de l'application elle-même.

1. Créez une fonction dans une classe à exporter qui sera appelée par mql pour transférer des données ; par exemple, SendTick.

N'oubliez pas que mql ne verra que les méthodes (fonctions) des classes pour lesquelles le modificateur [DllExport] est installé.

2. Créer un délégué d'événement dans cette classe avec des paramètres

3. Dans le formulaire nous devons souscrire à l'événement de la classe exportée

4. Lorsque nous appelons la méthode SendTick depuis mql, nous appelons l'événement créé et passons les paramètres

5. Dans le formulaire, nous créons un gestionnaire d'événement qui intercepte l'événement et envoie les données au formulaire, ou fait autre chose.

C'est tout. Rien d'autre n'est requis.

Dans le cas où le formulaire et la classe d'exportation fonctionnent dans des threads différents, pour mettre des informations sur le formulaire, nous avons besoin d'un délégué de traitement des données du thread adjacent.

Si vous y parvenez, veuillez partager le "résultat" et vos impressions sur la simplicité. )))

Le plus "difficile" dans tout cela sera l'installation de la bibliothèque. )))

 
Alexey Volchanskiy:

Cette photo est-elle un exemple ?

Je vois, je vais me débrouiller tout seul.

Alexey, j'ai détaillé l'image. )) Si vous avez d'autres questions, demandez-les moi, j'essaierai d'y répondre !