Comment faire pour passer une énumération de manière cohérente ?

 

Disons que nous avons une énumération. Comment obtenir toutes les valeurs possibles de cette énumération une par une, par exemple dans une boucle ?

ENUM_TIMEFRAMES tf1;

C'est-à-dire que tf1++ doit retourner séquentiellement PERIOD_M1, PERIOD_M2, PERIOD_M5.... Je pense que cela ne peut pas être fait avec les outils linguistiques.

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Периоды графиков
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Периоды графиков
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы графиков / Периоды графиков - Документация по MQL5
 
vous ne pouvez pas le faire car la valeur des périodes n'augmente pas d'une unité, vous devez organiser votre propre indice d'énumération, comme ceci
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:
Ce n'est pas possible car la valeur de la période n'est pas incrémentée de un, vous devez organiser votre propre index d'énumération, comme ceci

Si seulement c'était aussi simple. Les valeurs ne sont pas uniformément réparties. Supposons que la période PERIOD_H1 soit de 60, et que la période suivante PERIOD_H2 soit de 120.
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Периоды графиков
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Периоды графиков
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы графиков / Периоды графиков - Документация по MQL5
 
C-4:
Si seulement c'était aussi simple. Les valeurs ne sont pas uniformément réparties. Disons que la période PERIOD_H1 est de 60 et que la période suivante PERIOD_H2 est de 120.

Il y a probablement deux fonctions qui doivent être saisies : 1 - retourne le nombre d'éléments dans l'énumération, 2 - retourne l'élément par numéro...

 
Interesting:

Il y a probablement deux fonctions qui doivent être saisies : 1 - retourne le nombre d'éléments dans l'énumération, 2 - retourne l'élément par numéro...


C'est exact, c'est ce que j'ai fait dans MT4.
 
C-4:
Si seulement c'était aussi simple. Les valeurs ne sont pas uniformément réparties. Disons que la période PERIOD_H1 est de 60 et que la période suivante PERIOD_H2 est de 120.

Le fait est que l'énumération est une chose prédéfinie et que toutes ses valeurs peuvent être visualisées,

C'est pourquoi le respecté sergey1294 vous a conseillé de décrire la table de conversion en un appel de série,

où si la valeur augmente de 1, la valeur suivante de l'enum dans la liste sera appelée.

 
En général, il existe une seule solution. Écrivez une fonction spéciale de l'énumérateur pour chaque énumération. Par exemple pour les délais :
ENUM_TIMEFRAMES GetPeriodEnumerator(uchar i);
Estimons maintenant combien il y a d'énumérations et combien de fonctions Enumerator il devrait y avoir (une pour chaque énumération).
 
C-4:
En général, il existe une seule solution. Pour chaque énumération, écrivez une fonction spéciale d'énumérateur. Par exemple, pour les délais : estimons maintenant combien d'énumérations il y a au total et ensuite combien de fonctions énumératrices il devrait y avoir (une pour chaque énumération).
Il y a 21 périodes de temps au total dans MT5. La version finale ressemblera à ceci
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:
Il existe un total de 21 délais dans MT5. La variante finale ressemblera à ceci
Il faut maintenant faire de même pour les autres numérateurs (identifiants) standard + s'il y a des choses personnalisées à ne pas oublier...
 
Une autre option consiste à écrire les valeurs de l'horizon temporel dans un tableau et à parcourir ce tableau pour obtenir la valeur requise.
Документация по MQL5: Предопределенные переменные / _Period
Документация по MQL5: Предопределенные переменные / _Period
  • www.mql5.com
Предопределенные переменные / _Period - Документация по MQL5
 

En général, il existe deux options pour l'énumération

Première utilisation d'une fonction, j'ai oublié de mettre un deux-points dans mon dernier message.

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 deuxième méthode consiste à utiliser un tableau
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
  };