88 lines
6.8 KiB
Plaintext
88 lines
6.8 KiB
Plaintext
//+------------------------------------------------------------------+
|
||||
|
|
//| 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);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
�
|