我怎样才能持续地通过列举?

 

比方说,我们有一个枚举。我们怎样才能逐一获得这个枚举的所有可能值,例如在一个循环中?

ENUM_TIMEFRAMES tf1;

即tf1++必须依次返回PERIOD_M1, PERIOD_M2, PERIOD_M5...。我认为这不能用语言工具来完成。

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Периоды графиков
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Периоды графиков
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы графиков / Периоды графиков - Документация по MQL5
 
你不能这样做,因为周期的值不会增加1,你必须组织你自己的枚举索引,像这样
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:
这是不可能的,因为周期值不是以1递增的,你必须组织你自己的枚举索引,像这样

如果有这么简单就好了。这些数值的分布并不均匀。假设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 - 按编号返回元素...


没错,这就是我在MT4中的做法
 
C-4:
如果有这么简单就好了。这些数值的分布并不均匀。假设PERIOD_H1是60,下一个周期PERIOD_H2 是120。

关键是枚举是一个预定义的东西,它的所有值都可以被查看。

这就是为什么尊敬的sergey1294 建议你把转换表描述成一个串行调用。

其中,如果值增加了1,列表中的下一个枚举值将被调用。

 
一般来说,有一个解决方案。为每个枚举写一个特殊的Enumerator函数。例如,对于时间框架。
ENUM_TIMEFRAMES GetPeriodEnumerator(uchar i);
现在我们来估计一下有多少个枚举,以及应该有多少个枚举器函数(每个枚举一个)。
 
C-4:
一般来说,有一个解决方案。为每个枚举写一个特殊的Enumerator函数。例如,对于Timeframes:现在让我们估计一下总共有多少个枚举,然后应该有多少个Enumerator函数(每个枚举一个)。
MT5中共有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:
MT5中共有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
  };
原因: