Как последовательно перебрать перечисление?

 

Допустим, имеем перечисление. Как последовательно, например в цикле, получить все возможные значения этого перечисления?

ENUM_TIMEFRAMES tf1;

Т.е. tf1++ должно последовательно возвращать PERIOD_M1, PERIOD_M2, PERIOD_M5... Думаю, что средствами языка это сделать нельзя.

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Периоды графиков
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Периоды графиков
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы графиков / Периоды графиков - Документация по MQL5
 
так делать нельзя так как значение периодов не увеличивается на единицу, нужно организовать свой собственный индекс перечисления, примерно так 
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:
так делать нельзя так как значение периодов не увеличивается на единицу, нужно организовать свой собственный индекс перечисления, примерно так 

Если бы все было так просто. Значения распределены не равномерно. Допустим PERIOD_H1  это 60, а следующий период PERIOD_H2 это уже 120.
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Периоды графиков
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Периоды графиков
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы графиков / Периоды графиков - Документация по MQL5
 
C-4:
Если бы все было так просто. Значения распределены не равномерно. Допустим PERIOD_H1  это 60, а следующий период PERIOD_H2 это уже 120.

Наверно нужно ввести две функции: 1 - возвращает количество элементов в перечислении, 2 - возвращает элемент по номеру...

 
Interesting:

Наверно нужно ввести две функции: 1 - возвращает количество элементов в перечислении, 2 - возвращает элемент по номеру...


все верно, в МТ4 я так и делал
 
C-4:
Если бы все было так просто. Значения распределены не равномерно. Допустим PERIOD_H1  это 60, а следующий период PERIOD_H2 это уже 120.

Суть в том что перечисление вещь предопределённая и все её значения можно посмотреть,

поэтому уважаемый sergey1294 вам и посоветовал описать таблицу перевода в последовательный вызов,

где при увеличении значения на 1 происходит вызов следующего по списку значения перечисления.

 
В общем решение одно. На каждое перечисление писать специальную функцию Enumerator. Например для Timeframes:
ENUM_TIMEFRAMES GetPeriodEnumerator(uchar i);
Теперь прикинем, сколько всего есть перечислений и сколько тогда должно быть функций конверторов (по одной на каждое перечисление).
 
C-4:
В общем решение одно. На каждое перечисление писать специальную функцию Enumerator. Например для Timeframes: Теперь прикинем, сколько всего есть перечислений и сколько тогда должно быть функций конверторов (по одной на каждое перечисление).
всего в МТ5 21 таймфрейм. Окончательный вариант будет выглядеть так
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:
всего в МТ5 21 таймфрейм. Окончательный вариант будет выглядеть так
Осталось сделать тоже самое для остальных стандартных нумераторов (идентификаторов) + если что еще и пользовательские вещи не забыть...
 
еще есть один вариант, записать значения таймфреймов в массив и перебирать этот массив, получая необходимое значения.
Документация по MQL5: Предопределенные переменные / _Period
Документация по MQL5: Предопределенные переменные / _Period
  • www.mql5.com
Предопределенные переменные / _Period - Документация по MQL5
 

В общем есть два варианта перечисления

первый с помощью функции, забыл в прошлом посте проставить двоеточие

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);
  }
Второй вариант с помощью массива
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
  };