mirror of
https://github.com/mihakralj/QuanTAlib.git
synced 2026-08-17 10:08:05 +00:00
[CodeFactor] Apply fixes to commit 9697fac
This commit is contained in:
@@ -211,7 +211,7 @@ public sealed class Adxvma : AbstractBase
|
||||
double sc = Math.Max(0.0, Math.Min(adxVal / 100.0, 1.0));
|
||||
|
||||
// Adaptive EMA
|
||||
double result = double.IsNaN(_state.Result) ? sourceValue : _state.Result + sc * (sourceValue - _state.Result);
|
||||
double result = double.IsNaN(_state.Result) ? sourceValue : _state.Result + (sc * (sourceValue - _state.Result));
|
||||
|
||||
// Update state
|
||||
_state = new AdxvmaState(
|
||||
|
||||
@@ -53,7 +53,7 @@ public sealed class Decycler : AbstractBase
|
||||
double arg = 0.707 * 2.0 * Math.PI / period;
|
||||
double cosArg = Math.Cos(arg);
|
||||
double alpha = (cosArg + Math.Sin(arg) - 1.0) / cosArg;
|
||||
double halfAlpha = 1.0 - alpha * 0.5;
|
||||
double halfAlpha = 1.0 - (alpha * 0.5);
|
||||
_a1 = halfAlpha * halfAlpha;
|
||||
double oneMinusAlpha = 1.0 - alpha;
|
||||
_b1 = 2.0 * oneMinusAlpha;
|
||||
@@ -147,7 +147,7 @@ public sealed class Decycler : AbstractBase
|
||||
}
|
||||
|
||||
// HP recurrence: hp = a1*(src - 2*src1 + src2) + b1*hp + c1*hp1
|
||||
double hp = Math.FusedMultiplyAdd(_a1, src - 2.0 * _state.Src1 + _state.Src2,
|
||||
double hp = Math.FusedMultiplyAdd(_a1, src - (2.0 * _state.Src1) + _state.Src2,
|
||||
Math.FusedMultiplyAdd(_b1, _state.Hp, _c1 * _state.Hp1));
|
||||
|
||||
// Decycler = source - high-pass
|
||||
@@ -238,7 +238,7 @@ public sealed class Decycler : AbstractBase
|
||||
double arg = 0.707 * 2.0 * Math.PI / period;
|
||||
double cosArg = Math.Cos(arg);
|
||||
double alpha = (cosArg + Math.Sin(arg) - 1.0) / cosArg;
|
||||
double halfAlpha = 1.0 - alpha * 0.5;
|
||||
double halfAlpha = 1.0 - (alpha * 0.5);
|
||||
double a1 = halfAlpha * halfAlpha;
|
||||
double oneMinusAlpha = 1.0 - alpha;
|
||||
double b1 = 2.0 * oneMinusAlpha;
|
||||
@@ -258,7 +258,7 @@ public sealed class Decycler : AbstractBase
|
||||
|
||||
for (int i = 2; i < source.Length; i++)
|
||||
{
|
||||
double newHp = Math.FusedMultiplyAdd(a1, source[i] - 2.0 * source[i - 1] + source[i - 2],
|
||||
double newHp = Math.FusedMultiplyAdd(a1, source[i] - (2.0 * source[i - 1]) + source[i - 2],
|
||||
Math.FusedMultiplyAdd(b1, hp, c1 * hp1));
|
||||
output[i] = source[i] - newHp;
|
||||
hp1 = hp;
|
||||
|
||||
@@ -83,7 +83,7 @@ public sealed class Ema : AbstractBase
|
||||
_decay = 1.0 - alpha;
|
||||
Name = $"Ema(α={alpha:F4})";
|
||||
// Approximate period from alpha: alpha = 2/(N+1) => N = 2/alpha - 1
|
||||
WarmupPeriod = (int)(2.0 / alpha - 1.0);
|
||||
WarmupPeriod = (int)((2.0 / alpha) - 1.0);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -327,7 +327,7 @@ public sealed class Ema : AbstractBase
|
||||
ref double outRef = ref MemoryMarshal.GetReference(output);
|
||||
|
||||
// Unroll by 4 to reduce loop overhead and improve instruction-level parallelism
|
||||
int unrollEnd = i + ((len - i) / 4) * 4;
|
||||
int unrollEnd = i + (((len - i) / 4) * 4);
|
||||
for (; i < unrollEnd; i += 4)
|
||||
{
|
||||
double v0 = Unsafe.Add(ref srcRef, i);
|
||||
@@ -381,7 +381,6 @@ public sealed class Ema : AbstractBase
|
||||
|
||||
state.Ema = Math.FusedMultiplyAdd(state.Ema, decay, alpha * v3);
|
||||
Unsafe.Add(ref outRef, i + 3) = state.Ema;
|
||||
|
||||
}
|
||||
|
||||
// Scalar remainder
|
||||
@@ -425,7 +424,7 @@ public sealed class Ema : AbstractBase
|
||||
|
||||
// Unroll by 4 for better ILP
|
||||
int i = 1;
|
||||
int unrollEnd = 1 + ((len - 1) / 4) * 4;
|
||||
int unrollEnd = 1 + (((len - 1) / 4) * 4);
|
||||
|
||||
for (; i < unrollEnd; i += 4)
|
||||
{
|
||||
|
||||
@@ -242,7 +242,6 @@ public sealed class Frama : ITValuePublisher, IDisposable
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
private void Handle(object? sender, in TValueEventArgs args) => Update(args.Value, args.IsNew);
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Initializes the indicator state using the provided bar series history.
|
||||
/// </summary>
|
||||
|
||||
@@ -244,7 +244,7 @@ public sealed class Htit : AbstractBase
|
||||
if (_state.Index >= 12)
|
||||
{
|
||||
// NaN will propagate if IT buffer contains NaN
|
||||
return (4.0 * _itBuffer[^1] + 3.0 * _itBuffer[^2] + 2.0 * _itBuffer[^3] + _itBuffer[^4]) * 0.1;
|
||||
return ((4.0 * _itBuffer[^1]) + (3.0 * _itBuffer[^2]) + (2.0 * _itBuffer[^3]) + _itBuffer[^4]) * 0.1;
|
||||
}
|
||||
|
||||
return price; // May be NaN if no valid input yet
|
||||
|
||||
@@ -88,7 +88,7 @@ public sealed class Hwma : AbstractBase
|
||||
throw new ArgumentException("Gamma must be between 0 and 1", nameof(gamma));
|
||||
}
|
||||
|
||||
int effectivePeriod = (int)(2.0 / alpha - 1.0); // Reverse calculate for display
|
||||
int effectivePeriod = (int)((2.0 / alpha) - 1.0); // Reverse calculate for display
|
||||
_alpha = alpha;
|
||||
_beta = beta;
|
||||
_gamma = gamma;
|
||||
@@ -190,7 +190,7 @@ public sealed class Hwma : AbstractBase
|
||||
double prevA = _state.A;
|
||||
|
||||
// F = α × source + (1-α) × (prevF + prevV + 0.5 × prevA)
|
||||
double forecast = prevF + prevV + 0.5 * prevA;
|
||||
double forecast = prevF + prevV + (0.5 * prevA);
|
||||
double newF = Math.FusedMultiplyAdd(forecast, _decayAlpha, _alpha * val);
|
||||
|
||||
// V = β × (F - prevF) + (1-β) × (prevV + prevA)
|
||||
@@ -202,7 +202,7 @@ public sealed class Hwma : AbstractBase
|
||||
_state = _state with { F = newF, V = newV, A = newA };
|
||||
|
||||
// output = F + V + 0.5 × A
|
||||
result = newF + newV + 0.5 * newA;
|
||||
result = newF + newV + (0.5 * newA);
|
||||
}
|
||||
|
||||
Last = new TValue(input.Time, result);
|
||||
@@ -333,7 +333,7 @@ public sealed class Hwma : AbstractBase
|
||||
double prevA = A;
|
||||
|
||||
// F = α × source + (1-α) × (prevF + prevV + 0.5 × prevA)
|
||||
F = Math.FusedMultiplyAdd(prevF + prevV + 0.5 * prevA, decayAlpha, alpha * val);
|
||||
F = Math.FusedMultiplyAdd(prevF + prevV + (0.5 * prevA), decayAlpha, alpha * val);
|
||||
|
||||
// V = β × (F - prevF) + (1-β) × (prevV + prevA)
|
||||
V = Math.FusedMultiplyAdd(prevV + prevA, decayBeta, beta * (F - prevF));
|
||||
@@ -342,7 +342,7 @@ public sealed class Hwma : AbstractBase
|
||||
A = Math.FusedMultiplyAdd(prevA, decayGamma, gamma * (V - prevV));
|
||||
|
||||
// output = F + V + 0.5 × A
|
||||
output[i] = F + V + 0.5 * A;
|
||||
output[i] = F + V + (0.5 * A);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -107,7 +107,7 @@ public sealed class Jma : AbstractBase
|
||||
_logSqrtDivider = Math.Log(Math.Max(sqrtDivider, 1e-12));
|
||||
|
||||
// same warmup heuristic used in the AFL port (SetBarsRequired)
|
||||
WarmupPeriod = (int)Math.Ceiling(20.0 + 80.0 * Math.Pow(period, 0.36));
|
||||
WarmupPeriod = (int)Math.Ceiling(20.0 + (80.0 * Math.Pow(period, 0.36)));
|
||||
|
||||
_handler = Handle;
|
||||
Name = $"Jma({period},{phase})";
|
||||
|
||||
+19
-19
@@ -399,26 +399,26 @@ public sealed class Mama : AbstractBase
|
||||
double adj = (AdjSlope * period) + AdjIntercept;
|
||||
|
||||
// Smooth
|
||||
double smooth = (4.0 * priceBuffer[bufferIdx] +
|
||||
3.0 * priceBuffer[(bufferIdx - 1) & Mask] +
|
||||
2.0 * priceBuffer[(bufferIdx - 2) & Mask] +
|
||||
double smooth = ((4.0 * priceBuffer[bufferIdx]) +
|
||||
(3.0 * priceBuffer[(bufferIdx - 1) & Mask]) +
|
||||
(2.0 * priceBuffer[(bufferIdx - 2) & Mask]) +
|
||||
priceBuffer[(bufferIdx - 3) & Mask]) * 0.1;
|
||||
|
||||
smoothBuffer[bufferIdx] = smooth;
|
||||
|
||||
// Detrender
|
||||
double dt = (C1 * smoothBuffer[bufferIdx] +
|
||||
C2 * smoothBuffer[(bufferIdx - 2) & Mask] -
|
||||
C2 * smoothBuffer[(bufferIdx - 4) & Mask] -
|
||||
C1 * smoothBuffer[(bufferIdx - 6) & Mask]) * adj;
|
||||
double dt = ((C1 * smoothBuffer[bufferIdx]) +
|
||||
(C2 * smoothBuffer[(bufferIdx - 2) & Mask]) -
|
||||
(C2 * smoothBuffer[(bufferIdx - 4) & Mask]) -
|
||||
(C1 * smoothBuffer[(bufferIdx - 6) & Mask])) * adj;
|
||||
|
||||
detrender[bufferIdx] = dt;
|
||||
|
||||
// Q1
|
||||
double q1 = (C1 * dt +
|
||||
C2 * detrender[(bufferIdx - 2) & Mask] -
|
||||
C2 * detrender[(bufferIdx - 4) & Mask] -
|
||||
C1 * detrender[(bufferIdx - 6) & Mask]) * adj;
|
||||
double q1 = ((C1 * dt) +
|
||||
(C2 * detrender[(bufferIdx - 2) & Mask]) -
|
||||
(C2 * detrender[(bufferIdx - 4) & Mask]) -
|
||||
(C1 * detrender[(bufferIdx - 6) & Mask])) * adj;
|
||||
|
||||
Q1_buffer[bufferIdx] = q1;
|
||||
|
||||
@@ -427,15 +427,15 @@ public sealed class Mama : AbstractBase
|
||||
I1_buffer[bufferIdx] = i1;
|
||||
|
||||
// Advance phases
|
||||
double jI = (C1 * i1 +
|
||||
C2 * I1_buffer[(bufferIdx - 2) & Mask] -
|
||||
C2 * I1_buffer[(bufferIdx - 4) & Mask] -
|
||||
C1 * I1_buffer[(bufferIdx - 6) & Mask]) * adj;
|
||||
double jI = ((C1 * i1) +
|
||||
(C2 * I1_buffer[(bufferIdx - 2) & Mask]) -
|
||||
(C2 * I1_buffer[(bufferIdx - 4) & Mask]) -
|
||||
(C1 * I1_buffer[(bufferIdx - 6) & Mask])) * adj;
|
||||
|
||||
double jQ = (C1 * q1 +
|
||||
C2 * Q1_buffer[(bufferIdx - 2) & Mask] -
|
||||
C2 * Q1_buffer[(bufferIdx - 4) & Mask] -
|
||||
C1 * Q1_buffer[(bufferIdx - 6) & Mask]) * adj;
|
||||
double jQ = ((C1 * q1) +
|
||||
(C2 * Q1_buffer[(bufferIdx - 2) & Mask]) -
|
||||
(C2 * Q1_buffer[(bufferIdx - 4) & Mask]) -
|
||||
(C1 * Q1_buffer[(bufferIdx - 6) & Mask])) * adj;
|
||||
|
||||
// Phasor addition
|
||||
double i2_val = i1 - jQ;
|
||||
|
||||
@@ -105,7 +105,7 @@ public sealed class Mgdi : AbstractBase
|
||||
ratio4 *= ratio4;
|
||||
|
||||
double denominator = _k * _period * ratio4;
|
||||
_state.LastMgdi = (Math.Abs(denominator) < 1e-9) ? price : prev + (price - prev) / denominator;
|
||||
_state.LastMgdi = (Math.Abs(denominator) < 1e-9) ? price : prev + ((price - prev) / denominator);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -218,7 +218,7 @@ public sealed class Mgdi : AbstractBase
|
||||
ratio4 *= ratio4;
|
||||
|
||||
double denominator = k * period * ratio4;
|
||||
lastMgdi = (Math.Abs(denominator) < 1e-9) ? price : lastMgdi + (price - lastMgdi) / denominator;
|
||||
lastMgdi = (Math.Abs(denominator) < 1e-9) ? price : lastMgdi + ((price - lastMgdi) / denominator);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -356,8 +356,8 @@ public sealed class Nma : AbstractBase
|
||||
double denom = 0;
|
||||
for (int j = 0; j < bars; j++)
|
||||
{
|
||||
int idx0 = ((head - 1 - j) % bufSize + bufSize) % bufSize;
|
||||
int idx1 = ((head - 2 - j) % bufSize + bufSize) % bufSize;
|
||||
int idx0 = (((head - 1 - j) % bufSize) + bufSize) % bufSize;
|
||||
int idx1 = (((head - 2 - j) % bufSize) + bufSize) % bufSize;
|
||||
double oi = Math.Abs(lnBuf[idx0] - lnBuf[idx1]);
|
||||
num += oi * sqrtW[j];
|
||||
denom += oi;
|
||||
|
||||
@@ -358,7 +358,6 @@ public sealed class Rema : AbstractBase
|
||||
}
|
||||
|
||||
Unsafe.Add(ref outRef, i) = result;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -60,7 +60,7 @@ public sealed class Rgma : AbstractBase
|
||||
|
||||
_passes = passes;
|
||||
|
||||
_alpha = 2.0 / (period / Math.Sqrt(passes) + 1.0);
|
||||
_alpha = 2.0 / ((period / Math.Sqrt(passes)) + 1.0);
|
||||
_decay = 1.0 - _alpha;
|
||||
|
||||
_filters = new double[_passes];
|
||||
@@ -293,7 +293,6 @@ public sealed class Rgma : AbstractBase
|
||||
state.IsHot = true;
|
||||
}
|
||||
|
||||
|
||||
return filters[^1];
|
||||
}
|
||||
|
||||
@@ -347,7 +346,6 @@ public sealed class Rgma : AbstractBase
|
||||
state.IsHot = true;
|
||||
}
|
||||
|
||||
|
||||
y = filters[^1];
|
||||
}
|
||||
|
||||
@@ -395,7 +393,7 @@ public sealed class Rgma : AbstractBase
|
||||
return;
|
||||
}
|
||||
|
||||
double alpha = 2.0 / (period / Math.Sqrt(passes) + 1.0);
|
||||
double alpha = 2.0 / ((period / Math.Sqrt(passes)) + 1.0);
|
||||
double decay = 1.0 - alpha;
|
||||
|
||||
var state = State.New();
|
||||
|
||||
@@ -76,8 +76,8 @@ public sealed class T3 : AbstractBase
|
||||
|
||||
double c1 = -v3;
|
||||
double c2 = 3.0 * (v2 + v3);
|
||||
double c3 = -3.0 * (2.0 * v2 + v + v3);
|
||||
double c4 = 1.0 + 3.0 * v + 3.0 * v2 + v3;
|
||||
double c3 = -3.0 * ((2.0 * v2) + v + v3);
|
||||
double c4 = 1.0 + (3.0 * v) + (3.0 * v2) + v3;
|
||||
|
||||
_params = new Parameters(alpha, decay, c1, c2, c3, c4);
|
||||
|
||||
@@ -358,8 +358,8 @@ public sealed class T3 : AbstractBase
|
||||
|
||||
double c1 = -v3;
|
||||
double c2 = 3.0 * (v2 + v3);
|
||||
double c3 = -3.0 * (2.0 * v2 + v + v3);
|
||||
double c4 = 1.0 + 3.0 * v + 3.0 * v2 + v3;
|
||||
double c3 = -3.0 * ((2.0 * v2) + v + v3);
|
||||
double c4 = 1.0 + (3.0 * v) + (3.0 * v2) + v3;
|
||||
|
||||
var p = new Parameters(alpha, decay, c1, c2, c3, c4);
|
||||
var state = State.New();
|
||||
|
||||
@@ -78,7 +78,7 @@ public sealed class Tema : AbstractBase
|
||||
_alpha = alpha;
|
||||
_decay = 1.0 - alpha;
|
||||
Name = $"Tema(α={alpha:F4})";
|
||||
WarmupPeriod = (int)(3 * (2.0 / alpha - 1.0));
|
||||
WarmupPeriod = (int)(3 * ((2.0 / alpha) - 1.0));
|
||||
_handler = Handle;
|
||||
}
|
||||
|
||||
|
||||
@@ -384,7 +384,6 @@ public sealed class Vama : AbstractBase
|
||||
return (results, indicator);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Resets the VAMA state.
|
||||
/// </summary>
|
||||
|
||||
@@ -310,7 +310,7 @@ public sealed class Yzvama : AbstractBase
|
||||
|
||||
double sOSq = ro * ro;
|
||||
double sCSq = rc * rc;
|
||||
double sRsSq = rh * (rh - rc) + rl * (rl - rc);
|
||||
double sRsSq = (rh * (rh - rc)) + (rl * (rl - rc));
|
||||
|
||||
// Use FMA for sSqDailyShort and sSqDailyLong computations
|
||||
// Original: sOSq + _kShort * sCSq + (1.0 - _kShort) * sRsSq
|
||||
@@ -562,7 +562,6 @@ public sealed class Yzvama : AbstractBase
|
||||
return (results, indicator);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Resets the YZVAMA state.
|
||||
/// </summary>
|
||||
|
||||
Reference in New Issue
Block a user