【MQL5】TesterStatistics関数について

MQL5リファレンス
スポンサーリンク
スポンサーリンク

TesterStatistics関数の働き・役割

TesterStatistics関数は、エキスパートアドバイザーEA)のテスト結果に基づいて、指定された統計パラメータを返す関数です。この関数は、テストされたEAのパフォーマンスを評価するために使用され、取引に関する様々な統計データを得ることができます。具体的には、総利益、利益率、トレードの総数、勝ちトレードの数など、テスト結果に関連するデータを取得することが可能です。

なお、TesterStatistics関数は、ストラテジーテスターでEAバックテストされる際に使用され、特にOnTester関数OnDeinit関数の中でのみ有効に機能します。それ以外の場所で呼び出すと結果が定義されないため、テスト環境でのみ使用することが重要です。

TesterStatistics関数の引数について

double  TesterStatistics(
  ENUM_STATISTICS statistic_id      // ID
  );

TesterStatistics関数は、1つの引数を取ります。この引数を指定することで、取得したい統計パラメータを決定します。

引数構成

  1. statistic_id
  • 型: ENUM_STATISTICS
  • 説明: 取得したい統計パラメータを指定します。ENUM_STATISTICSは、統計パラメータを定義した列挙型で、以下のようなパラメータを指定できます。
    • STAT_PROFIT: 総利益を表す統計パラメータ
    • STAT_TRADES: トレードの総数を表す統計パラメータ
    • STAT_PROFIT_TRADES: 勝ちトレードの総数を表す統計パラメータ
    • STAT_LOSS_TRADES: 負けトレードの総数を表す統計パラメータ
    • STAT_PROFIT_FACTOR: 利益率(プロフィットファクター)を表す統計パラメータ

この引数に適切なパラメータIDを指定することで、テスト結果に基づいた特定の統計情報を取得できます。

TesterStatistics関数の戻り値について

TesterStatistics関数戻り値は、指定した統計パラメータに基づいて計算された数値です。この数値はdouble型で返され、テスト結果の統計的な情報を示します。

例えば、次のような戻り値が得られます。

  • STAT_PROFIT を指定した場合、テストの総利益が返されます。
  • STAT_PROFIT_FACTOR を指定した場合、利益率(プロフィットファクター)が返されます。
  • STAT_TRADES を指定した場合、トレードの総数が返されます。

戻り値は常にテスト結果に基づく数値ですが、指定するパラメータによってその意味が異なります。また、OnTester関数OnDeinit関数内でのみ有効な数値が返される点に注意が必要です。

TesterStatistics関数を使う際の注意点

TesterStatistics関数は、ストラテジーテスターでのバックテストや最適化中にのみ使用できます。OnTester関数OnDeinit関数の外で呼び出した場合、正しい結果が得られません。

statistic_idには、ENUM_STATISTICS列挙型で定義された有効なIDを指定する必要があります。無効なIDを指定すると、正しい統計データが返されないことがあります。

バックテストが終了していない状態で関数を呼び出すと、統計が正確に算出されないことがあります。

TesterStatistics関数を使ったサンプルコード

// 標準の「MACD Sample.mq5」ファイルに基づくEA
// Testerイベントハンドラ内でTesterStatistics()の結果を表示するサンプルコード

#define MACD_MAGIC 1234502 // マジックナンバーの設定
//--- 必要なライブラリをインクルードする
#include <Trade\Trade.mqh>        // 取引機能のライブラリ
#include <Trade\SymbolInfo.mqh>   // シンボル情報のライブラリ
#include <Trade\PositionInfo.mqh> // ポジション情報のライブラリ
#include <Trade\AccountInfo.mqh>  // アカウント情報のライブラリ
//--- エキスパートパラメータの初期設定
input double InpLots          = 0.1;  // ロット数
input int    InpTakeProfit    = 50;   // テイクプロフィット(ピップス単位)
input int    InpTrailingStop  = 30;   // トレーリングストップの設定(ピップス単位)
input int    InpMACDOpenLevel = 3;    // MACDオープンレベル(ピップス単位)
input int    InpMACDCloseLevel = 2;   // MACDクローズレベル(ピップス単位)
input int    InpMATrendPeriod  = 26;  // 移動平均(MA)のトレンド期間

//+------------------------------------------------------------------+
//| エキスパート初期化関数(EAが開始された時に一度だけ実行される)         |
//+------------------------------------------------------------------+
int OnInit(void)
{
  //--- エキスパートの初期化を行う。失敗した場合はエラーを返す
  if(!ExtExpert.Init())
    return(INIT_FAILED); // 初期化に失敗した場合のエラーコード
  //--- 初期化が成功した場合
  return(INIT_SUCCEEDED); // 正常に初期化されたことを示すコード
}

//+------------------------------------------------------------------+
//| エキスパートティック処理関数(新しいティックが受信されるたびに呼ばれる)|
//+------------------------------------------------------------------+
void OnTick(void)
{
  static datetime limit_time = 0; // 前回のティック処理時間を保持する変数
  //--- 現在の時間が指定されたlimit_timeを超えているかを確認する
  if(TimeCurrent() >= limit_time)
  {
    //--- 利用可能なバーが十分に存在するか確認(ここではトレンド期間の2倍以上が必要)
    if(Bars(Symbol(), Period()) > 2 * InpMATrendPeriod)
    {
      //--- エキスパートの処理が成功した場合、次のタイムアウト時間を設定
      if(ExtExpert.Processing())
        limit_time = TimeCurrent() + ExtTimeOut; // 次の処理タイミングを設定
    }
  }
}

//+------------------------------------------------------------------+
//| エキスパートテスター処理関数(バックテスト終了後に自動的に呼ばれる)     |
//+------------------------------------------------------------------+
double OnTester(void)
{
  //--- 各統計パラメータをTesterStatistics関数を使って取得する
  double profit_factor = TesterStatistics(STAT_PROFIT_FACTOR); // プロフィットファクターを取得
  double profit = TesterStatistics(STAT_PROFIT);               // 総利益を取得
  int trades_total = (int)TesterStatistics(STAT_TRADES);       // トレードの総数を取得
  int profit_trades = (int)TesterStatistics(STAT_PROFIT_TRADES); // 勝ちトレードの総数を取得
  int loss_trades = (int)TesterStatistics(STAT_LOSS_TRADES);     // 負けトレードの総数を取得

  //--- 統計情報をエキスパートログに表示
  PrintFormat("%s: Profit = %.2f, trades total: %lu, profit trades total: %lu, loss trades total: %lu, profit factor: %.2f",
              __FUNCTION__,   // 関数名を表示
              profit,         // 総利益
              trades_total,   // トレードの総数
              profit_trades,  // 勝ちトレードの総数
              loss_trades,    // 負けトレードの総数
              profit_factor); // プロフィットファクター

  //--- 戻り値としてプロフィットファクターを返す
  return(profit_factor);
  
  /*
  結果の例:
  OnTester: Profit = 209.84, trades total: 13, profit trades total: 11, loss trades total: 2, profit factor: 3.02
  最終残高は10209.84 USD
  OnTester result 3.020606644198363
  */
}

<注意>

このサンプルコードは、MetaTrader5に標準実装されているEAMACD Sample.mq5」から一部を切り出したものです。そのため、オリジナルのMACD Sample.mq5内で定義されているExtExpertの定義が、このコードには含まれておらず、このままコンパイルしようとすると、コンパイルエラーが発生します。ExtExpertの部分は、オリジナルのコードを参考にしながら適切に定義する必要があります。

サンプルコード解説1:グローバル領域部分

このサンプルコードは、MetaTrader5に標準実装されている「MACD Sample.mq5」ファイルに基づいています。ここでは、グローバル領域に定義されている設定やインクルードされたライブラリについて解説します。

1. マジックナンバーの定義

#define MACD_MAGIC 1234502 // マジックナンバーの設定

マジックナンバーとは、エキスパートアドバイザーEA)が開いたポジションを他のポジションと区別するための一意(1つしか存在しない)の識別子です。この識別子により、異なるEAが同じ通貨ペアで同時に取引しても、取引履歴やポジションを区別できます。MACD_MAGICという名前で1234502が設定されています。

2. 必要なライブラリのインクルード

#include <Trade\Trade.mqh>        // 取引機能のライブラリ
#include <Trade\SymbolInfo.mqh>   // シンボル情報のライブラリ
#include <Trade\PositionInfo.mqh> // ポジション情報のライブラリ
#include <Trade\AccountInfo.mqh>  // アカウント情報のライブラリ

この部分では、取引やアカウントに関連する機能を利用するためのライブラリをインクルードしています。

  • Trade.mqh: 注文を発行したり、ポジションを管理するための機能を提供します。
  • SymbolInfo.mqh: シンボル(通貨ペアや商品など)の情報を取得するために使われます。
  • PositionInfo.mqh: 開かれているポジションに関する情報を扱います。
  • AccountInfo.mqh: アカウントの残高やレバレッジなど、取引アカウントに関する情報を取得します。

これらのライブラリをインクルードすることで、EAは取引に関連する様々な情報を取得・操作することが可能になります。

3. エキスパートアドバイザーの入力パラメータ

input double InpLots          = 0.1;  // ロット数
input int    InpTakeProfit    = 50;   // テイクプロフィット(ピップス単位)
input int    InpTrailingStop  = 30;   // トレーリングストップの設定(ピップス単位)
input int    InpMACDOpenLevel = 3;    // MACDオープンレベル(ピップス単位)
input int    InpMACDCloseLevel = 2;   // MACDクローズレベル(ピップス単位)
input int    InpMATrendPeriod  = 26;  // 移動平均(MA)のトレンド期間

この部分は、エキスパートアドバイザーの入力パラメータを定義しています。ユーザーがEAを実行する際に、これらの値を自由に設定することができます。

  • InpLots: 取引に使用するロット数を指定します。ここでは0.1ロットが設定されています。
  • InpTakeProfit: テイクプロフィットの値(利益確定の価格)をピップス単位で指定します。ここでは」50ピップスに設定されています。
  • InpTrailingStop: トレーリングストップの設定です。価格が有利に動いた場合、ストップロスを追従させる距離をピップス単位で指定します。ここでは30ピップスです。
  • InpMACDOpenLevel: MACDのオープンレベル、つまり取引開始のトリガーとなるレベルをピップス単位で指定します。ここでは3ピップスに設定されています。
  • InpMACDCloseLevel: MACDのクローズレベル、つまり取引終了のトリガーとなるレベルをピップス単位で指定します。ここでは2ピップスです。
  • InpMATrendPeriod: 移動平均の期間です。この期間をもとにトレンドを判断します。26期間が設定されています。

これらのパラメータにより、エキスパートアドバイザーは柔軟な取引条件を設定することが可能です。

サンプルコード解説2:OnInit関数部分

//+------------------------------------------------------------------+
//| エキスパート初期化関数(EAが開始された時に一度だけ実行される)         |
//+------------------------------------------------------------------+
int OnInit(void)
{
  //--- エキスパートの初期化を行う。失敗した場合はエラーを返す
  if(!ExtExpert.Init())
    return(INIT_FAILED); // 初期化に失敗した場合のエラーコード
  //--- 初期化が成功した場合
  return(INIT_SUCCEEDED); // 正常に初期化されたことを示すコード
}

OnInit関数は、エキスパートアドバイザーEA)がチャートに適用されるときに一度だけ呼び出される初期化関数です。この関数の目的は、EAの動作に必要な初期設定やリソースの準備を行うことです。ここでは、OnInit関数の各部分について解説します。

関数の定義

OnInit関数は、戻り値としてint型のステータスコードを返します。この戻り値により、EAの初期化が成功したか失敗したかを判断します。戻り値には、INIT_SUCCEEDEDまたはINIT_FAILEDが使用されます。

初期化処理

この部分では、ExtExpert.Initという初期化処理が実行されます。ExtExpertは、エキスパートアドバイザーの主要なロジックを管理するCSampleExpertクラスインスタンスです。このInitメソッドは、取引に使用するシンボル情報やトレードオブジェクト、インジケータの初期化など、EAの動作に必要な準備を行います。これには、MACDEMAといった取引判断に使われるインジケータの作成や、取引パラメータの検証が含まれます。

EAの初期化が正しく行われないと、EAは動作しないため、このようなエラーチェックが非常に重要です。失敗した場合、INIT_FAILEDを返し、初期化エラーとして処理します。

正常終了処理

初期化が正常に完了した場合、INIT_SUCCEEDEDが返されます。これにより、EAが問題なく起動したことを示し、その後の処理が続けられます。

ExtExpertについて

ExtExpertは「MACD Sample.mq5」に存在するエキスパートロジックのオブジェクトです。ExtExpert.Initメソッドでは、シンボルやトレードの初期設定、インジケータハンドル作成、トレードパラメータのチェックを行っています。これにより、EAMACDEMAインジケータを使用した売買ロジックを適切に実行できるようになります。この部分を動作させるためには、オリジナルのコード内のExtExpertの定義が必要となります。

サンプルコード解説3:OnTick関数部分

//+------------------------------------------------------------------+
//| エキスパートティック処理関数(新しいティックが受信されるたびに呼ばれる)|
//+------------------------------------------------------------------+
void OnTick(void)
{
  static datetime limit_time = 0; // 前回のティック処理時間を保持する変数
  //--- 現在の時間が指定されたlimit_timeを超えているかを確認する
  if(TimeCurrent() >= limit_time)
  {
    //--- 利用可能なバーが十分に存在するか確認(ここではトレンド期間の2倍以上が必要)
    if(Bars(Symbol(), Period()) > 2 * InpMATrendPeriod)
    {
      //--- エキスパートの処理が成功した場合、次のタイムアウト時間を設定
      if(ExtExpert.Processing())
        limit_time = TimeCurrent() + ExtTimeOut; // 次の処理タイミングを設定
    }
  }
}

OnTick関数は、新しいティック(価格データの更新)が発生するたびに自動的に呼び出される関数です。エキスパートアドバイザーEA)は、この関数内でリアルタイムの取引ロジックを実行します。ここでは、OnTick関数の各部分と、その中で使用されているProcessingメソッド変数ExtTimeOutについて解説します。

ティック処理のタイミング制御

まず、limit_timeという変数を使用して、前回のティック処理が行われた時間を保持します。次に、現在の時間(TimeCurrent)がlimit_timeを超えた場合にのみ、処理が行われる仕組みになっています。これにより、連続したティック更新の中でも、無駄な処理が発生しないよう制御されています。

利用可能なバーの確認

次に、Bars関数を使って利用可能なバーの数を確認します。ここでは、トレンドを判断するために必要な移動平均期間(InpMATrendPeriod)の2倍以上のバーが存在するかをチェックしています。十分なデータがある場合にのみ、EAのロジックが実行されます。

ExtExpert.Processingメソッド

OnTick関数内で、ExtExpert.Processingメソッドが呼び出されています。このメソッドは、CSampleExpertクラスの一部であり、EAがポジションを開くか閉じるか、またはトレードを修正するかの判断を行う主要な処理を担当します。このメソッドは、現在のMACDEMAといったインジケータのデータをもとに、売買シグナルの判断やトレードの実行を行います。

ExtTimeOut変数

ExtTimeOutは、次のトレード処理までのタイムアウト時間を秒単位で指定する変数です。Processingメソッドが正常に実行されてトレードが完了した場合、limit_timeに現在の時間(TimeCurrent)にExtTimeOutを加えた値を設定します。これにより、次にProcessingメソッドが呼び出されるまでの待機時間が確保され、連続してトレード処理が行われないようになっています。

サンプルコード解説4:OnTester関数部分

OnTester関数は、エキスパートアドバイザーEA)のバックテストが終了した際に自動的に呼び出される関数です。この関数の主な役割は、バックテストの結果に基づいて統計データを取得し、テスト結果を評価することです。TesterStatistics関数を使用して、トレードに関するさまざまな統計情報を取得し、EAのパフォーマンスを評価します。

TesterStatistics関数による統計データの取得

OnTester関数内では、TesterStatistics関数を使ってテスト結果から各種統計データを取得します。この関数は、ENUM_STATISTICSで指定されたパラメータの統計値を返します。

  • profit_factor: プロフィットファクター(利益率)を取得します。プロフィットファクターは、利益トレードの合計と損失トレードの合計を比較して、EAの利益性を評価します。
  • profit: 総利益を取得します。これはテスト期間中に得られた純利益です。
  • trades_total: トレードの総数を取得します。これはバックテスト中に実行されたトレードの回数です。
  • profit_trades: 勝ちトレードの総数を取得します。バックテスト中に利益を上げたトレードの回数です。
  • loss_trades: 負けトレードの総数を取得します。損失を出したトレードの回数です。

統計情報の表示とフォーマット指定子の解説

取得した統計データは、PrintFormat関数を使ってエキスパートログに出力されます。PrintFormat関数は、指定されたフォーマットに従ってデータを出力する関数で、わかりやすい形で情報を表示することができます。

PrintFormat("%s: Profit = %.2f, trades total: %lu, profit trades total: %lu, loss trades total: %lu, profit factor: %.2f",
              __FUNCTION__,   // 関数名を表示
              profit,         // 総利益
              trades_total,   // トレードの総数
              profit_trades,  // 勝ちトレードの総数
              loss_trades,    // 負けトレードの総数
              profit_factor); // プロフィットファクター

フォーマット指定子は、以下のように解釈します:

  • %s: 文字列を表示するためのフォーマット指定子です。ここでは__FUNCTION__が使用されており、実行中の関数名が表示されます。
  • %.2f: 浮動小数点数を小数点以下2桁まで表示するための指定子です。profitやprofit_factorのように、金額やプロフィットファクターを2桁で整えて表示しています。
  • %lu: 符号なし長整数(unsigned long)の値を表示するための指定子です。trades_total、profit_trades、loss_tradesは全てトレード数に関するデータで、整数値を扱います。

これにより、ログには関数名や利益、トレードの総数、勝ちトレードの数、負けトレードの数、プロフィットファクターがフォーマットされた形で表示されます。

戻り値

OnTester関数は、プロフィットファクターを戻り値として返します。この値は、EAがどれだけ効率的に利益を上げたかを示す指標となり、バックテストの最適化などで使用されることがあります。

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