159 lines
4.2 KiB
MQL5
159 lines
4.2 KiB
MQL5
//+------------------------------------------------------------------+
|
|
//| Robust.mq5 |
|
|
//| Copyright 2026, Niquel Mendoza. |
|
|
//| https://www.mql5.com |
|
|
//+------------------------------------------------------------------+
|
|
#property copyright "Copyright 2026, Niquel Mendoza."
|
|
#property link "https://www.mql5.com"
|
|
#property version "1.00"
|
|
#property strict
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
#define PERCENTILE(vec, l, h, w) ((l == h) ? (vec[l]) : ((vec[l] * (1.0 - w)) + (vec[h] * w)))
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
__forceinline void MakePer(const double rank, ulong&l, ulong&h, double& w)
|
|
{
|
|
l = (ulong)MathFloor(rank);
|
|
h = (ulong)MathCeil(rank);
|
|
w = rank - l;
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
bool V2(const matrix& X, double& checksum)
|
|
{
|
|
//---
|
|
const ulong cols = X.Cols();
|
|
const ulong rows = X.Rows();
|
|
const double rs_1 = double(rows - 1);
|
|
|
|
//---
|
|
ulong l50, h50;
|
|
double w50;
|
|
MakePer(0.50 * rs_1, l50, h50, w50);
|
|
|
|
ulong l25, h25;
|
|
double w25;
|
|
MakePer(0.25 * rs_1, l25, h25, w25);
|
|
|
|
ulong l75, h75;
|
|
double w75;
|
|
MakePer(0.75 * rs_1, l75, h75, w75);
|
|
|
|
|
|
//---
|
|
for(ulong c = 0; c < cols; c++)
|
|
{
|
|
//---
|
|
vector col = X.Col(c);
|
|
col.Sort(SORT_ASCENDING);
|
|
|
|
//---
|
|
const double median_v = PERCENTILE(col, l50, h50, w50);
|
|
const double iqr_v = PERCENTILE(col, l75, h75, w75) - PERCENTILE(col, l25, h25, w25);
|
|
|
|
//---
|
|
if(fabs(iqr_v) < DBL_EPSILON)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
//---
|
|
// m_medians[c] = median_v;
|
|
// m_iqrs[c] = iqr_v;
|
|
// m_iqrs_inv[c] = 1.0 / iqr_v;
|
|
checksum = (median_v) + (iqr_v) + (1.0 / iqr_v);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
bool Normal(const matrix& X, double& checksum)
|
|
{
|
|
//---
|
|
const ulong cols = X.Cols();
|
|
const ulong rows = X.Rows();
|
|
const double rs_1 = double(rows - 1);
|
|
|
|
//---
|
|
for(ulong c = 0; c < cols; c++)
|
|
{
|
|
//---
|
|
const vector col = X.Col(c);
|
|
const double median_v = col.Median();
|
|
const double iqr_v = col.Percentile(75) - col.Percentile(25);
|
|
|
|
//---
|
|
if(fabs(iqr_v) < DBL_EPSILON)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
//---
|
|
// m_medians[c] = median_v;
|
|
// m_iqrs[c] = iqr_v;
|
|
// m_iqrs_inv[c] = 1.0 / iqr_v;
|
|
checksum = (median_v) + (iqr_v) + (1.0 / iqr_v);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
matrix Ran()
|
|
{
|
|
matrix v(64, 64);
|
|
for(int i = 0; i < 64; i++)
|
|
for(int x = 0; x < 64; x++)
|
|
v[i][x] = (double)MathRand();
|
|
|
|
return v;
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Script program start function |
|
|
//+------------------------------------------------------------------+
|
|
void OnStart()
|
|
{
|
|
//---
|
|
//---
|
|
MathSrand(10);
|
|
double vs = 0.0;
|
|
|
|
ulong a = GetMicrosecondCount();
|
|
for(int i = 1; i < 10000; i++)
|
|
{
|
|
matrix v = Ran();
|
|
double v1;
|
|
Normal(v, v1);
|
|
vs += v1;
|
|
}
|
|
ulong b = GetMicrosecondCount();
|
|
|
|
Print("native: ", (b - a), " vs : ", vs);
|
|
|
|
vs = 0.0;
|
|
MathSrand(10);
|
|
|
|
a = GetMicrosecondCount();
|
|
for(int i = 1; i < 10000; i++)
|
|
{
|
|
matrix v = Ran();
|
|
double v1;
|
|
V2(v, v1);
|
|
vs += v1;
|
|
}
|
|
b = GetMicrosecondCount();
|
|
|
|
Print("v2: ", (b - a), " vs : ", vs);
|
|
}
|
|
//+------------------------------------------------------------------+
|