LoginSignup
0
0

More than 1 year has passed since last update.

MT5バックテストのシャープレシオ(旧計算方法)をOnTesterで出力するためのプログラム【コピペ用】

Last updated at Posted at 2022-02-14

 MT5のアップデートでバックテストの評価項目「シャープレシオ」の計算方法が変わってしまったので、OnTesterで旧計算方法のシャープレシオを出力するためのプログラムを作りました。

旧計算方法
シャープレシオ = 取引損益の平均値 ÷ 取引損益の標準偏差

プログラムを貼っておくので任意のEAにコピペして使ってください。

#include <Math\Stat\Math.mqh>

double OnTester()
  {
   const int dig = 2;   // ←シャープレシオの小数点以下何桁まで表示するか

   double PL_Results[];
   double mean = 0, std = 0, SR = 0;

//--- 取引損益を配列に書き込み
   if(!GetTradeResultsToArray(PL_Results))
      return 0;

//--- 取引損益の平均値を計算
   mean = MathMean(PL_Results);

//--- 取引損益の標準偏差を計算
   std = MathStandardDeviation(PL_Results);

//--- 旧計算方法 シャープレシオ
   SR = mean / std;
   SR = MathRound(SR, dig);

   return SR;
  }

//+------------------------------------------------------------------+
//| 取引損益を配列に書き込む
//+------------------------------------------------------------------+
bool GetTradeResultsToArray(double &pl_results[])
  {
//--- 全期間の取引履歴をリクエストする
   if(!HistorySelect(0, TimeCurrent()))
      return (false);

   uint total_deals = HistoryDealsTotal();

//--- 配列を、履歴の取引数にリサイズ
   ArrayResize(pl_results, total_deals);

   int   counter = 0;             // 取引回数カウンター
   ulong ticket_history_deal = 0; // ディールチケット

//--- 全ての取引を配列に取得
   for(uint i = 0; i < total_deals; i++)
     {
      //--- 取引を選択する
      if((ticket_history_deal = HistoryDealGetTicket(i)) > 0)
        {
         ENUM_DEAL_ENTRY deal_entry  = (ENUM_DEAL_ENTRY)HistoryDealGetInteger(ticket_history_deal, DEAL_ENTRY);
         long            deal_type   = HistoryDealGetInteger(ticket_history_deal, DEAL_TYPE);
         double          deal_profit = HistoryDealGetDouble(ticket_history_deal, DEAL_PROFIT);

         //--- 取引操作以外はスルー
         if((deal_type != DEAL_TYPE_BUY) && (deal_type != DEAL_TYPE_SELL))
            continue;

         //--- エントリーアウトのみ
         if(deal_entry != DEAL_ENTRY_IN)
           {
            //--- 取引結果を配列に書き込み、取引のカウントアップ
            pl_results[counter] = deal_profit;
            counter++;
           }
        }
     }
//--- 配列の最終サイズを設定する
   ArrayResize(pl_results, counter);
   return (true);
  }

image.png

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0