mirror of
https://github.com/mihakralj/QuanTAlib.git
synced 2026-08-12 15:48:05 +00:00
[CodeFactor] Apply fixes to commit 4a01f03
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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