MQLでEAやインジケータを作っているときに「今この変数には何が入っているんだろう?」と気になることってありますよね。
そんなときに役立つのが、文字列化マクロを使ったログ出力関数です。

WAN
文字列化マクロはリファレンスで紹介されてないテクニックだよ(‘ω’)
MQL言語では Print()
や PrintFormat()
を使ってログに出力できますが、普通に書くとこんな感じになります。
int count = 10;
double price = 145.32;
Print("count = ", count);
Print("price = ", price);
これでも問題ないのですが、変数名を手入力しなければいけません。
もし変数名を変えたら、出力部分も書き直す必要があり、ちょっと面倒ですよね。
文字列化マクロとは?
そこで便利なのが 文字列化マクロ です。
MQLでは #define
を使って、特殊なマクロを作ることができます。
「#」を使うと、コードそのものを文字列に変換(文字列化)できるのです。
#define VAR_PRINT(X) Print(#X, " = ", X);
例えば次のように使うと、
int count = 10;
double price = 145.32;
VAR_PRINT(count);
VAR_PRINT(price);
ログ出力は以下のようになります。
count = 10
price = 145.32
これなら、変数名を手入力しなくてもOK。
「変数名と値がセットで出力される」ので、デバッグがとても楽になります。
関数名と行番号も出力
以下のマクロは、さらに実用的です。
コードはこちら:
input bool InpLog = true; // ログを出力するかどうか
#define PrintLog(X) if(InpLog)Print("[LOG] ", __FUNCTION__, " ", __LINE__, " ", #X, " = ", X);
ポイントは3つあります。
- ログ出力ON/OFFを切り替え可能
InpLog
をtrue
にすればログを出力、false
にすればログを止められます。 - 関数名を自動で出力
__FUNCTION__
は「このログがどの関数から呼ばれたか」を自動で表示します。 - 行番号を自動で出力
__LINE__
は「コード上の行番号」を出してくれるので、あとからログを見返すときにとても便利です。
実際の使用例
void OnStart()
{
int count = 10;
double price = 145.32;
PrintLog(count);
PrintLog(price);
}
出力結果:
[LOG] OnStart 6 count = 10
[LOG] OnStart 7 price = 145.32
ログを見ただけで、
- どの関数で出力されたのか
- 何行目のコードなのか
- 変数名とその値
が一目で分かります。
まとめ
#X
を使えば変数名を文字列化できる__FUNCTION__
と__LINE__
を組み合わせれば、どこから出力されたのかがわかるInpLog
でログを簡単にON/OFFできる
開発中に「どの時点でどんな値が入っているか」を確認するときに、このマクロは強力な武器になります。
特に複雑なEAを作るときは、こうしたデバッグ用の仕組みを最初から入れておくと、後々とても助かりますよ。普段のデバッグやEA開発にぜひ取り入れてみてください!