この記事ではMQL5にて設定されている定義済みマクロについて解説したいと思います。
定義済みマクロとは?
まずそもそも定義済みマクロとは何かという点をまず説明したいと思います。
定義済みマクロとは、プログラミング言語において、あらかじめ決められた特別な単語や記号のことです。定義済みマクロは、プログラムを作る人が自分で定義することなく、プログラミング環境によって既に使えるようになっているもので、プログラムが動くコンピューターに関する情報や、プログラムが作られた日時などの情報を提供します。
例えば、プログラムを書いているときに、今日の日付や今の時間を自動でプログラムに入れたいときがあるかもしれません。
定義済みマクロを使うと、そのプログラムを作っている時点の日付や時間を、自分で書かなくてもプログラムの中に入れることができます。
これらの定義済みマクロは、プログラムを作る際に自動で情報を更新したい場合や、後でプログラムを見返したときに、いつ作ったものかをすぐに知りたい場合などに便利です。
プログラミングの世界では、このような自動化された機能を使って、より効率的に作業を進めることができます。
MQL5の定義済みマクロ
MQL5でもプログラムを作るとき、問題があるかどうかを確認する作業(デバッグといいます)を楽にするための特別な単語、すなわち定義済みマクロが用意されています。
定義済みマクロを使うと、プログラムがどのように動いているかの情報を簡単に見ることができます。定義済みマクロを見るためには、Print関数を使って、MT5のエキスパートログに出力させるのが一般的です。
MQL5の定義済みマクロは以下のような定数リストを持っています。
※定数については↓の記事をご参照ください
__CPU_ARCHITECTURE__
__CPU_ARCHITECTURE__は、コンパイル時におけるCPUアーキテクチャが表示されます。
CPUアーキテクチャとは?
CPUアーキテクチャとは、コンピューターの中心となる部品であるCPU(Central Processing Unit、中央処理装置)が、どのように設計されているかを示す型の事を言います。
例えるなら、CPUの設計図のようなものです。CPUがどのように情報を処理するか、どんな命令を実行できるかなどを決めています。
コンピューターにはさまざまな種類のアーキテクチャがありますが、一般によく知られているものには以下のようなものがあります:
- x86: これはもともとは32ビットのCPUに使われるアーキテクチャで、多くのパーソナルコンピューターに採用されていました。
- x86-64(またはx64): x86アーキテクチャを64ビットに拡張したもので、現代の多くのパーソナルコンピューターに使われています。
- ARM: スマートフォンやタブレットなど、電力消費を抑える必要があるデバイスで一般的に使用されるアーキテクチャです。
// MQL5のスクリプト例
void OnStart()
{
// CPUアーキテクチャの情報を取得して表示する
Print("このプログラムは以下のCPUアーキテクチャ用にコンパイルされました: ", __CPU_ARCHITECTURE__);
}
//出力例→このプログラムは以下のCPUアーキテクチャ用にコンパイルされました: X64 Regular
このコードをMetaTrader5でスクリプトとして実行すると、エキスパートログにプログラムがコンパイルされた時のCPUのアーキテクチャが表示されます。
例えば、出力結果が “x86” だった場合、そのプログラムは32ビットのアーキテクチャ用にコンパイルされていることを意味します。もし “x64” が表示されたら、64ビットのアーキテクチャ用です。
この情報は、特に複数の異なるCPUアーキテクチャをターゲットにしたプログラムを作成している場合や、特定のアーキテクチャに最適化したコードを書いている場合に便利です。
__DATE__
__DATE__を使用すると、プログラムがコンパイルされた日付(年月日)が表示されます。
時間、分、秒は含まれません。
以下のサンプルコードは、プログラムがコンパイルされた日付を出力します。
void OnStart()
{
Print("このプログラムは ", __DATE__, " にコンパイルされました。");
}
__DATETIME__
__DATETIME__を用いると、プログラムをコンパイルした正確な日付と時間(年月日時分秒)がわかります。以下のコードは、コンパイルされた正確な日時を表示します。
void OnStart()
{
Print("このプログラムは ", __DATETIME__, " にコンパイルされました。");
}
__LINE__
__LINE__は、コードが書かれている行の番号を示します。以下のコードは、__LINE__が書かれている行番号を出力します。
void OnStart()
{
Print("この行の番号は ", __LINE__, " です。");
}
__FILE__
__FILE__は、現在コンパイルされているファイルの名前を表示します。以下のサンプルコードは、ファイル名を出力します。
void OnStart()
{
Print("このファイルの名前は ", __FILE__, " です。");
}
PATH
__PATH__は、作成しているプログラムのファイルがコンピューター上でどこにあるかを示す絶対パスを返します。
プログラムをコンパイルするときにこの__PATH__を使うと、そのファイルが保存されている場所を示す完全な「住所」がわかります。
// MQL5のスクリプト例
void OnStart()
{
// 現在のファイルの絶対パスを出力する
Print("このファイルの絶対パスは: ", __PATH__);
}
絶対パスとは?
絶対パスは、ファイルやフォルダーの位置をコンピューター全体の文脈で指定したものです。
絶対パスは、住んでいる家の住所を、街、都市、州、国を含めて説明するようなものです。
たとえば、Windowsコンピューターであれば、絶対パスは「C:\Users\YourName\Documents\Project\file.mq5」のようになります。
これは、Cドライブの中のUsersフォルダーにあるYourNameという名前のユーザーのDocumentsフォルダーの中のProjectフォルダーにあるfile.mq5というファイルを指します。
絶対パスを使うと、コンピューターのどこからでもそのファイルを見つけ出すことができるため、非常に便利です。
__FUNCTION__
__FUNCTION__
は、__FUNCTION_が使われている作業領域の関数名を教えてくれます。
※関数については↓の記事をご参照ください
たとえば、ある計算をするための関数の中に __FUNCTION_を書いた場合、その関数の名前を表示することができます。
これは、特にプログラムのどの部分で何が起こっているかを知りたい時に役立ちます。
// この関数は何らかの計算を行います
double CalculateSomething(double num) {
// 現在の関数の名前を出力する
Print("現在の関数名: ", __FUNCTION__);
// ここで計算を行う(例として単純な乗算)
return num * 2.0;
}
// MQL5プログラムの開始点
void OnStart() {
// CalculateSomething 関数を呼び出す
double result = CalculateSomething(4.5);
// 結果を出力する
Print("計算結果: ", result);
}
このコードでは、CalculateSomething
関数が定義されており、この関数内で__FUNCTION_マクロを使って関数の名前を出力しています。
OnStart関数はMQL5プログラムの開始点で、ここからCalculateSomething
関数が呼び出されています。このサンプルを実行すると、CalculateSomething
関数の名前がターミナルのログに表示され、関数がどこで実行されているかを明確にするのに役立ちます。
出力結果↓
__FUNCSIG__
__FUNCSIG__は、__FUNCSIG__マクロが存在する関数の完全な名前とその詳細(=シグネチャ)を教えてくれます。関数の名前だけでなく、その関数の戻り値、引数構成、いった情報が含まれます。複数の書式を付与されたオーバーロード関数の書式識別などに役立ちます。
※オーバーロード関数については↓の記事をご参照ください
// MQL5のスクリプト例
void OnStart()
{
// 現在の関数のシグネチャを出力する
Print("この関数のシグネチャは: ", __FUNCSIG__);
CalculateProfit(4,2.0);
}
// 引数を持つ別の関数の例
double CalculateProfit(int lots, double price)
{
// この関数のシグネチャを出力する
Print("この関数のシグネチャは: ", __FUNCSIG__);
return lots*price;
シグネチャについて
プログラミングにおける「シグネチャ」という用語は、特に関数やメソッド(クラス内で定義される関数)に関連して使われます。
関数のシグネチャとは、その関数を一意(他に同じものがない)に識別するための情報を含む、関数定義の一部です。
具体的には、シグネチャには以下の情報が含まれます:
- 関数の名前: 何という名前でその関数が呼ばれるか。
- パラメータリスト: その関数が受け取る引数(パラメータ)の数とタイプ。引数の返すデータ型、順番、数によって関数を区別します。
- (場合によっては)戻り値の型: その関数が実行後に返すデータ型。
例えば、int Add(int a, int b)
という関数のシグネチャは、関数名Add
と、二つの整数型のパラメータa
とb
を含みます。戻り値の型はint
です。
関数のシグネチャは、特に関数のオーバーロードがある言語では重要です。
同じ名前の関数が複数ある場合、それぞれの関数を区別するために、パラメータの型や数を使います。これによって、プログラムはどの関数を呼び出すべきかを判断できるようになります。
MQLBUILD, MQL5BUILD
__MQLBUILD__ と __MQL5BUILD__ は、使用しているMQL5プログラミング言語のコンパイラ(プログラムをコンピューターが理解できる形に変換するツール→メタエディター)のバージョンを教えてくれる識別子です。
これらを使うことで、プログラムをコンパイルする際にどのバージョンのコンパイラが使われたのかがわかります。
ビルド番号とは?
ビルド番号は、ソフトウェアやプログラムが開発される過程で付けられる、そのバージョンを示す一連の数字です。
開発者はプログラムを少しでも更新するたびにビルド番号を増やします。
これにより、プログラムの特定のバージョンに問題があった場合に、どのバージョンで問題が生じているのかを特定しやすくなります。
例えば、MQL5でプログラムを書いていて、特定の機能が新しいコンパイラのバージョンでしか動かないことがわかった場合、__MQLBUILD__や__MQL5BUILD__ を使って自分の環境がその新しいバージョンに対応しているかを確認することができます。
これにより、プログラムが期待通りに動作するかどうかをよりよく理解することができます。
// MQL5のスクリプト例
void OnStart()
{
// コンパイラのビルド番号を出力する
Print("このスクリプトをコンパイルするのに使われたMQL5コンパイラのビルド番号は ", __MQLBUILD__, " です。");
}
__COUNTER__
__COUNTER__はプログラムがコンパイルされる際に、コンパイラ(=メタエディター)によって特定の値で置き換えられるマクロです。
__COUNTER__は初期状態のカウンター値は0から始まります。
ソースコード内で__COUNTER__が検出されるたびに、そのカウンターの値は1ずつ増加します。つまり、最初に__COUNTER__が検出された場合は0、次に検出された場合は1というように、使用されるたびに値が増えていきます。
// 最初の__COUNTER__の使用
// 値: 0
// 2回目の__COUNTER__の使用
// 値: 1
// 3回目の__COUNTER__の使用
// 値: 2
// 以降、__COUNTER__を使用するたびに値は1ずつ増加します。
void OnTick()
{
Print("1回目カウンタ値は",__COUNTER__," です");
Print("2回目呼び出しのカウンタ値は",__COUNTER__," です");
Print("3回目呼び出しのカウンタ値は",__COUNTER__," です");
Print("4回目呼び出しのカウンタ値は",__COUNTER__," です");
}//値動きの度に0,1,2.3が出力
__RANDOM__
__RANDOM__は、プログラムがコンパイルされるたびに、自動的に異なるランダムなulong
値を生成し、その場所に挿入する特別なマクロです。
プログラム内でこの__RANDOM__を使うと、その部分に毎回異なる数字が現れます。
__RANDOM__は、プログラム内で一意の値が必要な場合や、実行ごとに異なる結果を生成したい場合に便利です。
例えば、セキュリティ関連のコードで使う一時的なキーや、プログラムのバージョン管理にランダムな数値を使いたい場合などに役立ちます。
void OnStart()
{
Print("1回目呼び出し時のランダムな生成値は",__RANDOM__," です");
Print("2回目呼び出し時のランダムな生成値は",__RANDOM__," です");
Print("3回目呼び出し時のランダムな生成値は",__RANDOM__," です");
}//ランダムな値が生成され、出力される
↓出力結果
————————————————————————————–
※当サイトでは、プログラミング経験ゼロの方でも、プログラミングの基礎から学べる
をメインコンテンツとして展開しています。
第0回から、順を追って勉強していけばプログラミングの経験がなくてもMQL5を使って、MT5用のEAが作れるように書いています。最初は難しいと感じるかもしれませんが、繰り返し勉強していく事で自然とスキルが身についていくはずです。興味ある方は是非ご覧ください。