定義済みマクロ代入

デバッグプロセスを簡素化し、MQL5 プログラムの動作に関する情報を取得するには、コンパイルの時点で値が設定された特別なマクロ定数があります。これらの定数を使用する最も簡単な方法は、Print() 関数による値出力です。

定数

説明

__DATE__

時刻を含まないファイルコンパイルの日付(時間、分、秒は 0 )。

__DATETIME__

ファイルコンパイルの日付と時刻。

__LINE__

マクロが配置されているソースコードの行番号。

__FILE__

現在コンパイルされているファイルの名称。

__PATH__

現在コンパイルされているファイルへの絶対パス。

__FUNCTION__

本体にマクロが配置されている関数の名称。

__FUNCSIG__

本体にマクロが配置されている関数のシグネチャ。関数の完全な記述のロギングはオーバーロード関数の識別に役立つことがあります。

__MQLBUILD__, __MQL5BUILD__

コンパイラのビルド番号。

__COUNTER__

コンパイラは、検出された各__COUNTER__宣言を0からN-1までのカウンター値で置き換えます。ここで、Nはコードでの使用回数です。__COUNTER__の順序はソースコードを再コンパイルしても変わらないことが保証されています。

__COUNTER__値は、次の方法で計算されます。

  • 初期カウンタ値は0です。
  • 各カウンタの使用後、その値は1ずつ増加します。
  • まず、コンパイラはすべてのマクロとテンプレートをオンサイトでソースコードに展開します。
  • テンプレート関数の特殊化ごとに個別のコードが作成されます。
  • テンプレートクラス/構造体の特殊化ごとに個別のコードが作成されます。
  • 次に、コンパイラは取得したソースコードを定義された順序で渡し、検出された__COUNTER__の各使用を現在のカウンタ値に置き換えます。

以下のは、コンパイラがソースコードを処理し、検出された__COUNTER__のすべてのインスタンスを順次増加する値に置き換える方法を示しています。

__RANDOM__

コンパイラは、__ RANDOM__宣言ごとにランダムなulong値を挿入します。

例:

#property copyright "Copyright © 2009, MetaQuotes Software Corp."
#property link     "https://www.metaquotes.net"
//+------------------------------------------------------------------+
//| エキスパート初期化に使用される関数                                        |
//+------------------------------------------------------------------+
void OnInit()
 {
//--- エキスパートアドバイザーの初期化情報出力の例
  Print(" __FUNCTION__ = ",__FUNCTION__,"  __LINE__ = ",__LINE__);
//--- タイマーイベントの間隔を設定する
  EventSetTimer(5);
//---
 }
//+------------------------------------------------------------------+
//| エキスパート初期化解除に使用される関数                                    |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
 {
//--- エキスパートアドバイザーの初期化解除情報出力の例
  Print(" __FUNCTION__ = ",__FUNCTION__,"  __LINE__ = ",__LINE__);
//---
 }
//+------------------------------------------------------------------+
//| エキスパートティック関数                                                 |
//+------------------------------------------------------------------+
void OnTick()
 {
//--- ティック受け取りの情報出力
  Print(" __MQLBUILD__ = ",__MQLBUILD__,"  __FILE__ = ",__FILE__);
  Print(" __FUNCTION__ = ",__FUNCTION__,"  __LINE__ = ",__LINE__);
  test1(__FUNCTION__);
  test2();
//---
 }
//+------------------------------------------------------------------+
//| テスト1                                                            |
//+------------------------------------------------------------------+
void test1(string par)
 {
//--- 関数内での情報出力
  Print(" __FUNCTION__ = ",__FUNCTION__,"  __LINE__ = ",__LINE__," par=",par);
 }
//+------------------------------------------------------------------+
//| テスト2                                                            |
//+------------------------------------------------------------------+
void test2()
 {
//--- 関数内での情報出力
  Print(" __FUNCTION__ = ",__FUNCTION__,"  __LINE__ = ",__LINE__);
 }
//+------------------------------------------------------------------+
//| OnTimer イベントハンドラ                                               |
//+------------------------------------------------------------------+
void OnTimer()
 {
//---
  Print(" __FUNCTION__ = ",__FUNCTION__,"  __LINE__ = ",__LINE__);
  test1(__FUNCTION__);
 }

 

 

__COUNTER__マクロの使用例

//--- 式とその値を操作ログにすばやく表示するためのマクロを作成する
#define print(expr) Print(#expr,"=",expr)
 
//--- 事前定義された__COUNTER__マクロを介してMACRO_COUNTERカスタムマクロを定義する
#define MACRO_COUNTER __COUNTER__
 
//--- __COUNTER__マクロを使用して変数の入力値を設定する
input int InpVariable = __COUNTER__;
 
//--- 関数を定義する前に、__ COUNTER__マクロを使用してグローバル変数の値を設定する
int ExtVariable = __COUNTER__;
 
//+------------------------------------------------------------------+
//| 関数は __COUNTER__値を戻す                                          |
//+------------------------------------------------------------------+
int GlobalFunc(void)
 {
  return(__COUNTER__);
 }
//+------------------------------------------------------------------+
//| テンプレート関数は__COUNTER__値を戻す                                   |
//+------------------------------------------------------------------+
template<typename T>
int GlobalTemplateFunc(void)
 {
  return(__COUNTER__);
 }
//+------------------------------------------------------------------+
//| __COUNTER__を戻すメソッドを持つ構造体                                    |
//+------------------------------------------------------------------+
struct A
 {
  int               dummy; // 未使用
 
  int               Method(void)
    {
    return(__COUNTER__);
    }
 };
//+------------------------------------------------------------------+
//| __COUNTER__を戻すテンプレートメソッドを持つ構造体                            |
//+------------------------------------------------------------------+
template<typename T>
struct B
 {
  int               dummy; // 未使用
 
  int               Method(void)
    {
    return(__COUNTER__);
    }
 };
//+------------------------------------------------------------------+
//| __COUNTER__を返すテンプレートメソッドを持つ構造体                            |
//+------------------------------------------------------------------+
struct C
 {
  int               dummy; // 未使用
 
  template<typename T>
  int               Method(void)
    {
    return(__COUNTER__);
    }
 };
//+------------------------------------------------------------------+
//| 関数#2は__COUNTER__値を戻す                                         |
//+------------------------------------------------------------------+
int GlobalFunc2(void)
 {
  return(__COUNTER__);
 }
//+------------------------------------------------------------------+
//| スクリプトプログラム開始関数                                              |
//+------------------------------------------------------------------+
void OnStart(void)
 {
// マクロと変数での__COUNTER__
  print(MACRO_COUNTER);
  print(InpVariable);
  print(ExtVariable);
 
//--- 関数での__COUNTER__
  print(GlobalFunc());
  print(GlobalFunc());               // 値は不変
  print(GlobalTemplateFunc<int>());
  print(GlobalTemplateFunc<int>());   // 値は不変
  print(GlobalTemplateFunc<double>());// 値が変更されている
  print(GlobalFunc2());
  print(GlobalFunc2());               // 値は不変
 
// 構造体での__COUNTER__
  A a1, a2;
  print(a1.Method());
  print(a2.Method());                 // 値は不変
 
// テンプレート構造体での__COUNTER__
  B<int> b1, b2;
  B<double> b3;
  print(b1.Method());
  print(b2.Method());                 // 値は不変
  print(b3.Method());                 // 値が変更されている
 
// テンプレート関数を持つ構造体での__COUNTER__
  C c1, c2;
  print(c1.Method<int>());
  print(c1.Method<double>());         // 値が変更されている
  print(c2.Method<int>());           // the same value as during the first c1.Method<int>() call
 
//--- マクロとグローバル変数の__COUNTER__をもう一度見てみる
  print(MACRO_COUNTER); // 値が変更されている
  print(ExtGlobal2);
 }
//--- 関数を定義した後、__ COUNTER__マクロを使用してグローバル変数の値を設定する
int ExtGlobal2 = __COUNTER__;
//+------------------------------------------------------------------+
 
/* 結果
  __COUNTER__=3
  InpVariable=0
  ExtVariable=1
  GlobalFunc()=5
  GlobalFunc()=5
  GlobalTemplateFunc<int>()=8
  GlobalTemplateFunc<int>()=8
  GlobalTemplateFunc<double>()=9
  GlobalFunc2()=7
  GlobalFunc2()=7
  a1.Method()=6
  a2.Method()=6
  b1.Method()=10
  b2.Method()=10
  b3.Method()=11
  c1.Method<int>()=12
  c1.Method<double>()=13
  c2.Method<int>()=12
  __COUNTER__=4
  ExtGlobal2=2
 
*/