5.MQLの書き方 – データの扱い
EAの中では、沢山のデータを扱います。
「”Hello, world!”と表示する」場合は、”Hello, world!”という文字が必要なデータになります。
これは文字列データです。
「売値(Bid)が20SMAを上抜けたかどうか」を知るためには、売値(Bid)と20SMAが必要なデータになります。
売値(Bid)と20SMAは、どちらも小数点以下を含む数値データです。
「毎日9:55になったらショートする」場合は、その日の時間が必要なデータになります。
データ型
このようにデータには、そのデータの型というものが定められています。
データ型にはそれぞれ名前が付いています。
EAで扱うデータとしては、以下のものがあります。
データ型 | 説明 | 例 |
---|---|---|
int | 整数型 | 10 -25 |
double | 浮動小数点数型 (小数点以下を含む数値) |
3.14 100.123 |
string | 文字列型 | “Hello, world!” “あいうえお” ※文字列は、ダブルクォーテーション(“)で囲みます。 |
datetime | 日付型 | D’2000.1.1 12:00:00′ ※日付は、Dから始まりシングルクォーテーション(‘)で囲み、YYYY.MM.DD HH:ii:ss などの形式で記述します。 |
bool | 論理型 | true false |
enum | 列挙型 | PRICE_CLOSE MODE_SMA |
データ型は他にも存在しますが、上記を覚えれば一先ず大丈夫です。
実際の使い方や他のデータ型については随時解説していきます。
変数
データを扱う際、データを変数という箱に入れることがあります。
箱というのは、あくまでイメージの話ですが、要は手元にあるデータが”何のデータなのか”後になっても分かるようにしておく、という事です。
例えば「財布にお小遣い1,000円を入れておいて、缶コーヒー1本120円を現金払いで購入した後、財布の残高はいくらか」と考える時は、以下のような流れになります。
- 財布に1,000円を入れる
- 財布から120円減らす
- 財布の中身を確認する
財布という箱を用意することで、いつでも残高が確認できるようになります。
道中ではそこにお小遣いが入っているという事が確かでありさえすれば良いのです。
これは現実世界でも私たちが日常的に行っている事なので、イメージしやすいと思います。
「変わる数」という名の通り、変数の中身は変化しうるものです。
上記の例では、残高が1,000円から120円減り、880円に変化しています。
およそEAとは無関係な内容ではありますが、この内容をプログラムに書くと次のようになります。
int wallet; wallet = 1000; wallet = wallet - 120; Print(wallet);
1行目:変数の宣言
int wallet;
1行目では、walletという名のint型の変数を用意しています(変数の宣言)。
変数を用意する際は、そのデータ型を書いて、半角スペースを空けて、変数名を書きます。
データ型 変数名;
末尾の”;”は、1つの文章の終わりに付けるというルールです。
2行目:値の代入
wallet = 1000;
2行目では、1行目で用意した変数walletに整数1000を入れています。
変数に値を入れることを「代入」と言います。
代入には”=”を使います。
プログラムでは、イコールは等しいという意味ではなく、”=”の右側を左側の変数に入れる、という意味なので注意してください。
また、1行目と2行目をドッキングして、変数の宣言と値の代入を1行で記述してしまう書き方もあります。こちらの方がスマートです。
int wallet = 1000;
ちなみに、ここで代入しているデータが整数なので、変数walletはint型で用意します。
少数を含む数値を代入したいなら、double型の変数にしておかなければなりません。
3行目:変数に計算値を代入
wallet = wallet - 120;
3行目でも代入を行っています。
”=”の右側を左側の変数に入れるので、「wallet-120」をwalletに代入ということになります。
walletにはもともと1000が入っているので、1000-120の計算結果880を改めてwalletに代入し、walletの中身を書き換えていることになります。
4行目:変数の中身を表示
Print(wallet);
4行目では、Hello worldプログラムでも使用したPrintという命令文を使って、wallet変数の中身を表示しています。
定数
中身が変化しうる変数ですが、そもそも変化させる必要のないデータは、変数に格納する必要がありません。
上記の例で言うと、缶コーヒーの値段120円というのがプログラム内で流動的に変化させる必要のないデータであれば、変数に代入する必要はありません。
ただ、上記プログラムの例を見て感じる通り、”120”というのが何の値なのか分かりづらいかもしれません。
そういった場合、変数ではなく「定数」を使います。
定数の宣言は、変数の宣言の前に”const”という修飾子を付けます。
const int COFFEE_PRICE = 120;
定数は変数と違い、中身のデータを書き換えることはできません。
定数の中にデータを代入するためには、定数の宣言と同時に代入を行う必要があります。
また、上記では”COFFEE_PRICE”という定数名にしてあります。
変数と区別するために、全て大文字のスネークケースを使用していますが、こうしなければならないという事ではありませんのでご注意ください(ご自身の命名規則があればそれに則ってください)。
上記プログラムをコーヒーの値段を定数に置き換えて書き直すと、次のようになります。
const int COFFEE_PRICE = 120; int wallet = 1000; wallet = wallet - COFFEE_PRICE; Print(wallet);
ちなみに、上記プログラム内の”120”や”1000”といった具体的な数値の事を、プログラムでは「マジックナンバー」と言います。
具体的な数値を記述する回数は、最小限にした方が無難だというのが一般的です。
理由としては、変数や定数と違って何の数値なのかがパッと見では判断できないからです。また、何度もその数値が出現すると、もし後からその数値自体を変更しなければならなくなった場合に沢山変更が必要だからといった理由もあります。
以上が簡単なデータ型の扱いです。
次回は、データの計算に使われる演算子についてまとめます。