Questions sur la POO dans MQL5 - page 40

 
Dmitry Fedoseev:

const - s'il est nécessaire d'interdire l'affectation de variables (sauf une fois pendant l'initialisation). Si une variable est déclarée comme const, alors lorsqu'elle est passée à une fonction par référence, l'argument de la fonction doit également être const, mais le compilateur le forcera, vous ne devez pas y penser. Si une variable n'est pas assignée, elle peut également être marquée comme const - cela fonctionnera plus rapidement, ceci s'applique aux arguments de fonction. Cependant, à tout moment, vous pouvez avoir besoin de le modifier...

static - si c'est une variable dans une classe, c'est un cas rare, même le plus rare. S'il s'agit d'une méthode de classe, alors si la méthode ne manipule que les arguments de cette méthode et les variables statiques de la classe, c'est également un cas rare (cependant, pas si rare, si vous rassemblez simplement les fonctions dans une classe par commodité).

Je n'ai pas encore eu l'occasion d'essayer la DLL C# pour MQL5. J'avais l'habitude d'utiliser des enveloppes C++ et de créer une instance de classe en C#. Je soupçonne que cette DLL va maintenant utiliser une classe statique, ce qui limite considérablement les options. Quelqu'un sait-il si une classe statique ou une classe dynamique est créée maintenant ?

 
Alexey Volchanskiy:

Je n'ai pas encore eu l'occasion d'essayer la DLL C# pour MQL5. J'avais l'habitude de le faire avec des enveloppes C++, mais du côté positif, une instance de la classe était créée en C#. J'ai le sentiment que la DLL va maintenant utiliser une classe statique, ce qui limite considérablement ses possibilités. Quelqu'un sait-il s'il crée maintenant une classe statique ou une classe dynamique ?

Je n'ai utilisé que les statiques pour MQL5 - si le modificateur statique est utilisé, la signature sera visible directement à partir de MU, très pratique.

pour ce qui est de la restriction, vous pouvez lancer la tâche dans un thread séparé et ensuite l'exécuter, c'est très rapide en C#.

ou écrire des appels dans la dll

ce n'est pas un problème


UPD :

Je ne suis pas sûr de pouvoir expliquer mes récentes recherches sur la raison d'être de l'utilisation de la POO dans les tâches MQL, mais je vais vous dire ce que je vois

En général, si nous utilisons le style POO, en respectant pleinement le contrôle d'accès et en veillant à définir tous les modificateurs privé/protégé/public et à utiliser obligatoirement const pour chaque définition de méthode et signature (peut être supprimé ultérieurement s'il est utilisé pour modifier des données) et en écrivant tous les accès aux données protégées avec get / set, le résultat de l'utilisation correcte de la POO est la détection de gros bogues sur lamodification involontairedes données pendant le développement.

J'ai réécrit une classe de cette façon à partir de zéro - immédiatement, le compilateur a trouvé une incompatibilité avec mon problème, est entré dans la classe de base à partir du descendant lors de la vérification (test) de l'idée, et comme d'habitude a été distrait et a oublié de supprimer - pas le fait que j'aurais trouvé ce bug dans le test, je pourrais penser qu'il a été prévu de cette façon )) .

Un autre avantage notable pour moi est l'absence de toutes les variables décrites globalement - j'essaie de ne pas les utiliser, elles ne sont pas du tout utilisées ici (enfin, à l'exception du drapeau d'optimisation globale - pour répondre à mes besoins et du drapeau d'erreur critique lors du trading)

Une observation intéressante est que lors de la réécriture de tous les appels via get / set, la classe source a d'abord augmenté en taille et a ensuite commencé à se rétrécir de manière significative, lorsque j'ai commencé à substituer dans les appels de get / set - je ne dis pas que cela gonfle considérablement le code en taille, mais encore une fois - cela permettra de contrôler l'intégrité des données !


SZY : si vous êtes un perfectionniste dans l'âme et que vous pensez qu'un appel supplémentaire via get / set est une horloge supplémentaire sur le CPU, alors quand la tâche est terminée à 100%, il n'est pas difficile de compter les appels à chaque get / set via la recherche dans le source et d'appliquer une vieille règle - si vous appelez une section de code plus d'une fois, alors vous devez faire de cette section de code une sous-routine.... personne n'interdit de faire l'inverse ---> un seul appel pour obtenir / fixer pour assigner / lire le champ.... mais c'est pour ainsi dire des "sales tours" avec des avantages discutables

 
Igor Makanu:

Je n'ai utilisé que les statiques pour MQL5 - si vous avez un modificateur statique, la signature sera visible directement à partir de MU, très pratique.

à propos de la restriction, vous pourriez lancer la tâche dans un thread séparé et ensuite le tuer.

ou écrire des appels dans la dll

Je ne pense pas que ce soit un problème.

Je ne parle pas de membres statiques pour Sharp, je parle de ça.

public static class ClassName {}

Vous ne pouvez pas créer une instance de classe statique via new et la détruire via delete, elle n'a pas de constructeurs et de destructeurs, tous les membres et méthodes sont statiques. Bref, cela fait longtemps que je n'y ai pas travaillé, mais je me souviens à quel point c'était inconfortable, comme un lit de Procuste.

Ils sont généralement utilisés comme conteneur pour les fonctions de bibliothèque, comme les fonctions mathématiques.

 
Alexey Volchanskiy:

Je ne parlais pas de membres statiques pour Sharp, mais ce...

Je pense que c'est une classe qui ne verra pas MQL sans le modificateur statique, mais qui verra les méthodes à l'intérieur de la classe avec le modificateur statique.

vous pouvez utiliser localement n'importe quelle classe dans une dll, j'ai WinForm dans une classe de dll sans static. tout fonctionne bien, mais j'appelle des fonctions déclarées avec static, et où ces fonctions sont déclarées dans la classe - cela n'a pas d'importance pour l'appel de dll depuis MQL, même si la classe entière est static ou non.

Je ne pourrai pas encore le vérifier, je n'ai pas installé le studio sur mon ordinateur portable après l'avoir remplacé par un SSD, je n'en ai pas encore besoin.

 
Alexey Volchanskiy:

Je n'ai pas encore eu l'occasion d'essayer la DLL C# pour MQL5. J'avais l'habitude de le faire avec des enveloppes C++, mais du côté positif, une instance de la classe était créée en C#. J'ai le sentiment que la DLL va maintenant utiliser une classe statique, ce qui limite considérablement ses possibilités. Quelqu'un sait-il si une classe statique ou une classe dynamique est créée maintenant ?

La classe est régulière, les méthodes sont statiques. Je n'ai pas essayé d'autres options.

 
Igor, Dmitry, en bref, vous devez l'essayer vous-même. Si je comprends bien, dans tous les cas, il faut se référer au nom de la classe, et non au nom de l'objet de la classe. Je vais l'essayer, merci.
 
Bonjour, si j'ai une question sur les signaux, où dois-je écrire ? Je voudrais savoir s'il est raisonnable de s'abonner aux signaux, si le dépôt est de 312 $ ? Et comment éviter de dépendre du courtier et travailler efficacement, si j'ai commencé à trader il y a un mois et demi ? J'ai commencé à négocier il y a un mois et demi. Merci.
 
Alexey Volchanskiy:
Igor, Dmitry, en bref, vous devez l'essayer vous-même. D'après ce que j'ai compris, dans tous les cas, il faut faire référence par le nom de la classe, et non par le nom de l'objet de la classe. Je vais l'essayer, merci.

Adressez-vous par le nom de la classe.

 
Alexey Volchanskiy: Igor, Dmitry, en bref, vous devez l'essayer vous-même. Je comprends que, dans tous les cas, il faut se référer au nom de la classe, et non au nom de l'objet de la classe. Je vais essayer, merci.

Je ne peux pas prétendre que c'est la seule façon d'appeler C# à partir de MQL5, j'ai utilisé un exemple des développeurs dehttps://www.mql5.com/ru/forum/285631.

#import "TestLib.dll"

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   int x=41;
   TestClass::Inc(x);
   Print(x);
  }

public class TestClass
{
   public static void Inc(ref int x)
   {
    x++;
   }
}

J'ai utilisé l'exemple des développeurs pour obtenir le point d'entrée en C#, je n'ai pas utilisé d'autres moyens, avec un peu de bricolage, le même code .dll peut être compilé pour MT4.

article et mes recherches sur la raison pour laquelle le code de l'article ne fonctionne pas comme prévu https://www.mql5.com/ru/forum/3153/page4#comment_10366498 - tout fonctionne jusqu'à présent

 

j'ai regardé les résultats de ma bataille avec le code de style POO - hmmm... Excellent ! ))))


J'ai une question, mais dans mon code, enfin, trois fois exactement, j'utilise une construction comme :

private:
   COrder            *m_order;
.......

// использую так
return(CheckPointer(m_order)==POINTER_INVALID ? true : m_order.Orderclose());

//или так

if(CheckPointer(m_order)==POINTER_INVALID)

appelle tout dans des méthodes privées, mais existe-t-il une "méthode Jedi ?" pour s'affranchir dans le code source deCheckPointer(m_order)==POINTER_INVALID

Je demande à propos de certains get / set

pas de problèmes particuliers, mais pour ainsi dire un caprice, ou alors que la soif de connaissance des méthodes OOP en C++ n'a pas encore diminué

Raison: