¿Cómo puedo pasar por una enumeración de forma coherente?
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); } }
Esto no es posible porque el valor del periodo no se incrementa en uno, tienes que organizar tu propio índice de enumeración, así
- www.mql5.com
Probablemente haya que introducir dos funciones: 1 - devuelve el número de elementos de la enumeración, 2 - devuelve el elemento por número...
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.
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).
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).
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); }
Hay un total de 21 marcos temporales en MT5. La variante final tendrá el siguiente aspecto
- www.mql5.com
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 };
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.