mirror of
https://github.com/mihakralj/QuanTAlib.git
synced 2026-08-18 02:28:05 +00:00
[CodeFactor] Apply fixes to commit 4a01f03
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user