MT4やMT5など自分でEAのパラメーターを設計する場合、プログラミング言語MQLを用いてプログラムを書いていく必要があります。
しかし、そのプログラムの記述をシンプルにしかもわかりやすく利用したいという方も多いのではないでしょうか。
そこで今回は、MQLで利用できるEnum列挙型について解説し、特徴や作り方、使い方を解説します。
こんな方におすすめ
- MQLのプログラムを効率的に書きたい
- Enum列挙型について知りたい
- 実際にEnum列挙型を書いてみたい
目次
Enum列挙型とは
Enum列挙型とは、複数の定数をひとつにまとめておくことができる型のことです。
これは、EAのパラメーターで用いるMQLで用いられるだけでなく、様々なプログラミング言語で利用されています。
そのため、他のプログラムを扱ったことがある方にとっても聞き覚えのある言葉かもしれません。
Enum列挙型の例として、EAの設定値をEA内に設置する場合に用いられることが挙げられます。
具体例として、EAの変数の値にA、B、Cの3手法から選べるEAがあったとします。
ここでEnum列挙型を用いることで、EAの設定画面(パラメーターの入力)から手法の種類という項目の値を選択すると、A、B、Cのいずれかを選べるようになるのです。
Enum列挙型を使えるようになれば、このA、B、Cといった選択肢(定数)をEAの設定値として一つの項目(手法の種類)にまとめられるようになります。
さらにEnum列挙型を利用することでEAを利用した際、簡単に設定を変更できるようになるというのも注目の機能といえるでしょう。
そんなEnum列挙型の特徴について、次の項目で説明していきます。
Enum列挙型の特徴
Enum列挙型には魅力的な特徴として次の3点が挙げられます。
- 関連するいくつもの固定値を一つのグループとして扱うことができる
- 各固定値に対して、さまざまな詳細情報を設定することができる
- 固定値全体に適用できる共通の動作や機能を作ることができる
これらについてそれぞれどのような特徴なのかを解説していきましょう。
関連するいくつもの固定値を一つのグループとして扱うことができる
Enum列挙型を利用すれば関連するいくつもの固定値をたった一つのグループにまとめられます。
EAでは多くの設定値を設定して走らせることが少なくありません。
しかし設定値をまとめずに表示させてしまうと、非常に見にくくなるだけでなく、誤った操作をしてしまうことも十分起こりうるのです。
このようなトラブルを避けたり、円滑な設定値を選べるという意味でもEnum列挙型でグループにしてリスト化することができるのは大きなメリットであり、特徴と言えます。
各固定値に対して、さまざまな詳細情報を設定することができる
Enum列挙型を利用すれば各固定値に対してさまざまな詳細情報を設定できます。
たとえば、買いのみ、売りのみ、両建てあり、両建てなしといった4つの固定値を用意したとします。
この固定値ごとにそれぞれの情報を付与することで、どのような固定値なのか分かる仕組みです。
さらに、それぞれの固定値に対して、どのような動作をする(たとえば売り注文を入れるなど)かも設定できるのもメリットとして挙げられます。
なお、関連して、//コメントで日本語文字を選択肢にすることもできる点も日本語を使うユーザーとして便利な点です。
固定値全体に適用できる共通の動作や機能を作ることができる
Enum列挙型をEAのプログラムに導入することで、固定値全体に適用できる共通の動作や機能を設定できる点もメリットです。
たとえば、固定値それぞれに売り注文を実行するという動作が共通している場合、通常であれば固定値それぞれに売り注文を実行するという動作を設定します。
しかし、Enum列挙型を利用すればEnum列挙型上であらかじめ売り注文を実行するという命令を加えれば、一つのグループにまとめられた固定値すべてにその命令が適用される仕組みです。
固定値が多くなればなるほどメリットは大きくなるため、本格的なEAをプログラミングしたいと考えている場合は、Enum列挙型の利用が必須といっても過言ではありません。
スムーズに操作でき、プログラムの記述をスッキリさせるという意味でも、共通の動作や機能を作れるEnum列挙型は有効な手段といえるでしょう。
Enum列挙型の作り方
EAに導入するためのEnum列挙型の作り方について解説します。
手順としては次の流れで進めていく形です。
- enumの記述
- データ型の名前の入力
- {}内にリスト化する値を記述
- 応用:移動平均線の種類を指定する記述
- 応用2:時間軸の種類を指定する記述
これらの順番で見ていきましょう。
enumの記述
Enum列挙型を利用することを記述します。
たとえば、次のような形で 「enum」というキーワードを最初に記述します。
//「sample」という名前のenum列挙型を作る。
enum
これでEnum列挙型のデータ型(数字や文字列などのラベルを入れた箱のような仕組み)を作るということを記述してEnum列挙型のプログラムを入れる流れです。
言い換えれば、冒頭にこの「enum」を記述しないと、この先ににいくらプログラムを入れてもEnum列挙型として認められません。
まずはこの「enum」を書き込みましょう。
データ型の名前の入力
続いて行うのは、Enum列挙型の名前です。
これは自分で分かりやすい名前、あるいはパラメーターの種類(買い方)のタイトルを入力します。
ここでは「sample」という名前で入力していきましょう。
//「sample」という名前のenum列挙型を作る。
enum sample
これでsampleという名前のEnum列挙型の仕組みを作るという形になります。
{}内にリスト化する値を記述
名前を入力したら、入れておくデータのリストを作りましょう。
データ型の名前を記述したら、その後ろに{}を書いて、{}内にリスト化する値をコンマで区切って記述することで、選択できるデータを入力します。
ここではA~Gまでのリストを入れていきましょう。
//「sample」という名前のenum列挙型を作る。
enum sample
{
A,
B,
C,
D,
E,
F,
G
};
ポイントとして、次の2点を押さえます。
- リストの最後はコンマを入れないこと(例ではGの後ろにコンマを入れていない)
- }の後ろに「;」(セミコロン)を入れること
いずれかが抜けてしまうとEAでEnum列挙型がうまく動かないので注意しましょう。
応用:移動平均線の種類を指定する記述
使い方で詳しく説明しますが、実際にEAへ落とし込む場合の例として移動平均線の種類の指定を記述します。
enum ma_List
{
SMA=MODE_SMA,
EMA=MODE_EMA,
SMMA=MODE_SMMA,
LWMA=MODE_LWMA
};
input ma_List MaMethods = EMA;
一見難しく見えますが、ma_Listは移動平均線のリストという意味です。
さらに他のデータリストもおなじみの言葉ばかりです。
- 単純移動平均線:SMA
- 指数平滑移動平均線:EMA
- 平滑移動平均線:SMMA
- 線形加重移動平均線:LWMA
EAを使ったことがある方ならおなじみの選択項目ばかりではないでしょうか。
一般的なプログラムではこういった記述をしてもエラーが出ます。
しかし、EAのために開発されたMQLであればきちんと動いてくれるでしょう。
応用2:時間軸の種類を指定する記述
EAやテクニカル分析で定番の時間軸の指定も次のような形で利用できます。
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 = M1;
注目すべきなのは、数値です。
M1は1分足ですが、日足、週足、月足のいずれも分で表現しています。
たとえば、1週間は10,080分なので、Enum列挙型でも10800と記述しているのです。
Enum列挙型の使い方
最後に「Isyuukan」(1週間)という名前のEnum列挙型をOnStart関数の中で使ってみます。
OnStart関数とはスクリプトと呼ばれる簡易的なプログラムでのみ用いられる関数のことです。
MQLを始めたばかりの方は最初にスクリプトを利用し、その中で利用できるOnStart関数を使うのをおすすめします。
以下ではOnStart関数の中でEnum列挙型を利用する方法について解説します。
リストを記述する
最初にこれまで紹介した曜日のenum列挙型を記述しましょう。
//「Isyuukan」という名前のenum列挙型を作る。
enum Issyuukan
{
Sunday,
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday
};
ここまでの記述は先ほどと同じデータ型と呼ばれる記述です。
さらにこれを出力して実行するために次のように記述します。
//「Isyuukan」という名前のenum列挙型を作る。
enum Issyuukan
{
Sunday,
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday
};
void OnStart()
{
//enum列挙型「Isyuukan」をデータ型にした変数名「day」を宣言
Isyuukan day;
//変数「day」に、値「Wednesday」を代入
day=Wednesday;
//ログ出力
Print(Wednesday);
}
ここまでで基本的なEnum列挙型が完成します。
変数を変更する
先ほどの記述の場合、データ型だけでも動くことは動くのですが、実はこの状態のままだと値「Wednesday」を代入しても「3」と出力してしまうのです。
これは、指定がない場合文字ではなく0から始まる数字で表示してしまうEnum列挙型のもともとに設定によるもので自然な流れといえます。
たとえば、例の記述のままだと、曜日を入力しても次のような数字が出てしまうのです。
{
Sunday, 0と表示される
Monday, 1と表示される
Tuesday, 2と表示される
Wednesday, 3と表示される
Thursday, 4と表示される
Friday, 5と表示される
Saturday 6と表示される
};
これを改善するには最後の記述を少し変えるだけで可能になります。
改善前
//ログ出力
Print(Wednesday);
}
改善後
//ログ出力
Print(EnumToString(day));
}
Print関数の中にEnumToString関数を加えます。
これによって0と表示されるものがSundayと表示される仕組みです。
他にも次のような方法を提案するものもあります。
改善前
//変数「day」に、値「Wednesday」を代入
day=Wednesday;
//ログ出力
Print(Wednesday);
}
改善後
//変数「day」に、値「3」を代入
day=3;
//ログ出力
Print(EnumToString(day));
}
このように改善しても3がWednesdayとして表示されます。
ただ、この値の指定をしてしまうと、Saturday(6)より大きい数字、例えば7以上の数字を入れるとコンパイルエラーになるのです。
つまり、7以上の数字はIsyuukanのリストにないので変換できないとなります。
応用:数字を自分で設定する
基本的にはSunday=0となりますが、これをSunday=1にしてSaturdayを7にするといったことも可能です。
Sunday=1,
と記述することで、Sundayを定数1として設定します。
これを記述すると次のような形になります。
//「Isyuukan」という名前のenum列挙型を作る。
enum Isyuukan
{
Sunday=1,
Monday=2,
Tuesday=3,
Wednesday=4,
Thursday=5,
Friday=6,
Saturday=0
};
void OnStart()
{
//enum列挙型「DayOfWeek」をデータ型にした変数名「day」を宣言
DayOfWeek day;
//インスタンス「day」に、値「3を代入
day=3;
//ログ出力
Print(EnumToString(day));
}
これで、1と入力すればSundayと表示され、先ほど3でWednesdayが表示されていたものがTuesdayと表示されるようになります。
同様に0でSundayと表示されるところ、この記述ではSaturdayと表示される仕組みです。
自分で数値を変えて、練習してみましょう。
コメントを残す