無料でロボットをダウンロードする方法を見る
Telegram上で私たちを見つけてください。
私たちのファンページに参加してください
興味深いスクリプト?
それではリンクにそれを投稿してください。-
他の人にそれを評価してもらいます
記事を気に入りましたか?MetaTrader 5ターミナルの中でそれを試してみてください。
ライブラリ

Logging V2 for both MQL4 and MQL5 - MetaTrader 5のためのライブラリ

ビュー:
23
評価:
(4)
パブリッシュ済み:
\MQL5\Include\
Logging.mqh (52.65 KB) ビュー
\MQL5\Experts\ \MQL5\Scripts\
MQL5フリーランス このコードに基づいたロボットまたはインジケーターが必要なら、フリーランスでご注文ください フリーランスに移動

CDebugLoggerクラス V2:MQL4/5用の包括的なロギング・ユーティリティ

CDebugLogger クラスは、MQL4/5環境用に特別に設計された強力で柔軟なロギング・ユーティリティです。アプリケーションの動作を正確に監視、デバッグ、追跡する必要がある開発者にとって不可欠なツールです。

このCDebugLoggerクラスの 新バージョンでは、機能性と汎用性を高めるためにいくつかの改良を導入しました。これらの改善点には、OnTick、OnTimer、OnChartEventのようなイベント駆動型のシステムで過剰なロギングを防ぐためのデバウンスメカニズムや、開発者が最も関連性の高いログエントリに集中できるようにするための新しいフィルタリングとサイレンスオプションが含まれます。

私は、ユーザーが自分のニーズに最も合った実装を自由に選択できるように、この更新版を別のコードベースとしてリリースすることにしました。オリジナルのバージョンを好むか、この強化されたバージョンを好むかにかかわらず、あなたのワークフローとプロジェクトの要件に合ったログ記録ツールを選択するオプションがあります。

以下では、この強化されたクラスの主な特徴と機能を探ります。

主な機能

  • 複数のログレベル: CDebugLoggerクラスは、INFOWARNINGERRORDEBUGを 含む異なる重要度レベルでのロギングをサポートします。これにより、開発者は特定の重要なメッセージをフィルターし、フォーカスすることができます。
  • タイムスタンプのインクルード: 開発者は、カスタマイズ可能なフォーマットで、ログメッセージにタイムスタンプを含めることができます。この機能は、イベントの正確な時間を追跡し、時間に敏感な問題をデバッグするために重要です。
  • ファイルロギング: このクラスは、ファイルへのロギングを強力にサポートします。開発者は、ファイルへのロギングを有効または無効にし、ログファイルのパスを指定し、ログを共通フォルダに保存するかどうかを選択できます。さらに、ログはCSV形式で保存でき、解析や分析が容易になります。
  • コンテキスト情報: ログメッセージをより明確にするために、CDebugLogger クラスは関数シグネチャ、ファイル名、行番号を含めることができます。このコンテキスト情報は、コード内の問題の正確な位置を特定するのに役立ちます。
  • サイレントキーワード: このクラスのユニークな機能は、特定のキーワードを含むログをサイレントにする機能です。これは特に、パスワードや機密データなどの機密情報がログに記録されるのを防ぐのに役立つ。
  • キーワードのフィルター: この クラスの もう一つのユニークな機能は、特定のキーワードを含むログをフィルターする機能 ある。これは、特定の問題に関連するログだけに焦点を当てることで、デバッグに 特に役立ちます。開発者は、特定の用語を含むメッセージだけを含むようにログ出力を絞り込むことができ、無関係なログエントリに圧倒されることなく、その用語に関連する問題を簡単に特定して 対処することができます。
  • イベントに対するログのデバウンス:イベントドリブンシステム(OnTick、OnTimer、OnChartEventなど)のログスパミングや過剰なロギングを防ぐために、CDebugLoggerクラスはデバウンスメカニズムを含みます。この機能は、同じイベントからの繰り返されるログエントリが一時的に抑制され、ユニークまたは重要な変更のみがログに記録されるようにします。これは、ログのノイズを減らし、高頻度のイベント環境でのパフォーマンス低下を防ぐのに特に便利です。

使用例

以下は、CDebugLogger クラスを初期化して使用する方法の例です:

// ファイルへのINFOレベルのロギングでロガーを初期化する。
CDebugLogger logger(INFO, true, "log.txt", true, TIME_DATE | TIME_MINUTES, false, true, true, true);

// 簡単なメッセージを記録する
logger.Log(INFO, "This is an info message");

// キーワードを黙らせる
logger.AddSilentKeyword("password");

// 黙殺されるメッセージを記録する
logger.Log(INFO, "User entered password: 1234");

// ファイルのロギングを有効にする
logger.EnableFileLogging(true, "debug.log", false);

// サイレンスキーワードを削除する
logger.RemoveSilentKeyword("password");

// サイレンスリストからキーワードを削除した後、メッセージをログに記録する。
logger.Log(INFO, "User entered password: 1234");

// ログをフィルタリングするキーワードを追加する
logger.AddFilterKeyword("success");

// フィルタリングされるメッセージを記録する
logger.Log(INFO, "Operation failed");

// フィルタを通過するメッセージをログに記録する
logger.Log(INFO, "Operation successful");

// フィルタからキーワードを削除する
logger.RemoveFilterKeyword("success");

// 汎用Log関数を使って初期化する。
logging.Initialize(WARNING, true, "warnings.log", true, TIME_SECONDS, true, false, true, true);

// 汎用Log関数を使用して警告をログに記録する。
Log(WARNING, "This is a warning message");

スクリプトの例

CDebugLoggerクラスをスクリプトで利用するには、以下のように必要なライブラリをファイルの先頭にインクルードするだけです:

//--- このヘッダーファイルは、他のすべてのヘッダーファイルの前にインクルードすることが重要です。
#include <Logging.mqh>  


//+------------------------------------------------------------------+
//| スクリプト・プログラム開始機能|
//+------------------------------------------------------------------+
void OnStart()
{
   //--- INFOレベルでロガーを初期化し、ファイルにログを記録する。
   //--- タイムスタンプを含み、CSV形式で保存する。
   int log_options = 0; // ファイル名|行|funcig;
   logging.Initialize(INFO, true, "example_log.txt", true, TIME_DATE | TIME_MINUTES | TIME_SECONDS, false, log_options, true);

   //--- 簡単な情報メッセージを記録する
   Log(INFO, "Script started successfully.");

   //--- 警告メッセージを記録する
   Log(WARNING, "This is a warning message.");

   //--- エラーメッセージを記録する
   Log(ERROR, "This is an error message.");

   //--- デバッグ・メッセージを記録する
   Log(DEBUG, "This is a debug message for debugging purposes.");

   //--- パスワード」を含むログを消去するキーワードを追加する。
   logging.AddSilentKeyword("password");

   //--- サイレンスキーワードを含むメッセージを記録しようとする。
   Log(INFO, "User entered password: 12348"); // このメッセージは消音される

   //--- サイレンスキーワードを削除する
   logging.RemoveSilentKeyword("password");

   //--- メッセージをもう一度ログに記録する。
   Log(INFO, "User entered password: 1234");

   //--- 汎用Log関数を使用して、メッセージをログに記録する。
   Log(INFO, "This message is logged using the generic Log function.");

   //--- INFOレベルのメッセージをログに記録するには、Printマクロを使用します。
   Print("This message is logged using the Print macro.");

   //--- 異なるオプションの組み合わせによるロギングのデモ
   logging.Initialize(INFO, true, "log_with_options.txt", true, TIME_DATE | TIME_MINUTES, false, FILENAME | LINE, true);
   Log(INFO, "This log includes only the file name and line number.");

   logging.Initialize(INFO, true, "log_with_funcsig.txt", true, TIME_DATE | TIME_MINUTES | TIME_SECONDS, false, FUNCSIG, true);
   Log(INFO, "This log includes only the function signature.");

   logging.Initialize(INFO, true, "log_custom_order.txt", true, TIME_MINUTES, false, LINE | FILENAME | FUNCSIG, true);
   Log(INFO, "This log includes line number, file name, and function signature in a custom order.");

   //--- 'important'を含むログをフィルターするキーワードを追加する。
   logging.AddFilterKeyword("important");

   //--- フィルタを実証するために、いくつかのメッセージを記録する
   Log(INFO, "This is an important message."); // このメッセージは表示される
   Log(INFO, "This is a regular message.");    // このメッセージは表示されない

   //--- すべてのログを表示するには、フィルターキーワードを削除する。
   logging.RemoveFilterKeyword("important");

   //--- スクリプトの終了を示す最終メッセージを記録する。
   Log(INFO, "Script execution completed.");
}

CSV出力例

Timestamp,Level,Message
"2024.09.01 18:31:44","INFO","Script started successfully."
"2024.09.01 18:31:44","WARNING","This is a warning message."
"2024.09.01 18:31:44","ERROR","This is an error message."
"2024.09.01 18:31:44","DEBUG","This is a debug message for debugging purposes."
"2024.09.01 18:31:44","INFO","User entered password: 1234"
"2024.09.01 18:31:44","INFO","This message is logged using the generic Log function."
"2024.09.01 18:31:44","INFO","This message is logged using the Print macro."
Timestamp,Level,Message,Filename,Line
"2024.09.01 18:31","INFO","This log includes only the file name and line number.","Logging.mq5","135"
Timestamp,Level,Message,Funcsig
"2024.09.01 18:31:44","INFO","This log includes only the function signature.","void OnStart()"
Timestamp,Level,Message,Filename,Line,Funcsig
"18:31","INFO","This log includes line number, file name, and function signature in a custom order.","Logging.mq5","141","void OnStart()"
"18:31","INFO","This is an important message.","Logging.mq5","147","void OnStart()"
"18:31","INFO","Script execution completed.","Logging.mq5","154","void OnStart()"


Experアドバイザーの例

#include <Logging.mqh>

//+------------------------------------------------------------------+
//| エキスパート初期化関数|
//+------------------------------------------------------------------+
int OnInit()
{  int log_options = LINE | FUNCSIG; // FILENAME | LINE | FUNCSIG; または 0
   logging.Initialize(INFO, false, "example_log.txt", true, TIME_DATE | TIME_MINUTES | TIME_SECONDS, false, log_options, false);
//--- タイマーを作成する
   EventSetMillisecondTimer(1);
//---
   return(INIT_SUCCEEDED); }
//+------------------------------------------------------------------+
|エキスパート初期化関数|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- タイマーを破壊する
   EventKillTimer(); }

int counter = 0;
datetime last_time = 0; //--- カウンタが最後に更新された時刻を格納する。
//+------------------------------------------------------------------+
//| タイマー機能|
//+------------------------------------------------------------------+
void OnTimer()
{  logging.BeginEvent(); //--- 新しいイベントを開始する
   Log(INFO, "Sample message");
   Log(INFO, "Another message");
   Log(INFO, "Sample message"); 
//--- 現在時刻を取得する
   datetime current_time = TimeLocal();
//--- カウンターが最後に更新されてから少なくとも2秒が経過しているかチェックする。
   if (current_time - last_time >= 2)
   {  //--- カウンターを更新する
      counter++;
      //--- 前回の更新
      last_time = current_time;
      //--- 新しいカウンタ値でメッセージを記録する。
      Log(INFO, "Counter value: " + IntegerToString(counter));
      //--- 別のメッセージを記録することもできる。
      Log(INFO, "Updated after 2 seconds"); }
   else
   {  //--- タイマーはアクティブだが、カウンターは変化していないことを示すメッセージをログに記録する。
      Log(INFO, "Timer active but counter unchanged"); } }

MT5ターミナルの出力例

2024.09.22 13:00:29.589 test_logging (EURUSD,H1)        2024.09.22 13:00:29 Line: 43 Function: void OnTimer() [INFO] Sample message
2024.09.22 13:00:29.589 test_logging (EURUSD,H1)        2024.09.22 13:00:29 Line: 44 Function: void OnTimer() [INFO] Another message
2024.09.22 13:00:29.589 test_logging (EURUSD,H1)        2024.09.22 13:00:29 Line: 45 Function: void OnTimer() [INFO] Sample message
2024.09.22 13:00:29.589 test_logging (EURUSD,H1)        2024.09.22 13:00:29 Line: 55 Function: void OnTimer() [INFO] Counter value: 1
2024.09.22 13:00:29.589 test_logging (EURUSD,H1)        2024.09.22 13:00:29 Line: 57 Function: void OnTimer() [INFO] Updated after 2 seconds
2024.09.22 13:00:29.605 test_logging (EURUSD,H1)        2024.09.22 13:00:29 Line: 60 Function: void OnTimer() [INFO] Timer active but counter unchanged
2024.09.22 13:00:31.001 test_logging (EURUSD,H1)        2024.09.22 13:00:31 Line: 55 Function: void OnTimer() [INFO] Counter value: 2
2024.09.22 13:00:31.001 test_logging (EURUSD,H1)        2024.09.22 13:00:31 Line: 57 Function: void OnTimer() [INFO] Updated after 2 seconds
2024.09.22 13:00:31.017 test_logging (EURUSD,H1)        2024.09.22 13:00:31 Line: 60 Function: void OnTimer() [INFO] Timer active but counter unchanged
2024.09.22 13:00:33.001 test_logging (EURUSD,H1)        2024.09.22 13:00:33 Line: 55 Function: void OnTimer() [INFO] Counter value: 3
2024.09.22 13:00:33.001 test_logging (EURUSD,H1)        2024.09.22 13:00:33 Line: 57 Function: void OnTimer() [INFO] Updated after 2 seconds
2024.09.22 13:00:33.016 test_logging (EURUSD,H1)        2024.09.22 13:00:33 Line: 60 Function: void OnTimer() [INFO] Timer active but counter unchanged


まとめ

CDebugLogger クラスは、MQL4/5開発者にとって非常に貴重なツールです。カスタマイズ可能な幅広い機能により、アプリケーションの正確なロギングとモニタリングが可能になり、デバッグが容易になり、アプリケーションのパフォーマンス追跡が向上します。CDebugLoggerクラスは、シンプルなメッセージ・ロギングが必要な場合でも、詳細なコンテキスト情報が必要な場合でも、開発ニーズに合わせた信頼性の高い効率的なソリューションを提供します。

CDebugLoggerクラスの詳細、またはその他の高度なツールやソリューションについては、StormWave Technologiesを ご覧ください。

MetaQuotes Ltdによって英語から翻訳されました。
元のコード: https://www.mql5.com/en/code/52298

Position Risk Calculation Tool Position Risk Calculation Tool

ロットサイズとストップロスに基づいてリスク(パーセンテージと金額)を動的に計算するインジケーター。

Dashboard Panel for displaying information on the chart Dashboard Panel for displaying information on the chart

このコードは、すべての関連情報をチャートに表示するダッシュボードの作成方法を示している。

Adaptive Moving Average (AMA) Adaptive Moving Average (AMA)

適応移動平均線は、ノイズの影響を受けにくい移動平均線を作るときに使われ、トレンドを検知する際にラグが最小に抑えられるという特徴を持ちます。

Accelerator Oscillator (AC) Accelerator Oscillator (AC)

アクセルレーション/デセレレーションインジケーター(AC)は現在の市場を動かす力の加速と減速を測ります。