https://www.mql5.com/en/articles/16779
Kod:
public List<float> OrthogonalPolynomial(
dynamic Sistem,
int Period,
int Degree,
int PolyType) // 0=Legendre,1=Cheb1,2=Cheb2,3=Laguerre,4=Hermite
{
var C = Sistem.GrafikFiyatSec("Kapanis");
var Out = Sistem.Liste(0);
if (Degree < 0) Degree = 0;
if (Degree > 9) Degree = 9;
for (int i = Period; i < Sistem.BarSayisi; i++)
{
double mean = 0.0;
for (int k = 0; k < Period; k++)
mean += C[i - k];
mean /= Period;
double num = 0.0;
double den = 0.0;
for (int k = 0; k < Period; k++)
{
double x = 1.0 - 2.0 * k / (Period - 1); // MQL5 normalize
double p = PolyValue(x, Degree, PolyType);
double v = C[i - k] - mean;
num += v * p;
den += p * p;
}
Out[i] = den != 0 ? (float)(num / den) : 0f;
}
return Out;
}
double PolyValue(double x, int n, int type)
{
if (type == 0) return Legendre(x, n);
if (type == 1) return Chebyshev1(x, n);
if (type == 2) return Chebyshev2(x, n);
if (type == 3) return Laguerre(x, n);
if (type == 4) return Hermite(x, n);
return 0.0;
}
double Legendre(double x, int n)
{
if (n == 0) return 1.0;
if (n == 1) return x;
double p0 = 1.0;
double p1 = x;
for (int k = 2; k <= n; k++)
{
double pk = ((2 * k - 1) * x * p1 - (k - 1) * p0) / k;
p0 = p1;
p1 = pk;
}
return p1;
}
double Chebyshev1(double x, int n)
{
if (n == 0) return 1;
if (n == 1) return x;
double t0 = 1;
double t1 = x;
for (int k = 2; k <= n; k++)
{
double tk = 2 * x * t1 - t0;
t0 = t1;
t1 = tk;
}
return t1;
}
double Chebyshev2(double x, int n)
{
if (n == 0) return 1;
if (n == 1) return 2 * x;
double u0 = 1;
double u1 = 2 * x;
for (int k = 2; k <= n; k++)
{
double uk = 2 * x * u1 - u0;
u0 = u1;
u1 = uk;
}
return u1;
}
double Laguerre(double x, int n)
{
if (n == 0) return 1;
if (n == 1) return 1 - x;
double l0 = 1;
double l1 = 1 - x;
for (int k = 2; k <= n; k++)
{
double lk = ((2 * k - 1 - x) * l1 - (k - 1) * l0) / k;
l0 = l1;
l1 = lk;
}
return l1;
}
double Hermite(double x, int n)
{
if (n == 0) return 1;
if (n == 1) return x;
double h0 = 1;
double h1 = x;
for (int k = 2; k <= n; k++)
{
double hk = x * h1 - (k - 1) * h0;
h0 = h1;
h1 = hk;
}
return h1;
}
public List<float> OrthogonalTrend(
dynamic Sistem,
int Period)
{
var C = Sistem.GrafikFiyatSec("Kapanis");
var Out = Sistem.Liste(0);
for (int i = Period; i < Sistem.BarSayisi; i++)
{
double mean = 0.0;
for (int k = 0; k < Period; k++)
mean += C[i - k];
mean /= Period;
double num = 0.0;
double den = 0.0;
for (int k = 0; k < Period; k++)
{
//
double x = 1.0 - 2.0 * k / (Period - 1); // geçmiş → -1, şimdi → +1
double v = C[i - k] - mean;
num += v * x;
den += x * x;
}
Out[i] = den != 0 ? (float)(num / den) : 0f;
}
return Out;
}
public List<float> OrthogonalRSI(
dynamic Sistem,
int RsiPeriod,
int PolyPeriod)
{
var C = Sistem.GrafikFiyatSec("Kapanis");
var RSI = Sistem.RSI(RsiPeriod);
var Out = Sistem.Liste(0);
for (int i = PolyPeriod; i < Sistem.BarSayisi; i++)
{
double mean = 0.0;
for (int k = 0; k < PolyPeriod; k++)
mean += RSI[i - k];
mean /= PolyPeriod;
double num = 0.0;
double den = 0.0;
for (int k = 0; k < PolyPeriod; k++)
{
double x = 1.0 - 2.0 * k / (PolyPeriod - 1);
double v = RSI[i - k] - mean;
num += v * x;
den += x * x;
}
Out[i] = den != 0 ? (float)(num / den) : 0f;
}
return Out;
}
public List<float> OrthogonalCCI(
dynamic Sistem,
int CciPeriod,
int PolyPeriod)
{
var C = Sistem.GrafikFiyatSec("Kapanis");
var CCI = Sistem.CommodityChannelIndex(CciPeriod);
var Out = Sistem.Liste(0);
for (int i = PolyPeriod; i < Sistem.BarSayisi; i++)
{
double mean = 0.0;
for (int k = 0; k < PolyPeriod; k++)
mean += CCI[i - k];
mean /= PolyPeriod;
double num = 0.0;
double den = 0.0;
for (int k = 0; k < PolyPeriod; k++)
{
double x = 1.0 - 2.0 * k / (PolyPeriod - 1); // zaman yönü doğru
double v = CCI[i - k] - mean;
num += v * x;
den += x * x;
}
Out[i] = den != 0 ? (float)(num / den) : 0f;
}
return Out;
}
public List<float> OrthogonalMomentum(
dynamic Sistem,
int Period)
{
var C = Sistem.GrafikFiyatSec("Kapanis");
var Out = Sistem.Liste(0);
for (int i = Period; i < Sistem.BarSayisi; i++)
{
double mean = 0.0;
for (int k = 0; k < Period; k++)
mean += C[i - k];
mean /= Period;
double num = 0.0;
double den = 0.0;
for (int k = 0; k < Period; k++)
{
double x = 1.0 - 2.0 * k / (Period - 1);
double v = (C[i - k] - mean);
num += v * x;
den += x * x;
}
Out[i] = den != 0 ? (float)(num / den) : 0f;
}
return Out;
}
public List<float> OrthogonalVolatility(
dynamic Sistem,
int Period)
{
var C = Sistem.GrafikFiyatSec("Kapanis");
var Out = Sistem.Liste(0);
for (int i = Period; i < Sistem.BarSayisi; i++)
{
double mean = 0.0;
for (int k = 0; k < Period; k++)
mean += C[i - k];
mean /= Period;
double sum = 0.0;
for (int k = 0; k < Period; k++)
{
double x = 1.0 - 2.0 * k / (Period - 1);
double v = C[i - k] - mean;
sum += (v * x) * (v * x);
}
Out[i] = (float)Math.Sqrt(sum / Period);
}
return Out;
}
public int AdaptivePeriod(
dynamic Sistem,
int MinP,
int MaxP,
int VolPeriod)
{
var Vol = OrthogonalVolatility(Sistem, VolPeriod);
// Son volatilite
float v = Vol[Sistem.BarSayisi - 1];
// Basit normalize (robust ve hızlı)
float vMin = 0.0001f;
float vMax = 1.0f;
float t = (v - vMin) / (vMax - vMin);
if (t < 0) t = 0;
if (t > 1) t = 1;
// Vol ↑ → Period ↓
int P = (int)(MaxP - t * (MaxP - MinP));
if (P < MinP) P = MinP;
if (P > MaxP) P = MaxP;
return P;
}
public List<float> AdaptiveOrthogonalTrend(
dynamic Sistem,
int MinP,
int MaxP,
int VolPeriod)
{
var C = Sistem.GrafikFiyatSec("Kapanis");
var Out = Sistem.Liste(0);
var Vol = OrthogonalVolatility(Sistem, VolPeriod);
for (int i = MaxP; i < Sistem.BarSayisi; i++)
{
float v = Vol[i];
float t = Math.Min(1f, Math.Max(0f, v));
int P = (int)(MaxP - t * (MaxP - MinP));
if (P < MinP) P = MinP;
if (P > MaxP) P = MaxP;
double mean = 0.0;
for (int k = 0; k < P; k++)
mean += C[i - k];
mean /= P;
double num = 0.0, den = 0.0;
for (int k = 0; k < P; k++)
{
double x = 1.0 - 2.0 * k / (P - 1);
double v2 = C[i - k] - mean;
num += v2 * x;
den += x * x;
}
Out[i] = den != 0 ? (float)(num / den) : 0f;
}
return Out;
}
Yer İmleri