¿Cómo puedo pasar por una enumeración de forma coherente? - página 5

 
Sergei Vladimirov:
¿Por qué iba a hacerlo?
TickSize en MIX es 25, Digits es 0. La normalización de un precio entero que no sea múltiplo de 25 provocará un error OrderSend.
 
fxsaber:
TickSize en MIX es 25 y Digits es 0. La normalización de un precio entero que no sea múltiplo de 25 provocará un error OrderSend.
Justo ahora en un hilo vecino aconsejaba ahogar el ordenador en la bañera, luego todo se desacreditará aún más.
 
Dmitry Fedoseev:
Justo ahora en un hilo vecino aconsejando ahogar el ordenador en la bañera, luego todo se desacreditará aún más.
Eres un bocazas, por desgracia. Yo no creo nada, pero tengo derecho a criticar... sobre ti.
 
fxsaber:
TickSize en MIX es 25 y Digits es 0. La normalización de un precio entero que no sea múltiplo de 25 provocará un error OrderSend.
Pues bien, con esa lógica incluso en una normalización de 0,25 pasos se produciría un error. El propósito de la normalización no es ajustar el precio a algún paso de precio exótico, sino redondear el número de punto flotante a una precisión determinada. No provoca ningún error.
 
Sergei Vladimirov:
Pues bien, con esa lógica, incluso en el caso de un paso de 0,25, la normalización produciría un error. El propósito de la normalización no es ajustar el precio a algún paso de precio exótico, sino redondear el número de punto flotante a una precisión determinada. No da lugar a ningún error.
La normalización se introdujo originalmente para una sola cosa (y se menciona en la ayuda): las funciones comerciales.
 
Vladimir Batrudinov:

Probablemente haya que introducir dos funciones: 1 - devuelve el número de elementos del enum, 2 - devuelve el elemento por número...


En el enum, puede asignar cualquier valor a los elementos, por ejemplo, como se indica a continuación. Un enum no es un array.

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


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

Lenguajes como C# requieren especificar el nombre del enum, mientras que C++ y por tanto MQL4/5 manejan el enum con bastante libertad. Por si acaso, esta tontería compila tanto en MQL5 como en C++

 
Alexey Volchanskiy:

En el enum, se puede asignar cualquier valor a los elementos, como el siguiente. enum no es un array.

¿Y qué? Se trataba de recorrer los elementos en orden de declaración.
 
Alexey Navoykov:
¿Y qué? Se trataba de recorrer esos elementos por orden de declaración.
Ah, cierto, leí mal la pregunta, pensé, por los valores.
 

Una nota para los programadores:

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


Ahora, si necesitamos editar una enumeración, tenemos que editarla una vez y en un solo lugar. Necesitamos añadir un nuevo elemento, por ejemplo elemento_nuevo = 56, añadimos

ENUM_QQ_HELPER(element_new , 56)

Y no te molestes en editar get_enumqq_array(). La técnica se llama X Macro https://en.wikipedia.org/wiki/X_Macro. Si los desarrolladores lo desean, pueden modificar fácilmente la enumeración estándar de esta manera.

Tal vez no sea inmediatamente obvio, la enumeración resultó así:

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

Digamos que tenemos una enumeración. ¿Cómo podemos obtener todos los valores posibles de esta enumeración uno por uno, por ejemplo, en un bucle?

Es decir, tf1++ debe devolver secuencialmente PERIOD_M1, PERIOD_M2, PERIOD_M5... Creo que esto no se puede hacer con las herramientas lingüísticas.

Pero si hay un ENUM_MYENUM, (ENUM_MYENUM)INT_MAX debería dar el valor máximo del enum. De lo contrario, se trata de un error de conversión de tipos. Es sólo porque el operador de conversión de tipo debe devolver el valor de este mismo tipo. No es necesariamente válido en el contexto, pero sí en el tipo.