Perguntas sobre OOP em MQL5 - página 60

 
Igor Makanu:

Olá novamente!


esta pergunta, há um enum, precisamos ou de um enum ou de um enum ou de um enum ou de um container - algo onde armazenar 7 enum , mas o apetite cresce, talvez 70 enum


onde ?

Tanto a matriz como a lista e o recipiente podem ser feitos dependendo da tarefa. Pelo que entendi, o mais provável é que você precise simplificar a escrita do código, então você pode dividir os enums em grupos e combiná-los em estruturas para os parâmetros de cada objeto.

Se estamos falando da etapa de execução, acho que é prática normal usar enumeração somente quando se especifica valores/pares. E para armazená-las, use um tipo de base simples.

 
Aleksey Mavrin:

Você pode fazer uma matriz, uma lista e um recipiente, dependendo da tarefa. Pelo que entendi, provavelmente é necessário simplificar a escrita do código, então você pode dividir os enums em grupos e combiná-los em estruturas para os parâmetros de cada objeto.

Se estamos falando da etapa de execução, acho que é prática normal usar enumeração somente quando se especifica valores/pares. E para armazená-las, use um tipo de base simples.

fez isso no início, afastei-me dele por alguma razão, parece que havia problemas com a inicialização de tais campos, ou melhor, com variantes de enumeração autocompletas em ME em alguma compilação, talvez devido ao fato de que parte do código em outro injetor era.... vamos analisar esta opção.


naveguei na internet, quero algo afiado como isto... algumas propriedades (((.

 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:

fez isso no início, por alguma razão eu abandonei, parece que havia problemas com a inicialização de tais campos, ou melhor, com a auto-completação de variantes de enumeração em ME em alguma construção, provavelmente porque parte do código em outro injetor era.... vamos analisar esta opção.


naveguei na internet, quero algo afiado como isto... algum tipo de propriedade (((

Qual é o problema?

Se for um-para-um, então:

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);
 } 

Isto se você não quiser colocar a enumeração em um escopo global.

 
Vladimir Simakov:

Isto se você não quiser colocar a enumeração no escopo global.

hmm...

Eu simplesmente não sabia como fazer isso:

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

Obrigado!

 

Alguém tem uma solução elegante para o JSON carregar objetos descomplicados?

Preciso de um exemplo de um código deste tipo para 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}

MQL serializer disponívelem https://www.mql5.com/ru/code/13663

mas não entendo a estrutura da travessia de campo correta

 
Igor Makanu:

Mas eu não tenho idéia de como atravessar corretamente os campos do objeto

As macros são tudo).
 
Alexey Navoykov:
macros são tudo!)

Uh-huh... Vou tentar perguntar novamente:

AJUDE-ME A AJUDAR UM EXAMINADOR! POR FAVOR!

 
Igor Makanu:

Uh-huh... Vou tentar perguntar novamente:

AJUDA-ME E PRECISO UM EXEMPLO! Por favor!

Bem, se a questão especificamente sobre contornar os campos, é algo parecido com isto:

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

...

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

E você pode trabalhar o corpo da macro por si mesmo).

 
Alexey Navoykov:

Bem, se a questão é especificamente sobre a travessia de campo, é mais ou menos assim:

E você pode trabalhar o corpo da macro por si mesmo).

OK, isso é alguma coisa!

Obrigado!

 
Por outro lado, para a serialização, é provavelmente melhor especificar os nomes dos campos explicitamente, para que você possa renomeá-los mais tarde no código sem se preocupar que os arquivos salvos parem de funcionar.