PR

【オリジナル関数】変数名と値を簡単にプリントするPrintLog関数-文字列化マクロ

オリジナル関数

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

WAN
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つあります。

  1. ログ出力ON/OFFを切り替え可能
    InpLogtrue にすればログを出力、false にすればログを止められます。
  2. 関数名を自動で出力
    __FUNCTION__ は「このログがどの関数から呼ばれたか」を自動で表示します。
  3. 行番号を自動で出力
    __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開発にぜひ取り入れてみてください!

タイトルとURLをコピーしました