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

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?

ENUM_TIMEFRAMES tf1;

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

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Периоды графиков
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Периоды графиков
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы графиков / Периоды графиков - Документация по MQL5
Sergey Gritsay  
non potete farlo perché il valore dei periodi non aumenta di uno, dovete organizzare il vostro indice di enumerazione, come questo
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);
 }
}
Vasiliy Sokolov  
sergey1294:
Questo non è possibile perché il valore del periodo non è incrementato di uno, dovete organizzare il vostro indice di enumerazione, come questo

Se solo fosse così semplice. I valori non sono distribuiti uniformemente. Supponiamo che PERIOD_H1 sia 60, e che il periodo successivo PERIOD_H2 sia 120.
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Периоды графиков
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Периоды графиков
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы графиков / Периоды графиков - Документация по MQL5
[Eliminato]  
C-4:
Se solo fosse così semplice. I valori non sono distribuiti uniformemente. Diciamo che PERIODO_H1 è 60 e il periodo successivo PERIODO_H2 è 120.

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

Sergey Gritsay  
Interesting:

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


Esatto, è quello che ho fatto in MT4
Mykola Demko  
C-4:
Se solo fosse così semplice. I valori non sono distribuiti uniformemente. Diciamo che PERIODO_H1 è 60 e il periodo successivo PERIODO_H2 è 120.

Il punto è che l'enumerazione è una cosa predefinita e tutti i suoi valori possono essere visualizzati,

Ecco perché il rispettato sergey1294 ti ha consigliato di descrivere la tabella di conversione in una chiamata seriale,

dove se il valore aumenta di 1, sarà chiamato il prossimo valore di enum nella lista.

Vasiliy Sokolov  
In generale, c'è una soluzione. Scrivere una funzione Enumerator speciale per ogni enumerazione. Per esempio, per Timeframes:
ENUM_TIMEFRAMES GetPeriodEnumerator(uchar i);
Ora stimiamo quante enumerazioni ci sono e quante funzioni Enumerator ci dovrebbero essere (una per ogni enumerazione).
Sergey Gritsay  
C-4:
In generale, c'è una soluzione. Per ogni enumerazione, scrivere una funzione Enumerator speciale. Per esempio, per Timeframes: ora stimiamo quante enumerazioni ci sono in totale e poi quante funzioni Enumerator ci dovrebbero essere (una per ogni enumerazione).
Ci sono 21 timeframes in totale in MT5. La versione finale sarà come questa
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);
  }
[Eliminato]  
sergey1294:
Ci sono un totale di 21 timeframes in MT5. La variante finale sarà così
Ora dobbiamo fare lo stesso per altri numeratori standard (identificatori) + se ci sono alcune cose personalizzate da non dimenticare...
Sergey Gritsay  

In generale, ci sono due opzioni per l'enumerazione

Prima usando una funzione, ho dimenticato di mettere i due punti nel mio ultimo 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);
  }
Il secondo modo è usare 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
  };
Motivazione: