【超入門】MQL5 EA講座 第21回「Enum列挙型」【EAの作り方】

MQL5でEA作ろう講座

今回はEnum列挙型というものについて解説していきたいと思います<m(__)m>

Enum列挙型を使いこなせるようになると、EA開発におけるコード記述を整理するのに大変役立ちます。

たとえば、為替市場におけるさまざまな状態や注文タイプを扱う際、Enum列挙型を使用することで、それぞれの状態やタイプに具体的な名前を付けることができます。

これにより、数値や不透明なコードを解釈する代わりに、直感的に理解できる名前を使用することができます。

今の時点ではピンとこないかもしれませんが、実際にEAを開発する段階になると、それが実感できるようになるかと思います。EA開発の上でまた一つ便利な武器が手に入る!といったイメージを抱きながら今回も読んでいただけると幸いです。

分かりやすい解説を心掛けましたので、今回も是非楽しんで学習して頂ければと思います。

MQL5で自動売買プログラム作るにあたっては、MT5メタエディターがお使いのパソコンにインストールされている必要があります。

もし、まだMT5のダウンロードが完了していない方は、

こちらからデモ口座の開設とMT5のダウンロード・インストールを完了して頂ければと思います。

スポンサーリンク
スポンサーリンク

Enum列挙型とは?

Enum列挙型というのは、今までの講座記事で取り上げてきたデータ型の一つです。

データ型については大丈夫でしょうか?

データ型→ 変数に入れるデータの種類を決めるためのラベルのようなもの

でしたね。

整数型(int) とか 実数型(double) とか 文字列型(string)とか、そういうやつです。

忘れてしまった人は↓の記事をご覧ください。

Enum列挙型は厳密には、整数型の1種です。

Enum列挙型の特徴は、整数型 の 定数をまとめて、リスト化できるところにあります。

定数 のことは覚えていますでしょうか?

定数定まった数→決まっている、変わらない数

でしたね。詳しくは↓をご覧ください。

でも、整数型定数をまとめてリスト化する、と言われてもピンとこないですよね?

実際にEnum列挙型を作ってみましょう。

Enum列挙型の作り方

サンプルとして、1週間を表すEnum列挙型を作っていきたいと思います。↓のような感じになります。

//「DayOfWeek」という名前のenum列挙型を作る。
 enum DayOfWeek
{
   Sunday,
   Monday,
   Tuesday,
   Wednesday,
   Thursday,
   Friday,
   Saturday
};

サンプルコードの中身を順にみていきましょう。

まず enum

というキーワードを最初に記述します。この記述によって、

Enum列挙型データ型を作りますよー」

という意味になります。

続いて、データ型の名前を決めます。これは変数名と同じように自分で決めます。

今回はデータ型の名前は「DayOfWeek」としました。

データ型の名前を記述したら、その後ろに{}を書いて、{}内にリスト化する値をコンマで区切って記述していきます。

}の後ろには普通の記述文と同様に、いったん記述の終了を表す ;(セミコロン)をつけます。

ご覧の通り1週間の各曜日の英単語が、コンマ区切りで{}内に記述されていますね。

・・・「Enum列挙型整数型 の 定数をまとめてリスト化したものって言っていなかったっけ?

SundayとかMondayって文字じゃん!( `ー´)ノ」

と思われた方は鋭いです。

鋭いですが、そのことについてはもうしばらくお待ちください。

実際に作ったEnum列挙型をプログラムの中で使ってみると、わかると思います。

Enum列挙型の使い方

では、「DayOfWeek」という名前のEnum列挙型OnStart関数の中で使ってみましょう。

//「DayOfWeek」という名前のenum列挙型を作る。
 enum DayOfWeek
{
   Sunday,
   Monday,
   Tuesday,
   Wednesday,
   Thursday,
   Friday,
   Saturday
};
      

 
void OnStart()
  {
     
     //enum列挙型「DayOfWeek」をデータ型にした変数名「day」を宣言
      DayOfWeek day;
      
      //変数「day」に、値「Tuesday」を代入
      day=Tuesday;
      
      //ログ出力
      Print(Tuesday);
  }

先ほど、「DayOfWeek」というデータ型をまず記述し、その後ろに、「day」という変数(=インスタンス)をつけました。これで「day」には「DayOfWeek」でリスト化したSundayとかMonday・・・といった値が格納できるようになったわけです。

※今回解説しているEnum列挙型や、今後出てくる構造体クラスなどのように、自分で作れるデータ型を実際に利用する時に、宣言する変数のようなもの(上のサンプルコードで言えば、「day」に該当するもの)をインスタンスと呼びます(インスタンスについては第54回「インスタンスについて」 で詳しく解説予定です)↓

インスタンスEnum列挙型クラス構造体を実際に使う時に宣言する、変数名のようなもの

まずはこれだけ覚えておいてください。(構造体クラスについては、講座第22回第48回でそれぞれ解説しますので、今は覚えなくても大丈夫です)

試しに値「Tuesday」を代入して、Print関数ログ出力してみましょう。↓

メッセージには「Tuesday」ではなくて、「2」という数字が出てきました。

???どういうことでしょうか?

ここで

Enum列挙型整数型定数をまとめてリスト化したもの

というEnum列挙型の定義に立ち戻るわけです。こういうことです↓

enum DayOfWeek
{
   Sunday,//定数0として処理される
   Monday,//定数1として処理される
   Tuesday,//定数2として処理される
   Wednesday,//定数3として処理される
   Thursday,//定数4として処理される
   Friday,//定数5として処理される
   Saturday//定数6として処理される
};

Sunday、Monday・・・といった情報はあくまで我々人間が表面上視認しているものであり、実際にプログラムとしては、列挙している順に0,1,2・・・という定数で認識・処理されるわけです。

プログラムの最後の記述を少しだけ変えてみます。↓

void OnStart()
  {
     
     //enum列挙型「DayOfWeek」をデータ型にした変数名「day」を宣言
      DayOfWeek day;
      
      //変数「day」に、値「Tuesday」を代入
      day=Tuesday;
      
      //ログ出力
      Print(EnumToString(day));
  }

Print関数の中にEnumToString関数という関数が入っています。

少し難しい記述になっておりますが、細かい意味は今は分からなくても大丈夫です。

※詳しく知りたい方は↓の記事をご参照ください。

Enum列挙型のデータを文字列データに変換している、と思ってください。

実行してみます

定数データが文字列データに変換されて「Tuesday」がログ出力されました。

Sunday=0,Monday=1・・・ということであれば、こういう記述にしても↓・・・

void OnStart()
  {
     
     //enum列挙型「DayOfWeek」をデータ型にした変数名「day」を宣言
      DayOfWeek day;
      
      //変数「day」に、値「2」を代入
      day=2;
      
      //ログ出力
      Print(EnumToString(day));
  }

インスタンス「day」に代入する値を「Tuesday」から「2」に変更しました。

実行してみます。

出力結果は値「Tuesday」を代入していた時と同じになりました。

Enum列挙型として作った「DayOfWeek」にて、「Tuesday」=「定数2」と定めているので、必然的に上記のような結果になります。

ちなみに、「DayOfWeek」が定数リストとして定義しているのは、「Sunday=0」 から「Saturday=6」までなので、

↓のように

void OnStart()
  {
     
     //enum列挙型「DayOfWeek」をデータ型にした変数名「day」を宣言
      DayOfWeek day;
      
      //変数「day」に、値「7」を代入
      day=7;
      
      //ログ出力
      Print(EnumToString(day));
  }

インスタンス「day」に、値「7」を代入し、これをコンパイルすると・・・

コンパイルエラーになってしまいました。

エラーの内容は

「7はEnum列挙型「DayOfWeek」のデータに変換できません」

というものです。7は定数リスト化されていない値なので、変換できないという訳です。

また、Enum列挙型定数リストは、記述した順に0,1,2,3・・・でなければ駄目!という訳でもありません。

Enum列挙型を作るときに、自分自身で設定することもできます。↓

//「DayOfWeek」という名前のenum列挙型を作る。
enum DayOfWeek
{
   Sunday=1,//Sundayを定数1として設定する
   Monday=4,//Mondayを定数4として設定する
   Tuesday=3,//Tuesdayを定数3として設定する
   Wednesday=6,//Wednesdayを定数6として設定する
   Thursday=2,//Thursdayを定数2として設定する
   Friday=5,//Fridayを定数5として設定する
   Saturday=0//Saturdayを定数0として設定する
};
 
void OnStart()
  {
     
     //enum列挙型「DayOfWeek」をデータ型にした変数名「day」を宣言
      DayOfWeek day;
      
      //インスタンス「day」に、値「2」を代入
      day=2;
      
      //ログ出力
      Print(EnumToString(day));
  }

0-6の値をバラバラに割り振りました。このプログラムを実行すると・・・

定数「2」が割り振られている「Thursday」がログ出力されました。

以上がEnum列挙型の概要になります。

いかがだったでしょうか?少し混乱させてしまったかもしれません。

でも今回やった事というのは、そこまで大したことではなく、

元々用意されていた、int や doublestring といったデータ型とは別に、「DayOfWeek」という名前のオリジナルのデータ型を作った、というだけなんです。

今までの講座記事で取り上げてきたデータ型と違い、Enum列挙型はある程度自分でカスタマイズできるデータ型である、ということを押さえていただけると幸いです。

カスタマイズできるデータ型」という考え方は、この後取り扱う予定の 構造体クラスにも適用できる考え方だからです。

・・・でも、無理はしないでくださいね。 ^^) _旦~~

わからなくなったり、忘れてしまった事項は後から何度でも読み返し、復習すればいいだけです。

まとめ

今回はEnum列挙型 について解説しました。

今回の記事では以下のことを学びました

今回は以上になります。

最後までお読みいただきありがとうございました<m(__)m>

【超入門】MQL5 EA講座 第20回「多次元配列」【EAの作り方

          →【超入門】MQL5 EA講座 第22回「構造体」【EAの作り方】

コメント

タイトルとURLをコピーしました