エニュメレーションを一貫して行うにはどうしたらいいですか?

 

仮に列挙があるとしよう。この列挙の可能な値を一つずつ、例えばループの中で取得するにはどうしたらよいでしょうか。

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だとします。

入力が必要な関数は2つでしょう。1 - 列挙された要素の数を返す、2 - 番号で要素を返す...

 
Interesting:

入力が必要な関数は2つでしょう。1 - 列挙された要素の数を返す、2 - 番号で要素を返す...


そうなんです、MT4でやったことなんです
 
C-4:
そんな簡単なものならいいのですが。値が均等でない。PERIOD_H1が60で、次の期間PERIOD_H2が 120だとします。

ポイントは、列挙はあらかじめ定義されたもので、そのすべての値を見ることができるということです。

そのため、尊敬するsergey1294 さんから、シリアルコールに変換するテーブルを記述するようにアドバイスをいただきました。

ここで、valueが1増加した場合、リストの次のenum値が呼び出されます。

 
一般的には、解決策は一つです。各列挙ごとに特別なEnumerator関数を書いてください。例えばTimeframesの場合。
ENUM_TIMEFRAMES GetPeriodEnumerator(uchar i);
では、列挙がいくつあって、Enumerator関数がいくつあればいいのか(各列挙に1つずつ)、推定してみましょう。
 
C-4:
一般的には、解決策は一つです。それぞれの列挙について、特別なEnumerator関数を書いてください。例えば、Timeframesの場合:さて、全部でいくつの列挙があるのか、そして、いくつのEnumerator関数(各列挙に対して1つ)があるべきかを推定してみよう。
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
 

一般に、列挙には次の2つの選択肢があります。

関数を使うのは初めて、前回の投稿でコロンを付け忘れていた

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);
  }
2つ目の方法は、配列を使用する方法です。
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
  };
理由: