mirror of
https://github.com/mihakralj/QuanTAlib.git
synced 2026-08-17 10:08:05 +00:00
[CodeFactor] Apply fixes to commit 4a01f03
This commit is contained in:
@@ -94,7 +94,7 @@ public class CcorValidationTests
|
||||
|
||||
for (int i = 0; i < 200; i++)
|
||||
{
|
||||
double val = 100.0 + 10.0 * Math.Sin(2.0 * Math.PI * i / period);
|
||||
double val = 100.0 + (10.0 * Math.Sin(2.0 * Math.PI * i / period));
|
||||
ccor.Update(new TValue(DateTime.UtcNow.AddMinutes(i), val), true);
|
||||
}
|
||||
|
||||
@@ -103,7 +103,7 @@ public class CcorValidationTests
|
||||
$"Sine wave should produce non-trivial phasor: Real={ccor.Real:F4}, Imag={ccor.Imag:F4}");
|
||||
|
||||
// R² + I² should be near 1 for a pure tone at the matched frequency
|
||||
double magnitude = Math.Sqrt(ccor.Real * ccor.Real + ccor.Imag * ccor.Imag);
|
||||
double magnitude = Math.Sqrt((ccor.Real * ccor.Real) + (ccor.Imag * ccor.Imag));
|
||||
Assert.True(magnitude > 0.5,
|
||||
$"Phasor magnitude should be significant for matched sine: {magnitude:F4}");
|
||||
}
|
||||
@@ -138,7 +138,7 @@ public class CcorValidationTests
|
||||
|
||||
for (int i = 0; i < 200; i++)
|
||||
{
|
||||
double val = 100.0 + 10.0 * Math.Sin(2.0 * Math.PI * i / period);
|
||||
double val = 100.0 + (10.0 * Math.Sin(2.0 * Math.PI * i / period));
|
||||
ccor.Update(new TValue(DateTime.UtcNow.AddMinutes(i), val), true);
|
||||
}
|
||||
|
||||
@@ -374,7 +374,7 @@ public class CcorValidationTests
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
ind.Update(new TValue(t0.AddMinutes(i),
|
||||
100.0 + 10.0 * Math.Sin(2.0 * Math.PI * i / 20.0)), isNew: true);
|
||||
100.0 + (10.0 * Math.Sin(2.0 * Math.PI * i / 20.0))), isNew: true);
|
||||
}
|
||||
|
||||
// Anchor bar
|
||||
|
||||
@@ -158,7 +158,7 @@ public sealed class Ccor : AbstractBase
|
||||
// Phasor angle (degrees) with quadrant resolution
|
||||
if (imagVal != 0.0)
|
||||
{
|
||||
angleVal = 90.0 + Math.Atan(realVal / imagVal) * (180.0 / Math.PI);
|
||||
angleVal = 90.0 + (Math.Atan(realVal / imagVal) * (180.0 / Math.PI));
|
||||
}
|
||||
if (imagVal > 0.0)
|
||||
{
|
||||
@@ -342,7 +342,7 @@ public sealed class Ccor : AbstractBase
|
||||
|
||||
for (int k = 0; k < n; k++)
|
||||
{
|
||||
int idx = ((bufIdx - 1 - k) % period + period) % period;
|
||||
int idx = (((bufIdx - 1 - k) % period) + period) % period;
|
||||
double x = priceBuf[idx];
|
||||
double y = cosTab[k];
|
||||
sx += x;
|
||||
@@ -353,8 +353,8 @@ public sealed class Ccor : AbstractBase
|
||||
}
|
||||
|
||||
double nd = n;
|
||||
double dp = (nd * sxx - sx * sx) * (nd * syy - sy * sy);
|
||||
realVal = dp > 0.0 ? Math.Clamp((nd * sxy - sx * sy) / Math.Sqrt(dp), -1.0, 1.0) : 0.0;
|
||||
double dp = ((nd * sxx) - (sx * sx)) * ((nd * syy) - (sy * sy));
|
||||
realVal = dp > 0.0 ? Math.Clamp(((nd * sxy) - (sx * sy)) / Math.Sqrt(dp), -1.0, 1.0) : 0.0;
|
||||
}
|
||||
|
||||
output[i] = realVal;
|
||||
@@ -423,13 +423,13 @@ public sealed class Ccor : AbstractBase
|
||||
}
|
||||
|
||||
double nd = n;
|
||||
double denomProd = (nd * sxx - sx * sx) * (nd * syy - sy * sy);
|
||||
double denomProd = ((nd * sxx) - (sx * sx)) * ((nd * syy) - (sy * sy));
|
||||
if (denomProd <= 0.0)
|
||||
{
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
double r = (nd * sxy - sx * sy) / Math.Sqrt(denomProd);
|
||||
double r = ((nd * sxy) - (sx * sy)) / Math.Sqrt(denomProd);
|
||||
return Math.Clamp(r, -1.0, 1.0);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -40,7 +40,7 @@ public class EacpValidationTests
|
||||
// Generate sine wave with known period
|
||||
for (int i = 0; i < 500; i++)
|
||||
{
|
||||
double price = 100.0 + 10.0 * Math.Sin(2.0 * Math.PI * i / knownPeriod);
|
||||
double price = 100.0 + (10.0 * Math.Sin(2.0 * Math.PI * i / knownPeriod));
|
||||
eacp.Update(new TValue(DateTime.UtcNow.AddSeconds(i), price));
|
||||
}
|
||||
|
||||
@@ -155,7 +155,7 @@ public class EacpValidationTests
|
||||
// Generate sine wave
|
||||
for (int i = 0; i < 300; i++)
|
||||
{
|
||||
double price = 100.0 + 10.0 * Math.Sin(2.0 * Math.PI * i / 20.0);
|
||||
double price = 100.0 + (10.0 * Math.Sin(2.0 * Math.PI * i / 20.0));
|
||||
eacpEnhanced.Update(new TValue(DateTime.UtcNow.AddSeconds(i), price));
|
||||
eacpNormal.Update(new TValue(DateTime.UtcNow.AddSeconds(i), price));
|
||||
}
|
||||
@@ -293,7 +293,7 @@ public class EacpValidationTests
|
||||
|
||||
for (int i = 0; i < 200; i++)
|
||||
{
|
||||
double price = 0.0001 + 0.00001 * Math.Sin(2.0 * Math.PI * i / 20.0);
|
||||
double price = 0.0001 + (0.00001 * Math.Sin(2.0 * Math.PI * i / 20.0));
|
||||
eacp.Update(new TValue(DateTime.UtcNow.AddSeconds(i), price));
|
||||
}
|
||||
|
||||
@@ -308,7 +308,7 @@ public class EacpValidationTests
|
||||
|
||||
for (int i = 0; i < 200; i++)
|
||||
{
|
||||
double price = 1e10 + 1e9 * Math.Sin(2.0 * Math.PI * i / 20.0);
|
||||
double price = 1e10 + (1e9 * Math.Sin(2.0 * Math.PI * i / 20.0));
|
||||
eacp.Update(new TValue(DateTime.UtcNow.AddSeconds(i), price));
|
||||
}
|
||||
|
||||
@@ -360,7 +360,7 @@ public class EacpValidationTests
|
||||
// Generate pure sine wave
|
||||
for (int i = 0; i < 300; i++)
|
||||
{
|
||||
double price = 100.0 + 10.0 * Math.Sin(2.0 * Math.PI * i / 20.0);
|
||||
double price = 100.0 + (10.0 * Math.Sin(2.0 * Math.PI * i / 20.0));
|
||||
eacp.Update(new TValue(DateTime.UtcNow.AddSeconds(i), price));
|
||||
}
|
||||
|
||||
@@ -406,8 +406,8 @@ public class EacpValidationTests
|
||||
// Generate two different sine waves
|
||||
for (int i = 0; i < 500; i++)
|
||||
{
|
||||
double price1 = 100.0 + 10.0 * Math.Sin(2.0 * Math.PI * i / period1);
|
||||
double price2 = 100.0 + 10.0 * Math.Sin(2.0 * Math.PI * i / period2);
|
||||
double price1 = 100.0 + (10.0 * Math.Sin(2.0 * Math.PI * i / period1));
|
||||
double price2 = 100.0 + (10.0 * Math.Sin(2.0 * Math.PI * i / period2));
|
||||
|
||||
eacp1.Update(new TValue(DateTime.UtcNow.AddSeconds(i), price1));
|
||||
eacp2.Update(new TValue(DateTime.UtcNow.AddSeconds(i), price2));
|
||||
@@ -428,7 +428,7 @@ public class EacpValidationTests
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
ind.Update(new TValue(t0.AddMinutes(i),
|
||||
100.0 + 10.0 * Math.Sin(2.0 * Math.PI * i / 20.0)), isNew: true);
|
||||
100.0 + (10.0 * Math.Sin(2.0 * Math.PI * i / 20.0))), isNew: true);
|
||||
}
|
||||
|
||||
// Anchor bar
|
||||
|
||||
@@ -191,10 +191,10 @@ public sealed class Eacp : AbstractBase
|
||||
// High-pass filter: removes DC and low-frequency trend
|
||||
double hp2 = s.Hp1;
|
||||
double hp1 = s.Hp0;
|
||||
double coef = (1.0 - _alphaHP / 2.0);
|
||||
double hp0 = coef * coef * (price0 - 2.0 * price1 + price2)
|
||||
+ 2.0 * (1.0 - _alphaHP) * hp1
|
||||
- (1.0 - _alphaHP) * (1.0 - _alphaHP) * hp2;
|
||||
double coef = (1.0 - (_alphaHP / 2.0));
|
||||
double hp0 = (coef * coef * (price0 - (2.0 * price1) + price2))
|
||||
+ (2.0 * (1.0 - _alphaHP) * hp1)
|
||||
- ((1.0 - _alphaHP) * (1.0 - _alphaHP) * hp2);
|
||||
|
||||
// Super-smoother filter: removes high-frequency noise
|
||||
double filt2 = s.Filt1;
|
||||
@@ -290,12 +290,12 @@ public sealed class Eacp : AbstractBase
|
||||
double corrVal = 0;
|
||||
if (valid > 1)
|
||||
{
|
||||
double denomX = valid * sxx - sx * sx;
|
||||
double denomY = valid * syy - sy * sy;
|
||||
double denomX = (valid * sxx) - (sx * sx);
|
||||
double denomY = (valid * syy) - (sy * sy);
|
||||
double denom = denomX * denomY;
|
||||
if (denom > 0)
|
||||
{
|
||||
corrVal = (valid * sxy - sx * sy) / Math.Sqrt(denom);
|
||||
corrVal = ((valid * sxy) - (sx * sy)) / Math.Sqrt(denom);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -319,7 +319,7 @@ public sealed class Eacp : AbstractBase
|
||||
}
|
||||
|
||||
// Power = amplitude squared
|
||||
double sq = cosAcc * cosAcc + sinAcc * sinAcc;
|
||||
double sq = (cosAcc * cosAcc) + (sinAcc * sinAcc);
|
||||
|
||||
// Smooth the power spectrum (EMA-like smoothing)
|
||||
// Power squared per Ehlers: emphasizes spectral peaks, suppresses noise
|
||||
|
||||
@@ -103,7 +103,7 @@ public sealed class HtDcperiodValidationTests : IDisposable
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
ind.Update(new TValue(t0.AddMinutes(i),
|
||||
100.0 + 10.0 * Math.Sin(2.0 * Math.PI * i / 20.0)), isNew: true);
|
||||
100.0 + (10.0 * Math.Sin(2.0 * Math.PI * i / 20.0))), isNew: true);
|
||||
}
|
||||
|
||||
// Anchor bar
|
||||
|
||||
@@ -27,7 +27,7 @@ public class HtDcphaseTests
|
||||
// Feed data through publisher
|
||||
for (int i = 0; i < 80; i++)
|
||||
{
|
||||
source.Add(new TValue(DateTime.UtcNow.AddMinutes(i), 100 + Math.Sin(i * 0.3) * 10));
|
||||
source.Add(new TValue(DateTime.UtcNow.AddMinutes(i), 100 + (Math.Sin(i * 0.3) * 10)));
|
||||
}
|
||||
|
||||
Assert.True(ht.IsHot);
|
||||
@@ -131,7 +131,7 @@ public class HtDcphaseTests
|
||||
// Prime with data
|
||||
for (int i = 0; i < 70; i++)
|
||||
{
|
||||
ht.Update(new TValue(now.AddMinutes(i), 100 + Math.Sin(i * 0.1) * 10));
|
||||
ht.Update(new TValue(now.AddMinutes(i), 100 + (Math.Sin(i * 0.1) * 10)));
|
||||
}
|
||||
|
||||
Assert.True(ht.IsHot);
|
||||
@@ -153,7 +153,7 @@ public class HtDcphaseTests
|
||||
|
||||
for (int i = 0; i < 70; i++)
|
||||
{
|
||||
ht.Update(new TValue(now.AddMinutes(i), 100 + i * 0.5));
|
||||
ht.Update(new TValue(now.AddMinutes(i), 100 + (i * 0.5)));
|
||||
}
|
||||
|
||||
// New bar
|
||||
@@ -187,7 +187,7 @@ public class HtDcphaseTests
|
||||
|
||||
for (int i = 0; i < 80; i++)
|
||||
{
|
||||
ht.Update(new TValue(now.AddMinutes(i), 100 + Math.Sin(i * 0.2) * 5));
|
||||
ht.Update(new TValue(now.AddMinutes(i), 100 + (Math.Sin(i * 0.2) * 5)));
|
||||
}
|
||||
|
||||
Assert.True(ht.IsHot);
|
||||
@@ -203,7 +203,7 @@ public class HtDcphaseTests
|
||||
|
||||
for (int i = 0; i < 80; i++)
|
||||
{
|
||||
ht.Update(new TValue(now.AddMinutes(i), 100 + i * 0.5));
|
||||
ht.Update(new TValue(now.AddMinutes(i), 100 + (i * 0.5)));
|
||||
}
|
||||
|
||||
var result = ht.Update(new TValue(now.AddMinutes(80), double.PositiveInfinity));
|
||||
@@ -236,14 +236,14 @@ public class HtDcphaseTests
|
||||
|
||||
for (int i = 0; i < 80; i++)
|
||||
{
|
||||
ht.Update(new TValue(now.AddMinutes(i), 100 + Math.Sin(i * 0.2) * 5));
|
||||
ht.Update(new TValue(now.AddMinutes(i), 100 + (Math.Sin(i * 0.2) * 5)));
|
||||
}
|
||||
var firstResult = ht.Last.Value;
|
||||
|
||||
ht.Reset();
|
||||
for (int i = 0; i < 80; i++)
|
||||
{
|
||||
ht.Update(new TValue(now.AddMinutes(i), 100 + Math.Sin(i * 0.2) * 5));
|
||||
ht.Update(new TValue(now.AddMinutes(i), 100 + (Math.Sin(i * 0.2) * 5)));
|
||||
}
|
||||
Assert.Equal(firstResult, ht.Last.Value);
|
||||
}
|
||||
@@ -352,7 +352,7 @@ public class HtDcphaseTests
|
||||
var values = new double[80];
|
||||
for (int i = 0; i < 80; i++)
|
||||
{
|
||||
values[i] = 100 + Math.Sin(i * 0.2) * 5;
|
||||
values[i] = 100 + (Math.Sin(i * 0.2) * 5);
|
||||
}
|
||||
|
||||
ht.Prime(values, TimeSpan.FromMinutes(5));
|
||||
|
||||
@@ -103,7 +103,7 @@ public sealed class HtDcphaseValidationTests : IDisposable
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
ind.Update(new TValue(t0.AddMinutes(i),
|
||||
100.0 + 10.0 * Math.Sin(2.0 * Math.PI * i / 20.0)), isNew: true);
|
||||
100.0 + (10.0 * Math.Sin(2.0 * Math.PI * i / 20.0))), isNew: true);
|
||||
}
|
||||
|
||||
// Anchor bar
|
||||
|
||||
@@ -141,8 +141,8 @@ public sealed class HtDcphase : AbstractBase
|
||||
double input1 = buffer[KEY_Q1];
|
||||
DoHilbertTransform(buffer, KEY_JQ, input1, true, hilbertIdx, adjustedPrevPeriod);
|
||||
|
||||
q2 = 0.2 * (buffer[KEY_Q1] + buffer[KEY_JI]) + 0.8 * prevQ2;
|
||||
i2 = 0.2 * (i1ForOddPrev3 - buffer[KEY_JQ]) + 0.8 * prevI2;
|
||||
q2 = (0.2 * (buffer[KEY_Q1] + buffer[KEY_JI])) + (0.8 * prevQ2);
|
||||
i2 = (0.2 * (i1ForOddPrev3 - buffer[KEY_JQ])) + (0.8 * prevI2);
|
||||
|
||||
i1ForEvenPrev3 = i1ForEvenPrev2;
|
||||
i1ForEvenPrev2 = buffer[KEY_DETRENDER];
|
||||
@@ -166,8 +166,8 @@ public sealed class HtDcphase : AbstractBase
|
||||
hilbertIdx = 0;
|
||||
}
|
||||
|
||||
q2 = 0.2 * (buffer[KEY_Q1] + buffer[KEY_JI]) + 0.8 * prevQ2;
|
||||
i2 = 0.2 * (i1ForEvenPrev3 - buffer[KEY_JQ]) + 0.8 * prevI2;
|
||||
q2 = (0.2 * (buffer[KEY_Q1] + buffer[KEY_JI])) + (0.8 * prevQ2);
|
||||
i2 = (0.2 * (i1ForEvenPrev3 - buffer[KEY_JQ])) + (0.8 * prevI2);
|
||||
|
||||
i1ForOddPrev3 = i1ForOddPrev2;
|
||||
i1ForOddPrev2 = buffer[KEY_DETRENDER];
|
||||
@@ -296,7 +296,7 @@ public sealed class HtDcphase : AbstractBase
|
||||
}
|
||||
|
||||
// Calculate smoothed price using WMA
|
||||
double adjustedPrevPeriod = 0.075 * s.Period + 0.54;
|
||||
double adjustedPrevPeriod = (0.075 * s.Period) + 0.54;
|
||||
|
||||
s.PeriodWMASub += price;
|
||||
s.PeriodWMASub -= s.TrailingWMAValue;
|
||||
|
||||
@@ -133,7 +133,7 @@ public sealed class HtSineValidationTests : IDisposable
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
ind.Update(new TValue(t0.AddMinutes(i),
|
||||
100.0 + 10.0 * Math.Sin(2.0 * Math.PI * i / 20.0)), isNew: true);
|
||||
100.0 + (10.0 * Math.Sin(2.0 * Math.PI * i / 20.0))), isNew: true);
|
||||
}
|
||||
|
||||
// Anchor bar
|
||||
|
||||
@@ -161,8 +161,8 @@ public sealed class HtSine : AbstractBase
|
||||
double input1 = buffer[KEY_Q1];
|
||||
DoHilbertTransform(buffer, KEY_JQ, input1, true, hilbertIdx, adjustedPrevPeriod);
|
||||
|
||||
q2 = 0.2 * (buffer[KEY_Q1] + buffer[KEY_JI]) + 0.8 * prevQ2;
|
||||
i2 = 0.2 * (i1ForOddPrev3 - buffer[KEY_JQ]) + 0.8 * prevI2;
|
||||
q2 = (0.2 * (buffer[KEY_Q1] + buffer[KEY_JI])) + (0.8 * prevQ2);
|
||||
i2 = (0.2 * (i1ForOddPrev3 - buffer[KEY_JQ])) + (0.8 * prevI2);
|
||||
|
||||
// The variable I1 is the detrender delayed for 3 price bars.
|
||||
i1ForEvenPrev3 = i1ForEvenPrev2;
|
||||
@@ -187,8 +187,8 @@ public sealed class HtSine : AbstractBase
|
||||
hilbertIdx = 0;
|
||||
}
|
||||
|
||||
q2 = 0.2 * (buffer[KEY_Q1] + buffer[KEY_JI]) + 0.8 * prevQ2;
|
||||
i2 = 0.2 * (i1ForEvenPrev3 - buffer[KEY_JQ]) + 0.8 * prevI2;
|
||||
q2 = (0.2 * (buffer[KEY_Q1] + buffer[KEY_JI])) + (0.8 * prevQ2);
|
||||
i2 = (0.2 * (i1ForEvenPrev3 - buffer[KEY_JQ])) + (0.8 * prevI2);
|
||||
|
||||
// The variable i1 is the detrender delayed for 3 price bars.
|
||||
i1ForOddPrev3 = i1ForOddPrev2;
|
||||
@@ -199,8 +199,8 @@ public sealed class HtSine : AbstractBase
|
||||
private static void CalcSmoothedPeriod(
|
||||
ref double re, double i2, double q2, ref double prevI2, ref double prevQ2, ref double im, ref double period)
|
||||
{
|
||||
re = Math.FusedMultiplyAdd(0.2, i2 * prevI2 + q2 * prevQ2, 0.8 * re);
|
||||
im = Math.FusedMultiplyAdd(0.2, i2 * prevQ2 - q2 * prevI2, 0.8 * im);
|
||||
re = Math.FusedMultiplyAdd(0.2, (i2 * prevI2) + (q2 * prevQ2), 0.8 * re);
|
||||
im = Math.FusedMultiplyAdd(0.2, (i2 * prevQ2) - (q2 * prevI2), 0.8 * im);
|
||||
|
||||
prevQ2 = q2;
|
||||
prevI2 = i2;
|
||||
@@ -373,7 +373,7 @@ public sealed class HtSine : AbstractBase
|
||||
}
|
||||
|
||||
// Calculate smoothed price using WMA
|
||||
double adjustedPrevPeriod = 0.075 * s.Period + 0.54;
|
||||
double adjustedPrevPeriod = (0.075 * s.Period) + 0.54;
|
||||
|
||||
s.PeriodWMASub += price;
|
||||
s.PeriodWMASub -= s.TrailingWMAValue;
|
||||
|
||||
Reference in New Issue
Block a user