バランスグラフを使用した戦略の最適化と、結果の「バランス+最大シャープレシオ」基準との比較

Vladimir Karputov | 20 11月, 2017

内容


1. はじめに

作業するうちに、バランスグラフの履歴での成長は不十分であると気が付きました。さらに必要なのは十分な滑らさです。言い換えれば、トレンドラインからの平均二乗偏差はできるだけ小さくなければなりません。これは、利益とは別に安定性が求められることを意味します。それを達成するために、もう1つの最適化パラメータ、すなわち、バランスグラフ曲線と、回帰直線からのその値の偏差の分散を確認してみましょう。

ALGLIB数値解析ライブラリを使用して、線形回帰式の比とその他の統計的特性を取得します。


2. バランスグラフのトレンドラインを計算する方法

バランスグラフのトレンドラインを作成して、線からの偏差の平方和が最小になるようにしなければなりません。

線を計算するための方程式y=ax+bの比は標準最小二乗(LS)法によって見出されます。これには、必要な数式を全て提供するかわりに、ALGLIBライブラリの既成関数を使用して、それを私たちのニーズに適応させることにします。

2.1. 最適化基準を計算するためのアルゴリズム

5つの取引例を見てみましょう。

図1. Balance and Linear regression.png

図1. バランスグラフと線形回帰

これら5つの取引は「残高」1-2-3-4-5バランスラインを形成します。線形回帰直線が計算され、最小二乗法を使用してプロットされます(計算はALGLIB数値解析ライブラリを使用して実行されます)。

2.2. 1番目のTrendProfit変数の導入

プロットされた回帰直線の取引当たりの利益を表します。

図2. TrendProfitパラメータ

図2. TrendProfitパラメータ

この変数は回帰線の高さと取引回数の比として計算され、高さは点Bと点Aの回帰直線値の差として計算されます。

さて、ここで回帰直線の構築誤差、すなわち、回帰直線と平衡線との平均偏差を得る必要があります。これを線形回帰からの標準残高偏差と呼び、LR Standard error:( LR標準誤差)としてマークします。

図3. LR標準誤差

3. LR標準誤差

この方程式では error(誤差)はバランス値と線形回帰との差として計算されます。方程式の詳細についてはこちらを参照できます(ロシア語)。 

図1で考察されるケースでは、誤差は下記のとおりです。

誤差#1 誤差#2 誤差#3 誤差#4 誤差#5
10 000 - 10 600 = - 600 12 000 - 11 200 = 800 11 000 - 11 800 = - 800 14 000 - 12 400 = 1600 12 000 - 13 000 = - 1000

したがって、LR標準誤差は下記に等しくなります。

図4. 算出されたLR標準誤差

4. 算出されたLR標準誤差

2.3. ProfitStability変数

このパラメータはバランスグラフの滑らかさを担います。以下はここでの目標です。

ProfitStabilityTrendProfit LR標準エラーの比率として計算されます。

図5. ProfitStability変数

5. ProfitStability変数 

取引量が異なることによる影響を減らすためにProfitStability変数をすべての取引の総量で割ります。


3. ALGLIBライブラリの使用法

現時点(ビルド1645)で、ALGLIBライブラリはすでに長いこと標準ライブラリに統合されています( [データフォルダ]\MQL5\Include\Math\Alglib\alglib.mqh)。

図6. alglib

6. 標準ライブラリでのALGLIBライブラリへのパス

ALGLIBライブラリクラス 

線形回帰を扱うには、次のクラスが必要です。

BalanceRegression.mqhクラス

線形回帰とパラメータの計算に関連する作業のすべては、Balance regression.mqhクラスで実行されます。

クラスメソッド

 パラメータの設定
 SetStartBalance   初期バランスの設定
 SetFromDate  取引履歴を要求する初期日付の設定
 SetVolumeNormalization  取引量の正規化モードの設定
 計算結果へのアクセス
 GetProfitStability  計算結果へのアクセス 


CBalanceRegressionの使用は次のステップを含みます。

  1. 初期バランスの設定 — SetStartBalanceメソッドを呼び出す
  2. 取引履歴を要求する初期日付の設定 — SetFromDateメソッドを呼び出す
  3. 取引量の正規化モードの設定 — SetVolumeNormalizationメソッドを呼び出す(取引量の正規化を使用する場合は'true'、それ以外の場合は'false'を渡す) 
  4. 計算結果の取得 — GetProfitStabilityメソッドを呼び出し、取得した結果をOnTester関数に返す

3.1. 計算手順(GetProfitStabilityメソッド)

(手数料+スワップ+利益)> 0.0を持つ取引結果は、arr_profits配列に保存されます。すべての取引量は、total_volume変数で合計されます。

//---
   double   arr_profits[];                            // 約定結果配列
   double   total_volume=0;                           // 合計取引量

次に、すべての取引を処理します。arr_profits配列に書き入れて、取引量をtotal_volume変数に合計します。

//--- 取引履歴を要求する 
   HistorySelect(m_from_date,to_date);
   uint total_deals=HistoryDealsTotal();
   ulong ticket_history_deal=0;
//--- 全ての約定について 
   for(uint i=0;i<total_deals;i++)
     {
      //--- 約定のticket_history_dealの取得を試みる 
      if((ticket_history_deal=HistoryDealGetTicket(i))>0)
        {
         long     deal_type         =HistoryDealGetInteger(ticket_history_deal,DEAL_TYPE);
         double   deal_volume       =HistoryDealGetDouble(ticket_history_deal,DEAL_VOLUME);
         double   deal_commission   =HistoryDealGetDouble(ticket_history_deal,DEAL_COMMISSION);
         double   deal_swap         =HistoryDealGetDouble(ticket_history_deal,DEAL_SWAP);
         double   deal_profit       =HistoryDealGetDouble(ticket_history_deal,DEAL_PROFIT);

         if(deal_type!=DEAL_TYPE_BUY && deal_type!=DEAL_TYPE_SELL)
            continue;

         if(deal_commission==0.0 && deal_swap==0.0 && deal_profit==0.0)
            continue;

         total_volume+=deal_volume;

         int arr_size=ArraySize(arr_profits);
         ArrayResize(arr_profits,arr_size+1,50);   // 配列のサイズを変更する

         if(arr_size==0)
            arr_profits[arr_size]=GetSetStartBalance()+deal_commission+deal_swap+deal_profit;
         else
            arr_profits[arr_size]=arr_profits[arr_size-1]+deal_commission+deal_swap+deal_profit;

         int d=0;
        }
     }

注:arr_profits配列の最初のエントリを作成すると、初期バランスと取引結果が合計されます。その後のすべてのエントリについては、前のエントリと取引結果を合計します。

CMatrixDouble class obクラスオブジェクトを宣言します。実際、これは行列です。取引インデックス("1"で始まる)結果を書き入れます。

//--- CMatrixDoubleオブジェクト
   CMatrixDouble xy(arr_size,2);
   for(int i=0;i<arr_size;i++)
     {
      xy[i].Set(0,i+1);
      xy[i].Set(1,arr_profits[i]);
      //Print(arr_profits[i]); // デバッグ
     }

必要なクラスオブジェクト( CLinReg、CLinearModel、CLRReport)を宣言し、線形回帰を計算します。

//--- 線形回帰構造
   CLinReg        linear_regression;
   CLinearModel   linear_model;
   CLRReport      linear_report;
   int retcode;
   linear_regression.LRBuild(xy,arr_size,1,retcode,linear_model,linear_report);
   if(retcode!=1)
     {
      Print("Linear regression failed, error code=",retcode);
      return(0.0);
     }
   int nvars;
   double coefficients[];
   linear_regression.LRUnpack(linear_model,coefficients,nvars);
   double coeff_a=coefficients[0];
   double coeff_b=coefficients[1];
   PrintFormat("y = %.1f x + %.1f",coeff_a,coeff_b);

最後にLRUnpackメソッドを呼び出してy = a*x + b方程式の比を取得します。その比はcoefficients配列に配置されます。

ALGLIBライブラリを使用して線形回帰を計算したので、本稿全体の焦点であるパラメータの計算に直接進みます。

//--- パラメータの計算
   double TrendProfit=((double)arr_size*coeff_a+coeff_b)-(1.0*coeff_a+coeff_b);  // "Y"軸上の回帰直線の投影
   TrendProfit/=(double)arr_size;                                                // 取引数で除算
   double TrendMSE=linear_report.m_rmserror;                                     // 訓練セットの二乗平均平方根誤差
   double ProfitStability=TrendProfit/TrendMSE;
//--- 取引量を正規化する
   if(GetVolumeNormalization())
      ProfitStability/=total_volume;
//--- 取引数で乗算する - 約定が少ないパスには興味がない
   ProfitStability*=arr_size;
//---
   return(ProfitStability*10000.0);

SetVolumeNormalizationメソッドを介して設定された初期パラメータに応じて、ProfitStabilityパラメータを合計取引量で除算します。結果をより良く表現するために、結果に10000を乗算します。


4. CBalanceRegressionクラスのインクルード

CBalanceRegressionクラスを様々なEAにインクルードするアルゴリズムを考察してみましょう。 

4.1. MQL5ウィザードで生成されたエキスパートアドバイザー

ここでは取引量の正規化が結果に及ぼす影響を確認するべきです。つまり、ポジションの量を動的に計算するEAが必要です。これはMQL5ウィザードで行うことができます。エキスパートアドバイザー(生成)を選択し、資金管理モジュールの1つを資金管理ページに含めます。

  • "Trading with fixed margin" — 余剰証拠金%でロットを計算する
  • "Trading with fixed risk" — バランス%でロットを計算する
  • "Trading with optimized trade volume" — 取引履歴によってロットを計算する

本稿では"Trading with fixed risk"資金管理モジュールを選択しましたが、EA自体は"EA test balance regression.mq5"という名前です。これを例として、CBalanceRegressionクラスファイルをインクルードする方法を示します。

ステップ1: CBalanceRegressionファイルをインクルードしてクラスオブジェクトを宣言する (m_balance_regression)。

注意:CBalanceRegressionクラスファイルは[データフォルダ]\MQL5\Include\Balance regressionフォルダに位置するべきです。

//--- 利用できる資金管理
#include <Expert\Money\MoneyFixedRisk.mqh>
//--- 利用できるモジュールBalance Regression
#include <Balance regression\BalanceRegression.mqh>
//+------------------------------------------------------------------+
//| 入力                                                             |
//+------------------------------------------------------------------+

そして

//+------------------------------------------------------------------+
//| グローバルエキスパートオブジェクト                                   |
//+------------------------------------------------------------------+
CExpert ExtExpert;
CBalanceRegression m_balance_regression;
//+------------------------------------------------------------------+
//| エキスパート初期化関数                                              |
//+------------------------------------------------------------------+

ステップ2:取引量の正規化を入力パラメータに有効/無効にするためのパラメータを追加します。

input double             Money_FixRisk_Percent=10.0;                            // リスクの%
//--- バランス正規化のための入力
input bool               InpVolumeNormalization=true;                           // 取引量の正規化
//+------------------------------------------------------------------+
//| グローバルエキスパートオブジェクト                                   |
//+------------------------------------------------------------------+

ステップ3: CBalanceRegressionクラスのm_balance_regressionオブジェクトのパラメータ(取引履歴を要求するための初期データと取引量の正規化モード)を設定します。

//+------------------------------------------------------------------+
//| エキスパート初期化関数                                              |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- CBalanceRegressionパラメータを設定する
   m_balance_regression.SetStartBalance(AccountInfoDouble(ACCOUNT_BALANCE));
   m_balance_regression.SetFromDate(TimeCurrent());
   m_balance_regression.SetVolumeNormalization(InpVolumeNormalization);
//--- エキスパートの初期化

ステップ4:OnTester関数をファイルの最後に追加します。ここでは、(GetProfitStabilityを呼び出して)カスタム最適化基準を受け取り、テスターにパラメータを渡します。

//+------------------------------------------------------------------+
//| テスター関数                                                       |
//+------------------------------------------------------------------+
double OnTester()
  {
//---
   double ret=m_balance_regression.GetProfitStability(TimeCurrent());
//---
   return(ret);
  }

4.2. 標準的なMACDサンプルと移動平均に基づくエキスパートアドバイザー

元になるEAはそれぞれ[データフォルダ]\MQL5\Experts\Examples\MACD\MACD Sample.mq5と [データフォルダ]MQL5\Experts\Examples\Moving Average\Moving Average.mq5です。

元になるEAを取り出し、異なる名前でコピーを保存します。私は"MACD Sample balance regression.mq5"と"Moving Average balance regression.mq5"を選びました。

ステップ1:CBalanceRegressionクラスファイルをインクルードしてクラスオブジェクトを宣言する(m_balance_regression)。

注意:CBalanceRegressionクラスファイルは[データフォルダ]\MQL5\Include\Balance regressionフォルダに位置するべきです。

MACD Sample balance regression.mq5 Moving Average balance regression.mq5
#include <Trade\AccountInfo.mqh>
//--- 利用できるモジュールBalance Regression
#include <Balance regression\BalanceRegression.mqh>
CBalanceRegression m_balance_regression;
//---
input double InpLots          =0.1; // ロット
#include <Trade\Trade.mqh>
//--- 利用できるモジュールBalance Regression
#include <Balance regression\BalanceRegression.mqh>
CBalanceRegression m_balance_regression;

input double MaximumRisk        = 0.02;    // 最大リスク(%)

ステップ2:取引量の正規化を入力パラメータに有効/無効にするためのパラメータを追加します。

MACD Sample balance regression.mq5 Moving Average balance regression.mq5
input int    InpMATrendPeriod =26;  // MAトレンド期間
//--- バランス正規化のための入力
input bool   InpVolumeNormalization=true; // 取引量の正規化
//---
int ExtTimeOut=10; // 取引操作間のタイムアウト時間(秒単位)
input int    MovingShift        = 6;       // 移動平均のシフト
//--- バランス正規化のための入力
input bool   InpVolumeNormalization=true;  // 取引量の正規化
//---
int    ExtHandle=0;

ステップ3: CBalanceRegressionクラスのm_balance_regressionオブジェクトのパラメータ(取引履歴を要求するための初期データと取引量の正規化モード)を設定します。

MACD Sample balance regression.mq5  Moving Average balance regression.mq5
//+------------------------------------------------------------------+
//| 初期化と入力パラメータの確認                                         |
//+------------------------------------------------------------------+
bool CSampleExpert::Init(void)
  {
//--- CBalanceRegressionパラメータを設定する
   m_balance_regression.SetStartBalance(AccountInfoDouble(ACCOUNT_BALANCE));
   m_balance_regression.SetFromDate(TimeCurrent());
   m_balance_regression.SetVolumeNormalization(InpVolumeNormalization);
//--- 共通情報を初期化する
  
//+------------------------------------------------------------------+
//| エキスパート初期化関数                                              |
//+------------------------------------------------------------------+
int OnInit(void)
  {
//--- CBalanceRegressionパラメータを設定する
   m_balance_regression.SetStartBalance(AccountInfoDouble(ACCOUNT_BALANCE));
   m_balance_regression.SetFromDate(TimeCurrent());
   m_balance_regression.SetVolumeNormalization(InpVolumeNormalization);
//--- ヘッジモードが有効な場合、取引クラスによるポジションの調整を準備する

ステップ4:両方のEAのファイルの最後にOnTester関数を追加します。ここでは、(GetProfitStabilityを呼び出して)カスタム最適化基準を受け取り、テスターにパラメータを渡します。

//+------------------------------------------------------------------+
//| テスター関数                                                       |
//+------------------------------------------------------------------+
double OnTester()
  {
//---
   double ret=m_balance_regression.GetProfitStability(TimeCurrent());
//---
   return(ret);
  }

5. EURUSD H4での最適化、フォワードテストなし

回帰法を用いてバランスグラフを最適化するという考え方を確認できる3つのEAがあります。2つのEA(EA test balance regression.mq5および Moving Average balance regression.mq5)は取引中に動的にポジションボリュームを計算する一方、MACD Sample balance regression.mq5は固定ロットを使用します。

5.1. EA test balance regression.mq5、EURUSD H4、フォワードテストなし

オプションを見落とさずにテストを高速化するために、最適化のための2つのパラメータ、つまりポジション開閉シグナルの境界パラメータを選択しました。

図7. テスターの入力タブ

7. テスターの入力タブ

  • テスト1:"Balance + max Sharp Ratio"標準パラメータの最適化 
  • テスト2:"Custom max"カスタムパラメータの最適化(取引量最適化パラメータは'false') 
  • テスト3:"Custom max"カスタムパラメータの最適化(取引量最適化パラメータは'true')

5.1.1 テスト1:"Balance + max Sharp Ratio"標準パラメータの最適化

テスト1のテスター設定(注:"Optimization"は"Balance + max Sharpe Ratio"に等しい):

図8. テスターの設定タブ

8. テスターの設定タブ

5.1.2. PC2台のホームローカルネットワークとクラウドでのテスト速度の比較

ホームネットワークには2台のコンピュータがあります。

  1. クアッドコアIntel Core i3-3120M @ 2.50GHz、8077MBを搭載したラップトップ:ターミナルは2番目のコンピュータ上のエージェントと通信する必要があるため、4つのエージェントのうち3つだけがテストに使用されます。
  2. 6コアAMD Phenom II X6 1075Tプロセッサ(4058 MB)を搭載したデスクトップ:CPUを過熱しないために、6つのうち4つだけがテストに使用されます。

図9. ホームネットワークの最適化

9. ホームネットワークの最適化

テスト1ホームネットワークでは21分43秒でパスしました

キャッシュされたテスト結果を削除し、MQL5 Cloud Europe 1でテスト1を起動します。クラウドでは、テストは1分9秒で完了し、テスト費用は$0.06です。

テスト1の結果(降順で並び替えて5つの最良結果を表示):

パス 結果 利益 予想ペイオフ 利益係数 回復係数 シャープレシオ カスタム エクイティDD % 取引 Signal_ThresholdOpen Signal_ThresholdClose
346 4349.76 17818.98 181.83 1.28 1.45 0.16 27989.31 60.48 98 30 100
345 4349.76 17818.98 181.83 1.28 1.45 0.16 27989.31 60.48 98 25 100
344 4349.76 17818.98 181.83 1.28 1.45 0.16 27989.31 60.48 98 20 100
343 4349.76 17818.98 181.83 1.28 1.45 0.16 27989.31 60.48 98 15 100
327 4349.76 17818.98 181.83 1.28 1.45 0.16 27989.31 60.48 98 30 95

図10. テスト1、最適化パス346

10. テスト1、最適化パス346

5.1.3. テスト2:"Custom max"カスタムパラメータの最適化(取引量最適化パラメータは'false')

テスト2のテスター設定(注:"Optimization"は"Custom max"に等しい):

図11. テスターの設定タブ

11. テスターの設定タブ

テスト2のテスター設定(注:Value 行の"Volume normalization"は'false'):

図12. テスターの入力タブ

12. テスターの入力タブ

テスト2の結果(降順で並び替えて5つの最良結果を表示):

パス 結果 利益 予想ペイオフ 利益係数 回復係数 シャープレシオ カスタム エクイティDD % 取引 Signal_ThresholdOpen Signal_ThresholdClose
270 40085.45 11072.30 93.04 1.12 0.90 0.11 40085.45 41.18 119 30 80
269 40085.45 11072.30 93.04 1.12 0.90 0.11 40085.45 41.18 119 25 80
268 40085.45 11072.30 93.04 1.12 0.90 0.11 40085.45 41.18 119 20 80
267 40085.45 11072.30 93.04 1.12 0.90 0.11 40085.45 41.18 119 15 80
251 40085.45 11072.30 93.04 1.12 0.90 0.11 40085.45 41.18 119 30 75


図13. EURUSDH4、テスト2、最適化パス270

13. EURUSDH4、テスト2、最適化パス270

カスタムパラメータによる"Custom max"の最適化により、収益性は低下しましたが、エクイティによるドローダウンはより小さくなりました(Equity DD%列)。また、テスト2では、バランスによるドローダウンが小さくなっています。これは、図12と13を比較すると視覚的にもわかります。

5.1.4. テスト3:"Custom max"カスタムパラメータの最適化(取引量最適化パラメータは'true')

テスト3のテスター設定(テスター2と似ている)

図14. テスターの設定タブ

14. テスターの設定タブ

テスト3のテスター設定(注:Value 行の"Volume normalization"は''true''):

図15. テスターの入力タブ

15. テスターの入力タブ

クラウドでは、テストは2分27秒で完了し、テスト全体がMQL5 Cloud Europe 1で実行されました。テスト費用は$0.08です。

テスト3の結果(降順で並び替えて5つの最良結果を表示):

パス 結果 利益 予想ペイオフ 利益係数 回復係数 シャープレシオ カスタム エクイティDD % 取引 Signal_ThresholdOpen Signal_ThresholdClose
346 92.11 17818.98 181.83 1.28 1.45 0.16 92.11253 60.48 98 30 100
345 92.11 17818.98 181.83 1.28 1.45 0.16 92.11253 60.48 98 25 100
344 92.11 17818.98 181.83 1.28 1.45 0.16 92.11253 60.48 98 20 100
343 92.11 17818.98 181.83 1.28 1.45 0.16 92.11253 60.48 98 15 100
327 92.11 17818.98 181.83 1.28 1.45 0.16 92.11253 60.48 98 30 95

テスト3では、取引量パラメータが'true'に等しいので、テスト1と同じ最適オプションが定義されています。これは、線形回帰法を使用してバランスグラフを最適化するための優れたマーカーです。

結論:線形回帰法を使用しているバランスグラフの最適化により、 "Balance + max Sharp Ratio"最適化方法に劣らない、それ以上である結果を選択することができます。

5.2. Moving Average balance regression.mq5、EURUSD H4、フォワードテストなし

最適化のために以下のパラメータを選択します。

図16. テスターの入力タブ

16. テスターの入力タブ

Moving Average balance regression EAのテストを3つ実行します。

  • テスト1:"Balance + max Sharp Ratio"標準パラメータの最適化 
  • テスト2:"Custom max"カスタムパラメータの最適化(取引量最適化パラメータは'false') 
  • テスト3:"Custom max"カスタムパラメータの最適化(取引量最適化パラメータは'true')

テスター設定(通貨、ティック生成方法、時間間隔は図5と同じ)

5.2.1. テスト1("Balance + max Sharp Ratio"標準パラメータの最適化)のクラウドでの実行です。クラウドでは、テストは1分22秒で完了し、テスト全体がMQL5 Cloud Europe 1で実行されました。テスト費用は$0.03です。

テスト1の結果(降順で並び替えて5つの最良結果を表示):

パス 結果 利益 予想ペイオフ 利益係数 回復係数 シャープレシオ カスタム エクイティDD % 取引 DecreaseFactor MovingPeriod
19 3500.83 1209.31 28.79 2.89 2.74 0.31 280.3791 4.29 42 9 13
18 3500.83 1209.31 28.79 2.89 2.74 0.31 280.3791 4.29 42 8 13
17 3500.83 1209.31 28.79 2.89 2.74 0.31 280.3791 4.29 42 7 13
21 3438.91 1202.00 28.62 2.76 2.52 0.31 287.1098 4.59 42 11 13
20 3438.91 1202.00 28.62 2.76 2.52 0.31 287.1098 4.59 42 10 13

最良のパス#19を見てみましょう。

図17. EURUSDH4、テスト1、最適化パス19

17. EURUSDH4、テスト1、最適化パス19

5.2.2. テスト2("Custom max"カスタムパラメータの最適化(取引量最適化パラメータは'false'))のクラウドで実行です。クラウドでは、結果は反転していますがキャッシュから取り出されたので、テストは0分と00秒かかります。テスト全体がMQL5 Cloud Europe 2で実行されました。テスト費用は$0.00です。

テスト2の結果(降順で並び替えて5つの最良結果を表示):

パス 結果 利益 予想ペイオフ 利益係数 回復係数 シャープレシオ カスタム エクイティDD % 取引 DecreaseFactor MovingPeriod
141 102076.24 1029.99 25.75 2.16 2.29 0.22 102076.2 3.93 40 14 22
140 102076.24 1029.99 25.75 2.16 2.29 0.22 102076.2 3.93 40 13 22
139 102076.24 1029.99 25.75 2.16 2.29 0.22 102076.2 3.93 40 12 22
142 101254.84 1037.87 25.95 2.15 2.31 0.22 101254.8 3.93 40 15 22
138 90936.41 960.67 24.02 2.09 2.08 0.21 90936.41 4.31 40 11 22

パス141はテーブルの最上部にあります(結果欄に最大値があります)。

図18. EURUSDH4、テスト2、最適化パス141

18. EURUSDH4、テスト2、最適化パス141

テスト2では、バランスグラフを最適化すると、 "Balance + max Sharp Ratio"パラメータによる最適化よりも良い結果が得られました。

5.2.3. テスト3クラウドでの"Custom max"カスタムパラメータの最適化(取引量最適化パラメータは'true)クラウドでは、テストは1分13秒で完了し、テスト全体がMQL5 Cloud Europe 2で実行されました。テスト費用は$0.05です。

テスト3の結果(降順で並び替えて5つの最良結果を表示):

パス 結果 利益 予想ペイオフ 利益係数 回復係数 シャープレシオ カスタム エクイティDD % 取引 DecreaseFactor MovingPeriod
141 13869.05 1029.99 25.75 2.16 2.29 0.22 13869.05 3.93 40 14 22
140 13869.05 1029.99 25.75 2.16 2.29 0.22 13869.05 3.93 40 13 22
139 13869.05 1029.99 25.75 2.16 2.29 0.22 13869.05 3.93 40 12 22
142 13235.93 1037.87 25.95 2.15 2.31 0.22 13235.93 3.93 40 15 22
138 12542.95 960.67 24.02 2.09 2.08 0.21 12542.95 4.31 40 11 22

テスト3では、テスト2と同じ最適オプションが選択されました。取引量パラメータ('true')の影響はありませんでした。

結論"Custom max"パラメータによる最適化により、両方のテスト(テスト2及び3)でテスト1より良い結果を選ぶぶことができました。テスト3では、取引量パラメータ('true')の影響はありませんでした。

5.3. MACD Sample balance regression.mq5、EURUSD H4、フォワードテストなし

最適化のために以下のパラメータを選択します。

図19. テスターの入力タブ

19. テスターの入力タブ

MACD Sample balance regressionEAのテストを3つ実行します。

テスター設定(通貨、ティック生成方法、時間間隔は図5と同じ)

5.3.1. テスト1("Balance + max Sharp Ratio"標準パラメータの最適化)のクラウドでの実行です。クラウドでは、テストに3分55秒かかります(タスクがいくつかの低速エージェントでは実行されないので10個のタスクが他のエージェントに分散され、時間が比較的長いです)。テスト全体がMQL5 Cloud Europe 1で実行されました。テスト費用は$0.04です。

テスト1の結果:

パス 結果 利益 予想ペイオフ 利益係数 回復係数 シャープレシオ カスタム エクイティDD % 取引 InpTakeProfit InpTrailingStop
163 767049.82 363.32 24.22
3.87 74.02 24573559 0.91 15 25 50
136 767049.82 363.32 24.22
3.87 74.02 24573559 0.91 15 25 45
109 767049.82 363.32 24.22
3.87 74.02 24573559 0.91 15 25 40
82 767049.82 363.32 24.22
3.87 74.02 24573559 0.91 15 25 35
55 767049.82 363.32 24.22
3.87 74.02 24573559 0.91 15 25 30

この期間には取引がほとんどありません(13〜16)。より短い時間枠 (M15)でより多くの取引があることを願っています。これらのテストは以下の別のセクションに示されています。今のところ最良の結果は#163です。

図20. EURUSDH4、テスト1、最適化パス163

20. EURUSDH4、テスト1、最適化パス163

5.3.2. テスト2("Custom max"カスタムパラメータの最適化(取引量最適化パラメータは'false'))のクラウドで実行です。クラウドでは、結果は反転していますがキャッシュから取り出されたので、テストは0分と00秒かかります。テスト全体がMQL5 Cloud Europe 2で実行されました。テスト費用は$0.00です。

テスト2の結果:

パス 結果 利益 予想ペイオフ 利益係数 回復係数 シャープレシオ カスタム エクイティDD % 取引 InpTakeProfit InpTrailingStop
163 24573558.59 363.32 24.22
3.87 74.02 24573559 0.91 15 25 50
136 24573558.59 363.32 24.22
3.87 74.02 24573559 0.91 15 25 45
109 24573558.59 363.32 24.22
3.87 74.02 24573559 0.91 15 25 40
82 24573558.59 363.32 24.22
3.87 74.02 24573559 0.91 15 25 35
55 24573558.59 363.32 24.22
3.87 74.02 24573559 0.91 15 25 30

テスト2では、テスト1と同様に、最良の結果が得られました([結果]以外のすべての列を比較)。 

5.3.3. テスト3クラウドでの"Custom max"カスタムパラメータの最適化(取引量最適化パラメータは'true)クラウドでは、テストは1分5秒で完了し、テスト全体がMQL5 Cloud Europe 2で実行されました。テスト費用は$0.05です。

テスト3の結果:

パス 結果 利益 予想ペイオフ 利益係数 回復係数 シャープレシオ カスタム エクイティDD % 取引 InpTakeProfit InpTrailingStop
163 16382372.39 363.32 24.22
3.87 74.02 16382372 0.91 15 25 50
136 16382372.39 363.32 24.22
3.87 74.02 16382372 0.91 15 25 45
109 16382372.39 363.32 24.22
3.87 74.02 16382372 0.91 15 25 40
82 16382372.39 363.32 24.22
3.87 74.02 16382372 0.91 15 25 35
55 16382372.39 363.32 24.22
3.87 74.02 16382372 0.91 15 25 30
テスト3では、テスト1及び2と同様に、最良の結果が得られました([結果]以外のすべての列を比較)。

線形回帰法を使用したバランスグラフの最適化は、 "Balance + max Sharp Ratio"を使用する場合と同様に機能しました。


6. フォワードテストによるEURUSD M15の最適化

EAは前と同じEA test balance regression.mq5、Moving Average balance regression.mq5及びMACD Sample balance regression.mq5の3つです。前のテストとは異なり、M15でフォワードテストを有効にしてテストします。

6.1. EA test balance regression.mq5、フォワードテストありテストを3つ実行します。

  • テスト1:"Balance + max Sharp Ratio"標準パラメータの最適化
  • テスト2:"Custom max"カスタムパラメータの最適化(取引量最適化パラメータは'false')
  • テスト3:"Custom max"カスタムパラメータの最適化(取引量最適化パラメータは'true')

6.1.1. テスト1:"Balance + max Sharp Ratio"標準パラメータの最適化テスターの設定:

図21. テスターの設定タブ

図21. テスターの設定タブ

テスターパラメータは図7

と同一です。クラウドではテストは2分14秒で完了し、テスト全体がMQL5 Cloud Europe 2で実行されました。テスト費用は$0.08です。

最適化結果:

パス 結果 利益 予想ペイオフ 利益係数 回復係数 シャープレシオ カスタム エクイティDD % 取引 Signal_ThresholdOpen Signal_ThresholdClose
352 23196.38 85836.92 721.32 1.47 2.03 0.24 2722.602 48.82 119 60 100
351 23196.38 85836.92 721.32 1.47 2.03 0.24 2722.602 48.82 119 55 100
333 23196.38 85836.92 721.32 1.47 2.03 0.24 2722.602 48.82 119 60 95
332 23196.38 85836.92 721.32 1.47 2.03 0.24 2722.602 48.82 119 55 95
314 23196.38 85836.92 721.32 1.47 2.03 0.24 2722.602 48.82 119 60 90

図22. EURUSDM15、テスト1、最適化パス352

22. EURUSDM15、テスト1、最適化パス352

フォワード結果:

パス フォワード結果 バック結果 利益 予想ペイオフ 利益係数 回復係数 シャープレシオ カスタム エクイティDD % 取引 Signal_ThresholdOpen Signal_ThresholdClose
284 216.48 11708.46 18.91 1.89 1.02 0.02 0.02 7172.395 9.33 10 100 80
283 216.48 11708.46 18.91 1.89 1.02 0.02 0.02 7172.395 9.33 10 95 80
282 216.48 11708.46 18.91 1.89 1.02 0.02 0.02 7172.395 9.33 10 90 80
281 216.48 11708.46 18.91 1.89 1.02 0.02 0.02 7172.395 9.33 10 85 80
265 216.48 11708.46 18.91 1.89 1.02 0.02 0.02 7172.395 9.33 10 100 75

ここでの最善の選択肢は、フォワードセクションにわずか10の取引しか持たないものでした。これはもちろん不十分で、更なるテストを行う必要があります。

図23. EURUSDM15、テスト1、フォワードパス284

23. EURUSDM15、テスト1、フォワードパス284

6.1.2. テスト2:"Custom max"カスタムパラメータの最適化(取引量最適化パラメータは'false')

最良の最適化結果(フォワードではない):

パス 結果 利益 予想ペイオフ 利益係数 回復係数 シャープレシオ カスタム エクイティDD % 取引 Signal_ThresholdOpen Signal_ThresholdClose
284 180332.68 10820.37 309.15 4.67 6.80 0.56 180332.7 7.98 35 100 80
283 180332.68 10820.37 309.15 4.67 6.80 0.56 180332.7 7.98 35 95 80
282 180332.68 10820.37 309.15 4.67 6.80 0.56 180332.7 7.98 35 90 80
281 180332.68 10820.37 309.15 4.67 6.80 0.56 180332.7 7.98 35 85 80
265 180332.68 10820.37 309.15 4.67 6.80 0.56 180332.7 7.98 35 100 75

図24. EURUSDM15、テスト2、最適化パス284

24. EURUSDM15、テスト2、最適化パス284

フォワード結果:

パス フォワード結果 バック結果 利益 予想ペイオフ 利益係数 回復係数 シャープレシオ カスタム エクイティDD % 取引 Signal_ThresholdOpen Signal_ThresholdClose
284 -14294.76 180332.68 18.91 1.89 1.02 0.02 0.02 -14294.8 9.33 10 100 80
283 -14294.76 180332.68 18.91 1.89 1.02 0.02 0.02 -14294.8 9.33 10 95 80
282 -14294.76 180332.68 18.91 1.89 1.02 0.02 0.02 -14294.8 9.33 10 90 80
281 -14294.76 180332.68 18.91 1.89 1.02 0.02 0.02 -14294.8 9.33 10 85 80
265 -14294.76 180332.68 18.91 1.89 1.02 0.02 0.02 -14294.8 9.33 10 100 75

テスト2では、フォワードテストはテスト1と同じ結果を示します。

テスト2の線形回帰法を用いてバランスグラフを最適化することにより、テスト1("Balance + max Sharp Ratio"法)に劣らない結果を検出することができました。

6.1.3. テスト3("Custom max"カスタムパラメータの最適化(取引量最適化パラメータは'true'))のクラウドでの実行です。クラウドでは、テストは3分29秒で完了し、テスト全体がMQL5 Cloud Europe 1で実行されました。テスト費用は$0.07です。

最良の最適化結果(フォワードではない):

パス 結果 利益 予想ペイオフ 利益係数 回復係数 シャープレシオ カスタム エクイティDD % 取引 Signal_ThresholdOpen Signal_ThresholdClose
208 1660.90 10008.05 285.94 4.50 6.55 0.56 1660.901 7.98 35 100 60
207 1660.90 10008.05 285.94 4.50 6.55 0.56 1660.901 7.98 35 95 60
206 1660.90 10008.05 285.94 4.50 6.55 0.56 1660.901 7.98 35 90 60
205 1660.90 10008.05 285.94 4.50 6.55 0.56 1660.901 7.98 35 85 60
189 1660.90 10008.05 285.94 4.50 6.55 0.56 1660.901 7.98 35 100 55


図25. EURUSDM15、テスト3、最適化パス208

25. EURUSDM15、テスト3、最適化パス 208

"Normalization of traded volumes" を有効にしても、結果に大きな影響はありませんでした。また、最適な結果の1つは最適化された間隔内で検出されました。

最良のフォワード結果:

パス フォワード結果 バック結果 利益 予想ペイオフ 利益係数 回復係数 シャープレシオ カスタム エクイティDD % 取引 Signal_ThresholdOpen Signal_ThresholdClose
266 -103.43 -25.56 -7464.56 -24.64 0.66 -0.99 -0.11 -103.428 75.43 303 10 80
247 -103.43 -25.56 -7464.56 -24.64 0.66 -0.99 -0.11 -103.428 75.43 303 10 75
228 -103.43 -25.56 -7464.56 -24.64 0.66 -0.99 -0.11 -103.428 75.43 303 10 70
209 -103.43 -25.56 -7464.56 -24.64 0.66 -0.99 -0.11 -103.428 75.43 303 10 65
156 -120.35 -29.28 -8013.01 -22.76 0.63 -1.00 -0.13 -120.35 80.44 352 30 50

テスト3のフォワードテスト(取引量最適化パラメータは 'true')は、ネガティブな結果のみを示します(「フォワード結果」列を参照)。フォワードテストで最も正確で現実的な結果が選択されているため、線形回帰法を使用してバランスグラフを最適化するための良い結果です。

線形回帰法(取引量最適化パラメータが'false')を使用してバランスグラフを最適化すると"Balance max + Sharp Ratio"法に匹敵する結果を得ることができます。取引量最適化パラメータが''true'の場合、フォワードテスト結果はこの時間枠での実際のテストイメージを示します。

6.2. MACD Sample balance regression.mq5、フォワードテスト

6.2.1. テスト1("Balance + max Sharp Ratio"標準パラメータの最適化)のクラウドでの実行です。クラウドでは、テストは1分3秒で完了し、テスト全体がMQL5 Cloud Europe 1で実行されました。テスト費用は$0.06です。

最適化結果:

パス 結果 利益 予想ペイオフ 利益係数 回復係数 シャープレシオ カスタム エクイティDD % 取引 InpTakeProfit InpTrailingStop
171 2094.29 479.93 8.57 1.81 2.03 0.20 -1.69249 2.30 56 65 50
144 2094.29 479.93 8.57 1.81 2.03 0.20 -1.69249 2.30 56 65 45
182 2078.33 489.23 8.74 1.82 2.07 0.20 -9.9625 2.29 56 120 50
155 2077.49 489.03 8.73 1.82 2.07 0.20 -9.90369 2.29 56 120 45
181 2066.17 484.13 8.65 1.81 2.05 0.20 -8.1109 2.29 56 115 50


図26. EURUSDM15、テスト1、最適化パス171

図26. EURUSDM15、テスト1、最適化パス171

フォワード結果:

パス フォワード結果 バック結果 利益 予想ペイオフ 利益係数 回復係数 シャープレシオ カスタム エクイティDD % 取引 InpTakeProfit InpTrailingStop
78 1182.13 1659.86 83.87 5.24 1.43 0.42 0.12 -44.8452 1.95 16 140 30
77 1134.97 1659.86 78.87 4.93 1.41 0.40 0.11 -53.5369 1.95 16 135 30
105 1107.99 1639.60 78.17 4.89 1.40 0.39 0.11 -26.6428 1.96 16 140 35
76 1085.51 1659.86 73.87 4.62 1.38 0.37 0.11 -62.5775 1.95 16 130 30
171 1060.24 2094.29 62.97 3.94 1.32 0.36 0.11 -347.982 1.70 16 65 50


図27. EURUSDM15、テスト1、フォワードパス78

図27. EURUSDM15、テスト1、フォワードパス78

6.2.2. テスト2:"Custom max"カスタムパラメータの最適化(取引量最適化パラメータは'false')

最適化結果:

パス 結果 利益 予想ペイオフ 利益係数 回復係数 シャープレシオ カスタム エクイティDD % 取引 InpTakeProfit InpTrailingStop
168 84498.76 442.03 7.89 1.74 2.08 0.19 84498.76 2.07 56 50 50
141 84498.76 442.03 7.89 1.74 2.08 0.19 84498.76 2.07 56 50 45
114 84498.76 442.03 7.89 1.74 2.08 0.19 84498.76 2.07 56 50 40
167 83473.95 442.03 7.89 1.74 2.08 0.19 83473.95 2.06 56 45 50
140 83473.95 442.03 7.89 1.74 2.08 0.19 83473.95 2.06 56 45 45


図28. EURUSDM15、テスト2、最適化パス168

図28. EURUSDM15、テスト2、最適化パス168

フォワード結果:

パス フォワード結果 バック結果 利益 予想ペイオフ 利益係数 回復係数 シャープレシオ カスタム エクイティDD % 取引 InpTakeProfit InpTrailingStop
78 1182.13 1659.86 83.87 5.24 1.43 0.42 0.12 6462.158 1.95 16 140 30
77 1134.97 1659.86 78.87 4.93 1.41 0.40 0.11 5018.77 1.95 16 135 30
105 1107.99 1639.60 78.17 4.89 1.40 0.39 0.11 5617.275 1.96 16 140 35
76 1085.51 1659.86 73.87 4.62 1.38 0.37 0.11 3525.665 1.95 16 130 30
171 1060.24 2094.29 62.97 3.94 1.32 0.36 0.11 -5131.93 1.70 16 65 50

図29. EURUSDM15、テスト2、フォワードパス78

図29. EURUSDM15、テスト2、フォワードパス78

テスト2の回帰法を用いたバランスグラフの最適化は、"Balance + max Sharp Ratio"法に匹敵する結果を示しました。

6.2.3. テスト3("Custom max"カスタムパラメータの最適化(取引量最適化パラメータは'true))のクラウドでの実行です。クラウドでは、テストは1分44秒で完了し、テスト全体がMQL5 Cloud Europe 1で実行されました。テスト費用は$0.08です。

最適化結果:

パス 結果 利益 予想ペイオフ 利益係数 回復係数 シャープレシオ カスタム エクイティDD % 取引 InpTakeProfit InpTrailingStop
168 15089.06 442.03 7.89 1.74 2.08 0.19 15089.06 2.07 56 50 50
141 15089.06 442.03 7.89 1.74 2.08 0.19 15089.06 2.07 56 50 45
114 15089.06 442.03 7.89 1.74 2.08 0.19 15089.06 2.07 56 50 40
167 14906.06 442.03 7.89 1.74 2.08 0.19 14906.06 2.06 56 45 50
140 14906.06 442.03 7.89 1.74 2.08 0.19 14906.06 2.06 56 45 45

フォワード結果:

パス フォワード結果 バック結果 利益 予想ペイオフ 利益係数 回復係数 シャープレシオ カスタム エクイティDD % 取引 InpTakeProfit InpTrailingStop
78 4038.85 13138.16 83.87 5.24 1.43 0.42 0.12 4038.849 1.95 16 140 30
105 3510.80 13026.26 78.17 4.89 1.40 0.39 0.11 3510,797 1.96 16 140 35
77 3136.73 13138.16 78.87 4.93 1.41 0.40 0.11 3136.731 1.95 16 135 30
132 3074.09 13598.05 73.17 4.57 1.38 0.37 0.10 3074.089 1.96 16 140 40
159 2658.84 13777.31 68.47 4.28 1.35 0.35 0.10 2658.844 1.96 16 140 45
テスト3では、最適化とフォワード結果がテスト2のものと完全に一致します。取引量最適化パラメータは'true'に等しく、テスト3には大きな影響はありません。これはMACD Sample balance regression.mq5 EAが一定ロットで取引されるためです。

線形回帰法を用いたバランスグラフの最適化は、標準的な"Balance max + Sharp Ratio"法に匹敵することが判明しました。

6.3. Moving Average balance regression.mq5 EA、フォワードテスト

6.3.1. テスト1:"Balance + max Sharp Ratio"標準パラメータの最適化。テスターのInputs(入力)タブは図15に似ており、Settings(設定)タブは図23

に似ています。クラウドでは、テストは1分28秒で完了し、テスト全体がMQL5 Cloud Europe 1で実行されました。テスト費用は$0.05です。

最適化結果:

パス 結果 利益 予想ペイオフ 利益係数 回復係数 シャープレシオ カスタム エクイティDD % 取引 DecreaseFactor MovingPeriod
53 -1.29 -16.76 -0.03 0.99 -0.03 0.00 11966.34 5.92 525 4 16
52 -1.29 -16.76 -0.03 0.99 -0.03 0.00 11966.34 5.92 525 3 16
165 -6.17 -24.02 -0.05 0.99 -0.03 0.00 -37045.4 6.66 465 12 24
166 -26.36 -49.14 -0.11 0.99 -0.07 0.00 -38052.8 6.86 465 13 24
163 -39.47 -61.88 -0.13 0.98 -0.09 0.00 -39156.1 6.62 465 10 24


図30. EURUSDM15、テスト1、最適化パス53

図30. EURUSDM15、テスト1、最適化パス53

フォワード結果:

パス フォワード結果 バック結果 利益 予想ペイオフ 利益係数 回復係数 シャープレシオ カスタム エクイティDD % 取引 DecreaseFactor MovingPeriod
48 409.74 -460.18 185.78 1.06 1.16 0.80 0.04 42602.76 2.26 175 12 15
49 364.79 -461.14 165.23 0.94 1.14 0.67 0.04 38508.36 2.41 175 13 15
50 362.45 -460.40 164.15 0.94 1.14 0.66 0.04 38292.53 2.42 175 14 15
51 353.14 -467.05 159.83 0.91 1.13 0.65 0.03 37460.15 2.42 175 15 15
47 350.60 -629.53 144.32 0.82 1.13 0.65 0.03 32767.39 2.17 175 11 15


図31. EURUSDM15、テスト1、フォワードパス48

図31. EURUSDM15、テスト1、フォワードパス48

6.3.2. テスト2:"Custom max"カスタムパラメータの最適化(取引量最適化パラメータは'false') 

最適化結果: 

パス 結果 利益 予想ペイオフ 利益係数 回復係数 シャープレシオ カスタム エクイティDD % 取引 DecreaseFactor MovingPeriod
53 11966.34 -16.76 -0.03 0.99 -0.03 0.00 11966.34 5.92 525 4 16
52 11966.34 -16.76 -0.03 0.99 -0.03 0.00 11966.34 5.92 525 3 16
54 2465.75 -103.27 -0.20 0.96 -0.14 -0.01 2465.748 7.19 525 5 16
57 813.83 -91.78 -0.17 0.97 -0.13 -0.01 813.831 6.75 525 8 16
56 813.83 -91.78 -0.17 0.97 -0.13 -0.01 813.831 6.75 525 7 16

フォワード結果:

パス フォワード結果 バック結果 利益 予想ペイオフ 利益係数 回復係数 シャープレシオ カスタム エクイティDD % 取引 DecreaseFactor MovingPeriod
48 42602.76 -73708.28 185.78 1.06 1.16 0.80 0.04 42602.76 2.26 175 12 15
49 38508.36 -74600.92 165.23 0.94 1.14 0.67 0.04 38508.36 2.41 175 13 15
50 38292.53 -74386.41 164.15 0.94 1.14 0.66 0.04 38292.53 2.42 175 14 15
51 37460.15 -75315.40 159.83 0.91 1.13 0.65 0.03 37460.15 2.42 175 15 15
47 32767.39 -107616.36 144.32 0.82 1.13 0.65 0.03 32767.39 2.17 175 11 15
テスト2の線形回帰法を用いたバランスグラフの最適化は、テスト1と同じ結果を検出しました。

6.3.3. テスト3("Custom max"カスタムパラメータの最適化(取引量最適化パラメータは'true))のクラウドでの実行です。クラウドでは、テストは0分42秒で完了し、テスト全体がMQL5 Cloud Europe 1で実行されました。テスト費用は$0.04です。 

最適化結果:

パス 結果 利益 予想ペイオフ 利益係数 回復係数 シャープレシオ カスタム エクイティDD % 取引 DecreaseFactor MovingPeriod
53 243.32 -16.76 -0.03 0.99 -0.03 0.00 243.3172 5.92 525 4 16
52 243.32 -16.76 -0.03 0.99 -0.03 0.00 243.3172 5.92 525 3 16
54 45.69 -103.27 -0.20 0.96 -0.14 -0.01 45.68738 7.19 525 5 16
57 13.40 -91.78 -0.17 0.97 -0.13 -0.01 13.40301 6.75 525 8 16
56 13.40 -91.78 -0.17 0.97 -0.13 -0.01 13.40301 6.75 525 7 16

フォワード結果: 

パス フォワード結果 バック結果 利益 予想ペイオフ 利益係数 回復係数 シャープレシオ カスタム エクイティDD % 取引 DecreaseFactor MovingPeriod
48 1772.90 -997.81 185.78 1.06 1.16 0.80 0.04 1772.899 2.26 175 12 15
49 1591.91 -994.94 165.23 0.94 1.14 0.67 0.04 1591.912 2.41 175 13 15
50 1577.12 -987.34 164.15 0.94 1.14 0.66 0.04 1577.123 2.42 175 14 15
51 1537.14 -972.44 159.83 0.91 1.13 0.65 0.03 1537.142 2.42 175 15 15
47 1473.35 -1540.90 144.32 0.82 1.13 0.65 0.03 1473.354 2.17 175 11 15

テスト3の線形回帰法を使用してバランスグラフを最適化すると、テスト1の結果が完全に繰り返されます。言い換えれば、Moving Average balance regression.mq5 EAは取引で動的ロット計算を適用しますが、取引量最適化を有効にしても結果に影響はありません。

線形回帰法を用いたバランスグラフの最適化は、標準的な"Balance max + Sharp Ratio"法に匹敵することが判明しました。


7. 終わりに

線形回帰法を用いてバランスグラフを適用した結果は、"Balance + max Sharp Ratio"最適化法に同等であることが判明しました。動的ロットを使用するEAによる結果は興味深い結果ものです。場合によっては、"traded volumes normalization"(取引量の正規化)設定とフォワードテストの組み合わせによってより現実的なイメージが得られます。

私は、記述された方法には存在する権利があり、収益性の高い取引や損失を生み出す取引の期間を考慮して得られた価値を試すことなどによってさらに改善できると信じています。