移動平均線の種類やチャートの時間軸を数値のまま(`MODE_SMA`や`60`のような値)コードに直接書いていると、バックテストのログを見返したときに「あれ、このModeって何だっけ」と読み返す羽目になりがちです。

Enum(列挙型)を使えば、こうした数値をわかりやすい名前でひとまとめにでき、コードの見た目も読みやすくなります。この記事では、Enumの基本的な書式から、実際にMQLでよく使われる「時間軸」「移動平均線の種類」の2パターンを、iMA関数と組み合わせて動かせる完全なコードまで解説します。

Enum(列挙型)

Enum(列挙型)とは、複数の定数をひとつにまとめておくことができる型のことです。

定数をひとまとめにすることができる優れものです。

Enumで定義する定数のことを列挙子と呼びます。

Enumの特徴

Enumの特徴は以下のようになります。

  • 複数の定数(列挙子)を一つの型で統一して管理できる
  • 列挙子に分かりやすい名前を付けられるため、コードの可読性が上がる
  • `input`変数として使うと、MT4のパラメーター設定画面でドロップダウンから選べるようになる

Enumの書式について

Enumの書式は以下のとおりです。

定数のリストはそれそれ定数名をカンマ(,)で区切って指定します。

enum 列挙名 
{
    定数リスト1,
    定数リスト2,
    ・・・
};

Enumの使い道

Enumの使いみちですが、

バックテストなどで移動平均線の種類やModeの値などがわからなくなることがあります。

毎回調べるのが面倒なのでEnumを活用して、使いまわしすることが可能です。

時間軸をenumにした場合

時間軸をenumにした場合は以下のようになります。

enum timeFrame_List
{
     Current_timeFrame=0,
     M1 =1,
     M5 =5,
     M15=15,
     M30=30,
     H1 =60,
     H4 =240,
     D1 =1440,
     W1 =10080,
     MN =43200
};
input timeFrame_List TimeFrame = M5;

この`TimeFrame`は、MT4のパラメーター設定画面では「Current_timeFrame」「M1」「M5」…という名前の選択肢として表示されます。数値を直接入力する必要がなく、選び間違いも防げます。

移動平均線の種類をenumにした場合

移動平均線の種類をenumにした場合は以下のようになります。

enum maMethod_List
{
     SMA=MODE_SMA,
     EMA=MODE_EMA,
     SMMA=MODE_SMMA,
     LWMA=MODE_LWMA
};
input maMethod_List MaMethods = EMA;

enumを実際にiMA関数と組み合わせて使う

ここまでの2つのenumは定義しただけで終わりがちですが、実際に使うときはiMA関数の引数にそのまま渡すことができます。以下は、上記2つのenumを使って移動平均線の値を取得し、チャート上にコメント表示する最小限のインジケーターです。

1点注意点として、MQL4は「使う場所より前で定義する」というルールがあります。enumをinput変数の型として使う場合は、そのenum定義をinput宣言より前に書いてください。順番を逆にすると、コンパイル時に「型が見つからない」というエラーになります。

#property strict
#property indicator_chart_window

//enumは使う場所より前で定義する(input変数の型として使うため)
enum timeFrame_List
{
     Current_timeFrame=0,
     M1 =1,
     M5 =5,
     M15=15,
     M30=30,
     H1 =60,
     H4 =240,
     D1 =1440,
     W1 =10080,
     MN =43200
};

enum maMethod_List
{
     SMA=MODE_SMA,
     EMA=MODE_EMA,
     SMMA=MODE_SMMA,
     LWMA=MODE_LWMA
};

//パラメーター
input timeFrame_List TimeFrame = M5;
input maMethod_List   MaMethods = EMA;
input int             MaPeriod  = 20;

int OnInit()
{
   return(INIT_SUCCEEDED);
}

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
   double ma = iMA(NULL, TimeFrame, MaPeriod, 0, MaMethods, PRICE_CLOSE, 0);
   Comment("選択中の時間軸のMA(", MaPeriod, "期間): ", DoubleToString(ma, Digits));
   return(rates_total);
}
Copy

`TimeFrame`と`MaMethods`は、`iMA()`の第2引数(タイムフレーム)・第5引数(移動平均の種類)にそのまま渡せます。パラメーター設定画面でドロップダウンから選ぶだけで、コードを書き換えずに条件を変えて試せるのがenumを使う一番のメリットです。

まとめ

enumを活用することでよりソースコードの見栄えが良くなるのでぜひ活用してみてください。

関連記事