171 lines
3.9 KiB
MQL5
171 lines
3.9 KiB
MQL5
//+------------------------------------------------------------------+
| |||
//| Std.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
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| |
| |||
//+------------------------------------------------------------------+
| |||
bool StandartVec(const vector& in, vector& out)
| |||
{
| |||
double std = in.Std();
| |||
if(std < DBL_EPSILON)
| |||
return false;
| |||
std = 1.0 / std;
| |||
| |||
//---
| |||
const double mean = in.Mean();
| |||
out = (in - mean) * std;
| |||
return true;
| |||
}
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| |
| |||
//+------------------------------------------------------------------+
| |||
bool OnePassWelford(const vector& X, vector& out)
| |||
{
| |||
//---
| |||
const ulong fs = X.Size();
| |||
double mean_val = 0.0;
| |||
double m2 = 0.0;
| |||
for(ulong i = 0; i < fs; i++)
| |||
{
| |||
const double v = X[i];
| |||
out[i] = v;
| |||
| |||
//---
| |||
const double del = v - mean_val;
| |||
mean_val += del / (i + 1);
| |||
| |||
//---
| |||
const double del2 = v - mean_val;
| |||
| |||
//---
| |||
m2 += del * del2;
| |||
}
| |||
| |||
//--- calc std
| |||
double std = m2 / fs; // var
| |||
| |||
//--- check std
| |||
std = MathSqrt(std);
| |||
if(std < DBL_EPSILON)
| |||
return false;
| |||
| |||
//--- inv
| |||
std = 1.0 / std; // inversa
| |||
| |||
//--- final
| |||
out -= mean_val;
| |||
out *= std;
| |||
return true;
| |||
}
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| |
| |||
//+------------------------------------------------------------------+
| |||
bool TwoPassStd(const vector &X, vector &out)
| |||
{
| |||
const ulong n = X.Size();
| |||
if(n == 0)
| |||
return false;
| |||
| |||
//---
| |||
const double s_inv = 1.0 / double(n);
| |||
| |||
//---
| |||
double mean_val = 0.0;
| |||
for(ulong i = 0; i < n; i++)
| |||
mean_val += X[i];
| |||
mean_val *= s_inv;
| |||
| |||
//---
| |||
double sumSq = 0.0;
| |||
out.Resize(n);
| |||
for(ulong i = 0; i < n; i++)
| |||
{
| |||
const double d = X[i] - mean_val;
| |||
out[i] = d;
| |||
sumSq += d * d;
| |||
}
| |||
const double var = sumSq * s_inv;
| |||
| |||
//---
| |||
double std = MathSqrt(var);
| |||
if(std < DBL_EPSILON)
| |||
return false;
| |||
std = 1.0 / std;
| |||
| |||
//--- final: centrado + escalado, vectorizado
| |||
out *= std;
| |||
return true;
| |||
}
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| |
| |||
//+------------------------------------------------------------------+
| |||
vector Ran()
| |||
{
| |||
vector v(1000);
| |||
for(int i = 0; i < 1000; i++)
| |||
{
| |||
v[i] = (double)MathRand();
| |||
}
| |||
return v;
| |||
}
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| Script program start function |
| |||
//+------------------------------------------------------------------+
| |||
void OnStart()
| |||
{
| |||
//---
| |||
MathSrand(10);
| |||
double vs = 0.0;
| |||
| |||
ulong a = GetMicrosecondCount();
| |||
for(int i = 1; i < 100000; i++)
| |||
{
| |||
vector v = Ran();
| |||
StandartVec(v, v);
| |||
vs += v[0];
| |||
}
| |||
ulong b = GetMicrosecondCount();
| |||
| |||
Print("native: ", (b - a), " vs : ", vs);
| |||
| |||
vs = 0.0;
| |||
MathSrand(10);
| |||
| |||
a = GetMicrosecondCount();
| |||
for(int i = 1; i < 100000; i++)
| |||
{
| |||
vector v = Ran();
| |||
OnePassWelford(v, v);
| |||
vs += v[0];
| |||
}
| |||
b = GetMicrosecondCount();
| |||
| |||
Print("1p: ", (b - a), " vs : ", vs);
| |||
| |||
vs = 0.0;
| |||
MathSrand(10);
| |||
| |||
a = GetMicrosecondCount();
| |||
for(int i = 1; i < 100000; i++)
| |||
{
| |||
vector v = Ran();
| |||
TwoPassStd(v, v);
| |||
vs += v[0];
| |||
}
| |||
b = GetMicrosecondCount();
| |||
| |||
Print("2p: ", (b - a), " vs : ", vs);
| |||
| |||
}
| |||
//+------------------------------------------------------------------+
|