移動平均線の種類やチャートの時間軸を数値のまま(`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);
}
`TimeFrame`と`MaMethods`は、`iMA()`の第2引数(タイムフレーム)・第5引数(移動平均の種類)にそのまま渡せます。パラメーター設定画面でドロップダウンから選ぶだけで、コードを書き換えずに条件を変えて試せるのがenumを使う一番のメリットです。
まとめ
enumを活用することでよりソースコードの見栄えが良くなるのでぜひ活用してみてください。
コメント