MT5のアップデートでバックテストの評価項目__「シャープレシオ」__の計算方法が変わってしまったので、OnTesterで旧計算方法のシャープレシオを出力するためのプログラムを作りました。
旧計算方法
シャープレシオ = 取引損益の平均値 ÷ 取引損益の標準偏差
プログラムを貼っておくので任意のEAにコピペして使ってください。
.cpp
# 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);
}