[CodeFactor] Apply fixes to commit 4a01f03

This commit is contained in:
codefactor-io
2026-03-11 03:35:12 +00:00
parent 4a01f03cb4
commit 567fa89465
63 changed files with 293 additions and 302 deletions
+1 -1
View File
@@ -476,7 +476,7 @@ public sealed class Adx : ITValuePublisher
double dx = CalcDx(trSmooth, dmPlusSmooth, dmMinusSmooth);
dxSum += dx;
int adxStart = period * 2 - 1;
int adxStart = (period * 2) - 1;
for (int i = period + 1; i <= adxStart; i++)
{
@@ -55,7 +55,7 @@ public sealed class HtTrendmodeValidationTests : IDisposable
// Act - Process with sinusoidal data
for (int i = 0; i < 200; i++)
{
double value = 100.0 + Math.Sin(i * 0.2) * 10.0 + Math.Sin(i * 0.05) * 5.0;
double value = 100.0 + (Math.Sin(i * 0.2) * 10.0) + (Math.Sin(i * 0.05) * 5.0);
indicator.Update(new TValue(DateTime.UtcNow.AddMinutes(i), value));
}
@@ -74,7 +74,7 @@ public sealed class HtTrendmodeValidationTests : IDisposable
// Act
for (int i = 0; i < 200; i++)
{
double value = 100.0 + Math.Sin(i * 0.15) * 8.0;
double value = 100.0 + (Math.Sin(i * 0.15) * 8.0);
indicator.Update(new TValue(DateTime.UtcNow.AddMinutes(i), value));
}
@@ -208,7 +208,7 @@ public sealed class HtTrendmodeValidationTests : 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
@@ -124,8 +124,8 @@ public sealed class IchimokuValidationTests : IDisposable
// Add 4 bars with increasing trend
for (int i = 0; i < 4; i++)
{
double basePrice = 100 + i * 5;
ichimoku.Update(new TBar(baseTime + i * 60000, basePrice, basePrice + 5, basePrice - 5, basePrice, 1000));
double basePrice = 100 + (i * 5);
ichimoku.Update(new TBar(baseTime + (i * 60000), basePrice, basePrice + 5, basePrice - 5, basePrice, 1000));
}
// Tenkan (2-period) uses last 2 bars: bars 3,4
@@ -223,7 +223,7 @@ public sealed class IchimokuValidationTests : IDisposable
for (int i = 0; i < 5; i++)
{
ichimoku.Update(new TBar(baseTime + i * 60000, (highs[i] + lows[i]) / 2, highs[i], lows[i], (highs[i] + lows[i]) / 2, 1000));
ichimoku.Update(new TBar(baseTime + (i * 60000), (highs[i] + lows[i]) / 2, highs[i], lows[i], (highs[i] + lows[i]) / 2, 1000));
}
// 5-period: max(100,110,120,115,105) = 120, min(90,85,80,88,92) = 80
@@ -244,7 +244,7 @@ public sealed class IchimokuValidationTests : IDisposable
for (int i = 1; i < 10; i++)
{
ichimoku.Update(new TBar(baseTime + i * 60000, 100, 110, 90, 100, 1000));
ichimoku.Update(new TBar(baseTime + (i * 60000), 100, 110, 90, 100, 1000));
}
// 10-period includes the extreme bar
@@ -254,7 +254,7 @@ public sealed class IchimokuValidationTests : IDisposable
Assert.Equal(125.0, ichimoku.SenkouB.Value, Precision);
// Add another bar to drop the extreme
ichimoku.Update(new TBar(baseTime + 10 * 60000, 100, 110, 90, 100, 1000));
ichimoku.Update(new TBar(baseTime + (10 * 60000), 100, 110, 90, 100, 1000));
// Now 10-period window doesn't include extreme bar
// max(110,110,...) = 110, min(90,90,...) = 90
@@ -291,8 +291,8 @@ public sealed class IchimokuValidationTests : IDisposable
for (int i = 0; i < 15; i++)
{
double expectedClose = 100 + i * 1.5;
ichimoku.Update(new TBar(baseTime + i * 60000, expectedClose, expectedClose + 5, expectedClose - 5, expectedClose, 1000));
double expectedClose = 100 + (i * 1.5);
ichimoku.Update(new TBar(baseTime + (i * 60000), expectedClose, expectedClose + 5, expectedClose - 5, expectedClose, 1000));
Assert.Equal(expectedClose, ichimoku.Chikou.Value, Precision);
}
}
@@ -315,14 +315,14 @@ public sealed class IchimokuValidationTests : IDisposable
for (int i = 0; i < 10; i++)
{
double price = 50 + i; // 50 to 59
ichimoku.Update(new TBar(baseTime + i * 60000, price, price + 5, price - 5, price, 1000));
ichimoku.Update(new TBar(baseTime + (i * 60000), price, price + 5, price - 5, price, 1000));
}
// Then jump to much higher prices - affects Tenkan and Kijun more than SenkouB
for (int i = 10; i < 15; i++)
{
double price = 100 + (i - 10) * 2;
ichimoku.Update(new TBar(baseTime + i * 60000, price, price + 5, price - 5, price, 1000));
double price = 100 + ((i - 10) * 2);
ichimoku.Update(new TBar(baseTime + (i * 60000), price, price + 5, price - 5, price, 1000));
}
// In this scenario, SenkouA should be above SenkouB (bullish cloud)
@@ -344,14 +344,14 @@ public sealed class IchimokuValidationTests : IDisposable
for (int i = 0; i < 10; i++)
{
double price = 150 - i; // 150 down to 141
ichimoku.Update(new TBar(baseTime + i * 60000, price, price + 5, price - 5, price, 1000));
ichimoku.Update(new TBar(baseTime + (i * 60000), price, price + 5, price - 5, price, 1000));
}
// Then drop to much lower prices
for (int i = 10; i < 15; i++)
{
double price = 100 - (i - 10) * 3;
ichimoku.Update(new TBar(baseTime + i * 60000, price, price + 5, price - 5, price, 1000));
double price = 100 - ((i - 10) * 3);
ichimoku.Update(new TBar(baseTime + (i * 60000), price, price + 5, price - 5, price, 1000));
}
// In downtrend, SenkouB (longer term) should be above SenkouA (bearish cloud)
@@ -374,9 +374,9 @@ public sealed class IchimokuValidationTests : IDisposable
for (int i = 0; i < 100; i++)
{
// Random walk-ish price movement
double change = Math.Sin(i * 0.1) * 2 + Math.Cos(i * 0.05);
double change = (Math.Sin(i * 0.1) * 2) + Math.Cos(i * 0.05);
price += change;
barSeries.Add(new TBar(baseTime + i * 60000, price, price + 2, price - 2, price, 1000));
barSeries.Add(new TBar(baseTime + (i * 60000), price, price + 2, price - 2, price, 1000));
}
// Process all bars
@@ -406,8 +406,8 @@ public sealed class IchimokuValidationTests : IDisposable
// Process enough bars to warmup
for (int i = 0; i < 70; i++)
{
double price = 40000 + Math.Sin(i * 0.05) * 1000;
ichimoku.Update(new TBar(baseTime + i * 60000, price, price + 50, price - 50, price, 10));
double price = 40000 + (Math.Sin(i * 0.05) * 1000);
ichimoku.Update(new TBar(baseTime + (i * 60000), price, price + 50, price - 50, price, 10));
}
Assert.True(ichimoku.IsHot);
@@ -427,7 +427,7 @@ public sealed class IchimokuValidationTests : IDisposable
for (int i = 0; i < 60; i++)
{
double price = 100 + i;
barSeries.Add(new TBar(baseTime + i * 60000, price, price + 5, price - 5, price, 1000));
barSeries.Add(new TBar(baseTime + (i * 60000), price, price + 5, price - 5, price, 1000));
}
// Batch processing
@@ -472,7 +472,7 @@ public sealed class IchimokuValidationTests : IDisposable
for (int i = 0; i < 60; i++)
{
double price = 100 + i;
barSeries.Add(new TBar(baseTime + i * 60000, price, price + 5, price - 5, price, 1000));
barSeries.Add(new TBar(baseTime + (i * 60000), price, price + 5, price - 5, price, 1000));
}
var (results, indicator) = Ichimoku.Calculate(barSeries);
@@ -500,7 +500,7 @@ public sealed class IchimokuValidationTests : IDisposable
// Phase 1: Ranging market - Tenkan ≈ Kijun
for (int i = 0; i < 5; i++)
{
ichimoku.Update(new TBar(baseTime + i * 60000, 100, 105, 95, 100, 1000));
ichimoku.Update(new TBar(baseTime + (i * 60000), 100, 105, 95, 100, 1000));
}
// Capture initial state (using discards since we're testing the response to change)
@@ -510,8 +510,8 @@ public sealed class IchimokuValidationTests : IDisposable
// Phase 2: Sharp upward move - Tenkan should rise faster
for (int i = 5; i < 10; i++)
{
double price = 100 + (i - 5) * 5;
ichimoku.Update(new TBar(baseTime + i * 60000, price, price + 3, price - 3, price, 1000));
double price = 100 + ((i - 5) * 5);
ichimoku.Update(new TBar(baseTime + (i * 60000), price, price + 3, price - 3, price, 1000));
}
// Tenkan (short-term) should react faster to the uptrend
@@ -689,7 +689,7 @@ public sealed class IchimokuValidationTests : IDisposable
// Build state well past warmup
for (int i = 0; i < 100; i++)
{
double p = 100.0 + 10.0 * Math.Sin(2.0 * Math.PI * i / 20.0);
double p = 100.0 + (10.0 * Math.Sin(2.0 * Math.PI * i / 20.0));
ind.Update(new TBar(t0.AddMinutes(i), p, p + 2, p - 2, p, 1000), isNew: true);
}
@@ -22,7 +22,7 @@ public class TtmSqueezeValidationTests
// Very tight range bars - stddev will be near 0
for (int i = 0; i < 10; i++)
{
squeeze.Update(new TBar(baseTime + i * 60000, 100.0, 100.01, 99.99, 100.0, 1000));
squeeze.Update(new TBar(baseTime + (i * 60000), 100.0, 100.01, 99.99, 100.0, 1000));
}
// With effectively zero stddev, BB bands collapse to the mean
@@ -45,7 +45,7 @@ public class TtmSqueezeValidationTests
double high = 105;
double low = 95;
double close = (high + low) / 2; // exactly at midline
squeeze.Update(new TBar(baseTime + i * 60000, 100, high, low, close, 1000));
squeeze.Update(new TBar(baseTime + (i * 60000), 100, high, low, close, 1000));
}
// Momentum should be near zero since price = midline
@@ -113,7 +113,7 @@ public class TtmSqueezeValidationTests
double midline = 100; // (110 + 90) / 2
double close = midline + (i * 2); // 100, 102, 104, ...
squeeze.Update(new TBar(baseTime + i * 60000, 100, high, low, close, 1000));
squeeze.Update(new TBar(baseTime + (i * 60000), 100, high, low, close, 1000));
}
// Momentum should be strongly positive with rising trend
@@ -135,28 +135,28 @@ public class TtmSqueezeValidationTests
// Uptrend (rising above zero - cyan = 0)
for (int i = 0; i < 5; i++)
{
squeeze.Update(new TBar(baseTime + i * 60000, 100 + i * 2, 105 + i * 2, 95 + i * 2, 103 + i * 2, 1000));
squeeze.Update(new TBar(baseTime + (i * 60000), 100 + (i * 2), 105 + (i * 2), 95 + (i * 2), 103 + (i * 2), 1000));
colorsSeen.Add(squeeze.ColorCode);
}
// Now weakening but still positive (falling above zero - blue = 1)
for (int i = 5; i < 10; i++)
{
squeeze.Update(new TBar(baseTime + i * 60000, 115, 118, 112, 114, 1000));
squeeze.Update(new TBar(baseTime + (i * 60000), 115, 118, 112, 114, 1000));
colorsSeen.Add(squeeze.ColorCode);
}
// Downtrend (falling below zero - red = 2)
for (int i = 10; i < 15; i++)
{
squeeze.Update(new TBar(baseTime + i * 60000, 100 - (i - 10) * 3, 102 - (i - 10) * 3, 95 - (i - 10) * 3, 97 - (i - 10) * 3, 1000));
squeeze.Update(new TBar(baseTime + (i * 60000), 100 - ((i - 10) * 3), 102 - ((i - 10) * 3), 95 - ((i - 10) * 3), 97 - ((i - 10) * 3), 1000));
colorsSeen.Add(squeeze.ColorCode);
}
// Recovering but still negative (rising below zero - yellow = 3)
for (int i = 15; i < 20; i++)
{
squeeze.Update(new TBar(baseTime + i * 60000, 80, 85, 78, 82, 1000));
squeeze.Update(new TBar(baseTime + (i * 60000), 80, 85, 78, 82, 1000));
colorsSeen.Add(squeeze.ColorCode);
}
@@ -173,7 +173,7 @@ public class TtmSqueezeValidationTests
// Strong uptrend to ensure positive and rising momentum
for (int i = 0; i < 10; i++)
{
squeeze.Update(new TBar(baseTime + i * 60000, 100 + i * 5, 105 + i * 5, 95 + i * 5, 103 + i * 5, 1000));
squeeze.Update(new TBar(baseTime + (i * 60000), 100 + (i * 5), 105 + (i * 5), 95 + (i * 5), 103 + (i * 5), 1000));
}
if (squeeze.MomentumPositive && squeeze.MomentumRising)
@@ -191,7 +191,7 @@ public class TtmSqueezeValidationTests
// Strong downtrend to ensure negative and falling momentum
for (int i = 0; i < 10; i++)
{
squeeze.Update(new TBar(baseTime + i * 60000, 100 - i * 5, 105 - i * 5, 95 - i * 5, 97 - i * 5, 1000));
squeeze.Update(new TBar(baseTime + (i * 60000), 100 - (i * 5), 105 - (i * 5), 95 - (i * 5), 97 - (i * 5), 1000));
}
if (!squeeze.MomentumPositive && !squeeze.MomentumRising)
@@ -215,7 +215,7 @@ public class TtmSqueezeValidationTests
// Start with tight range to build squeeze
for (int i = 0; i < 5; i++)
{
squeeze.Update(new TBar(baseTime + i * 60000, 100, 100.1, 99.9, 100, 1000));
squeeze.Update(new TBar(baseTime + (i * 60000), 100, 100.1, 99.9, 100, 1000));
if (squeeze.SqueezeFired)
{
squeezeFiredCount++;
@@ -226,7 +226,7 @@ public class TtmSqueezeValidationTests
for (int i = 5; i < 10; i++)
{
double volatility = (i - 4) * 5;
squeeze.Update(new TBar(baseTime + i * 60000, 100, 100 + volatility, 100 - volatility, 100 + volatility - 2, 1000));
squeeze.Update(new TBar(baseTime + (i * 60000), 100, 100 + volatility, 100 - volatility, 100 + volatility - 2, 1000));
if (squeeze.SqueezeFired)
{
squeezeFiredCount++;
@@ -250,10 +250,10 @@ public class TtmSqueezeValidationTests
for (int i = 0; i < 50; i++)
{
double price = 100 + Math.Sin(i * 0.2) * 10;
double price = 100 + (Math.Sin(i * 0.2) * 10);
double high = price + 2;
double low = price - 2;
source.Add(new TBar(baseTime + i * 60000, price, high, low, price + 0.5, 1000));
source.Add(new TBar(baseTime + (i * 60000), price, high, low, price + 0.5, 1000));
}
// Batch calculation
@@ -301,7 +301,7 @@ public class TtmSqueezeValidationTests
// All bars identical
for (int i = 0; i < 10; i++)
{
squeeze.Update(new TBar(baseTime + i * 60000, 100, 100, 100, 100, 1000));
squeeze.Update(new TBar(baseTime + (i * 60000), 100, 100, 100, 100, 1000));
}
Assert.True(double.IsFinite(squeeze.Momentum.Value));
@@ -318,7 +318,7 @@ public class TtmSqueezeValidationTests
for (int i = 0; i < 10; i++)
{
double range = (i + 1) * 100; // Increasing volatility
squeeze.Update(new TBar(baseTime + i * 60000, 100, 100 + range, 100 - range, 100 + range / 2, 1000));
squeeze.Update(new TBar(baseTime + (i * 60000), 100, 100 + range, 100 - range, 100 + (range / 2), 1000));
}
Assert.True(double.IsFinite(squeeze.Momentum.Value));
@@ -334,7 +334,7 @@ public class TtmSqueezeValidationTests
// Build state well past warmup
for (int i = 0; i < 100; i++)
{
double p = 100.0 + 10.0 * Math.Sin(2.0 * Math.PI * i / 20.0);
double p = 100.0 + (10.0 * Math.Sin(2.0 * Math.PI * i / 20.0));
ind.Update(new TBar(t0.AddMinutes(i), p, p + 2, p - 2, p, 1000), isNew: true);
}
+12 -13
View File
@@ -210,8 +210,8 @@ public sealed class TtmSqueeze : ITValuePublisher
// Precompute linear regression constants
_sumX = 0.5 * momPeriod * (momPeriod - 1);
double sumX2 = (momPeriod - 1.0) * momPeriod * (2.0 * momPeriod - 1.0) / 6.0;
_denominator = momPeriod * sumX2 - _sumX * _sumX;
double sumX2 = (momPeriod - 1.0) * momPeriod * ((2.0 * momPeriod) - 1.0) / 6.0;
_denominator = (momPeriod * sumX2) - (_sumX * _sumX);
Reset();
}
@@ -328,11 +328,11 @@ public sealed class TtmSqueeze : ITValuePublisher
double bbCount = Math.Min(_barCount, _bbPeriod);
double bbMean = bbCount > 0 ? _priceSum / bbCount : close;
double bbVariance = bbCount > 1 ? (_priceSumSquares - _priceSum * _priceSum / bbCount) / bbCount : 0;
double bbVariance = bbCount > 1 ? (_priceSumSquares - (_priceSum * _priceSum / bbCount)) / bbCount : 0;
double bbStdDev = Math.Sqrt(Math.Max(0, bbVariance));
double bbUpper = bbMean + _bbMult * bbStdDev;
double bbLower = bbMean - _bbMult * bbStdDev;
double bbUpper = bbMean + (_bbMult * bbStdDev);
double bbLower = bbMean - (_bbMult * bbStdDev);
// === Keltner Channel Calculation ===
// EMA with warmup compensation
@@ -354,8 +354,8 @@ public sealed class TtmSqueeze : ITValuePublisher
_atrE = Math.FusedMultiplyAdd(_atrE, 1 - atrAlpha, 0);
double atr = _atrE < 1.0 ? _atrRma / (1.0 - _atrE) : _atrRma;
double kcUpper = kcMid + _kcMult * atr;
double kcLower = kcMid - _kcMult * atr;
double kcUpper = kcMid + (_kcMult * atr);
double kcLower = kcMid - (_kcMult * atr);
// === Squeeze Detection ===
bool wasSqueezeOn = _prevSqueezeOn;
@@ -380,7 +380,7 @@ public sealed class TtmSqueeze : ITValuePublisher
{
double oldest = _momentumBuffer[0];
double prevSumY = _momentumSumY;
_momentumSumXY = _momentumSumXY + prevSumY - _momPeriod * oldest;
_momentumSumXY = _momentumSumXY + prevSumY - (_momPeriod * oldest);
_momentumSumY -= oldest;
}
_momentumBuffer.Add(deviation);
@@ -411,8 +411,8 @@ public sealed class TtmSqueeze : ITValuePublisher
if (momCount < _momPeriod)
{
sx = 0.5 * n * (n - 1);
double sx2 = (n - 1.0) * n * (2.0 * n - 1.0) / 6.0;
denom = n * sx2 - sx * sx;
double sx2 = (n - 1.0) * n * ((2.0 * n) - 1.0) / 6.0;
denom = (n * sx2) - (sx * sx);
}
else
{
@@ -426,8 +426,8 @@ public sealed class TtmSqueeze : ITValuePublisher
}
else
{
double slope = (n * _momentumSumXY - sx * _momentumSumY) / denom;
double intercept = (_momentumSumY - slope * sx) / n;
double slope = ((n * _momentumSumXY) - (sx * _momentumSumY)) / denom;
double intercept = (_momentumSumY - (slope * sx)) / n;
// Regression value at current point (x = count - 1)
momentum = Math.FusedMultiplyAdd(slope, n - 1, intercept);
}
@@ -561,5 +561,4 @@ public sealed class TtmSqueeze : ITValuePublisher
_lowBuffer.Restore();
_momentumBuffer.Restore();
}
}