Questions sur la POO dans MQL5 - page 60

 
Igor Makanu:

Re-bonjour !


cette question, il y a un enum, nous avons besoin soit d'un array enum ou d'une list enum ou d'un container enum - quelque chose où stocker 7 enum, mais l'appétit grandit, peut-être 70 enum


où ?

Les tableaux, les listes et les conteneurs peuvent être utilisés en fonction de la tâche à accomplir. Si je comprends bien, il est probable que vous ayez besoin de simplifier l'écriture du code, alors vous pouvez diviser les enums en groupes et les combiner en structures pour les paramètres de chaque objet.

Si nous parlons de l'étape d'exécution, je pense qu'il est normal d'utiliser les enums uniquement pour spécifier des valeurs/paires. Et pour les stocker, utilisez un type de base simple.

 
Aleksey Mavrin:

Vous pouvez créer un tableau, une liste et un conteneur, selon la tâche à accomplir. Si je comprends bien, vous devez probablement simplifier l'écriture du code, puis vous pouvez diviser les enums en groupes et les combiner en structures pour les paramètres de chaque objet.

Si nous parlons de l'étape d'exécution, je pense qu'il est normal d'utiliser les enums uniquement pour spécifier des valeurs/paires. Et pour les stocker, utilisez un type de base simple.

je l'ai fait au début, je m'en suis éloigné pour une raison quelconque, il semble qu'il y ait eu des problèmes avec l'initialisation de tels champs, ou plutôt avec les variantes d'autocomplétion des enum dans ME dans certaines builds, peut-être à cause du fait qu'une partie du code dans un autre injecteur était..... examinons cette option.


j'ai surfé sur internet, je veux quelque chose de Sharp comme ça... certaines propriétés (((.

 public class COrder
    {
        public enum E_MOTION { HIGHER, LOWER, ZIGZAG }
        public enum E_VOLUME { FIXED, INC, DEC }
        public E_MOTION OrderMotionType { get; set; }
        public E_VOLUME OrderVolumeType { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var current = new COrder { OrderMotionType = COrder.E_MOTION.HIGHER, OrderVolumeType = COrder.E_VOLUME.FIXED };
            
        }
    }
 
Igor Makanu:

je l'ai fait au début, mais pour une raison quelconque, je l'ai abandonné, il semble qu'il y ait eu des problèmes avec l'initialisation de tels champs, ou plutôt avec l'autocomplétion des variantes d'enum dans ME dans certaines constructions, probablement parce qu'une partie du code dans un autre injecteur était..... examinons cette option.


j'ai surfé sur internet, je veux quelque chose de Sharp comme ça... une sorte de propriétés (((

Quel est le problème ?

Si c'est un-à-un, alors :

class COrder
{
public:
   enum E_MOTION { HIGHER, LOWER, ZIGZAG };
   enum E_VOLUME { FIXED, INC, DEC };
   E_MOTION orderMotionType;
   E_VOLUME orderVolumeType;
   COrder(E_MOTION _motion, E_VOLUME _volume):orderMotionType(_motion),orderVolumeType(_volume){}
};

void OnStart(){
   COrder* current = new COrder(COrder::HIGHER,COrder::FIXED);
 } 

Ceci si vous ne voulez pas mettre l'énumération dans une portée globale.

 
Vladimir Simakov:

Ceci si vous ne voulez pas mettre l'énumération dans la portée globale.

hmm...

Je ne savais pas comment faire :

 COrder* current = new COrder(COrder::HIGHER,COrder::FIXED);

Merci !

 

Quelqu'un a-t-il une solution élégante pour JSON afin de télécharger des objets simples ?

J'ai besoin d'un exemple d'un tel code pour MQL :

public class COrder
    {
        public enum E_MOTION { HIGHER, LOWER, ZIGZAG }
        public enum E_VOLUME { FIXED, INC, DEC }

        public bool IsRunning { get; set; }
        public int OpenPrice { get; set; }
        public int ClosePrice { get; set; }
        public E_VOLUME OrderVolumeType { get; set; }
        public E_MOTION OrderMotionType { get; set; }
        
    }

    class Program
    {
        static void Main(string[] args)
        {
            var current = new COrder {
                IsRunning = false, 
                OpenPrice = 1200,
                ClosePrice = 1300,
                OrderMotionType = COrder.E_MOTION.ZIGZAG, 
                OrderVolumeType = COrder.E_VOLUME.FIXED };

            string json = JsonSerializer.Serialize<COrder>(current);
            Console.WriteLine(json);
            Console.ReadLine();
        }
    }

{"IsRunning":false,"OpenPrice":1200,"ClosePrice":1300,"OrderVolumeType":0,"OrderMotionType":2}

Sérialiseur MQL disponibleà l'adresse https://www.mql5.com/ru/code/13663

mais je ne comprends pas la structure de la traversée correcte des champs.

 
Igor Makanu:

Mais je n'ai aucune idée de la façon de parcourir correctement les champs de l'objet.

Les macros sont tout.)
 
Alexey Navoykov:
les macros sont tout !)

Uh-huh... Je vais réessayer de demander :

AIDEZ-MOI À AIDER UN EXAMINATEUR ! S'IL VOUS PLAÎT !

 
Igor Makanu:

Uh-huh... Je vais réessayer de demander :

AIDEZ-MOI ET AVEZ BESOIN D'UN EXEMPLE ! S'il vous plaît !

Eh bien, si la question porte spécifiquement sur le contournement des champs, c'est quelque chose comme ça :

#define SERIALIZE5(object, m1, m2, m3, m4, m5)  /* your code */

...

SERIALIZE5(current, IsRunning, OpenPrice, ClosePrice, OrderVolumeType, OrderMotionType);

Vous pouvez élaborer le corps de la macro par vous-même).

 
Alexey Navoykov:

Eh bien, si la question porte spécifiquement sur la traversée de champs, c'est plus ou moins comme ça :

Et vous pouvez élaborer le corps de la macro par vous-même).

OK, c'est quelque chose !

Merci !

 
D'autre part, pour la sérialisation, il est probablement préférable de spécifier explicitement les noms de texte des champs, afin de pouvoir les renommer plus tard dans le code sans craindre que les fichiers enregistrés cessent de fonctionner.