Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Поделись своими разработками. Это увеличит твой рейтинг.
Vasiliy Sokolov
21115
Vasiliy Sokolov 2010.08.05 20:44 

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

ENUM_TIMEFRAMES tf1;

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

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

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

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


Sergey Gritsay
6243
Sergey Gritsay 2010.08.05 21:25  
Interesting:

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


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

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

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

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

Vasiliy Sokolov
21115
Vasiliy Sokolov 2010.08.05 22:44  
В общем решение одно. На каждое перечисление писать специальную функцию Enumerator. Например для Timeframes:
ENUM_TIMEFRAMES GetPeriodEnumerator(uchar i);
Теперь прикинем, сколько всего есть перечислений и сколько тогда должно быть функций конверторов (по одной на каждое перечисление).
Sergey Gritsay
6243
Sergey Gritsay 2010.08.05 22:59  
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);
  }

Vladimir Batrudinov
4917
Vladimir Batrudinov 2010.08.05 23:12  
sergey1294:
всего в МТ5 21 таймфрейм. Окончательный вариант будет выглядеть так
Осталось сделать тоже самое для остальных стандартных нумераторов (идентификаторов) + если что еще и пользовательские вещи не забыть...
Sergey Gritsay
6243
Sergey Gritsay 2010.08.05 23:18  
еще есть один вариант, записать значения таймфреймов в массив и перебирать этот массив, получая необходимое значения.
Документация по MQL5: Предопределенные переменные / _Period
Документация по MQL5: Предопределенные переменные / _Period
  • www.mql5.com
Предопределенные переменные / _Period - Документация по MQL5
Sergey Gritsay
6243
Sergey Gritsay 2010.08.05 23:32  

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

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

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
  };




/ /12345678
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий