Como é que passo por uma enumeração de forma consistente?

 

Digamos que temos uma enumeração. Como podemos obter todos os valores possíveis desta enumeração um a um, por exemplo, em loop?

ENUM_TIMEFRAMES tf1;

Isto é, tf1++ deve retornar sequencialmente PERÍODO_M1, PERÍODO_M2, PERÍODO_M5... Penso que isto não pode ser feito com as ferramentas linguísticas.

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Периоды графиков
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Периоды графиков
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы графиков / Периоды графиков - Документация по MQL5
 
não pode fazer isto porque o valor dos períodos não aumenta em um, tem de organizar o seu próprio índice de enumeração, como este
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:
Isto não é possível porque o valor do período não é incrementado por um, tem de organizar o seu próprio índice de enumeração, como este

Se ao menos fosse assim tão simples. Os valores não são distribuídos uniformemente. Suponhamos que PERÍODO_H1 é 60, e o próximo período PERÍODO_H2 é 120.
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Периоды графиков
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Периоды графиков
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы графиков / Периоды графиков - Документация по MQL5
 
C-4:
Se ao menos fosse assim tão simples. Os valores não são distribuídos uniformemente. Digamos que PERÍODO_H1 é 60 e o próximo período PERÍODO_H2 é 120.

Há provavelmente duas funções que precisam de ser introduzidas: 1 - devolve o número de elementos da enumeração, 2 - devolve o elemento por número...

 
Interesting:

Há provavelmente duas funções que precisam de ser introduzidas: 1 - devolve o número de elementos da enumeração, 2 - devolve o elemento por número...


É isso mesmo, foi o que fiz no MT4
 
C-4:
Se ao menos fosse assim tão simples. Os valores não são distribuídos uniformemente. Digamos que PERÍODO_H1 é 60 e o próximo período PERÍODO_H2 é 120.

A questão é que a enumeração é uma coisa pré-definida e todos os seus valores podem ser vistos,

É por isso que o respeitado Sergey1294 o aconselhou a descrever a tabela de conversão em chamada em série,

onde se o valor aumentar em 1, será chamado o próximo valor enumeral da lista.

 
Em geral, existe uma solução. Escrever uma função especial de Enumerador para cada enumeração. Por exemplo, para Prazos:
ENUM_TIMEFRAMES GetPeriodEnumerator(uchar i);
Agora vamos estimar quantas enumerações existem e quantas funções do Enumerador devem existir (uma para cada enumeração).
 
C-4:
Em geral, existe uma solução. Para cada enumeração, escrever uma função especial de Enumerador. Por exemplo, para Prazos: agora vamos estimar quantas enumerações existem no total e depois quantas funções do Enumerador devem existir (uma para cada enumeração).
Há 21 prazos no total em MT5. A versão final terá o seguinte 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:
Há um total de 21 períodos de tempo em MT5. A variante final terá o seguinte aspecto
Agora precisamos de fazer o mesmo para outros numeradores padrão (identificadores) + se há algumas coisas personalizadas a não esquecer...
 
Outra opção é escrever os valores de prazos numa matriz e percorrer a matriz, obtendo o valor requerido.
Документация по MQL5: Предопределенные переменные / _Period
Документация по MQL5: Предопределенные переменные / _Period
  • www.mql5.com
Предопределенные переменные / _Period - Документация по MQL5
 

Em geral, há duas opções para a enumeração

Primeiro usando uma função, esqueci-me de colocar um cólon no meu último posto

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);
  }
A segunda forma é utilizando uma matriz
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
  };