Files
All-MQL5-code/Experts/Articles/2358/UnExpert/Strategy/RSquare.mqh
T
2018-04-06 20:55:57 +02:00

88 lines
6.8 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
//+------------------------------------------------------------------+
//| UsingTrailing.mqh |
//| Copyright 2017, Vasiliy Sokolov. |
//| http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, Vasiliy Sokolov."
#property link "http://www.mql5.com"
#include <Math\AlgLib\alglib.mqh>
#include <Math\AlgLib\dataanalysis.mqh>
#include <Arrays\ArrayObj.mqh>
#include "TimeSeries.mqh"
//+------------------------------------------------------------------+
//| Correlation type                                                 |
//+------------------------------------------------------------------+
enum ENUM_CORR_TYPE
{
CORR_PEARSON, // Pearson's correlation
CORR_SPEARMAN // Spearman's Rank-Order correlation
};
//+------------------------------------------------------------------+
//| Returns the R^2 estimate based on the strategy balance           |
//+------------------------------------------------------------------+
double CustomR2Balance(ENUM_CORR_TYPE corr_type = CORR_PEARSON)
{
HistorySelect(0, TimeCurrent());
double deals_equity[];
double sum_profit = 0.0;
int current = 0;
int total = HistoryDealsTotal();
for(int i = 0; i < total; i++)
{
ulong ticket = HistoryDealGetTicket(i);
double profit = HistoryDealGetDouble(ticket, DEAL_PROFIT);
double swap = HistoryDealGetDouble(ticket, DEAL_SWAP);
if(profit == 0.0 && swap == 0.0)
continue;
if(ArraySize(deals_equity) <= current)
ArrayResize(deals_equity, current+16);
sum_profit += profit + swap;
deals_equity[current] = sum_profit;
current++;
}
ArrayResize(deals_equity, current);
return CustomR2Equity(deals_equity, corr_type);
}
//+------------------------------------------------------------------+
//| Returns the R^2 estimate based on the strategy equity            |
//| The values of equity are passed as the 'equity' array            |
//+------------------------------------------------------------------+
double CustomR2Equity(double& equity[], ENUM_CORR_TYPE corr_type = CORR_PEARSON)
{
int total = ArraySize(equity);
if(total == 0)
return 0.0;
//-- Fill the matrix: Y - equity value, X - ordinal number of the value
CMatrixDouble xy(total, 2);
for(int i = 0; i < total; i++)
{
xy[i].Set(0, i);
xy[i].Set(1, equity[i]);
}
//-- Find coefficients a and b of the linear model y = a*x + b;
int retcode = 0;
double a, b;
CLinReg::LRLine(xy, total, retcode, a, b);
//-- Generate the linear regression values for each X;
double estimate[];
ArrayResize(estimate, total);
for(int x = 0; x < total; x++)
estimate[x] = x*a+b;
//-- Find the coefficient of correlation of values with their linear regression
double corr = 0.0;
if(corr_type == CORR_PEARSON)
corr = CAlglib::PearsonCorr2(equity, estimate);
else
corr = CAlglib::SpearmanCorr2(equity, estimate);
//-- Find R^2 and its sign
double r2 = MathPow(corr, 2.0);
int sign = 1;
if(equity[0] > equity[total-1])
sign = -1;
r2 *= sign;
//-- Return the R^2 estimate normalized to within hundredths
return NormalizeDouble(r2,2);
}