変数の型の名前と意味を覚えても、実際に自分のコードでどう書けばいいのか分からない——という人向けの記事です。この記事では、各データ型の説明に加えて、実際にMetaEditorでコンパイルして確認できるサンプルコードを紹介します。
変数とは

変数はデータを入れる箱のことです。プログラムのデータを一時的に入れておく箱です。
変数には数値や文字列を格納することが可能です。変数には大きく分けて2種類の役割があります。
- 何度も使う数値や数式を引き出しやすくして、演算量を減らし、記述を楽にする。
- そのままだと消えてしまうデータを一時的に保存しておく。
特にデータを一時的に保存することができるという機能をメインで活用します。
変数の宣言
変数の宣言は次のように記述します。
記憶域クラス名 型修飾子 型名 変数名;
記憶域クラスとは、変数を格納する記憶領域を指定するものです。
型修飾子とは、変数の用途をこまかく指定するものです。
変数名
変数名は自分でわかりやすく箱に名前を決められます。
その箱にどのデータが入っているのかを名前を決めます。
変数の型
変数には型が存在します。型というのは箱に入れる中身によって用意する箱を変えるということです。
例えば、小さい箱には大きなモノは入りませんし、
割れる可能性があるものを箱に入れるなら割れ物注意の箱を用意しなければなりません。
変数にはそうした様々な用途に合わせた箱があります。代表的なものは以下にまとめておきました。
| 種類 | 説明 |
| int型 | 整数を扱うデータ型 |
| string型 | 文字列を扱うデータ型 |
| double型 | 数値(小数含む)を扱うデータ型 |
| color型 | 色を扱うデータ型 |
| datetime型 | 日時を扱うデータ型 |
| bool型 | 真偽(true または false)を扱うデータ型 |
int型
int型は-2147483648~2147483647(±約20億)の整数値だけ代入可能な型です。
MQLでは主に配列の添え字やfor文の回数を制御するために使用します。
string型
string型は文字列型です。
MQLでは、文字列をダブルクオーテーション””で囲んで宣言しますが、
宣言した文字列を代入するための変数です。
MQLでは主に
- メッセージボックスの文字列
- インジケータの情報を表示するための文字列
として使用します。
double型
double型は小数点を含む値を代入することが可能です。
MQLでは主に価格情報や計算結果で使用します。
color型
color型は色に関する情報を代入可能な型です。
インジケーターなどの色などに使用します。
datetime型
datetime型は日時が設定可能な型です。
現在時刻や、チャート上のバーの時間などを取得する際に使用します。
日付関数と呼ばれる日付を操作する関数群とセットで利用します。
bool型
bool型は論理型と呼ばれ、trueかfalseの2値のみが入る値です。
これは、if文と呼ばれる条件によって処理が変わる制御で使用します。
変数の格納
変数は値を格納する場所なので、変数を宣言すると場所だけが作成されます。
値を格納するまで変数という箱には何が入っているかわからない状態になっています。
そこで変数を利用するには値を格納する必要があります。
変数に値を格納するには次のように記述します。
変数名 = 値;
通常では「=」と言うのは左辺と右辺が等しいと言う意味で使われますが、
プログラミングの世界では、右辺を左辺へ代入するという意味で使われます。
よって上記の場合には値を変数に格納するという意味になります。
具体的には次のようになります。
int price; price = 1000;
変数の初期化
変数は宣言を行った後で値を格納します。
この手順とは別に変数を宣言すると同時に値を格納して変数の値を初期化することが可能です。
int price = 1000;//宣言と同時に初期化
ローカル変数とグローバル変数
変数にはローカル変数とグローバル変数の2種類があります。

ローカル変数は、関数内でしか参照できない変数です。
- ある関数内で宣言して、その関数内だけで使える
- その関数内だけでの処理に使う変数
グローバル変数はすべての関数の中から直接アクセスすることが可能な変数です。
- 全ての関数の外で宣言して、どの関数でも使える
- プログラム全体で参照したい時に利用する変数
- グローバル変数の多用はバグの原因になり易い
グローバル変数のスコープはプログラム全体です。
つまり、プログラムで定義された全ての関数からアクセスする事が出来ます。
実際にコンパイルして確認する
ここまでの内容を、実際にMetaEditorでコンパイルして動かせる形にまとめてみます。グローバル変数に取引回数を数えるカウンター(int型)を用意し、ティックが来るたびにローカル変数で現在価格(double型)を取得して、チャートに表示するだけのシンプルなインジケーターです。
//+------------------------------------------------------------------+
//| Variable.mq4 |
//| Copyright 2020, FX-EA System Project Creator |
//| https://creator.fx-ea-system-project.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, FX-EA System Project Creator"
#property link "https://creator.fx-ea-system-project.com/"
#property version "1.00"
#property strict
#property indicator_chart_window
int tick_count = 0;//グローバル変数:ティックを受け取った回数
int OnInit()
{
return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason)
{
Comment("");
}
void OnTick()
{
tick_count++;//グローバル変数はOnTick()をまたいで値を保持し続ける
double current_price = Bid;//ローカル変数:この関数の中だけで使う現在値
string symbol_name = Symbol();//ローカル変数:この関数の中だけで使う通貨ペア名
Comment(symbol_name, " 現在値:", current_price, "\n受信ティック数:", tick_count);
}
//+------------------------------------------------------------------+
tick_countはグローバル変数なので、OnTick()が何度呼ばれても値が保持され、増え続けます。一方current_priceとsymbol_nameはOnTick()の中で宣言したローカル変数なので、OnTick()が呼ばれるたびに新しく作られ、関数を抜けると消えます。この違いを実際にコンパイルして確認してみてください。
まとめ
変数を上手く活用することでプログラムを効率よく記述することができます。
変数には値を保存するだけではなく、一度保存した値を書き換えることも可能なので、
一度変数に保存した値を取り出して別の加工した上で再度変数に保存し直すということも可能です。
変数:データを入れる箱
変数名:データを入れる箱の名前
ローカル変数:関数内でしか参照できない変数
グローバル変数:すべての関数にアクセスすることが可能な変数
コメント