MetaTrader 5のストラテジーテスターを使えば、各テストパス後にトレーディングシステムの統計パラメータを取得できます。
統計パラメータは、TesterStatistics() 関数を使用して取得できます。この関数は OnTester() と OnDeinit() 関数内で呼び出されます。
最適化結果を扱うための関数(FrameFirst(), FrameFilter(), FrameNext(), FrameInputs() および FrameAdd())が導入されたことで、トレーダーは視覚的な最適化が可能になりました。必要なデータは、エキスパートアドバイザーの最適化中や数学的問題解決中に処理・表示できます。
この記事では、最適化中のエキスパートアドバイザーのテスト結果を可視化する例について考察します。詳しくは、記事「MetaTrader 5テスターで戦略を視覚化する」を参照してください。
1. 最適化中のバランスの動態の可視化
1.1. ファイルのダウンロード
Moving Averages_With_Frames.mq5 エキスパートアドバイザーを terminal_data_folder\MQL5\Experts にコピーしてください。
エキスパートアドバイザーの動作に使用されるファイルは以下の通りです:
- FrameGenerator.mqh - 最適化結果を表示するためのCFrameGeneratorクラス;
- SpecialChart.mqh - 複数のバランスチャートを描画するためのCSpecialChartクラス;
- SimpleTable.mqh - 2列の単純なテーブルを持つCSimpleTableクラス;
- ColorProgressBar.mqh - 2色を使用した進捗バーを持つCColorProgressBarクラス。
これらのファイルは terminal_data_folder\MQL5\Include にコピーしてください。
Code Baseプログラムは、MetaTrader 5ターミナルを通じて自動的にダウンロードできます(「ツールボックス」ウィンドウの CodeBase タブ)。そのためには、「ダウンロード」を選択してください。すべてのコードがダウンロードされ、各フォルダーに配置されます。

Fig. 1. CodeBaseプログラムのダウンロード
1.2. エキスパートアドバイザーのテスト
Moving Averages_With_Frames.mq5 エキスパートアドバイザーをストラテジーテスターで起動してください。
テスト設定:

Fig. 2. Moving Averages_With_Frames.mq5のテスト設定
最適化オプション:

Fig. 3. Moving Averages_With_Frames.mq5の最適化パラメータ
最適化中、エキスパートアドバイザーはバランス動態と最適化パスの統計データを表示します:

Fig. 4. Moving Averages_With_Frames.mq5の最適化
最適化プロセス:
1.3. エキスパートアドバイザーの動作原理
Moving Averages_With_Frames.mq5 エキスパートアドバイザーは、MetaTrader 5の標準パッケージに含まれるMoving Averages.mq5を基に作成されています(MQL5\Experts\Examples\Moving Average)。
結果の可視化のために以下のコードが追加されています:
//--- 最適化結果を扱うコードを接続 #include <FrameGenerator.mqh> //--- フレームジェネレーター CFrameGenerator fg; //+------------------------------------------------------------------+ //| テスター関数 | //+------------------------------------------------------------------+ double OnTester() { //--- 最適化基準計算関数をここに挿入 double TesterCritetia=MathAbs(TesterStatistics(STAT_SHARPE_RATIO)*TesterStatistics(STAT_PROFIT)); TesterCritetia=TesterStatistics(STAT_PROFIT)>0?TesterCritetia:(-TesterCritetia); //--- 各テスト後に呼び出し、最適化基準を引数として送信 fg.OnTester(TesterCritetia); //--- return(TesterCritetia); } //+------------------------------------------------------------------+ //| テスター初期化関数 | //+------------------------------------------------------------------+ void OnTesterInit() { //--- 複数のバランスラインを表示するためのチャートを準備 fg.OnTesterInit(3); // パラメータはチャート上のバランスラインの数を設定 } //+------------------------------------------------------------------+ //| テスター通過関数 | //+------------------------------------------------------------------+ void OnTesterPass() { //--- 得られたテスト結果を処理し、グラフィックを表示 fg.OnTesterPass(); } //+------------------------------------------------------------------+ //| テスター終了関数 | //+------------------------------------------------------------------+ void OnTesterDeinit() { //--- 最適化終了 fg.OnTesterDeinit(); } //+------------------------------------------------------------------+ //| チャートイベント処理 | //+------------------------------------------------------------------+ void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam) { //--- ヘッダーをクリックすると最適化終了後にフレームを表示 fg.OnChartEvent(id,lparam,dparam,sparam,100); // 100はショット間のmsの遅延 } //+------------------------------------------------------------------+
このコードは、他のエキスパートアドバイザーでも同様に使用できます。
CFrameGeneratorクラスは、最適化結果を扱うために使用されます。このクラスには、ストラテジーテスターイベント(OnTester(), OnTesterInit(), OnTesterPass(), OnTesterDeinit())を処理するためのメソッドと、チャートイベント(OnChartEvent())を処理するメソッドが含まれています。使用されるグラフィカルオブジェクトは、CFrameGeneratorクラスのOnTesterInit()メソッドで準備されます。
CFrameGeneratorクラスのOnTester()メソッドは、各テストパスの後にテストエージェントで呼び出されます。このメソッドは、取引結果に基づいてバランスカーブの動態を計算します。バランスカーブチャートは一次元配列で、その長さは実行された取引の数に依存します。
次に、TesterStatistics()関数を使用して統計データ(純利益、利益率、回復係数、取引数、最大ドローダウン率など)を要求し、フレーム(テストパスデータ配列)が生成され、FrameAdd()関数を使用してターミナルに送信されます。
フレームはCFrameGeneratorクラスのOnTesterPass()メソッドで受信され、処理されます。フレームの読み取り操作はFrameNext()関数によって行われます。フレームが生成されたエキスパートアドバイザーの入力パラメータの要求は、FrameInputs()関数を使用して行われます。
データを取得した後は、CSimpleTable、CColorProgressBar、CSpecialChartクラスのメソッドを使用して表示および更新されます。
OnTester()処理関数の実行は、テストエージェント上で次の現在の最適化パスが終了した後に行われます。これにより、MQL5 Cloud Networkの分散ネットワーク能力を使用して複雑な数学計算を実行できます。これを行うには、計算部分をOnTesterイベントハンドラーに配置します。
最適化を使用して数学計算を加速する例(ワイエルシュトラス関数の連続ウェーブレット変換)については、トピック「リアルタイムでの最適化プロセスの管理とエージェントからMetaTrader 5への大量データの転送」を参照してください。
2. CSimpleTable、CColorProgressBar、CSpecialChartクラスの使用例
添付のTest_SimpleTable.mq5およびTest_CSpecialChart.mq5スクリプトには、CSimpleTable、CColorProgressBar、CSpecialChartクラスの使用例が含まれています。これらは terminal_data_folder\MQL5\Scripts にコピーしてください。

Fig. 5. Test_SimpleTable.mq5スクリプトの操作結果

Fig. 6. Test_CSpecialChart.mq5スクリプトの操作結果