¿Cómo puedo pasar por una enumeración de forma coherente?

 

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?

ENUM_TIMEFRAMES tf1;

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

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Периоды графиков
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Периоды графиков
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы графиков / Периоды графиков - Документация по MQL5
 
no se puede hacer esto porque el valor de los periodos no se incrementa en uno, hay que organizar un índice de enumeración propio, así
int TF(int i)
{
 switch(i)
 {
  case 1: return(PERIOD_M1);
  case 2: return(PERIOD_M5);
  case 3: return(PERIOD_M15);
  case 4: return(PERIOD_M30);
  case 5: return(PERIOD_H1);
  case 6: return(PERIOD_H4);
  case 7: return(PERIOD_D1);
  case 8: return(PERIOD_W1);
  case 9: return(PERIOD_MN1);
 }
}
 
sergey1294:
Esto no es posible porque el valor del periodo no se incrementa en uno, tienes que organizar tu propio índice de enumeración, así

Si fuera tan sencillo. Los valores no están distribuidos uniformemente. Supongamos que PERIOD_H1 es de 60, y el siguiente periodo PERIOD_H2 es de 120.
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Периоды графиков
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Периоды графиков
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы графиков / Периоды графиков - Документация по MQL5
 
C-4:
Si fuera tan sencillo. Los valores no están distribuidos uniformemente. Digamos que PERIOD_H1 es 60 y el siguiente periodo PERIOD_H2 es 120.

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

 
Interesting:

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


Así es, eso es lo que hice en MT4
 
C-4:
Si fuera tan sencillo. Los valores no están distribuidos uniformemente. Digamos que PERIOD_H1 es 60 y el siguiente periodo PERIOD_H2 es 120.

La cuestión es que la enumeración es algo predefinido y se pueden ver todos sus valores,

Por eso el respetado sergey1294 te aconsejó que describieras la tabla de conversión en una llamada en serie,

donde si el valor aumenta en 1, se llamará al siguiente valor del enum de la lista.

 
En general, hay una solución. Escriba una función especial de Enumerador para cada enumeración. Por ejemplo, para los plazos:
ENUM_TIMEFRAMES GetPeriodEnumerator(uchar i);
Ahora vamos a estimar cuántas enumeraciones hay y cuántas funciones Enumerator debe haber (una por cada enumeración).
 
C-4:
En general, hay una solución. Para cada enumeración, escriba una función especial de Enumerador. Por ejemplo, para los plazos: Ahora vamos a estimar cuántas enumeraciones hay en total y luego cuántas funciones Enumerador debe haber (una para cada enumeración).
Hay 21 marcos temporales en total en MT5. La versión final tendrá el siguiente aspecto
ENUM_TIMEFRAMES GetPeriodEnumerator(uchar i)
  {
   switch(i)
     {
      case 0  return(PERIOD_M1);
      case 1  return(PERIOD_M2);
      case 2  return(PERIOD_M3);
      case 3  return(PERIOD_M4);
      case 4  return(PERIOD_M5);
      case 5  return(PERIOD_M6);
      case 6  return(PERIOD_M10);
      case 7  return(PERIOD_M12);
      case 8  return(PERIOD_M15);
      case 9  return(PERIOD_M20);
      case 10 return(PERIOD_M30);
      case 11 return(PERIOD_H1);
      case 12 return(PERIOD_H2);
      case 13 return(PERIOD_H3);
      case 14 return(PERIOD_H4);
      case 15 return(PERIOD_H6);
      case 16 return(PERIOD_H8);
      case 17 return(PERIOD_H12);
      case 18 return(PERIOD_D1);
      case 19 return(PERIOD_W1);
      case 20 return(PERIOD_MN1);
     }
   return(-1);
  }
 
sergey1294:
Hay un total de 21 marcos temporales en MT5. La variante final tendrá el siguiente aspecto
Ahora tenemos que hacer lo mismo para otros numeradores estándar (identificadores) + si hay algunas cosas personalizadas no olvidar...
 
Otra opción es escribir los valores de los plazos en una matriz y recorrerla, obteniendo el valor requerido.
Документация по MQL5: Предопределенные переменные / _Period
Документация по MQL5: Предопределенные переменные / _Period
  • www.mql5.com
Предопределенные переменные / _Period - Документация по MQL5
 

En general, existen dos opciones de enumeración

Primero usando una función, me olvidé de poner dos puntos en mi último post

ENUM_TIMEFRAMES GetPeriodEnumerator(uchar i)
  {
   switch(i)
     {
      case 0:  return(PERIOD_M1);
      case 1:  return(PERIOD_M2);
      case 2:  return(PERIOD_M3);
      case 3:  return(PERIOD_M4);
      case 4:  return(PERIOD_M5);
      case 5:  return(PERIOD_M6);
      case 6:  return(PERIOD_M10);
      case 7:  return(PERIOD_M12);
      case 8:  return(PERIOD_M15);
      case 9:  return(PERIOD_M20);
      case 10: return(PERIOD_M30);
      case 11: return(PERIOD_H1);
      case 12: return(PERIOD_H2);
      case 13: return(PERIOD_H3);
      case 14: return(PERIOD_H4);
      case 15: return(PERIOD_H6);
      case 16: return(PERIOD_H8);
      case 17: return(PERIOD_H12);
      case 18: return(PERIOD_D1);
      case 19: return(PERIOD_W1);
      case 20: return(PERIOD_MN1);
     }
   return(-1);
  }
La segunda forma es utilizando un array
ENUM_TIMEFRAMES GetPeriodEnumerator[21]=
  {
   PERIOD_M1,
   PERIOD_M2,
   PERIOD_M3,
   PERIOD_M4,
   PERIOD_M5,
   PERIOD_M6,
   PERIOD_M10,
   PERIOD_M12,
   PERIOD_M15,
   PERIOD_M20,
   PERIOD_M30,
   PERIOD_H1,
   PERIOD_H2,
   PERIOD_H3,
   PERIOD_H4,
   PERIOD_H6,
   PERIOD_H8,
   PERIOD_H12,
   PERIOD_D1,
   PERIOD_W1,
   PERIOD_MN1
  };