MQL5超入門(2)/データ型/列挙型(enum)

ロシアのforumでは、草稿中のヘルプの第10稿が出ました。まだ白紙のページも残っていて、時間が掛かりそうな予感がしています。
indicator からトレンドラインやテキスト等のオブジェクトが作れない仕様 ( =EA かscript でしか作れない & どっちもチャートに1個しか乗せられない..orz) には、オブジェクト指向なのにオブジェクトが自由に作れないのはおかしい!!担当者でてこいー(超・意訳) …とクレームがついています。
MetaQuotes社の説明は、indicator の性能を極限まで最適化したら、そうなったんや!!。の一点張りですが、最終仕様は未確定なので、EA やscript を1枚のチャートに複数乗せられるか検討するよ〜...という流れになっています。


果てさて、どうなることやら...。


本題に戻って、MQL5超入門の続きです。


MQL5 で導入されたデータ型の1つに列挙型(enum 型)があります。
列挙型は、数値を文字列で表記することができ、プログラム内が意味不明な数字だらけになるのを防ぐ役割があります。

移動平均の種別を 0, 1, 2, と書くよりも、MODE_SMA , MODE_EMA , MODE_SMMA と書いたほうが直感的にわかりますよね。
…って、それはMQL4でも #define を使えばできてました。そこで、enum は何が違うのか見てゆきます。
(#define の説明はこっち参照。MQL5 でも#define は使えます。)

MQL4 で#define を利用した場合の書き方

#define MODE_SMA  0
#define MODE_EMA  1
#define MODE_SMMA 2
#define MODE_LWMA 3

MQL5 で、enum を利用した場合の書き方

enum ENUM_MA_METHOD{
  MODE_SMA ,
  MODE_EMA ,
  MODE_SMMA ,
  MODE_LWMA ,
};

#define 宣言では、文字列を指定した数字に置き換えるだけでしたが、 enum 宣言では、数字を指定しなくても自動的に0, 1, 2, 3, が割り振られ、且つ、新しいenumタイプのデータ型 ENUM_MA_METHOD 型を使えるようになります。
注) 実際には、ENUM_MA_METHODは、MQL5では標準で定義されているので、上の宣言は不要です。


中身がただの数値なら、わざわざ ENUM_MA_METHOD なんて型を作らなくても...と思われるかも知れませんが、型があると、MT5 が型の違いによってUI を変えることが出来たりします。
具体的には…
MQL4 での移動平均の外部パラメータ指定

extern int MA_Period = 13;
extern int MA_Shift  = 0;
extern int MA_Method = MODE_SMA;


MQL5 での移動平均の外部パラメータ指定

input            int MA_Period = 13;
input            int MA_Shift  = 0;
input ENUM_MA_METHOD MA_Method = MODE_SMA;

となります。MQL5 ではextern は別の意味になるので、input を使います。
int の代わりにENUM_MA_METHOD とすることで、UIが分かりやすくなりました。



これ以外の局面では、MQL4 時代と同様に enum 型は int 型と同じ扱いでよさそうです。
移植を前提にしている人は、敢えて、自分で enum 型を定義する必要はないでしょう..。