Come si fa a passare un'enumerazione in modo coerente? - pagina 5

 
Sergei Vladimirov:
Perché dovrei farlo?
TickSize su MIX è 25, Digits è 0. Normalizzare un prezzo intero che non è un multiplo di 25 causerà un errore di OrderSend.
 
fxsaber:
TickSize su MIX è 25 e Digits è 0. Normalizzare un prezzo intero che non è un multiplo di 25 causerà un errore di OrderSend.
Proprio ora in un thread vicino ha consigliato di annegare il computer nella vasca da bagno, poi tutto sarà screditato ancora di più.
 
Dmitry Fedoseev:
Proprio ora in un thread vicino consiglia di affogare il computer nella vasca da bagno, poi tutto sarà screditato ancora di più.
Sei un chiacchierone, purtroppo. Io non creo nulla, ma ho il diritto di criticare - su di te.
 
fxsaber:
TickSize su MIX è 25 e Digits è 0. Normalizzare un prezzo intero che non è un multiplo di 25 causerà un errore di OrderSend.
Bene, con questa logica anche in una normalizzazione a passo 0,25 produrrebbe un errore. Lo scopo della normalizzazione non è quello di adattare il prezzo a qualche passo di prezzo esotico, ma di arrotondare il numero in virgola mobile a una data precisione. Non causa alcun errore.
 
Sergei Vladimirov:
Bene, con questa logica anche nel caso di un passo di 0,25, la normalizzazione produrrebbe un errore. Lo scopo della normalizzazione non è quello di adattare il prezzo a qualche passo di prezzo esotico, ma di arrotondare il numero in virgola mobile a una data precisione. Non porta a nessun errore.
La normalizzazione è stata originariamente introdotta solo per una cosa (ed è menzionata nell'aiuto) - le funzioni di trading.
 
Vladimir Batrudinov:

Ci sono probabilmente due funzioni che devono essere inserite: 1 - restituisce il numero di elementi nell'enum, 2 - restituisce l'elemento per numero...


In enum, potete assegnare qualsiasi valore agli elementi, per esempio, come qui sotto. Un enum non è un array.

enum crazy
{
    e1 = 100500,
    e2 = -200,
    e3 = -100500,
    e4 = 0
};


//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
{
    int z10 = e2;
    int z1 = e4;
  
}

Linguaggi come C# richiedono di specificare il nome dell'enum, mentre C++ e quindi MQL4/5 gestiscono l'enum piuttosto liberamente. Per sicurezza, questa sciocchezza si compila sia su MQL5 che su C++

 
Alexey Volchanskiy:

In enum, potete assegnare qualsiasi valore agli elementi, come il seguente. enum non è un array.

E allora? Si trattava di passare attraverso gli elementi in ordine di dichiarazione.
 
Alexey Navoykov:
E allora? Si trattava di passare attraverso questi elementi in ordine di dichiarazione.
Oh, giusto, ho letto male la domanda, ho pensato, per i valori.
 

Una nota per i programmatori:

#define  ENUM_QQ             \
  ENUM_QQ_HELPER(el_1, 3)   \
  ENUM_QQ_HELPER(el_2, 9)   \
  ENUM_QQ_HELPER(el_3, 38)  \
  ENUM_QQ_HELPER(el_4, 1)   

enum Enum_qq
{
#define  ENUM_QQ_HELPER(el, val) el = val,
  ENUM_QQ
#undef  ENUM_QQ_HELPER
};

void get_enumqq_array(int &ar[])
{
  int temp[] = {
#define  ENUM_QQ_HELPER(el, val) el,
  ENUM_QQ
#undef  ENUM_QQ_HELPER
  };
  ArrayResize(ar, ArraySize(temp));
  for(int i = 0;  i < ArraySize(temp);  ++i)
    ar[i] = temp[i];
}

void OnStart()
{
  int q[];
  get_enumqq_array(q);
  for(int i = 0;  i < ArraySize(q);  ++i)
    Alert(q[i]);
}


Ora se abbiamo bisogno di modificare un'enumerazione, dobbiamo modificarla una volta sola e in un solo posto. Abbiamo bisogno di aggiungere un nuovo elemento, per esempio element_new = 56, aggiungiamo

ENUM_QQ_HELPER(element_new , 56)

E non preoccupatevi di modificare get_enumqq_array(). La tecnica si chiama X Macro https://en.wikipedia.org/wiki/X_Macro. Se gli sviluppatori lo desiderano, possono facilmente modificare l'enumerazione standard in questo modo.

Forse non immediatamente evidente, l'enumerazione si è rivelata così:

enum Enum_qq
{
   el_1 = 3
   el_2 = 9
   el_3 = 38
   el_4 = 1   
};
 
Vasiliy Sokolov:

Diciamo che abbiamo un'enumerazione. Come possiamo ottenere tutti i possibili valori di questa enumerazione uno per uno, per esempio in un ciclo?

Cioè tf1++ deve restituire sequenzialmente PERIODO_M1, PERIODO_M2, PERIODO_M5... Penso che questo non possa essere fatto con gli strumenti linguistici.

Ma in teoria se c'è un ENUM_MYENUM, il (ENUM_MYENUM)INT_MAX dovrebbe dare il valore massimo dell'enum. Altrimenti questo è un bug di conversione dei tipi. È solo perché l'operatore di conversione del tipo deve restituire il valore di questo stesso tipo. Non necessariamente valido nel contesto, ma valido per il tipo.