mirror of
https://github.com/mihakralj/QuanTAlib.git
synced 2026-08-08 14:07:44 +00:00
[CodeFactor] Apply fixes to commit 0606491
This commit is contained in:
@@ -608,7 +608,7 @@ public class AberrTests
|
||||
var series = new TSeries();
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
series.Add(DateTime.UtcNow, 100 + i * 10); // 100, 110, 120, ...
|
||||
series.Add(DateTime.UtcNow, 100 + (i * 10)); // 100, 110, 120, ...
|
||||
}
|
||||
|
||||
// Multiplier 1.0
|
||||
|
||||
@@ -179,8 +179,8 @@ public class AccBandsTests
|
||||
// SMA(3) of adjLow: (54 + 58.80952 + 63.63636) / 3 ≈ 58.81529
|
||||
// SMA(3) of Close: (100+105+110)/3 = 105
|
||||
|
||||
double expectedUpper = (154.0 + 115.0 * (1.0 + 4.0 * 20.0 / 210.0) + 120.0 * (1.0 + 4.0 * 20.0 / 220.0)) / 3.0;
|
||||
double expectedLower = (54.0 + 95.0 * (1.0 - 4.0 * 20.0 / 210.0) + 100.0 * (1.0 - 4.0 * 20.0 / 220.0)) / 3.0;
|
||||
double expectedUpper = (154.0 + (115.0 * (1.0 + (4.0 * 20.0 / 210.0))) + (120.0 * (1.0 + (4.0 * 20.0 / 220.0)))) / 3.0;
|
||||
double expectedLower = (54.0 + (95.0 * (1.0 - (4.0 * 20.0 / 210.0))) + (100.0 * (1.0 - (4.0 * 20.0 / 220.0)))) / 3.0;
|
||||
|
||||
Assert.Equal(105.0, accBands.Last.Value, 1e-10);
|
||||
Assert.Equal(expectedUpper, accBands.Upper.Value, 1e-10);
|
||||
@@ -399,8 +399,8 @@ public class AccBandsTests
|
||||
// adjLow = 100*(1-4*0.090909) = 100*0.636364 ≈ 63.63636
|
||||
accBands.Update(new TBar(DateTime.UtcNow, 110, 120, 100, 110, 1000));
|
||||
Assert.Equal(110.0, accBands.Last.Value, 1e-10);
|
||||
Assert.Equal(120.0 * (1.0 + 4.0 * 20.0 / 220.0), accBands.Upper.Value, 1e-10);
|
||||
Assert.Equal(100.0 * (1.0 - 4.0 * 20.0 / 220.0), accBands.Lower.Value, 1e-10);
|
||||
Assert.Equal(120.0 * (1.0 + (4.0 * 20.0 / 220.0)), accBands.Upper.Value, 1e-10);
|
||||
Assert.Equal(100.0 * (1.0 - (4.0 * 20.0 / 220.0)), accBands.Lower.Value, 1e-10);
|
||||
}
|
||||
|
||||
// ============== Span API Tests ==============
|
||||
@@ -496,12 +496,12 @@ public class AccBandsTests
|
||||
// Bar 2: H=120, L=100 => w=20/220, adjH=120*(1+4*20/220), adjL=100*(1-4*20/220)
|
||||
// SMA(3) of Close: (100+105+110)/3 = 105
|
||||
|
||||
double adjH0 = 110.0 * (1.0 + 4.0 * 20.0 / 200.0);
|
||||
double adjH1 = 115.0 * (1.0 + 4.0 * 20.0 / 210.0);
|
||||
double adjH2 = 120.0 * (1.0 + 4.0 * 20.0 / 220.0);
|
||||
double adjL0 = 90.0 * (1.0 - 4.0 * 20.0 / 200.0);
|
||||
double adjL1 = 95.0 * (1.0 - 4.0 * 20.0 / 210.0);
|
||||
double adjL2 = 100.0 * (1.0 - 4.0 * 20.0 / 220.0);
|
||||
double adjH0 = 110.0 * (1.0 + (4.0 * 20.0 / 200.0));
|
||||
double adjH1 = 115.0 * (1.0 + (4.0 * 20.0 / 210.0));
|
||||
double adjH2 = 120.0 * (1.0 + (4.0 * 20.0 / 220.0));
|
||||
double adjL0 = 90.0 * (1.0 - (4.0 * 20.0 / 200.0));
|
||||
double adjL1 = 95.0 * (1.0 - (4.0 * 20.0 / 210.0));
|
||||
double adjL2 = 100.0 * (1.0 - (4.0 * 20.0 / 220.0));
|
||||
|
||||
Assert.Equal(105.0, middle[2], 1e-10);
|
||||
Assert.Equal((adjH0 + adjH1 + adjH2) / 3.0, upper[2], 1e-10);
|
||||
@@ -657,12 +657,12 @@ public class AccBandsTests
|
||||
// Bar 2: H=120,L=100,C=110 -> w=20/220, adjH=120*(1+80/220), adjL=100*(1-80/220)
|
||||
// Bar 3: H=125,L=105,C=115 -> w=20/230, adjH=125*(1+80/230), adjL=105*(1-80/230)
|
||||
// Bar 4: H=130,L=110,C=120 -> w=20/240, adjH=130*(1+80/240), adjL=110*(1-80/240)
|
||||
double adjH2 = 120.0 * (1.0 + 4.0 * 20.0 / 220.0);
|
||||
double adjL2 = 100.0 * (1.0 - 4.0 * 20.0 / 220.0);
|
||||
double adjH3 = 125.0 * (1.0 + 4.0 * 20.0 / 230.0);
|
||||
double adjL3 = 105.0 * (1.0 - 4.0 * 20.0 / 230.0);
|
||||
double adjH4 = 130.0 * (1.0 + 4.0 * 20.0 / 240.0);
|
||||
double adjL4 = 110.0 * (1.0 - 4.0 * 20.0 / 240.0);
|
||||
double adjH2 = 120.0 * (1.0 + (4.0 * 20.0 / 220.0));
|
||||
double adjL2 = 100.0 * (1.0 - (4.0 * 20.0 / 220.0));
|
||||
double adjH3 = 125.0 * (1.0 + (4.0 * 20.0 / 230.0));
|
||||
double adjL3 = 105.0 * (1.0 - (4.0 * 20.0 / 230.0));
|
||||
double adjH4 = 130.0 * (1.0 + (4.0 * 20.0 / 240.0));
|
||||
double adjL4 = 110.0 * (1.0 - (4.0 * 20.0 / 240.0));
|
||||
|
||||
Assert.Equal(115.0, accBands.Last.Value, 1e-10);
|
||||
Assert.Equal((adjH2 + adjH3 + adjH4) / 3.0, accBands.Upper.Value, 1e-10);
|
||||
@@ -672,8 +672,8 @@ public class AccBandsTests
|
||||
accBands.Update(new TBar(DateTime.UtcNow, 125, 135, 115, 125, 1000));
|
||||
// New window: bars [3,4,5]
|
||||
// Bar 5: H=135,L=115,C=125 -> w=20/250, adjH=135*(1+80/250), adjL=115*(1-80/250)
|
||||
double adjH5 = 135.0 * (1.0 + 4.0 * 20.0 / 250.0);
|
||||
double adjL5 = 115.0 * (1.0 - 4.0 * 20.0 / 250.0);
|
||||
double adjH5 = 135.0 * (1.0 + (4.0 * 20.0 / 250.0));
|
||||
double adjL5 = 115.0 * (1.0 - (4.0 * 20.0 / 250.0));
|
||||
|
||||
Assert.Equal(120.0, accBands.Last.Value, 1e-10);
|
||||
Assert.Equal((adjH3 + adjH4 + adjH5) / 3.0, accBands.Upper.Value, 1e-10);
|
||||
|
||||
@@ -63,12 +63,12 @@ public sealed class AccBandsValidationTests : IDisposable
|
||||
var accBands = new AccBands(3, 4.0);
|
||||
var (middle, upper, lower) = accBands.Update(series);
|
||||
|
||||
double adjH0 = 12.0 * (1.0 + 4.0 * 4.0 / 20.0);
|
||||
double adjH1 = 14.0 * (1.0 + 4.0 * 4.0 / 24.0);
|
||||
double adjH2 = 16.0 * (1.0 + 4.0 * 4.0 / 28.0);
|
||||
double adjL0 = 8.0 * (1.0 - 4.0 * 4.0 / 20.0);
|
||||
double adjL1 = 10.0 * (1.0 - 4.0 * 4.0 / 24.0);
|
||||
double adjL2 = 12.0 * (1.0 - 4.0 * 4.0 / 28.0);
|
||||
double adjH0 = 12.0 * (1.0 + (4.0 * 4.0 / 20.0));
|
||||
double adjH1 = 14.0 * (1.0 + (4.0 * 4.0 / 24.0));
|
||||
double adjH2 = 16.0 * (1.0 + (4.0 * 4.0 / 28.0));
|
||||
double adjL0 = 8.0 * (1.0 - (4.0 * 4.0 / 20.0));
|
||||
double adjL1 = 10.0 * (1.0 - (4.0 * 4.0 / 24.0));
|
||||
double adjL2 = 12.0 * (1.0 - (4.0 * 4.0 / 28.0));
|
||||
|
||||
Assert.Equal(12.0, middle.Last.Value, 1e-10);
|
||||
Assert.Equal((adjH0 + adjH1 + adjH2) / 3.0, upper.Last.Value, 1e-10);
|
||||
@@ -106,8 +106,8 @@ public sealed class AccBandsValidationTests : IDisposable
|
||||
double l = c - 5;
|
||||
double denom = h + l;
|
||||
double w = (h - l) / denom;
|
||||
sumAdjH += h * (1.0 + 4.0 * w);
|
||||
sumAdjL += l * (1.0 - 4.0 * w);
|
||||
sumAdjH += h * (1.0 + (4.0 * w));
|
||||
sumAdjL += l * (1.0 - (4.0 * w));
|
||||
}
|
||||
Assert.Equal(sumAdjH / 5.0, upper.Last.Value, 1e-10);
|
||||
Assert.Equal(sumAdjL / 5.0, lower.Last.Value, 1e-10);
|
||||
|
||||
@@ -39,7 +39,6 @@ public sealed class ApchannelValidationTests : IDisposable
|
||||
/// we validate against mathematical correctness by comparing the span and streaming results
|
||||
/// with manually calculated EMA values for high and low prices.
|
||||
/// </summary>
|
||||
|
||||
[Fact]
|
||||
public void Validate_AllModes_ProduceSameResult()
|
||||
{
|
||||
|
||||
@@ -168,7 +168,7 @@ public class ApzTests
|
||||
// Generate 9 corrections with isNew=false (different values)
|
||||
for (int i = 0; i < 9; i++)
|
||||
{
|
||||
var correctionBar = new TBar(tenthBar.Time, tenthBar.Open + i, tenthBar.High + i * 2, tenthBar.Low - i, tenthBar.Close + i, tenthBar.Volume);
|
||||
var correctionBar = new TBar(tenthBar.Time, tenthBar.Open + i, tenthBar.High + (i * 2), tenthBar.Low - i, tenthBar.Close + i, tenthBar.Volume);
|
||||
apz.Update(correctionBar, isNew: false);
|
||||
}
|
||||
|
||||
|
||||
@@ -383,7 +383,7 @@ public sealed class ApzValidationTests : IDisposable
|
||||
}
|
||||
else
|
||||
{
|
||||
ema = alpha * bar.Close + (1 - alpha) * ema;
|
||||
ema = (alpha * bar.Close) + ((1 - alpha) * ema);
|
||||
}
|
||||
|
||||
emaResults.Add(ema);
|
||||
|
||||
@@ -332,8 +332,8 @@ public sealed class AtrBandsValidationTests : IDisposable
|
||||
|
||||
double expectedMid = smaResult[i].Sma!.Value;
|
||||
double expectedAtr = atrResult[i].Atr!.Value;
|
||||
double expectedUp = expectedMid + multiplier * expectedAtr;
|
||||
double expectedLo = expectedMid - multiplier * expectedAtr;
|
||||
double expectedUp = expectedMid + (multiplier * expectedAtr);
|
||||
double expectedLo = expectedMid - (multiplier * expectedAtr);
|
||||
|
||||
Assert.True(
|
||||
Math.Abs(qMid[i].Value - expectedMid) <= ValidationHelper.SkenderTolerance,
|
||||
|
||||
@@ -411,7 +411,7 @@ public class BbandsTests
|
||||
DateTime startTime = DateTime.UtcNow;
|
||||
for (int i = 0; i < data.Length; i++)
|
||||
{
|
||||
streamBbands.Update(new TValue(startTime + i * TimeSpan.FromSeconds(1), data[i]), isNew: true);
|
||||
streamBbands.Update(new TValue(startTime + (i * TimeSpan.FromSeconds(1)), data[i]), isNew: true);
|
||||
}
|
||||
|
||||
Assert.Equal(streamBbands.Middle.Value, primedBbands.Middle.Value, precision: 10);
|
||||
|
||||
@@ -22,7 +22,7 @@ public class JbandsIndicatorTests
|
||||
public void MinHistoryDepths_MatchesWarmupFormula()
|
||||
{
|
||||
var ind = new JbandsIndicator { Period = 14 };
|
||||
int expected = (int)Math.Ceiling(20.0 + 80.0 * Math.Pow(14, 0.36));
|
||||
int expected = (int)Math.Ceiling(20.0 + (80.0 * Math.Pow(14, 0.36)));
|
||||
Assert.Equal(expected, ind.MinHistoryDepths);
|
||||
}
|
||||
|
||||
@@ -155,7 +155,7 @@ public class JbandsIndicatorTests
|
||||
var now = DateTime.UtcNow;
|
||||
for (int i = 0; i < 30; i++)
|
||||
{
|
||||
double price = 100 + Math.Sin(i * 0.3) * 10;
|
||||
double price = 100 + (Math.Sin(i * 0.3) * 10);
|
||||
indZero.HistoricalData.AddBar(now.AddMinutes(i), price - 1, price + 2, price - 2, price);
|
||||
indPos.HistoricalData.AddBar(now.AddMinutes(i), price - 1, price + 2, price - 2, price);
|
||||
indZero.ProcessUpdate(new UpdateArgs(i == 0 ? UpdateReason.HistoricalBar : UpdateReason.NewBar));
|
||||
@@ -185,7 +185,7 @@ public class JbandsIndicatorTests
|
||||
var now = DateTime.UtcNow;
|
||||
for (int i = 0; i < 30; i++)
|
||||
{
|
||||
double price = 100 + Math.Sin(i * 0.3) * 10;
|
||||
double price = 100 + (Math.Sin(i * 0.3) * 10);
|
||||
indPos.HistoricalData.AddBar(now.AddMinutes(i), price - 1, price + 2, price - 2, price);
|
||||
indNeg.HistoricalData.AddBar(now.AddMinutes(i), price - 1, price + 2, price - 2, price);
|
||||
indPos.ProcessUpdate(new UpdateArgs(i == 0 ? UpdateReason.HistoricalBar : UpdateReason.NewBar));
|
||||
|
||||
@@ -617,7 +617,7 @@ public class JbandsTests
|
||||
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
var val = new TValue(DateTime.UtcNow.AddMinutes(i), 100 + i * 0.5);
|
||||
var val = new TValue(DateTime.UtcNow.AddMinutes(i), 100 + (i * 0.5));
|
||||
src.Add(val.Time, val.Value);
|
||||
j.Update(val, isNew: true);
|
||||
}
|
||||
|
||||
@@ -158,7 +158,7 @@ public class MaenvTests
|
||||
// Actual: first bar w=9, second bar: newest w=9, oldest w=6; sum=110*9+100*6=990+600=1590; norm=15
|
||||
// WMA = 1590/15 = 106
|
||||
m.Update(new TValue(DateTime.UtcNow, 110));
|
||||
double expected2 = (110 * 9 + 100 * 6) / 15.0;
|
||||
double expected2 = ((110 * 9) + (100 * 6)) / 15.0;
|
||||
Assert.Equal(expected2, m.Last.Value, 1e-10);
|
||||
}
|
||||
|
||||
|
||||
@@ -120,11 +120,11 @@ public sealed class MaenvValidationTests : IDisposable
|
||||
Assert.Equal(100.0, ind.Last.Value, 1e-10);
|
||||
|
||||
ind.Update(series[1]);
|
||||
double expected2 = (110.0 * 9 + 100.0 * 6) / 15.0;
|
||||
double expected2 = ((110.0 * 9) + (100.0 * 6)) / 15.0;
|
||||
Assert.Equal(expected2, ind.Last.Value, 1e-10);
|
||||
|
||||
ind.Update(series[2]);
|
||||
double expected3 = (120.0 * 9 + 110.0 * 6 + 100.0 * 3) / 18.0;
|
||||
double expected3 = ((120.0 * 9) + (110.0 * 6) + (100.0 * 3)) / 18.0;
|
||||
Assert.Equal(expected3, ind.Last.Value, 1e-10);
|
||||
|
||||
_output.WriteLine("Maenv WMA manual calculation validated");
|
||||
|
||||
@@ -129,7 +129,7 @@ public class RegchannelIndicatorTests
|
||||
// Add some volatility to ensure non-zero stddev
|
||||
for (int i = 0; i < 20; i++)
|
||||
{
|
||||
double price = 100 + Math.Sin(i * 0.5) * 10;
|
||||
double price = 100 + (Math.Sin(i * 0.5) * 10);
|
||||
ind.HistoricalData.AddBar(now.AddMinutes(i), price, price + 5, price - 5, price, 1000);
|
||||
ind.ProcessUpdate(new UpdateArgs(i == 0 ? UpdateReason.HistoricalBar : UpdateReason.NewBar));
|
||||
}
|
||||
@@ -173,7 +173,7 @@ public class RegchannelIndicatorTests
|
||||
var now = DateTime.UtcNow;
|
||||
for (int i = 0; i < 20; i++)
|
||||
{
|
||||
double price = 100 + i * 0.5;
|
||||
double price = 100 + (i * 0.5);
|
||||
ind1.HistoricalData.AddBar(now.AddMinutes(i), price, price + 5, price - 5, price);
|
||||
ind2.HistoricalData.AddBar(now.AddMinutes(i), price, price + 5, price - 5, price);
|
||||
ind1.ProcessUpdate(new UpdateArgs(i == 0 ? UpdateReason.HistoricalBar : UpdateReason.NewBar));
|
||||
@@ -266,14 +266,14 @@ public class RegchannelIndicatorTests
|
||||
var now = DateTime.UtcNow;
|
||||
for (int i = 0; i < 30; i++)
|
||||
{
|
||||
double price = 100 + i * 2; // Strong uptrend
|
||||
double price = 100 + (i * 2); // Strong uptrend
|
||||
ind.HistoricalData.AddBar(now.AddMinutes(i), price, price + 2, price - 2, price);
|
||||
ind.ProcessUpdate(new UpdateArgs(i == 0 ? UpdateReason.HistoricalBar : UpdateReason.NewBar));
|
||||
}
|
||||
|
||||
// After warmup, middle should be close to the current regression line value
|
||||
double middle = ind.LinesSeries[0].GetValue(0);
|
||||
double lastPrice = 100 + 29 * 2; // 158
|
||||
double lastPrice = 100 + (29 * 2); // 158
|
||||
|
||||
// Middle should be close to last price (within reasonable range for regression)
|
||||
Assert.True(Math.Abs(middle - lastPrice) < 10, $"Middle ({middle}) should be close to last price ({lastPrice})");
|
||||
|
||||
@@ -90,7 +90,7 @@ public class RegchannelTests
|
||||
// Feed perfect linear data: y = 100 + 2*i (slope = 2)
|
||||
for (int i = 0; i < 20; i++)
|
||||
{
|
||||
ind.Update(new TValue(now.AddMinutes(i), 100 + 2 * i));
|
||||
ind.Update(new TValue(now.AddMinutes(i), 100 + (2 * i)));
|
||||
}
|
||||
|
||||
// Slope should be 2
|
||||
@@ -107,13 +107,13 @@ public class RegchannelTests
|
||||
// Low volatility: close to linear
|
||||
for (int i = 0; i < 20; i++)
|
||||
{
|
||||
ind1.Update(new TValue(now.AddMinutes(i), 100 + i + 0.1 * Math.Sin(i)));
|
||||
ind1.Update(new TValue(now.AddMinutes(i), 100 + i + (0.1 * Math.Sin(i))));
|
||||
}
|
||||
|
||||
// High volatility: large deviations from linear
|
||||
for (int i = 0; i < 20; i++)
|
||||
{
|
||||
ind2.Update(new TValue(now.AddMinutes(i), 100 + i + 5 * Math.Sin(i)));
|
||||
ind2.Update(new TValue(now.AddMinutes(i), 100 + i + (5 * Math.Sin(i))));
|
||||
}
|
||||
|
||||
double width1 = ind1.Upper.Value - ind1.Lower.Value;
|
||||
@@ -130,7 +130,7 @@ public class RegchannelTests
|
||||
|
||||
for (int i = 0; i < 20; i++)
|
||||
{
|
||||
ind.Update(new TValue(now.AddMinutes(i), 100 + i + Math.Sin(i) * 3));
|
||||
ind.Update(new TValue(now.AddMinutes(i), 100 + i + (Math.Sin(i) * 3)));
|
||||
}
|
||||
|
||||
double upperDist = ind.Upper.Value - ind.Last.Value;
|
||||
@@ -148,7 +148,7 @@ public class RegchannelTests
|
||||
|
||||
for (int i = 0; i < 20; i++)
|
||||
{
|
||||
double val = 100 + i + Math.Sin(i) * 3;
|
||||
double val = 100 + i + (Math.Sin(i) * 3);
|
||||
ind1.Update(new TValue(now.AddMinutes(i), val));
|
||||
ind2.Update(new TValue(now.AddMinutes(i), val));
|
||||
}
|
||||
@@ -465,7 +465,7 @@ public class RegchannelTests
|
||||
|
||||
for (int i = 0; i < 10000; i++)
|
||||
{
|
||||
double val = 100 + Math.Sin(i * 0.01) * 10 + i * 0.001;
|
||||
double val = 100 + (Math.Sin(i * 0.01) * 10) + (i * 0.001);
|
||||
ind.Update(new TValue(now.AddMinutes(i), val));
|
||||
}
|
||||
|
||||
|
||||
@@ -81,7 +81,7 @@ public sealed class RegchannelValidationTests : IDisposable
|
||||
// Perfect linear trend: 100, 110, 120, 130, 140
|
||||
for (int i = 0; i < 5; i++)
|
||||
{
|
||||
series.Add(new TValue(t0.AddMinutes(i), 100 + i * 10));
|
||||
series.Add(new TValue(t0.AddMinutes(i), 100 + (i * 10)));
|
||||
}
|
||||
|
||||
var ind = new Regchannel(5, 2.0);
|
||||
@@ -424,7 +424,7 @@ public sealed class RegchannelValidationTests : IDisposable
|
||||
var t0 = DateTime.UtcNow;
|
||||
for (int i = 0; i < 20; i++)
|
||||
{
|
||||
uptrend.Add(new TValue(t0.AddMinutes(i), 100 + i * 2 + (i % 3))); // Noisy uptrend
|
||||
uptrend.Add(new TValue(t0.AddMinutes(i), 100 + (i * 2) + (i % 3))); // Noisy uptrend
|
||||
}
|
||||
|
||||
var indUp = new Regchannel(10, 2.0);
|
||||
@@ -438,7 +438,7 @@ public sealed class RegchannelValidationTests : IDisposable
|
||||
var downtrend = new TSeries();
|
||||
for (int i = 0; i < 20; i++)
|
||||
{
|
||||
downtrend.Add(new TValue(t0.AddMinutes(i), 200 - i * 2 + (i % 3))); // Noisy downtrend
|
||||
downtrend.Add(new TValue(t0.AddMinutes(i), 200 - (i * 2) + (i % 3))); // Noisy downtrend
|
||||
}
|
||||
|
||||
var indDown = new Regchannel(10, 2.0);
|
||||
|
||||
@@ -129,7 +129,7 @@ public class SdchannelIndicatorTests
|
||||
// Add some volatility to ensure non-zero stddev
|
||||
for (int i = 0; i < 20; i++)
|
||||
{
|
||||
double price = 100 + Math.Sin(i * 0.5) * 10;
|
||||
double price = 100 + (Math.Sin(i * 0.5) * 10);
|
||||
ind.HistoricalData.AddBar(now.AddMinutes(i), price, price + 5, price - 5, price, 1000);
|
||||
ind.ProcessUpdate(new UpdateArgs(i == 0 ? UpdateReason.HistoricalBar : UpdateReason.NewBar));
|
||||
}
|
||||
@@ -173,7 +173,7 @@ public class SdchannelIndicatorTests
|
||||
var now = DateTime.UtcNow;
|
||||
for (int i = 0; i < 20; i++)
|
||||
{
|
||||
double price = 100 + i * 0.5;
|
||||
double price = 100 + (i * 0.5);
|
||||
ind1.HistoricalData.AddBar(now.AddMinutes(i), price, price + 5, price - 5, price);
|
||||
ind2.HistoricalData.AddBar(now.AddMinutes(i), price, price + 5, price - 5, price);
|
||||
ind1.ProcessUpdate(new UpdateArgs(i == 0 ? UpdateReason.HistoricalBar : UpdateReason.NewBar));
|
||||
@@ -266,14 +266,14 @@ public class SdchannelIndicatorTests
|
||||
var now = DateTime.UtcNow;
|
||||
for (int i = 0; i < 30; i++)
|
||||
{
|
||||
double price = 100 + i * 2; // Strong uptrend
|
||||
double price = 100 + (i * 2); // Strong uptrend
|
||||
ind.HistoricalData.AddBar(now.AddMinutes(i), price, price + 2, price - 2, price);
|
||||
ind.ProcessUpdate(new UpdateArgs(i == 0 ? UpdateReason.HistoricalBar : UpdateReason.NewBar));
|
||||
}
|
||||
|
||||
// After warmup, middle should be close to the current regression line value
|
||||
double middle = ind.LinesSeries[0].GetValue(0);
|
||||
double lastPrice = 100 + 29 * 2; // 158
|
||||
double lastPrice = 100 + (29 * 2); // 158
|
||||
|
||||
// Middle should be close to last price (within reasonable range for regression)
|
||||
Assert.True(Math.Abs(middle - lastPrice) < 10, $"Middle ({middle}) should be close to last price ({lastPrice})");
|
||||
|
||||
@@ -192,7 +192,7 @@ public class SdchannelTests
|
||||
// Perfect linear trend: 100, 102, 104, 106, 108
|
||||
for (int i = 0; i < 5; i++)
|
||||
{
|
||||
s.Update(new TValue(DateTime.UtcNow, 100 + i * 2));
|
||||
s.Update(new TValue(DateTime.UtcNow, 100 + (i * 2)));
|
||||
}
|
||||
|
||||
// All points lie exactly on regression line
|
||||
|
||||
@@ -90,7 +90,7 @@ public sealed class SdchannelValidationTests : IDisposable
|
||||
// Perfect linear trend: 100, 110, 120, 130, 140
|
||||
for (int i = 0; i < 5; i++)
|
||||
{
|
||||
series.Add(new TValue(t0.AddMinutes(i), 100 + i * 10));
|
||||
series.Add(new TValue(t0.AddMinutes(i), 100 + (i * 10)));
|
||||
}
|
||||
|
||||
var ind = new Sdchannel(5, 2.0);
|
||||
@@ -433,7 +433,7 @@ public sealed class SdchannelValidationTests : IDisposable
|
||||
var t0 = DateTime.UtcNow;
|
||||
for (int i = 0; i < 20; i++)
|
||||
{
|
||||
uptrend.Add(new TValue(t0.AddMinutes(i), 100 + i * 2 + (i % 3))); // Noisy uptrend
|
||||
uptrend.Add(new TValue(t0.AddMinutes(i), 100 + (i * 2) + (i % 3))); // Noisy uptrend
|
||||
}
|
||||
|
||||
var indUp = new Sdchannel(10, 2.0);
|
||||
@@ -447,7 +447,7 @@ public sealed class SdchannelValidationTests : IDisposable
|
||||
var downtrend = new TSeries();
|
||||
for (int i = 0; i < 20; i++)
|
||||
{
|
||||
downtrend.Add(new TValue(t0.AddMinutes(i), 200 - i * 2 + (i % 3))); // Noisy downtrend
|
||||
downtrend.Add(new TValue(t0.AddMinutes(i), 200 - (i * 2) + (i % 3))); // Noisy downtrend
|
||||
}
|
||||
|
||||
var indDown = new Sdchannel(10, 2.0);
|
||||
|
||||
@@ -396,7 +396,7 @@ public sealed class StarchannelValidationTests : IDisposable
|
||||
// Create predictable data: 100, 102, 104, 106, 108
|
||||
for (int i = 0; i < 5; i++)
|
||||
{
|
||||
double close = 100 + i * 2;
|
||||
double close = 100 + (i * 2);
|
||||
series.Add(new TBar(t0.AddMinutes(i), close, close + 5, close - 5, close, 100));
|
||||
}
|
||||
|
||||
|
||||
@@ -403,7 +403,7 @@ public class StbandsTests
|
||||
var series = new TSeries();
|
||||
for (int i = 0; i < 20; i++)
|
||||
{
|
||||
series.Add(DateTime.UtcNow.AddMinutes(i), 100 + i * 0.5);
|
||||
series.Add(DateTime.UtcNow.AddMinutes(i), 100 + (i * 0.5));
|
||||
}
|
||||
|
||||
TSeries result = stbands.Update(series);
|
||||
|
||||
@@ -132,7 +132,7 @@ public class TtmLrcIndicatorTests
|
||||
// Add some volatility to ensure non-zero stddev
|
||||
for (int i = 0; i < 20; i++)
|
||||
{
|
||||
double price = 100 + Math.Sin(i * 0.5) * 10;
|
||||
double price = 100 + (Math.Sin(i * 0.5) * 10);
|
||||
ind.HistoricalData.AddBar(now.AddMinutes(i), price, price + 5, price - 5, price, 1000);
|
||||
ind.ProcessUpdate(new UpdateArgs(i == 0 ? UpdateReason.HistoricalBar : UpdateReason.NewBar));
|
||||
}
|
||||
@@ -214,7 +214,7 @@ public class TtmLrcIndicatorTests
|
||||
// Perfect linear data: y = 100 + 2*i
|
||||
for (int i = 0; i < 20; i++)
|
||||
{
|
||||
double price = 100 + i * 2;
|
||||
double price = 100 + (i * 2);
|
||||
ind.HistoricalData.AddBar(now.AddMinutes(i), price, price, price, price);
|
||||
ind.ProcessUpdate(new UpdateArgs(i == 0 ? UpdateReason.HistoricalBar : UpdateReason.NewBar));
|
||||
}
|
||||
@@ -264,14 +264,14 @@ public class TtmLrcIndicatorTests
|
||||
var now = DateTime.UtcNow;
|
||||
for (int i = 0; i < 30; i++)
|
||||
{
|
||||
double price = 100 + i * 2; // Strong uptrend
|
||||
double price = 100 + (i * 2); // Strong uptrend
|
||||
ind.HistoricalData.AddBar(now.AddMinutes(i), price, price + 2, price - 2, price);
|
||||
ind.ProcessUpdate(new UpdateArgs(i == 0 ? UpdateReason.HistoricalBar : UpdateReason.NewBar));
|
||||
}
|
||||
|
||||
// After warmup, midline should be close to the current regression line value
|
||||
double midline = ind.LinesSeries[0].GetValue(0);
|
||||
double lastPrice = 100 + 29 * 2; // 158
|
||||
double lastPrice = 100 + (29 * 2); // 158
|
||||
|
||||
// Midline should be close to last price (within reasonable range for regression)
|
||||
Assert.True(Math.Abs(midline - lastPrice) < 10, $"Midline ({midline}) should be close to last price ({lastPrice})");
|
||||
|
||||
@@ -166,7 +166,7 @@ public class TtmLrcTests
|
||||
// Perfect linear data: y = 100 + 2*x
|
||||
for (int i = 0; i < 15; i++)
|
||||
{
|
||||
indicator.Update(new TValue(now.AddMinutes(i), 100 + 2.0 * i), isNew: true);
|
||||
indicator.Update(new TValue(now.AddMinutes(i), 100 + (2.0 * i)), isNew: true);
|
||||
}
|
||||
|
||||
Assert.True(indicator.IsHot);
|
||||
@@ -189,7 +189,7 @@ public class TtmLrcTests
|
||||
|
||||
for (int i = 0; i < 15; i++)
|
||||
{
|
||||
indicator.Update(new TValue(now.AddMinutes(i), 100 + 5.0 * i), isNew: true);
|
||||
indicator.Update(new TValue(now.AddMinutes(i), 100 + (5.0 * i)), isNew: true);
|
||||
}
|
||||
|
||||
Assert.True(indicator.Slope > 0, $"Slope should be positive for uptrend, got {indicator.Slope}");
|
||||
@@ -203,7 +203,7 @@ public class TtmLrcTests
|
||||
|
||||
for (int i = 0; i < 15; i++)
|
||||
{
|
||||
indicator.Update(new TValue(now.AddMinutes(i), 100 - 3.0 * i), isNew: true);
|
||||
indicator.Update(new TValue(now.AddMinutes(i), 100 - (3.0 * i)), isNew: true);
|
||||
}
|
||||
|
||||
Assert.True(indicator.Slope < 0, $"Slope should be negative for downtrend, got {indicator.Slope}");
|
||||
@@ -236,7 +236,7 @@ public class TtmLrcTests
|
||||
|
||||
for (int i = 0; i < 15; i++)
|
||||
{
|
||||
indicator.Update(new TValue(now.AddMinutes(i), 100 + 2.0 * i), isNew: true);
|
||||
indicator.Update(new TValue(now.AddMinutes(i), 100 + (2.0 * i)), isNew: true);
|
||||
}
|
||||
|
||||
Assert.True(Math.Abs(indicator.RSquared - 1.0) < 1e-9, $"R² should be 1.0 for perfect linear fit, got {indicator.RSquared}");
|
||||
@@ -313,7 +313,7 @@ public class TtmLrcTests
|
||||
|
||||
for (int i = 0; i < 8; i++)
|
||||
{
|
||||
indicator.Update(new TValue(now.AddMinutes(i), 100 + i * 2), isNew: true);
|
||||
indicator.Update(new TValue(now.AddMinutes(i), 100 + (i * 2)), isNew: true);
|
||||
}
|
||||
|
||||
double baseMid = indicator.Midline.Value;
|
||||
@@ -321,11 +321,11 @@ public class TtmLrcTests
|
||||
// Multiple corrections
|
||||
for (int j = 0; j < 5; j++)
|
||||
{
|
||||
indicator.Update(new TValue(now.AddMinutes(7), 150 + j * 10), isNew: false);
|
||||
indicator.Update(new TValue(now.AddMinutes(7), 150 + (j * 10)), isNew: false);
|
||||
}
|
||||
|
||||
// Revert to original
|
||||
indicator.Update(new TValue(now.AddMinutes(7), 100 + 7 * 2), isNew: false);
|
||||
indicator.Update(new TValue(now.AddMinutes(7), 100 + (7 * 2)), isNew: false);
|
||||
|
||||
Assert.Equal(baseMid, indicator.Midline.Value, 10);
|
||||
}
|
||||
@@ -492,7 +492,7 @@ public class TtmLrcTests
|
||||
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
indicator.Update(new TValue(now.AddMinutes(i), 100 + i * 2), isNew: true);
|
||||
indicator.Update(new TValue(now.AddMinutes(i), 100 + (i * 2)), isNew: true);
|
||||
}
|
||||
|
||||
Assert.True(indicator.IsHot);
|
||||
@@ -546,7 +546,7 @@ public class TtmLrcTests
|
||||
for (int i = 0; i < 15; i++)
|
||||
{
|
||||
times.Add(now.AddMinutes(i).Ticks);
|
||||
values.Add(100 + i * 2);
|
||||
values.Add(100 + (i * 2));
|
||||
}
|
||||
|
||||
var source = new TSeries(times, values);
|
||||
@@ -565,7 +565,7 @@ public class TtmLrcTests
|
||||
|
||||
for (int i = 0; i < 8; i++)
|
||||
{
|
||||
source.Add(new TValue(now.AddMinutes(i), 100 + i * 3), isNew: true);
|
||||
source.Add(new TValue(now.AddMinutes(i), 100 + (i * 3)), isNew: true);
|
||||
}
|
||||
|
||||
Assert.True(indicator.IsHot);
|
||||
@@ -720,7 +720,7 @@ public class TtmLrcTests
|
||||
|
||||
for (int i = 0; i < 8; i++)
|
||||
{
|
||||
indicator.Update(new TValue(now.AddMinutes(i), 100 + i * 2), isNew: true);
|
||||
indicator.Update(new TValue(now.AddMinutes(i), 100 + (i * 2)), isNew: true);
|
||||
}
|
||||
|
||||
Assert.NotNull(lastPubValue);
|
||||
|
||||
@@ -74,8 +74,8 @@ public sealed class TtmLrcValidationTests : IDisposable
|
||||
Assert.Equal(115.0 - expectedStdDev, ind.Lower1.Value, 1e-10);
|
||||
|
||||
// Verify ±2σ bands
|
||||
Assert.Equal(115.0 + 2.0 * expectedStdDev, ind.Upper2.Value, 1e-10);
|
||||
Assert.Equal(115.0 - 2.0 * expectedStdDev, ind.Lower2.Value, 1e-10);
|
||||
Assert.Equal(115.0 + (2.0 * expectedStdDev), ind.Upper2.Value, 1e-10);
|
||||
Assert.Equal(115.0 - (2.0 * expectedStdDev), ind.Lower2.Value, 1e-10);
|
||||
|
||||
_output.WriteLine("TtmLrc manual calculation validated");
|
||||
}
|
||||
@@ -89,7 +89,7 @@ public sealed class TtmLrcValidationTests : IDisposable
|
||||
// Perfect linear trend: 100, 110, 120, 130, 140
|
||||
for (int i = 0; i < 5; i++)
|
||||
{
|
||||
series.Add(new TValue(t0.AddMinutes(i), 100 + i * 10));
|
||||
series.Add(new TValue(t0.AddMinutes(i), 100 + (i * 10)));
|
||||
}
|
||||
|
||||
var ind = new TtmLrc(5);
|
||||
@@ -362,7 +362,7 @@ public sealed class TtmLrcValidationTests : IDisposable
|
||||
// Feed perfect linear data
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
ind.Update(new TValue(t0.AddMinutes(i), 100 + i * 5));
|
||||
ind.Update(new TValue(t0.AddMinutes(i), 100 + (i * 5)));
|
||||
}
|
||||
|
||||
Assert.Equal(1.0, ind.RSquared, 1e-9);
|
||||
@@ -481,7 +481,7 @@ public sealed class TtmLrcValidationTests : IDisposable
|
||||
var t0 = DateTime.UtcNow;
|
||||
for (int i = 0; i < 20; i++)
|
||||
{
|
||||
uptrend.Add(new TValue(t0.AddMinutes(i), 100 + i * 2 + (i % 3))); // Noisy uptrend
|
||||
uptrend.Add(new TValue(t0.AddMinutes(i), 100 + (i * 2) + (i % 3))); // Noisy uptrend
|
||||
}
|
||||
|
||||
var indUp = new TtmLrc(10);
|
||||
@@ -495,7 +495,7 @@ public sealed class TtmLrcValidationTests : IDisposable
|
||||
var downtrend = new TSeries();
|
||||
for (int i = 0; i < 20; i++)
|
||||
{
|
||||
downtrend.Add(new TValue(t0.AddMinutes(i), 200 - i * 2 + (i % 3))); // Noisy downtrend
|
||||
downtrend.Add(new TValue(t0.AddMinutes(i), 200 - (i * 2) + (i % 3))); // Noisy downtrend
|
||||
}
|
||||
|
||||
var indDown = new TtmLrc(10);
|
||||
|
||||
@@ -409,7 +409,7 @@ public sealed class UbandsValidationTests : IDisposable
|
||||
|
||||
_output.WriteLine($"Source variance: {sourceVar:F4}");
|
||||
_output.WriteLine($"Middle (USF) variance: {middleVar:F4}");
|
||||
_output.WriteLine($"Noise reduction: {(1 - middleVar / sourceVar) * 100:F1}%");
|
||||
_output.WriteLine($"Noise reduction: {(1 - (middleVar / sourceVar)) * 100:F1}%");
|
||||
|
||||
Assert.True(middleVar < sourceVar, "Smoothed signal should have lower variance");
|
||||
}
|
||||
|
||||
@@ -358,7 +358,7 @@ public class UchannelQuantowerTests
|
||||
double width2 = indicator2.LinesSeries[4].GetValue(0);
|
||||
|
||||
// Width2 should be approximately 2x Width1
|
||||
Assert.True(Math.Abs(width2 - 2 * width1) < 0.0001,
|
||||
Assert.True(Math.Abs(width2 - (2 * width1)) < 0.0001,
|
||||
$"Width2 ({width2}) should be ~2x Width1 ({width1})");
|
||||
}
|
||||
|
||||
@@ -377,7 +377,7 @@ public class UchannelQuantowerTests
|
||||
var now = DateTime.UtcNow;
|
||||
for (int i = 0; i < 30; i++)
|
||||
{
|
||||
double close = 100 + (i % 5) * 2;
|
||||
double close = 100 + ((i % 5) * 2);
|
||||
indicator1.HistoricalData.AddBar(now.AddMinutes(i), close, close + 3, close - 3, close, 1000);
|
||||
indicator1.ProcessUpdate(new UpdateArgs(UpdateReason.HistoricalBar));
|
||||
indicator2.HistoricalData.AddBar(now.AddMinutes(i), close, close + 3, close - 3, close, 1000);
|
||||
|
||||
@@ -148,7 +148,7 @@ public class VwapbandsIndicatorTests
|
||||
var now = DateTime.UtcNow;
|
||||
for (int i = 0; i < 5; i++)
|
||||
{
|
||||
indicator.HistoricalData.AddBar(now.AddMinutes(i), 100 + i, 105 + i, 95 + i, 102 + i, 1000 + i * 100);
|
||||
indicator.HistoricalData.AddBar(now.AddMinutes(i), 100 + i, 105 + i, 95 + i, 102 + i, 1000 + (i * 100));
|
||||
indicator.ProcessUpdate(new UpdateArgs(UpdateReason.HistoricalBar));
|
||||
}
|
||||
|
||||
|
||||
@@ -120,7 +120,7 @@ public class VwapbandsTests
|
||||
// Make multiple corrections
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
var correctionBar = new TBar(DateTime.UtcNow, 150 + i, 160 + i, 140 + i, 155 + i, 2000 + i * 100);
|
||||
var correctionBar = new TBar(DateTime.UtcNow, 150 + i, 160 + i, 140 + i, 155 + i, 2000 + (i * 100));
|
||||
vwapbands.Update(correctionBar, isNew: false);
|
||||
}
|
||||
|
||||
@@ -359,7 +359,7 @@ public class VwapbandsTests
|
||||
vwapbands.Update(bar2);
|
||||
|
||||
// VWAP = (100*1000 + 110*2000) / (1000+2000) = 320000/3000 = 106.666...
|
||||
double expectedVwap = (100.0 * 1000 + 110.0 * 2000) / (1000 + 2000);
|
||||
double expectedVwap = ((100.0 * 1000) + (110.0 * 2000)) / (1000 + 2000);
|
||||
Assert.Equal(expectedVwap, vwapbands.Vwap.Value, precision: 10);
|
||||
}
|
||||
|
||||
@@ -600,7 +600,7 @@ public class VwapbandsTests
|
||||
|
||||
// VWAP should be closer to 100 due to higher volume
|
||||
// VWAP = (100*10000 + 200*100) / (10000+100) = 1020000/10100 ≈ 100.99
|
||||
double expectedVwap = (100.0 * 10000 + 200.0 * 100) / (10000 + 100);
|
||||
double expectedVwap = ((100.0 * 10000) + (200.0 * 100)) / (10000 + 100);
|
||||
Assert.Equal(expectedVwap, vwapbands.Vwap.Value, precision: 10);
|
||||
Assert.True(vwapbands.Vwap.Value < 110, "VWAP should be heavily weighted toward 100");
|
||||
}
|
||||
|
||||
@@ -273,7 +273,7 @@ public sealed class VwapbandsValidationTests : IDisposable
|
||||
|
||||
// VWAP should be closer to 100 (high volume price)
|
||||
// VWAP = (100 × 10000 + 200 × 100) / (10000 + 100) = 1020000 / 10100 ≈ 100.99
|
||||
double expectedVwap = (100.0 * 10000 + 200.0 * 100) / (10000 + 100);
|
||||
double expectedVwap = ((100.0 * 10000) + (200.0 * 100)) / (10000 + 100);
|
||||
Assert.Equal(expectedVwap, vwapbands.Vwap.Value, precision: 10);
|
||||
Assert.True(vwapbands.Vwap.Value < 110, "VWAP should be heavily weighted toward 100");
|
||||
|
||||
@@ -434,7 +434,7 @@ public sealed class VwapbandsValidationTests : IDisposable
|
||||
// Multiple zero-volume bars with different prices
|
||||
for (int i = 0; i < 5; i++)
|
||||
{
|
||||
var zeroVolBar = new TBar(DateTime.UtcNow.AddMinutes(i + 1), 200 + i * 10, 200 + i * 10, 200 + i * 10, 200 + i * 10, 0);
|
||||
var zeroVolBar = new TBar(DateTime.UtcNow.AddMinutes(i + 1), 200 + (i * 10), 200 + (i * 10), 200 + (i * 10), 200 + (i * 10), 0);
|
||||
vwapbands.Update(zeroVolBar);
|
||||
}
|
||||
|
||||
|
||||
@@ -242,7 +242,7 @@ public class VwapsdIndicatorTests
|
||||
var now = DateTime.UtcNow;
|
||||
for (int i = 0; i < 5; i++)
|
||||
{
|
||||
indicator.HistoricalData.AddBar(now.AddMinutes(i), 100 + i, 105 + i, 95 + i, 102 + i, 1000 + i * 100);
|
||||
indicator.HistoricalData.AddBar(now.AddMinutes(i), 100 + i, 105 + i, 95 + i, 102 + i, 1000 + (i * 100));
|
||||
indicator.ProcessUpdate(new UpdateArgs(UpdateReason.HistoricalBar));
|
||||
}
|
||||
|
||||
@@ -344,7 +344,7 @@ public class VwapsdIndicatorTests
|
||||
double width2 = indicator2.LinesSeries[3].GetValue(0);
|
||||
|
||||
// Width2 should be approximately 2x Width1
|
||||
Assert.True(Math.Abs(width2 - 2 * width1) < 0.0001,
|
||||
Assert.True(Math.Abs(width2 - (2 * width1)) < 0.0001,
|
||||
$"Width2 ({width2}) should be ~2x Width1 ({width1})");
|
||||
}
|
||||
|
||||
|
||||
@@ -136,7 +136,7 @@ public class VwapsdTests
|
||||
// Make multiple corrections
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
var correctionBar = new TBar(DateTime.UtcNow, 150 + i, 160 + i, 140 + i, 155 + i, 2000 + i * 100);
|
||||
var correctionBar = new TBar(DateTime.UtcNow, 150 + i, 160 + i, 140 + i, 155 + i, 2000 + (i * 100));
|
||||
vwapsd.Update(correctionBar, isNew: false);
|
||||
}
|
||||
|
||||
@@ -371,7 +371,7 @@ public class VwapsdTests
|
||||
vwapsd.Update(bar2);
|
||||
|
||||
// VWAP = (100*1000 + 110*2000) / (1000+2000) = 320000/3000 = 106.666...
|
||||
double expectedVwap = (100.0 * 1000 + 110.0 * 2000) / (1000 + 2000);
|
||||
double expectedVwap = ((100.0 * 1000) + (110.0 * 2000)) / (1000 + 2000);
|
||||
Assert.Equal(expectedVwap, vwapsd.Vwap.Value, precision: 10);
|
||||
}
|
||||
|
||||
@@ -634,7 +634,7 @@ public class VwapsdTests
|
||||
|
||||
// VWAP should be closer to 100 due to higher volume
|
||||
// VWAP = (100*10000 + 200*100) / (10000+100) = 1020000/10100 ≈ 100.99
|
||||
double expectedVwap = (100.0 * 10000 + 200.0 * 100) / (10000 + 100);
|
||||
double expectedVwap = ((100.0 * 10000) + (200.0 * 100)) / (10000 + 100);
|
||||
Assert.Equal(expectedVwap, vwapsd.Vwap.Value, precision: 10);
|
||||
Assert.True(vwapsd.Vwap.Value < 110, "VWAP should be heavily weighted toward 100");
|
||||
}
|
||||
|
||||
@@ -305,7 +305,7 @@ public sealed class VwapsdValidationTests : IDisposable
|
||||
|
||||
// VWAP should be closer to 100 (high volume price)
|
||||
// VWAP = (100 × 10000 + 200 × 100) / (10000 + 100) = 1020000 / 10100 ≈ 100.99
|
||||
double expectedVwap = (100.0 * 10000 + 200.0 * 100) / (10000 + 100);
|
||||
double expectedVwap = ((100.0 * 10000) + (200.0 * 100)) / (10000 + 100);
|
||||
Assert.Equal(expectedVwap, vwapsd.Vwap.Value, precision: 10);
|
||||
Assert.True(vwapsd.Vwap.Value < 110, "VWAP should be heavily weighted toward 100");
|
||||
|
||||
@@ -466,7 +466,7 @@ public sealed class VwapsdValidationTests : IDisposable
|
||||
// Multiple zero-volume bars with different prices
|
||||
for (int i = 0; i < 5; i++)
|
||||
{
|
||||
var zeroVolBar = new TBar(DateTime.UtcNow.AddMinutes(i + 1), 200 + i * 10, 200 + i * 10, 200 + i * 10, 200 + i * 10, 0);
|
||||
var zeroVolBar = new TBar(DateTime.UtcNow.AddMinutes(i + 1), 200 + (i * 10), 200 + (i * 10), 200 + (i * 10), 200 + (i * 10), 0);
|
||||
vwapsd.Update(zeroVolBar);
|
||||
}
|
||||
|
||||
|
||||
@@ -100,10 +100,10 @@ public class MidpointIndicatorTests
|
||||
{
|
||||
indicator.HistoricalData.AddBar(
|
||||
now.AddMinutes(i),
|
||||
100 + i * 2,
|
||||
105 + i * 2,
|
||||
95 + i * 2,
|
||||
102 + i * 2);
|
||||
100 + (i * 2),
|
||||
105 + (i * 2),
|
||||
95 + (i * 2),
|
||||
102 + (i * 2));
|
||||
indicator.ProcessUpdate(new UpdateArgs(UpdateReason.HistoricalBar));
|
||||
}
|
||||
|
||||
|
||||
@@ -1223,9 +1223,9 @@ public class TBarSeriesTests
|
||||
{
|
||||
times[i] = i;
|
||||
opens[i] = i * 10.0;
|
||||
highs[i] = i * 10.0 + 5.0;
|
||||
lows[i] = i * 10.0 - 5.0;
|
||||
closes[i] = i * 10.0 + 2.0;
|
||||
highs[i] = (i * 10.0) + 5.0;
|
||||
lows[i] = (i * 10.0) - 5.0;
|
||||
closes[i] = (i * 10.0) + 2.0;
|
||||
volumes[i] = i * 100.0;
|
||||
}
|
||||
|
||||
@@ -1233,7 +1233,7 @@ public class TBarSeriesTests
|
||||
|
||||
Assert.Equal(N, series.Count);
|
||||
Assert.Equal(0, series[0].Time);
|
||||
Assert.Equal((N - 1) * 10.0 + 2.0, series[N - 1].Close);
|
||||
Assert.Equal(((N - 1) * 10.0) + 2.0, series[N - 1].Close);
|
||||
Assert.Equal((N - 1) * 100.0, series[N - 1].Volume);
|
||||
}
|
||||
|
||||
@@ -1246,7 +1246,7 @@ public class TBarSeriesTests
|
||||
|
||||
for (int i = 0; i < N; i++)
|
||||
{
|
||||
bars[i] = new TBar(i, i * 10.0, i * 10.0 + 5.0, i * 10.0 - 5.0, i * 10.0 + 2.0, i * 100.0);
|
||||
bars[i] = new TBar(i, i * 10.0, (i * 10.0) + 5.0, (i * 10.0) - 5.0, (i * 10.0) + 2.0, i * 100.0);
|
||||
}
|
||||
|
||||
series.AddRange(bars);
|
||||
@@ -1254,6 +1254,6 @@ public class TBarSeriesTests
|
||||
Assert.Equal(N, series.Count);
|
||||
Assert.Equal(0, series[0].Time);
|
||||
Assert.Equal(2.0, series[0].Close);
|
||||
Assert.Equal((N - 1) * 10.0 + 2.0, series[N - 1].Close);
|
||||
Assert.Equal(((N - 1) * 10.0) + 2.0, series[N - 1].Close);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -82,7 +82,7 @@ public class BiInputIndicatorBaseTests
|
||||
var indicator = new Mae(5);
|
||||
for (int i = 0; i < 4; i++)
|
||||
{
|
||||
indicator.Update(i * 10.0, i * 10.0 + 5.0);
|
||||
indicator.Update(i * 10.0, (i * 10.0) + 5.0);
|
||||
Assert.False(indicator.IsHot);
|
||||
}
|
||||
}
|
||||
@@ -93,7 +93,7 @@ public class BiInputIndicatorBaseTests
|
||||
var indicator = new Mae(5);
|
||||
for (int i = 0; i < 5; i++)
|
||||
{
|
||||
indicator.Update(i * 10.0, i * 10.0 + 5.0);
|
||||
indicator.Update(i * 10.0, (i * 10.0) + 5.0);
|
||||
}
|
||||
Assert.True(indicator.IsHot);
|
||||
}
|
||||
@@ -104,7 +104,7 @@ public class BiInputIndicatorBaseTests
|
||||
var indicator = new Mae(3);
|
||||
for (int i = 0; i < 20; i++)
|
||||
{
|
||||
indicator.Update(i * 10.0, i * 10.0 + 5.0);
|
||||
indicator.Update(i * 10.0, (i * 10.0) + 5.0);
|
||||
}
|
||||
Assert.True(indicator.IsHot);
|
||||
}
|
||||
@@ -268,7 +268,7 @@ public class BiInputIndicatorBaseTests
|
||||
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
indicator.Update(i * 10.0, i * 10.0 + 5.0);
|
||||
indicator.Update(i * 10.0, (i * 10.0) + 5.0);
|
||||
}
|
||||
double original = indicator.Last.Value;
|
||||
|
||||
@@ -360,7 +360,7 @@ public class BiInputIndicatorBaseTests
|
||||
var indicator = new Mae(3);
|
||||
for (int i = 0; i < 5; i++)
|
||||
{
|
||||
indicator.Update(i * 10.0, i * 10.0 + 5.0);
|
||||
indicator.Update(i * 10.0, (i * 10.0) + 5.0);
|
||||
}
|
||||
Assert.True(indicator.IsHot);
|
||||
|
||||
@@ -563,7 +563,7 @@ public class BiInputIndicatorBaseTests
|
||||
for (int i = 0; i < 20; i++)
|
||||
{
|
||||
actual.Add(now.AddMinutes(i), i * 10.0);
|
||||
predicted.Add(now.AddMinutes(i), i * 10.0 + 5.0);
|
||||
predicted.Add(now.AddMinutes(i), (i * 10.0) + 5.0);
|
||||
}
|
||||
|
||||
var result = Mae.Batch(actual, predicted, 5);
|
||||
@@ -603,7 +603,7 @@ public class BiInputIndicatorBaseTests
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
actual.Add(now.AddMinutes(i), i * 10.0);
|
||||
predicted.Add(now.AddMinutes(i), i * 10.0 + 3.0);
|
||||
predicted.Add(now.AddMinutes(i), (i * 10.0) + 3.0);
|
||||
}
|
||||
|
||||
var (results, indicator) = Mae.Calculate(actual, predicted, 5);
|
||||
@@ -647,7 +647,7 @@ public class BiInputIndicatorBaseTests
|
||||
{
|
||||
var bar = gbm.Next();
|
||||
actual[i] = bar.Close;
|
||||
predicted[i] = bar.Close * 1.03 + 1.0;
|
||||
predicted[i] = (bar.Close * 1.03) + 1.0;
|
||||
}
|
||||
|
||||
// Streaming
|
||||
|
||||
@@ -536,7 +536,6 @@ public class TSeriesTests
|
||||
Assert.Equal(3.0, series[2].Value);
|
||||
}
|
||||
|
||||
|
||||
[Fact]
|
||||
public void GetEnumerator_ExplicitGenericInterface_Works()
|
||||
{
|
||||
|
||||
@@ -100,7 +100,7 @@ public sealed class WclpriceValidationTests : IDisposable
|
||||
var bar = new TBar(DateTime.UtcNow, open: 10.0, high: 20.0, low: 8.0, close: 16.0, volume: 1000);
|
||||
var ind = new Wclprice();
|
||||
var result = ind.Update(bar, isNew: true);
|
||||
double expected = (20.0 + 8.0 + 2.0 * 16.0) / 4.0; // = 15.0
|
||||
double expected = (20.0 + 8.0 + (2.0 * 16.0)) / 4.0; // = 15.0
|
||||
Assert.Equal(expected, result.Value, 1e-12);
|
||||
_output.WriteLine($"WCLPRICE formula: expected={expected}, actual={result.Value}: PASSED");
|
||||
}
|
||||
|
||||
@@ -122,7 +122,7 @@ public class CcorIndicatorTests
|
||||
var now = DateTime.UtcNow;
|
||||
for (int i = 0; i < 30; i++)
|
||||
{
|
||||
double price = 100 + 5 * Math.Sin(2 * Math.PI * i / 20.0);
|
||||
double price = 100 + (5 * Math.Sin(2 * Math.PI * i / 20.0));
|
||||
indicator.HistoricalData.AddBar(now.AddMinutes(i), price, price + 2, price - 2, price + 1);
|
||||
indicator.ProcessUpdate(new UpdateArgs(UpdateReason.HistoricalBar));
|
||||
}
|
||||
|
||||
@@ -488,7 +488,7 @@ public class CcorTests
|
||||
// Feed a perfect sine wave of the same period
|
||||
for (int i = 0; i < 100; 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));
|
||||
_ = ind.Update(new TValue(DateTime.UtcNow.AddMinutes(i), val));
|
||||
}
|
||||
|
||||
|
||||
@@ -116,7 +116,7 @@ public class CcycIndicatorTests
|
||||
var now = DateTime.UtcNow;
|
||||
for (int i = 0; i < 20; i++)
|
||||
{
|
||||
double price = 100 + 5 * Math.Sin(2 * Math.PI * i / 20.0);
|
||||
double price = 100 + (5 * Math.Sin(2 * Math.PI * i / 20.0));
|
||||
indicator.HistoricalData.AddBar(now.AddMinutes(i), price, price + 2, price - 2, price + 1);
|
||||
indicator.ProcessUpdate(new UpdateArgs(UpdateReason.HistoricalBar));
|
||||
}
|
||||
|
||||
@@ -425,7 +425,7 @@ public class CcycTests
|
||||
|
||||
for (int i = 0; i < 200; i++)
|
||||
{
|
||||
double value = 100 + 10 * Math.Sin(2 * Math.PI * i / period);
|
||||
double value = 100 + (10 * Math.Sin(2 * Math.PI * i / period));
|
||||
ccyc.Update(new TValue(DateTime.UtcNow.AddDays(i), value), true);
|
||||
}
|
||||
|
||||
@@ -459,7 +459,7 @@ public class CcycTests
|
||||
double[] primeData = new double[50];
|
||||
for (int i = 0; i < 50; i++)
|
||||
{
|
||||
primeData[i] = 100 + 5 * Math.Sin(2 * Math.PI * i / 20.0);
|
||||
primeData[i] = 100 + (5 * Math.Sin(2 * Math.PI * i / 20.0));
|
||||
}
|
||||
|
||||
ccyc.Prime(primeData.AsSpan());
|
||||
|
||||
@@ -41,7 +41,7 @@ public class CcycValidationTests
|
||||
|
||||
for (int i = 0; i < 500; i++)
|
||||
{
|
||||
ccyc.Update(new TValue(DateTime.UtcNow.AddMinutes(i), 100.0 + 0.5 * i), true);
|
||||
ccyc.Update(new TValue(DateTime.UtcNow.AddMinutes(i), 100.0 + (0.5 * i)), true);
|
||||
}
|
||||
|
||||
// After warmup, should be near zero since linear trend has no cycle component
|
||||
@@ -58,7 +58,7 @@ public class CcycValidationTests
|
||||
|
||||
for (int i = 0; i < 200; i++)
|
||||
{
|
||||
double value = 100 + 10 * Math.Sin(2 * Math.PI * i / period);
|
||||
double value = 100 + (10 * Math.Sin(2 * Math.PI * i / period));
|
||||
ccyc.Update(new TValue(DateTime.UtcNow.AddMinutes(i), value), true);
|
||||
}
|
||||
|
||||
@@ -80,7 +80,7 @@ public class CcycValidationTests
|
||||
|
||||
for (int i = 0; i < 300; i++)
|
||||
{
|
||||
double value = 100 + 10 * Math.Sin(2 * Math.PI * i / period);
|
||||
double value = 100 + (10 * Math.Sin(2 * Math.PI * i / period));
|
||||
var r = ccyc.Update(new TValue(DateTime.UtcNow.AddMinutes(i), value), true);
|
||||
|
||||
if (i > 20 && prev * r.Value < 0 && prev != 0)
|
||||
@@ -169,7 +169,7 @@ public class CcycValidationTests
|
||||
double noiseVal = rng.Next().Close;
|
||||
ccycNoise.Update(new TValue(DateTime.UtcNow.AddMinutes(i), noiseVal), true);
|
||||
|
||||
double sineVal = 100 + 10 * Math.Sin(2 * Math.PI * i / 20.0);
|
||||
double sineVal = 100 + (10 * Math.Sin(2 * Math.PI * i / 20.0));
|
||||
var sineResult = ccycSine.Update(new TValue(DateTime.UtcNow.AddMinutes(i), sineVal), true);
|
||||
|
||||
if (i > 30)
|
||||
@@ -216,7 +216,7 @@ public class CcycValidationTests
|
||||
|
||||
for (int i = 0; i < 300; i++)
|
||||
{
|
||||
double value = 100 + 10 * Math.Sin(2 * Math.PI * i / 20.0);
|
||||
double value = 100 + (10 * Math.Sin(2 * Math.PI * i / 20.0));
|
||||
ccyc.Update(new TValue(DateTime.UtcNow.AddMinutes(i), value), true);
|
||||
|
||||
if (i > 20)
|
||||
@@ -340,7 +340,7 @@ public class CcycValidationTests
|
||||
|
||||
for (int i = 0; i < 20; i++)
|
||||
{
|
||||
double value = 100 + 5 * Math.Sin(2 * Math.PI * i / 20.0);
|
||||
double value = 100 + (5 * Math.Sin(2 * Math.PI * i / 20.0));
|
||||
var r = ccyc.Update(new TValue(DateTime.UtcNow.AddMinutes(i), value), true);
|
||||
results.Add(r.Value);
|
||||
}
|
||||
|
||||
@@ -262,7 +262,7 @@ public class CgIndicatorTests
|
||||
|
||||
var now = DateTime.UtcNow;
|
||||
double[] closes = { 100, 102, 98, 105, 97, 110, 95, 108, 92, 115, 90, 120 };
|
||||
double maxExpectedBound = (10 - 1) / 2.0 + 1.0; // Period-based bound with margin
|
||||
double maxExpectedBound = ((10 - 1) / 2.0) + 1.0; // Period-based bound with margin
|
||||
|
||||
foreach (var close in closes)
|
||||
{
|
||||
|
||||
@@ -79,7 +79,7 @@ public class CgTests
|
||||
var cg = new Cg(5);
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
cg.Update(new TValue(DateTime.UtcNow.AddSeconds(i), 100 + i * 10));
|
||||
cg.Update(new TValue(DateTime.UtcNow.AddSeconds(i), 100 + (i * 10)));
|
||||
}
|
||||
Assert.True(cg.Last.Value > 0, $"Expected positive CG, got {cg.Last.Value}");
|
||||
}
|
||||
@@ -91,7 +91,7 @@ public class CgTests
|
||||
var cg = new Cg(5);
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
cg.Update(new TValue(DateTime.UtcNow.AddSeconds(i), 200 - i * 10));
|
||||
cg.Update(new TValue(DateTime.UtcNow.AddSeconds(i), 200 - (i * 10)));
|
||||
}
|
||||
Assert.True(cg.Last.Value < 0, $"Expected negative CG, got {cg.Last.Value}");
|
||||
}
|
||||
@@ -328,7 +328,7 @@ public class CgTests
|
||||
// Generate and store values
|
||||
for (int i = 0; i < 20; i++)
|
||||
{
|
||||
inputs.Add(new TValue(DateTime.UtcNow.AddSeconds(i), 100 + i * 0.5));
|
||||
inputs.Add(new TValue(DateTime.UtcNow.AddSeconds(i), 100 + (i * 0.5)));
|
||||
}
|
||||
|
||||
// First pass
|
||||
|
||||
@@ -28,7 +28,7 @@ public class CgValidationTests
|
||||
var gbm = new GBM(seed: 42);
|
||||
var bars = gbm.Fetch(500, DateTime.UtcNow.Ticks, TimeSpan.FromMinutes(1));
|
||||
|
||||
double maxAbsValue = (period - 1) / 2.0 + 0.5; // Allow small margin
|
||||
double maxAbsValue = ((period - 1) / 2.0) + 0.5; // Allow small margin
|
||||
|
||||
foreach (var bar in bars)
|
||||
{
|
||||
@@ -65,7 +65,7 @@ public class CgValidationTests
|
||||
|
||||
for (int i = 0; i < 50; i++)
|
||||
{
|
||||
double price = 100.0 + i * 1.0; // Linear uptrend
|
||||
double price = 100.0 + (i * 1.0); // Linear uptrend
|
||||
cg.Update(new TValue(DateTime.UtcNow.AddSeconds(i), price));
|
||||
}
|
||||
|
||||
@@ -82,7 +82,7 @@ public class CgValidationTests
|
||||
|
||||
for (int i = 0; i < 50; i++)
|
||||
{
|
||||
double price = 200.0 - i * 1.0; // Linear downtrend
|
||||
double price = 200.0 - (i * 1.0); // Linear downtrend
|
||||
cg.Update(new TValue(DateTime.UtcNow.AddSeconds(i), price));
|
||||
}
|
||||
|
||||
@@ -100,7 +100,7 @@ public class CgValidationTests
|
||||
for (int i = 0; i < 50; i++)
|
||||
{
|
||||
double expPrice = 100.0 * Math.Exp(i * 0.02);
|
||||
double linPrice = 100.0 + i * 2.0;
|
||||
double linPrice = 100.0 + (i * 2.0);
|
||||
cgExp.Update(new TValue(DateTime.UtcNow.AddSeconds(i), expPrice));
|
||||
cgLin.Update(new TValue(DateTime.UtcNow.AddSeconds(i), linPrice));
|
||||
}
|
||||
@@ -120,7 +120,7 @@ public class CgValidationTests
|
||||
// Generate sine wave to simulate price oscillation
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
double price = 100.0 + 10.0 * Math.Sin(i * 0.2);
|
||||
double price = 100.0 + (10.0 * Math.Sin(i * 0.2));
|
||||
cg.Update(new TValue(DateTime.UtcNow.AddSeconds(i), price));
|
||||
if (cg.IsHot)
|
||||
{
|
||||
@@ -162,9 +162,9 @@ public class CgValidationTests
|
||||
// num = 1*10 + 2*12 + 3*11 + 4*13 + 5*15 = 10 + 24 + 33 + 52 + 75 = 194
|
||||
// den = 10 + 12 + 11 + 13 + 15 = 61
|
||||
// result = 194/61 - (5+1)/2 = 3.1803... - 3 = 0.1803...
|
||||
double expectedNum = 1 * 10 + 2 * 12 + 3 * 11 + 4 * 13 + 5 * 15;
|
||||
double expectedNum = (1 * 10) + (2 * 12) + (3 * 11) + (4 * 13) + (5 * 15);
|
||||
double expectedDen = 10 + 12 + 11 + 13 + 15;
|
||||
double expectedCg = (expectedNum / expectedDen) - (period + 1) / 2.0;
|
||||
double expectedCg = (expectedNum / expectedDen) - ((period + 1) / 2.0);
|
||||
|
||||
var cg = new Cg(period);
|
||||
for (int i = 0; i < prices.Length; i++)
|
||||
@@ -287,7 +287,7 @@ public class CgValidationTests
|
||||
Assert.True(double.IsFinite(cg.Last.Value));
|
||||
|
||||
// CG bounds check
|
||||
double maxAbsValue = (period - 1) / 2.0 + 1.0;
|
||||
double maxAbsValue = ((period - 1) / 2.0) + 1.0;
|
||||
Assert.True(Math.Abs(cg.Last.Value) <= maxAbsValue,
|
||||
$"CG with period {period} should be within ±{maxAbsValue}, got {cg.Last.Value}");
|
||||
}
|
||||
@@ -337,7 +337,7 @@ public class CgValidationTests
|
||||
// Uptrend
|
||||
for (int i = 0; i < 30; i++)
|
||||
{
|
||||
double price = 100.0 + i * 0.5;
|
||||
double price = 100.0 + (i * 0.5);
|
||||
cg.Update(new TValue(DateTime.UtcNow.AddSeconds(i), price));
|
||||
prices.Add(price);
|
||||
if (cg.IsHot)
|
||||
@@ -349,7 +349,7 @@ public class CgValidationTests
|
||||
// Plateau/slight decline
|
||||
for (int i = 30; i < 50; i++)
|
||||
{
|
||||
double price = 115.0 - (i - 30) * 0.2;
|
||||
double price = 115.0 - ((i - 30) * 0.2);
|
||||
cg.Update(new TValue(DateTime.UtcNow.AddSeconds(i), price));
|
||||
prices.Add(price);
|
||||
cgValues.Add(cg.Last.Value);
|
||||
|
||||
@@ -326,7 +326,7 @@ public class DspIndicatorTests
|
||||
// Generate sine wave price pattern
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
double price = 100.0 + 10.0 * Math.Sin(i * 0.1);
|
||||
double price = 100.0 + (10.0 * Math.Sin(i * 0.1));
|
||||
indicator.HistoricalData.AddBar(now.AddMinutes(i), price, price + 1, price - 1, price);
|
||||
indicator.ProcessUpdate(new UpdateArgs(UpdateReason.HistoricalBar));
|
||||
values.Add(indicator.LinesSeries[0].GetValue(0));
|
||||
|
||||
@@ -103,7 +103,7 @@ public class DspTests
|
||||
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
double price = 100.0 + i * 1.0;
|
||||
double price = 100.0 + (i * 1.0);
|
||||
dsp.Update(new TValue(DateTime.UtcNow.AddSeconds(i), price));
|
||||
}
|
||||
|
||||
@@ -118,7 +118,7 @@ public class DspTests
|
||||
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
double price = 200.0 - i * 1.0;
|
||||
double price = 200.0 - (i * 1.0);
|
||||
dsp.Update(new TValue(DateTime.UtcNow.AddSeconds(i), price));
|
||||
}
|
||||
|
||||
@@ -414,7 +414,7 @@ public class DspTests
|
||||
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
source.Add(new TValue(DateTime.UtcNow.AddSeconds(i), 100.0 + Math.Sin(i * 0.1) * 10));
|
||||
source.Add(new TValue(DateTime.UtcNow.AddSeconds(i), 100.0 + (Math.Sin(i * 0.1) * 10)));
|
||||
}
|
||||
|
||||
// Both should have values
|
||||
|
||||
@@ -69,7 +69,7 @@ public class DspValidationTests
|
||||
// Generate sine wave to simulate price oscillation
|
||||
for (int i = 0; i < 200; i++)
|
||||
{
|
||||
double price = 100.0 + 10.0 * Math.Sin(i * 0.1);
|
||||
double price = 100.0 + (10.0 * Math.Sin(i * 0.1));
|
||||
dsp.Update(new TValue(DateTime.UtcNow.AddSeconds(i), price));
|
||||
if (dsp.IsHot)
|
||||
{
|
||||
@@ -310,7 +310,7 @@ public class DspValidationTests
|
||||
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
double price = 0.0001 + i * 0.00001;
|
||||
double price = 0.0001 + (i * 0.00001);
|
||||
dsp.Update(new TValue(DateTime.UtcNow.AddSeconds(i), price));
|
||||
}
|
||||
|
||||
@@ -325,7 +325,7 @@ public class DspValidationTests
|
||||
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
double price = 1e10 + i * 1e8;
|
||||
double price = 1e10 + (i * 1e8);
|
||||
dsp.Update(new TValue(DateTime.UtcNow.AddSeconds(i), price));
|
||||
}
|
||||
|
||||
@@ -363,7 +363,7 @@ public class DspValidationTests
|
||||
// Strong uptrend with some noise
|
||||
for (int i = 0; i < 300; i++)
|
||||
{
|
||||
double trend = 100.0 + i * 0.5;
|
||||
double trend = 100.0 + (i * 0.5);
|
||||
double noise = Math.Sin(i * 0.3) * 2.0;
|
||||
double price = trend + noise;
|
||||
dsp.Update(new TValue(DateTime.UtcNow.AddSeconds(i), price));
|
||||
|
||||
@@ -305,7 +305,7 @@ public class EacpIndicatorTests
|
||||
// Generate sine wave pattern
|
||||
for (int i = 0; i < 200; 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));
|
||||
indicator.HistoricalData.AddBar(now.AddMinutes(i), price, price + 1, price - 1, price);
|
||||
indicator.ProcessUpdate(new UpdateArgs(UpdateReason.HistoricalBar));
|
||||
}
|
||||
@@ -324,7 +324,7 @@ public class EacpIndicatorTests
|
||||
var now = DateTime.UtcNow;
|
||||
for (int i = 0; i < 100; 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));
|
||||
indicator.HistoricalData.AddBar(now.AddMinutes(i), price, price + 1, price - 1, price);
|
||||
indicator.ProcessUpdate(new UpdateArgs(UpdateReason.HistoricalBar));
|
||||
}
|
||||
@@ -348,7 +348,7 @@ public class EacpIndicatorTests
|
||||
// Add same data to both
|
||||
for (int i = 0; i < 100; 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));
|
||||
indicatorEnhanced.HistoricalData.AddBar(now.AddMinutes(i), price, price + 1, price - 1, price);
|
||||
indicatorNormal.HistoricalData.AddBar(now.AddMinutes(i), price, price + 1, price - 1, price);
|
||||
indicatorEnhanced.ProcessUpdate(new UpdateArgs(UpdateReason.HistoricalBar));
|
||||
|
||||
@@ -169,7 +169,7 @@ public class EacpTests
|
||||
// Build some history
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
eacp.Update(new TValue(DateTime.UtcNow.AddSeconds(i), 100.0 + Math.Sin(i * 0.1) * 10), isNew: true);
|
||||
eacp.Update(new TValue(DateTime.UtcNow.AddSeconds(i), 100.0 + (Math.Sin(i * 0.1) * 10)), isNew: true);
|
||||
}
|
||||
|
||||
eacp.Update(new TValue(DateTime.UtcNow.AddSeconds(100), 110.0), isNew: true);
|
||||
@@ -237,7 +237,7 @@ public class EacpTests
|
||||
// First run
|
||||
for (int i = 0; i < 200; i++)
|
||||
{
|
||||
eacp.Update(new TValue(DateTime.UtcNow.AddSeconds(i), 100.0 + Math.Sin(i * 0.1) * 10));
|
||||
eacp.Update(new TValue(DateTime.UtcNow.AddSeconds(i), 100.0 + (Math.Sin(i * 0.1) * 10)));
|
||||
}
|
||||
var firstResult = eacp.Last.Value;
|
||||
|
||||
@@ -246,7 +246,7 @@ public class EacpTests
|
||||
// Second run with same data
|
||||
for (int i = 0; i < 200; i++)
|
||||
{
|
||||
eacp.Update(new TValue(DateTime.UtcNow.AddSeconds(i), 100.0 + Math.Sin(i * 0.1) * 10));
|
||||
eacp.Update(new TValue(DateTime.UtcNow.AddSeconds(i), 100.0 + (Math.Sin(i * 0.1) * 10)));
|
||||
}
|
||||
var secondResult = eacp.Last.Value;
|
||||
|
||||
@@ -431,7 +431,7 @@ public class EacpTests
|
||||
|
||||
for (int i = 0; i < 200; i++)
|
||||
{
|
||||
source.Add(new TValue(DateTime.UtcNow.AddSeconds(i), 100.0 + Math.Sin(i * 0.1) * 10));
|
||||
source.Add(new TValue(DateTime.UtcNow.AddSeconds(i), 100.0 + (Math.Sin(i * 0.1) * 10)));
|
||||
}
|
||||
|
||||
Assert.True(eacp.IsHot);
|
||||
@@ -447,7 +447,7 @@ public class EacpTests
|
||||
|
||||
for (int i = 0; i < 300; i++)
|
||||
{
|
||||
source.Add(new TValue(DateTime.UtcNow.AddSeconds(i), 100.0 + Math.Sin(i * 0.1) * 10));
|
||||
source.Add(new TValue(DateTime.UtcNow.AddSeconds(i), 100.0 + (Math.Sin(i * 0.1) * 10)));
|
||||
}
|
||||
|
||||
// Both should have values
|
||||
|
||||
@@ -316,7 +316,7 @@ public class EbswIndicatorTests
|
||||
// Add varying price bars
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
double price = 100 + 20 * Math.Sin(i * 0.2);
|
||||
double price = 100 + (20 * Math.Sin(i * 0.2));
|
||||
indicator.HistoricalData.AddBar(now.AddMinutes(i), price, price + 2, price - 2, price);
|
||||
indicator.ProcessUpdate(new UpdateArgs(UpdateReason.HistoricalBar));
|
||||
|
||||
@@ -338,7 +338,7 @@ public class EbswIndicatorTests
|
||||
// Generate sine wave price pattern
|
||||
for (int i = 0; i < 200; i++)
|
||||
{
|
||||
double price = 100.0 + 10.0 * Math.Sin(i * 0.1);
|
||||
double price = 100.0 + (10.0 * Math.Sin(i * 0.1));
|
||||
indicator.HistoricalData.AddBar(now.AddMinutes(i), price, price + 1, price - 1, price);
|
||||
indicator.ProcessUpdate(new UpdateArgs(UpdateReason.HistoricalBar));
|
||||
values.Add(indicator.LinesSeries[0].GetValue(0));
|
||||
@@ -364,7 +364,7 @@ public class EbswIndicatorTests
|
||||
// Generate sine wave price pattern
|
||||
for (int i = 0; i < 200; i++)
|
||||
{
|
||||
double price = 100.0 + 10.0 * Math.Sin(i * 0.15);
|
||||
double price = 100.0 + (10.0 * Math.Sin(i * 0.15));
|
||||
indicator.HistoricalData.AddBar(now.AddMinutes(i), price, price + 1, price - 1, price);
|
||||
indicator.ProcessUpdate(new UpdateArgs(UpdateReason.HistoricalBar));
|
||||
values.Add(indicator.LinesSeries[0].GetValue(0));
|
||||
|
||||
@@ -137,7 +137,7 @@ public class EbswTests
|
||||
|
||||
for (int i = 0; i < 200; i++)
|
||||
{
|
||||
double price = 100.0 + 10.0 * Math.Sin(i * frequency);
|
||||
double price = 100.0 + (10.0 * Math.Sin(i * frequency));
|
||||
ebsw.Update(new TValue(DateTime.UtcNow.AddSeconds(i), price));
|
||||
}
|
||||
|
||||
@@ -235,7 +235,7 @@ public class EbswTests
|
||||
// First run
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
ebsw.Update(new TValue(DateTime.UtcNow.AddSeconds(i), 100.0 + Math.Sin(i * 0.1) * 10));
|
||||
ebsw.Update(new TValue(DateTime.UtcNow.AddSeconds(i), 100.0 + (Math.Sin(i * 0.1) * 10)));
|
||||
}
|
||||
var firstResult = ebsw.Last.Value;
|
||||
|
||||
@@ -244,7 +244,7 @@ public class EbswTests
|
||||
// Second run with same data
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
ebsw.Update(new TValue(DateTime.UtcNow.AddSeconds(i), 100.0 + Math.Sin(i * 0.1) * 10));
|
||||
ebsw.Update(new TValue(DateTime.UtcNow.AddSeconds(i), 100.0 + (Math.Sin(i * 0.1) * 10)));
|
||||
}
|
||||
var secondResult = ebsw.Last.Value;
|
||||
|
||||
@@ -451,7 +451,7 @@ public class EbswTests
|
||||
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
source.Add(new TValue(DateTime.UtcNow.AddSeconds(i), 100.0 + Math.Sin(i * 0.1) * 10));
|
||||
source.Add(new TValue(DateTime.UtcNow.AddSeconds(i), 100.0 + (Math.Sin(i * 0.1) * 10)));
|
||||
}
|
||||
|
||||
Assert.True(ebsw.IsHot);
|
||||
@@ -467,7 +467,7 @@ public class EbswTests
|
||||
|
||||
for (int i = 0; i < 200; i++)
|
||||
{
|
||||
source.Add(new TValue(DateTime.UtcNow.AddSeconds(i), 100.0 + Math.Sin(i * 0.1) * 10));
|
||||
source.Add(new TValue(DateTime.UtcNow.AddSeconds(i), 100.0 + (Math.Sin(i * 0.1) * 10)));
|
||||
}
|
||||
|
||||
// Both should have values
|
||||
|
||||
@@ -89,7 +89,7 @@ public class EbswValidationTests
|
||||
// Generate sine wave to simulate price oscillation
|
||||
for (int i = 0; i < 200; i++)
|
||||
{
|
||||
double price = 100.0 + 10.0 * Math.Sin(i * 0.1);
|
||||
double price = 100.0 + (10.0 * Math.Sin(i * 0.1));
|
||||
ebsw.Update(new TValue(DateTime.UtcNow.AddSeconds(i), price));
|
||||
if (ebsw.IsHot)
|
||||
{
|
||||
@@ -186,7 +186,7 @@ public class EbswValidationTests
|
||||
// Larger amplitude oscillation to ensure EBSW detects cycles
|
||||
for (int i = 0; i < 300; i++)
|
||||
{
|
||||
double trend = 100.0 + i * 0.5;
|
||||
double trend = 100.0 + (i * 0.5);
|
||||
double oscillation = Math.Sin(i * 0.15) * 10.0; // Larger amplitude, longer period
|
||||
double price = trend + oscillation;
|
||||
ebsw.Update(new TValue(DateTime.UtcNow.AddSeconds(i), price));
|
||||
@@ -252,7 +252,7 @@ public class EbswValidationTests
|
||||
double frequency = 2.0 * Math.PI / 40.0;
|
||||
for (int i = 0; i < 500; i++)
|
||||
{
|
||||
double price = 100.0 + 10.0 * Math.Sin(i * frequency);
|
||||
double price = 100.0 + (10.0 * Math.Sin(i * frequency));
|
||||
ebsw.Update(new TValue(DateTime.UtcNow.AddSeconds(i), price));
|
||||
if (ebsw.IsHot)
|
||||
{
|
||||
@@ -405,7 +405,7 @@ public class EbswValidationTests
|
||||
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
double price = 0.0001 + i * 0.00001;
|
||||
double price = 0.0001 + (i * 0.00001);
|
||||
ebsw.Update(new TValue(DateTime.UtcNow.AddSeconds(i), price));
|
||||
}
|
||||
|
||||
@@ -421,7 +421,7 @@ public class EbswValidationTests
|
||||
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
double price = 1e10 + i * 1e8;
|
||||
double price = 1e10 + (i * 1e8);
|
||||
ebsw.Update(new TValue(DateTime.UtcNow.AddSeconds(i), price));
|
||||
}
|
||||
|
||||
|
||||
@@ -269,7 +269,7 @@ public class HomodIndicatorTests
|
||||
// Generate sine wave pattern
|
||||
for (int i = 0; i < 200; 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));
|
||||
indicator.HistoricalData.AddBar(now.AddMinutes(i), price, price + 1, price - 1, price);
|
||||
indicator.ProcessUpdate(new UpdateArgs(UpdateReason.HistoricalBar));
|
||||
}
|
||||
@@ -309,7 +309,7 @@ public class HomodIndicatorTests
|
||||
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
double price = 100.0 + i * 0.5; // Trending up
|
||||
double price = 100.0 + (i * 0.5); // Trending up
|
||||
indicator.HistoricalData.AddBar(now.AddMinutes(i), price, price + 1, price - 1, price);
|
||||
indicator.ProcessUpdate(new UpdateArgs(UpdateReason.HistoricalBar));
|
||||
}
|
||||
|
||||
@@ -146,7 +146,7 @@ public class HomodTests
|
||||
// Build some history
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
homod.Update(new TValue(DateTime.UtcNow.AddSeconds(i), 100.0 + Math.Sin(i * 0.1) * 10), isNew: true);
|
||||
homod.Update(new TValue(DateTime.UtcNow.AddSeconds(i), 100.0 + (Math.Sin(i * 0.1) * 10)), isNew: true);
|
||||
}
|
||||
|
||||
homod.Update(new TValue(DateTime.UtcNow.AddSeconds(100), 110.0), isNew: true);
|
||||
@@ -213,7 +213,7 @@ public class HomodTests
|
||||
// First run
|
||||
for (int i = 0; i < 200; i++)
|
||||
{
|
||||
homod.Update(new TValue(DateTime.UtcNow.AddSeconds(i), 100.0 + Math.Sin(i * 0.1) * 10));
|
||||
homod.Update(new TValue(DateTime.UtcNow.AddSeconds(i), 100.0 + (Math.Sin(i * 0.1) * 10)));
|
||||
}
|
||||
var firstResult = homod.Last.Value;
|
||||
|
||||
@@ -222,7 +222,7 @@ public class HomodTests
|
||||
// Second run with same data
|
||||
for (int i = 0; i < 200; i++)
|
||||
{
|
||||
homod.Update(new TValue(DateTime.UtcNow.AddSeconds(i), 100.0 + Math.Sin(i * 0.1) * 10));
|
||||
homod.Update(new TValue(DateTime.UtcNow.AddSeconds(i), 100.0 + (Math.Sin(i * 0.1) * 10)));
|
||||
}
|
||||
var secondResult = homod.Last.Value;
|
||||
|
||||
@@ -407,7 +407,7 @@ public class HomodTests
|
||||
|
||||
for (int i = 0; i < 200; i++)
|
||||
{
|
||||
source.Add(new TValue(DateTime.UtcNow.AddSeconds(i), 100.0 + Math.Sin(i * 0.1) * 10));
|
||||
source.Add(new TValue(DateTime.UtcNow.AddSeconds(i), 100.0 + (Math.Sin(i * 0.1) * 10)));
|
||||
}
|
||||
|
||||
Assert.True(homod.IsHot);
|
||||
@@ -423,7 +423,7 @@ public class HomodTests
|
||||
|
||||
for (int i = 0; i < 300; i++)
|
||||
{
|
||||
source.Add(new TValue(DateTime.UtcNow.AddSeconds(i), 100.0 + Math.Sin(i * 0.1) * 10));
|
||||
source.Add(new TValue(DateTime.UtcNow.AddSeconds(i), 100.0 + (Math.Sin(i * 0.1) * 10)));
|
||||
}
|
||||
|
||||
// Both should have values
|
||||
|
||||
@@ -110,7 +110,7 @@ public class HomodValidationTests
|
||||
// Generate 500 bars of sine wave
|
||||
for (int i = 0; i < 500; i++)
|
||||
{
|
||||
double value = 100.0 + 10.0 * Math.Sin(2.0 * Math.PI * i / knownPeriod);
|
||||
double value = 100.0 + (10.0 * Math.Sin(2.0 * Math.PI * i / knownPeriod));
|
||||
homod.Update(new TValue(DateTime.UtcNow.AddSeconds(i), value));
|
||||
}
|
||||
|
||||
@@ -131,7 +131,7 @@ public class HomodValidationTests
|
||||
// Generate sine wave with specified period
|
||||
for (int i = 0; i < 600; i++)
|
||||
{
|
||||
double value = 100.0 + 10.0 * Math.Sin(2.0 * Math.PI * i / period);
|
||||
double value = 100.0 + (10.0 * Math.Sin(2.0 * Math.PI * i / period));
|
||||
homod.Update(new TValue(DateTime.UtcNow.AddSeconds(i), value));
|
||||
}
|
||||
|
||||
@@ -282,7 +282,7 @@ public class HomodValidationTests
|
||||
// Strong uptrend with no cyclical component
|
||||
for (int i = 0; i < 500; i++)
|
||||
{
|
||||
double value = 100.0 + i * 0.5;
|
||||
double value = 100.0 + (i * 0.5);
|
||||
var result = homod.Update(new TValue(DateTime.UtcNow.AddSeconds(i), value));
|
||||
Assert.True(double.IsFinite(result.Value));
|
||||
}
|
||||
@@ -339,7 +339,7 @@ public class HomodValidationTests
|
||||
// Generate synthetic cycle
|
||||
for (int i = 0; i < 200; i++)
|
||||
{
|
||||
double value = 100.0 + 10.0 * Math.Sin(2.0 * Math.PI * i / 20);
|
||||
double value = 100.0 + (10.0 * Math.Sin(2.0 * Math.PI * i / 20));
|
||||
homod.Update(new TValue(DateTime.UtcNow.AddSeconds(i), value));
|
||||
}
|
||||
|
||||
@@ -347,7 +347,7 @@ public class HomodValidationTests
|
||||
var postWarmupValues = new List<double>();
|
||||
for (int i = 200; i < 400; i++)
|
||||
{
|
||||
double value = 100.0 + 10.0 * Math.Sin(2.0 * Math.PI * i / 20);
|
||||
double value = 100.0 + (10.0 * Math.Sin(2.0 * Math.PI * i / 20));
|
||||
var result = homod.Update(new TValue(DateTime.UtcNow.AddSeconds(i), value));
|
||||
postWarmupValues.Add(result.Value);
|
||||
}
|
||||
|
||||
@@ -178,7 +178,7 @@ public class HtDcperiodIndicatorTests
|
||||
// HT_DCPERIOD needs significant warmup - feed sinusoidal data
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
double price = 100 + 10 * Math.Sin(i * 0.3);
|
||||
double price = 100 + (10 * Math.Sin(i * 0.3));
|
||||
indicator.HistoricalData.AddBar(
|
||||
time: now.AddMinutes(i),
|
||||
open: price - 1,
|
||||
@@ -339,7 +339,7 @@ public class HtDcperiodIndicatorTests
|
||||
// Feed sinusoidal data with known period (~21 bars)
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
double price = 100 + 10 * Math.Sin(2 * Math.PI * i / 21.0);
|
||||
double price = 100 + (10 * Math.Sin(2 * Math.PI * i / 21.0));
|
||||
indicator.HistoricalData.AddBar(
|
||||
time: now.AddMinutes(i),
|
||||
open: price - 0.5,
|
||||
|
||||
@@ -27,7 +27,7 @@ public class HtDcperiodTests
|
||||
// Feed data through publisher
|
||||
for (int i = 0; i < 40; 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);
|
||||
@@ -144,7 +144,7 @@ public class HtDcperiodTests
|
||||
// Prime with data
|
||||
for (int i = 0; i < 50; 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);
|
||||
@@ -203,7 +203,7 @@ public class HtDcperiodTests
|
||||
// Feed valid data to warm up
|
||||
for (int i = 0; i < 50; 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);
|
||||
@@ -221,7 +221,7 @@ public class HtDcperiodTests
|
||||
|
||||
for (int i = 0; i < 50; 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(50), double.PositiveInfinity));
|
||||
@@ -255,7 +255,7 @@ public class HtDcperiodTests
|
||||
// First use
|
||||
for (int i = 0; i < 50; 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);
|
||||
var firstResult = ht.Last.Value;
|
||||
@@ -266,7 +266,7 @@ public class HtDcperiodTests
|
||||
|
||||
for (int i = 0; i < 50; 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);
|
||||
Assert.Equal(firstResult, ht.Last.Value);
|
||||
@@ -387,7 +387,7 @@ public class HtDcperiodTests
|
||||
var values = new double[50];
|
||||
for (int i = 0; i < 50; 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));
|
||||
@@ -443,7 +443,7 @@ public class HtDcperiodTests
|
||||
|
||||
for (int i = 0; i < 300; i++)
|
||||
{
|
||||
ht.Update(new TValue(now.AddMinutes(i), 100 + 10 * Math.Sin(omega * i)));
|
||||
ht.Update(new TValue(now.AddMinutes(i), 100 + (10 * Math.Sin(omega * i))));
|
||||
}
|
||||
|
||||
// After sufficient data, the detected period should be
|
||||
|
||||
@@ -54,7 +54,7 @@ public class HtPhasorTests
|
||||
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
phasor.Update(new TValue(DateTime.UtcNow.AddSeconds(i), 100.0 + Math.Sin(i * 0.1) * 5));
|
||||
phasor.Update(new TValue(DateTime.UtcNow.AddSeconds(i), 100.0 + (Math.Sin(i * 0.1) * 5)));
|
||||
}
|
||||
|
||||
Assert.True(double.IsFinite(phasor.Quadrature));
|
||||
@@ -126,7 +126,7 @@ public class HtPhasorTests
|
||||
|
||||
for (int i = 0; i < 50; i++)
|
||||
{
|
||||
source.Add(new TValue(DateTime.UtcNow.AddSeconds(i), 100.0 + Math.Sin(i * 0.2) * 10));
|
||||
source.Add(new TValue(DateTime.UtcNow.AddSeconds(i), 100.0 + (Math.Sin(i * 0.2) * 10)));
|
||||
}
|
||||
|
||||
Assert.True(phasor.IsHot);
|
||||
@@ -238,7 +238,7 @@ public class HtPhasorTests
|
||||
double[] data = new double[50];
|
||||
for (int i = 0; i < 50; i++)
|
||||
{
|
||||
data[i] = 100.0 + Math.Sin(i * 0.3) * 10;
|
||||
data[i] = 100.0 + (Math.Sin(i * 0.3) * 10);
|
||||
}
|
||||
|
||||
phasor1.Prime(data);
|
||||
|
||||
@@ -207,7 +207,7 @@ public class HtSineIndicatorTests
|
||||
// Add enough bars to pass warmup (63 bars)
|
||||
for (int i = 0; i < 70; i++)
|
||||
{
|
||||
double price = 100.0 + 10.0 * Math.Sin(i * 0.15);
|
||||
double price = 100.0 + (10.0 * Math.Sin(i * 0.15));
|
||||
indicator.HistoricalData.AddBar(now.AddMinutes(i), price, price + 1, price - 1, price);
|
||||
indicator.ProcessUpdate(new UpdateArgs(UpdateReason.HistoricalBar));
|
||||
}
|
||||
@@ -231,7 +231,7 @@ public class HtSineIndicatorTests
|
||||
// Generate enough data
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
double price = 100.0 + 10.0 * Math.Sin(i * 0.15);
|
||||
double price = 100.0 + (10.0 * Math.Sin(i * 0.15));
|
||||
indicator.HistoricalData.AddBar(now.AddMinutes(i), price, price + 1, price - 1, price);
|
||||
indicator.ProcessUpdate(new UpdateArgs(UpdateReason.HistoricalBar));
|
||||
}
|
||||
@@ -260,7 +260,7 @@ public class HtSineIndicatorTests
|
||||
// Generate cyclic price pattern
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
double price = 100.0 + 10.0 * Math.Sin(i * 0.15);
|
||||
double price = 100.0 + (10.0 * Math.Sin(i * 0.15));
|
||||
indicator.HistoricalData.AddBar(now.AddMinutes(i), price, price + 1, price - 1, price);
|
||||
indicator.ProcessUpdate(new UpdateArgs(UpdateReason.HistoricalBar));
|
||||
sineValues.Add(indicator.LinesSeries[0].GetValue(0));
|
||||
|
||||
@@ -91,7 +91,7 @@ public class HtSineTests
|
||||
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
htSine.Update(new TValue(DateTime.UtcNow.AddSeconds(i), 100.0 + Math.Sin(i * 0.1) * 10));
|
||||
htSine.Update(new TValue(DateTime.UtcNow.AddSeconds(i), 100.0 + (Math.Sin(i * 0.1) * 10)));
|
||||
}
|
||||
|
||||
Assert.True(double.IsFinite(htSine.LeadSine));
|
||||
@@ -106,7 +106,7 @@ public class HtSineTests
|
||||
const int period = 20;
|
||||
for (int i = 0; i < 500; i++)
|
||||
{
|
||||
double price = 100.0 + 10.0 * Math.Sin(2.0 * Math.PI * i / period);
|
||||
double price = 100.0 + (10.0 * Math.Sin(2.0 * Math.PI * i / period));
|
||||
htSine.Update(new TValue(DateTime.UtcNow.AddSeconds(i), price));
|
||||
}
|
||||
|
||||
@@ -128,7 +128,7 @@ public class HtSineTests
|
||||
// Build some history first
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
htSine.Update(new TValue(DateTime.UtcNow.AddSeconds(i), 100.0 + i * 0.1), isNew: true);
|
||||
htSine.Update(new TValue(DateTime.UtcNow.AddSeconds(i), 100.0 + (i * 0.1)), isNew: true);
|
||||
}
|
||||
var first = htSine.Last.Value;
|
||||
|
||||
@@ -147,7 +147,7 @@ public class HtSineTests
|
||||
// Build some history first
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
htSine.Update(new TValue(DateTime.UtcNow.AddSeconds(i), 100.0 + i * 0.1), isNew: true);
|
||||
htSine.Update(new TValue(DateTime.UtcNow.AddSeconds(i), 100.0 + (i * 0.1)), isNew: true);
|
||||
}
|
||||
|
||||
htSine.Update(new TValue(DateTime.UtcNow.AddSeconds(100), 150.0), isNew: true);
|
||||
@@ -168,7 +168,7 @@ public class HtSineTests
|
||||
// Build some history
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
htSine.Update(new TValue(DateTime.UtcNow.AddSeconds(i), 100.0 + i * 0.1), isNew: true);
|
||||
htSine.Update(new TValue(DateTime.UtcNow.AddSeconds(i), 100.0 + (i * 0.1)), isNew: true);
|
||||
}
|
||||
|
||||
// Add a new bar
|
||||
@@ -215,7 +215,7 @@ public class HtSineTests
|
||||
// First run
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
double price = 100.0 + 10.0 * Math.Sin(i * 0.1);
|
||||
double price = 100.0 + (10.0 * Math.Sin(i * 0.1));
|
||||
htSine.Update(new TValue(DateTime.UtcNow.AddSeconds(i), price));
|
||||
}
|
||||
var firstResult = htSine.Last.Value;
|
||||
@@ -225,7 +225,7 @@ public class HtSineTests
|
||||
// Second run with same data
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
double price = 100.0 + 10.0 * Math.Sin(i * 0.1);
|
||||
double price = 100.0 + (10.0 * Math.Sin(i * 0.1));
|
||||
htSine.Update(new TValue(DateTime.UtcNow.AddSeconds(i), price));
|
||||
}
|
||||
var secondResult = htSine.Last.Value;
|
||||
@@ -412,7 +412,7 @@ public class HtSineTests
|
||||
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
source.Add(new TValue(DateTime.UtcNow.AddSeconds(i), 100.0 + Math.Sin(i * 0.1) * 10));
|
||||
source.Add(new TValue(DateTime.UtcNow.AddSeconds(i), 100.0 + (Math.Sin(i * 0.1) * 10)));
|
||||
}
|
||||
|
||||
Assert.True(htSine.IsHot);
|
||||
|
||||
@@ -247,7 +247,7 @@ public class SsfdspIndicatorTests
|
||||
// Generate trending then ranging price pattern
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
double price = 100.0 + 10.0 * Math.Sin(i * 0.15);
|
||||
double price = 100.0 + (10.0 * Math.Sin(i * 0.15));
|
||||
indicator.HistoricalData.AddBar(now.AddMinutes(i), price, price + 1, price - 1, price);
|
||||
indicator.ProcessUpdate(new UpdateArgs(UpdateReason.HistoricalBar));
|
||||
values.Add(indicator.LinesSeries[0].GetValue(0));
|
||||
|
||||
@@ -103,7 +103,7 @@ public class SsfdspTests
|
||||
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
double price = 100.0 + i * 1.0;
|
||||
double price = 100.0 + (i * 1.0);
|
||||
ssfdsp.Update(new TValue(DateTime.UtcNow.AddSeconds(i), price));
|
||||
}
|
||||
|
||||
@@ -118,7 +118,7 @@ public class SsfdspTests
|
||||
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
double price = 200.0 - i * 1.0;
|
||||
double price = 200.0 - (i * 1.0);
|
||||
ssfdsp.Update(new TValue(DateTime.UtcNow.AddSeconds(i), price));
|
||||
}
|
||||
|
||||
@@ -423,7 +423,7 @@ public class SsfdspTests
|
||||
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
source.Add(new TValue(DateTime.UtcNow.AddSeconds(i), 100.0 + Math.Sin(i * 0.1) * 10));
|
||||
source.Add(new TValue(DateTime.UtcNow.AddSeconds(i), 100.0 + (Math.Sin(i * 0.1) * 10)));
|
||||
}
|
||||
|
||||
// Both should have values
|
||||
|
||||
@@ -159,7 +159,7 @@ public class SsfdspValidationTests
|
||||
|
||||
for (int i = 0; i < 200; i++)
|
||||
{
|
||||
double price = 100 + 10 * Math.Sin(frequency * i);
|
||||
double price = 100 + (10 * Math.Sin(frequency * i));
|
||||
ssfdsp.Update(new TValue(DateTime.UtcNow.AddSeconds(i), price));
|
||||
if (i >= 80) // After warmup
|
||||
{
|
||||
@@ -337,7 +337,7 @@ public class SsfdspValidationTests
|
||||
|
||||
for (int i = 0; i < 1000; i++)
|
||||
{
|
||||
double price = 100 + 10 * Math.Sin(2 * Math.PI * i / 40);
|
||||
double price = 100 + (10 * Math.Sin(2 * Math.PI * i / 40));
|
||||
ssfdsp.Update(new TValue(DateTime.UtcNow.AddSeconds(i), price));
|
||||
|
||||
if (i >= 100) // After warmup
|
||||
|
||||
@@ -78,7 +78,7 @@ public sealed class AlligatorValidationTests : IDisposable
|
||||
// Create strong uptrend
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
double price = 100.0 + i * 2.0;
|
||||
double price = 100.0 + (i * 2.0);
|
||||
var bar = new TBar(DateTime.UtcNow.AddMinutes(i), price, price + 1, price - 1, price, 1000);
|
||||
alligator.Update(bar);
|
||||
}
|
||||
|
||||
@@ -83,7 +83,7 @@ public class AmatTests
|
||||
// Feed rising prices to create bullish trend
|
||||
for (int i = 0; i < 20; i++)
|
||||
{
|
||||
amat.Update(new TValue(DateTime.UtcNow, 100 + i * 2));
|
||||
amat.Update(new TValue(DateTime.UtcNow, 100 + (i * 2)));
|
||||
}
|
||||
|
||||
// Trend should be +1, -1, or 0
|
||||
@@ -99,7 +99,7 @@ public class AmatTests
|
||||
// Feed steadily rising prices
|
||||
for (int i = 0; i < 50; i++)
|
||||
{
|
||||
amat.Update(new TValue(DateTime.UtcNow, 100 + i * 3));
|
||||
amat.Update(new TValue(DateTime.UtcNow, 100 + (i * 3)));
|
||||
}
|
||||
|
||||
// Should be bullish when fast EMA > slow EMA and both rising
|
||||
@@ -121,7 +121,7 @@ public class AmatTests
|
||||
// Feed steadily falling prices
|
||||
for (int i = 0; i < 50; i++)
|
||||
{
|
||||
amat.Update(new TValue(DateTime.UtcNow, 200 - i * 3));
|
||||
amat.Update(new TValue(DateTime.UtcNow, 200 - (i * 3)));
|
||||
}
|
||||
|
||||
// Should be bearish when fast EMA < slow EMA and both falling
|
||||
@@ -471,7 +471,7 @@ public class AmatTests
|
||||
// Feed rising prices to create divergence
|
||||
for (int i = 0; i < 30; i++)
|
||||
{
|
||||
amat.Update(new TValue(DateTime.UtcNow, 100 + i * 5));
|
||||
amat.Update(new TValue(DateTime.UtcNow, 100 + (i * 5)));
|
||||
}
|
||||
|
||||
// Strength should be positive when there's divergence
|
||||
|
||||
@@ -273,7 +273,7 @@ public sealed class AmatValidationTests : IDisposable
|
||||
// Phase 2: Falling prices (reversal)
|
||||
for (int i = 50; i < 150; i++)
|
||||
{
|
||||
double price = 150 - (i - 50) * 2; // Fall faster than rise
|
||||
double price = 150 - ((i - 50) * 2); // Fall faster than rise
|
||||
amat.Update(new TValue(time.AddMinutes(i), price));
|
||||
}
|
||||
double bearishTrend = amat.Last.Value;
|
||||
|
||||
@@ -34,7 +34,7 @@ public class ChopTests
|
||||
// Generate trending bars: each bar higher than the last
|
||||
for (int i = 0; i < 50; i++)
|
||||
{
|
||||
double basePrice = 100 + i * 2; // Strong uptrend
|
||||
double basePrice = 100 + (i * 2); // Strong uptrend
|
||||
bars.Add(new TBar(
|
||||
time: DateTime.UtcNow.AddMinutes(i),
|
||||
open: basePrice - 0.5,
|
||||
|
||||
@@ -74,7 +74,7 @@ public sealed class ChopValidationTests : IDisposable
|
||||
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
double price = 100.0 + i * 3.0; // Strong linear uptrend
|
||||
double price = 100.0 + (i * 3.0); // Strong linear uptrend
|
||||
var bar = new TBar(DateTime.UtcNow.AddMinutes(i), price, price + 0.5, price - 0.5, price, 1000);
|
||||
chop.Update(bar);
|
||||
}
|
||||
@@ -95,7 +95,7 @@ public sealed class ChopValidationTests : IDisposable
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
// Oscillating price with wide range but no trend
|
||||
double price = 100.0 + 5.0 * Math.Sin(2.0 * Math.PI * i / 3.0);
|
||||
double price = 100.0 + (5.0 * Math.Sin(2.0 * Math.PI * i / 3.0));
|
||||
double high = price + 3.0;
|
||||
double low = price - 3.0;
|
||||
var bar = new TBar(DateTime.UtcNow.AddMinutes(i), price, high, low, price, 1000);
|
||||
|
||||
@@ -60,7 +60,7 @@ public class HtTrendmodeTests
|
||||
// Feed data
|
||||
for (int i = 0; i < 50; i++)
|
||||
{
|
||||
indicator.Update(new TValue(DateTime.UtcNow.AddMinutes(i), 100.0 + i * 0.5));
|
||||
indicator.Update(new TValue(DateTime.UtcNow.AddMinutes(i), 100.0 + (i * 0.5)));
|
||||
}
|
||||
|
||||
// TrendMode property should match output
|
||||
@@ -76,7 +76,7 @@ public class HtTrendmodeTests
|
||||
// Feed data
|
||||
for (int i = 0; i < 50; i++)
|
||||
{
|
||||
indicator.Update(new TValue(DateTime.UtcNow.AddMinutes(i), 100.0 + Math.Sin(i * 0.2) * 10));
|
||||
indicator.Update(new TValue(DateTime.UtcNow.AddMinutes(i), 100.0 + (Math.Sin(i * 0.2) * 10)));
|
||||
}
|
||||
|
||||
// SmoothPeriod should be in valid range
|
||||
@@ -93,7 +93,7 @@ public class HtTrendmodeTests
|
||||
// Feed data
|
||||
for (int i = 0; i < 50; i++)
|
||||
{
|
||||
indicator.Update(new TValue(DateTime.UtcNow.AddMinutes(i), 100.0 + Math.Sin(i * 0.3) * 8));
|
||||
indicator.Update(new TValue(DateTime.UtcNow.AddMinutes(i), 100.0 + (Math.Sin(i * 0.3) * 8)));
|
||||
}
|
||||
|
||||
// InstPeriod should be positive
|
||||
@@ -109,7 +109,7 @@ public class HtTrendmodeTests
|
||||
// Strong trend: monotonically increasing
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
indicator.Update(new TValue(DateTime.UtcNow.AddMinutes(i), 100.0 + i * 2.0));
|
||||
indicator.Update(new TValue(DateTime.UtcNow.AddMinutes(i), 100.0 + (i * 2.0)));
|
||||
}
|
||||
|
||||
// With strong trend, inst_period should be larger → trend mode likely
|
||||
@@ -126,7 +126,7 @@ public class HtTrendmodeTests
|
||||
// Pure sinusoidal data (strong cycle)
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
double value = 100.0 + Math.Sin(i * 0.4) * 10.0;
|
||||
double value = 100.0 + (Math.Sin(i * 0.4) * 10.0);
|
||||
indicator.Update(new TValue(DateTime.UtcNow.AddMinutes(i), value));
|
||||
}
|
||||
|
||||
@@ -195,7 +195,7 @@ public class HtTrendmodeTests
|
||||
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
series.Add(DateTime.UtcNow.AddMinutes(i), 100.0 + Math.Sin(i * 0.2) * 10);
|
||||
series.Add(DateTime.UtcNow.AddMinutes(i), 100.0 + (Math.Sin(i * 0.2) * 10));
|
||||
}
|
||||
|
||||
var result = indicator.Update(series);
|
||||
@@ -218,7 +218,7 @@ public class HtTrendmodeTests
|
||||
|
||||
for (int i = 0; i < input.Length; i++)
|
||||
{
|
||||
input[i] = 100.0 + Math.Sin(i * 0.15) * 8;
|
||||
input[i] = 100.0 + (Math.Sin(i * 0.15) * 8);
|
||||
}
|
||||
|
||||
HtTrendmode.Batch(input.AsSpan(), output.AsSpan());
|
||||
@@ -238,7 +238,7 @@ public class HtTrendmodeTests
|
||||
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
series.Add(DateTime.UtcNow.AddMinutes(i), 100.0 + Math.Sin(i * 0.25) * 12);
|
||||
series.Add(DateTime.UtcNow.AddMinutes(i), 100.0 + (Math.Sin(i * 0.25) * 12));
|
||||
}
|
||||
|
||||
var result = HtTrendmode.Batch(series);
|
||||
@@ -278,7 +278,7 @@ public class HtTrendmodeTests
|
||||
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
double value = 100.0 + Math.Sin(i * 0.2) * 10 + Math.Cos(i * 0.3) * 5;
|
||||
double value = 100.0 + (Math.Sin(i * 0.2) * 10) + (Math.Cos(i * 0.3) * 5);
|
||||
series.Add(DateTime.UtcNow.AddMinutes(i), value);
|
||||
|
||||
var result = streamingIndicator.Update(new TValue(DateTime.UtcNow.AddMinutes(i), value));
|
||||
@@ -303,7 +303,7 @@ public class HtTrendmodeTests
|
||||
double[] primeData = new double[70];
|
||||
for (int i = 0; i < primeData.Length; i++)
|
||||
{
|
||||
primeData[i] = 100.0 + i * 0.5;
|
||||
primeData[i] = 100.0 + (i * 0.5);
|
||||
}
|
||||
|
||||
indicator.Prime(primeData);
|
||||
|
||||
@@ -174,7 +174,7 @@ public class IchimokuIndicatorTests
|
||||
var now = DateTime.UtcNow;
|
||||
for (int i = 0; i < 20; i++)
|
||||
{
|
||||
double basePrice = 100 + i * 2;
|
||||
double basePrice = 100 + (i * 2);
|
||||
indicator.HistoricalData.AddBar(now.AddMinutes(i), basePrice, basePrice + 5, basePrice - 5, basePrice);
|
||||
var args = new UpdateArgs(UpdateReason.HistoricalBar);
|
||||
indicator.ProcessUpdate(args);
|
||||
|
||||
@@ -83,7 +83,7 @@ public class IchimokuTests
|
||||
|
||||
for (int i = 0; i < 52; i++)
|
||||
{
|
||||
var bar = new TBar(baseTime + i * 60000, 100 + i, 105 + i, 95 + i, 102 + i, 1000);
|
||||
var bar = new TBar(baseTime + (i * 60000), 100 + i, 105 + i, 95 + i, 102 + i, 1000);
|
||||
ichimoku.Update(bar);
|
||||
}
|
||||
|
||||
@@ -241,18 +241,18 @@ public class IchimokuTests
|
||||
// Add some initial bars
|
||||
for (int i = 0; i < 3; 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 state before update (use underscore to indicate intentionally unused)
|
||||
_ = ichimoku.Tenkan.Value;
|
||||
|
||||
// Update with new bar
|
||||
ichimoku.Update(new TBar(baseTime + 3 * 60000, 110, 120, 100, 115, 1000), isNew: true);
|
||||
ichimoku.Update(new TBar(baseTime + (3 * 60000), 110, 120, 100, 115, 1000), isNew: true);
|
||||
double tenkanAfterNew = ichimoku.Tenkan.Value;
|
||||
|
||||
// Correct the bar (isNew=false) with different values
|
||||
ichimoku.Update(new TBar(baseTime + 3 * 60000, 90, 95, 85, 90, 1000), isNew: false);
|
||||
ichimoku.Update(new TBar(baseTime + (3 * 60000), 90, 95, 85, 90, 1000), isNew: false);
|
||||
double tenkanAfterCorrection = ichimoku.Tenkan.Value;
|
||||
|
||||
// Values should differ based on the correction
|
||||
@@ -268,17 +268,17 @@ public class IchimokuTests
|
||||
// Fill buffer
|
||||
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));
|
||||
}
|
||||
|
||||
// First update
|
||||
ichimoku.Update(new TBar(baseTime + 5 * 60000, 105, 110, 100, 105, 1000), isNew: true);
|
||||
ichimoku.Update(new TBar(baseTime + (5 * 60000), 105, 110, 100, 105, 1000), isNew: true);
|
||||
double firstTenkan = ichimoku.Tenkan.Value;
|
||||
|
||||
// Multiple corrections should converge
|
||||
for (int i = 0; i < 3; i++)
|
||||
{
|
||||
ichimoku.Update(new TBar(baseTime + 5 * 60000, 105, 110, 100, 105, 1000), isNew: false);
|
||||
ichimoku.Update(new TBar(baseTime + (5 * 60000), 105, 110, 100, 105, 1000), isNew: false);
|
||||
}
|
||||
|
||||
Assert.Equal(firstTenkan, ichimoku.Tenkan.Value, Precision);
|
||||
@@ -344,7 +344,7 @@ public class IchimokuTests
|
||||
// Process some bars
|
||||
for (int i = 0; i < 60; i++)
|
||||
{
|
||||
ichimoku.Update(new TBar(baseTime + i * 60000, 100 + i, 105 + i, 95 + i, 100 + i, 1000));
|
||||
ichimoku.Update(new TBar(baseTime + (i * 60000), 100 + i, 105 + i, 95 + i, 100 + i, 1000));
|
||||
}
|
||||
|
||||
Assert.True(ichimoku.IsHot);
|
||||
@@ -368,7 +368,7 @@ public class IchimokuTests
|
||||
// First use
|
||||
for (int i = 0; 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));
|
||||
}
|
||||
|
||||
double firstTenkan = ichimoku.Tenkan.Value;
|
||||
@@ -378,7 +378,7 @@ public class IchimokuTests
|
||||
|
||||
for (int i = 0; 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));
|
||||
}
|
||||
|
||||
Assert.Equal(firstTenkan, ichimoku.Tenkan.Value, Precision);
|
||||
@@ -396,7 +396,7 @@ public class IchimokuTests
|
||||
|
||||
for (int i = 0; i < 60; i++)
|
||||
{
|
||||
source.Add(new TBar(baseTime + i * 60000, 100, 110, 90, 100, 1000));
|
||||
source.Add(new TBar(baseTime + (i * 60000), 100, 110, 90, 100, 1000));
|
||||
}
|
||||
|
||||
var (tenkan, kijun, senkouA, senkouB, chikou) = Ichimoku.Batch(source);
|
||||
@@ -430,7 +430,7 @@ public class IchimokuTests
|
||||
|
||||
for (int i = 0; i < 20; i++)
|
||||
{
|
||||
source.Add(new TBar(baseTime + i * 60000, 100 + i, 110 + i, 90 + i, 100 + i, 1000));
|
||||
source.Add(new TBar(baseTime + (i * 60000), 100 + i, 110 + i, 90 + i, 100 + i, 1000));
|
||||
}
|
||||
|
||||
var (tenkan, _, _, _, _) = Ichimoku.Batch(source, 3, 5, 10, 5);
|
||||
@@ -446,7 +446,7 @@ public class IchimokuTests
|
||||
|
||||
for (int i = 0; i < 60; i++)
|
||||
{
|
||||
source.Add(new TBar(baseTime + i * 60000, 100, 110, 90, 100, 1000));
|
||||
source.Add(new TBar(baseTime + (i * 60000), 100, 110, 90, 100, 1000));
|
||||
}
|
||||
|
||||
var (results, indicator) = Ichimoku.Calculate(source);
|
||||
@@ -469,7 +469,7 @@ public class IchimokuTests
|
||||
// Constant high=low=close=100
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
ichimoku.Update(new TBar(baseTime + i * 60000, 100, 100, 100, 100, 1000));
|
||||
ichimoku.Update(new TBar(baseTime + (i * 60000), 100, 100, 100, 100, 1000));
|
||||
}
|
||||
|
||||
Assert.Equal(100.0, ichimoku.Tenkan.Value, Precision);
|
||||
@@ -506,8 +506,8 @@ public class IchimokuTests
|
||||
// Uptrend: increasing highs and lows
|
||||
for (int i = 0; i < 15; i++)
|
||||
{
|
||||
double basePrice = 100 + i * 2;
|
||||
ichimoku.Update(new TBar(baseTime + i * 60000, basePrice, basePrice + 5, basePrice - 5, basePrice, 1000));
|
||||
double basePrice = 100 + (i * 2);
|
||||
ichimoku.Update(new TBar(baseTime + (i * 60000), basePrice, basePrice + 5, basePrice - 5, basePrice, 1000));
|
||||
}
|
||||
|
||||
// In uptrend, Tenkan should be above Kijun (faster vs slower)
|
||||
|
||||
@@ -507,8 +507,8 @@ public class QstickTests
|
||||
|
||||
for (int i = 0; i < 20; i++)
|
||||
{
|
||||
double open = 100.0 + i * 0.5;
|
||||
double close = open + (i % 3 - 1); // varies between -1, 0, 1
|
||||
double open = 100.0 + (i * 0.5);
|
||||
double close = open + ((i % 3) - 1); // varies between -1, 0, 1
|
||||
bars.Add(new TBar(time.AddMinutes(i).Ticks, open, open + 2, open - 1, close, 1000));
|
||||
}
|
||||
|
||||
|
||||
@@ -123,7 +123,7 @@ public sealed class QstickValidationTests : IDisposable
|
||||
|
||||
// Bar 2: diff = 3, EMA = alpha * 3 + (1-alpha) * 6-
|
||||
qstick.Update(new TBar(time.AddMinutes(1).Ticks, 100.0, 108.0, 96.0, 103.0, 1000));
|
||||
expectedEma = alpha * 3 + (1 - alpha) * expectedEma;
|
||||
expectedEma = (alpha * 3) + ((1 - alpha) * expectedEma);
|
||||
Assert.Equal(expectedEma, qstick.Last.Value, 10);
|
||||
}
|
||||
|
||||
|
||||
@@ -87,7 +87,7 @@ public class TtmSqueezeTests
|
||||
|
||||
for (int i = 0; i < 4; i++)
|
||||
{
|
||||
squeeze.Update(new TBar(baseTime + i * 60000, 100, 105, 95, 102, 1000));
|
||||
squeeze.Update(new TBar(baseTime + (i * 60000), 100, 105, 95, 102, 1000));
|
||||
}
|
||||
|
||||
Assert.False(squeeze.IsHot);
|
||||
@@ -101,7 +101,7 @@ public class TtmSqueezeTests
|
||||
|
||||
for (int i = 0; i < 5; i++)
|
||||
{
|
||||
squeeze.Update(new TBar(baseTime + i * 60000, 100, 105, 95, 102, 1000));
|
||||
squeeze.Update(new TBar(baseTime + (i * 60000), 100, 105, 95, 102, 1000));
|
||||
}
|
||||
|
||||
Assert.True(squeeze.IsHot);
|
||||
@@ -120,7 +120,7 @@ public class TtmSqueezeTests
|
||||
// Low volatility: tight range bars
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
squeeze.Update(new TBar(baseTime + i * 60000, 100, 100.5, 99.5, 100, 1000));
|
||||
squeeze.Update(new TBar(baseTime + (i * 60000), 100, 100.5, 99.5, 100, 1000));
|
||||
}
|
||||
|
||||
// With tight range (0.5 from mid), low stddev means BB should be tighter
|
||||
@@ -139,7 +139,7 @@ public class TtmSqueezeTests
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
double offset = (i % 2 == 0) ? 10 : -10;
|
||||
squeeze.Update(new TBar(baseTime + i * 60000, 100, 110 + offset, 90 + offset, 100 + offset, 1000));
|
||||
squeeze.Update(new TBar(baseTime + (i * 60000), 100, 110 + offset, 90 + offset, 100 + offset, 1000));
|
||||
}
|
||||
|
||||
Assert.True(double.IsFinite(squeeze.Momentum.Value));
|
||||
@@ -154,11 +154,11 @@ public class TtmSqueezeTests
|
||||
// Start with tight range (likely squeeze on)
|
||||
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));
|
||||
}
|
||||
|
||||
// Sudden volatility expansion (removed unused initialSqueezeOn variable)
|
||||
squeeze.Update(new TBar(baseTime + 5 * 60000, 100, 120, 80, 115, 1000));
|
||||
squeeze.Update(new TBar(baseTime + (5 * 60000), 100, 120, 80, 115, 1000));
|
||||
|
||||
// The squeeze state should have changed
|
||||
// (The exact behavior depends on the calculation)
|
||||
@@ -210,12 +210,12 @@ public class TtmSqueezeTests
|
||||
// Flat then accelerating up
|
||||
for (int i = 0; i < 3; i++)
|
||||
{
|
||||
squeeze.Update(new TBar(baseTime + i * 60000, 100, 101, 99, 100, 1000));
|
||||
squeeze.Update(new TBar(baseTime + (i * 60000), 100, 101, 99, 100, 1000));
|
||||
}
|
||||
|
||||
// Strong up move
|
||||
squeeze.Update(new TBar(baseTime + 3 * 60000, 100, 115, 99, 112, 1000));
|
||||
squeeze.Update(new TBar(baseTime + 4 * 60000, 112, 125, 110, 122, 1000));
|
||||
squeeze.Update(new TBar(baseTime + (3 * 60000), 100, 115, 99, 112, 1000));
|
||||
squeeze.Update(new TBar(baseTime + (4 * 60000), 112, 125, 110, 122, 1000));
|
||||
|
||||
Assert.True(squeeze.MomentumRising);
|
||||
}
|
||||
@@ -233,7 +233,7 @@ public class TtmSqueezeTests
|
||||
// Strong uptrend with rising momentum
|
||||
for (int i = 0; i < 5; i++)
|
||||
{
|
||||
squeeze.Update(new TBar(baseTime + i * 60000, 100 + i * 2, 105 + i * 2, 98 + i * 2, 103 + i * 2, 1000));
|
||||
squeeze.Update(new TBar(baseTime + (i * 60000), 100 + (i * 2), 105 + (i * 2), 98 + (i * 2), 103 + (i * 2), 1000));
|
||||
}
|
||||
|
||||
// Should be MomentumPositive and MomentumRising = ColorCode 0 (Cyan)
|
||||
@@ -252,7 +252,7 @@ public class TtmSqueezeTests
|
||||
// Strong downtrend with falling momentum
|
||||
for (int i = 0; i < 5; i++)
|
||||
{
|
||||
squeeze.Update(new TBar(baseTime + i * 60000, 100 - i * 2, 102 - i * 2, 95 - i * 2, 97 - i * 2, 1000));
|
||||
squeeze.Update(new TBar(baseTime + (i * 60000), 100 - (i * 2), 102 - (i * 2), 95 - (i * 2), 97 - (i * 2), 1000));
|
||||
}
|
||||
|
||||
// Should be !MomentumPositive and !MomentumRising = ColorCode 2 (Red)
|
||||
@@ -274,15 +274,15 @@ public class TtmSqueezeTests
|
||||
|
||||
for (int i = 0; i < 3; i++)
|
||||
{
|
||||
squeeze.Update(new TBar(baseTime + i * 60000, 100, 105, 95, 102, 1000));
|
||||
squeeze.Update(new TBar(baseTime + (i * 60000), 100, 105, 95, 102, 1000));
|
||||
}
|
||||
|
||||
// Add new bar
|
||||
squeeze.Update(new TBar(baseTime + 3 * 60000, 100, 110, 98, 108, 1000), isNew: true);
|
||||
squeeze.Update(new TBar(baseTime + (3 * 60000), 100, 110, 98, 108, 1000), isNew: true);
|
||||
double valueAfterNew = squeeze.Momentum.Value;
|
||||
|
||||
// Correct the bar with different data
|
||||
squeeze.Update(new TBar(baseTime + 3 * 60000, 108, 112, 105, 92, 1000), isNew: false);
|
||||
squeeze.Update(new TBar(baseTime + (3 * 60000), 108, 112, 105, 92, 1000), isNew: false);
|
||||
double valueAfterCorrection = squeeze.Momentum.Value;
|
||||
|
||||
Assert.NotEqual(valueAfterNew, valueAfterCorrection);
|
||||
@@ -296,18 +296,18 @@ public class TtmSqueezeTests
|
||||
|
||||
for (int i = 0; i < 3; i++)
|
||||
{
|
||||
squeeze.Update(new TBar(baseTime + i * 60000, 100, 105, 95, 102, 1000));
|
||||
squeeze.Update(new TBar(baseTime + (i * 60000), 100, 105, 95, 102, 1000));
|
||||
}
|
||||
|
||||
// New bar
|
||||
squeeze.Update(new TBar(baseTime + 3 * 60000, 100, 110, 98, 108, 1000), isNew: true);
|
||||
squeeze.Update(new TBar(baseTime + (3 * 60000), 100, 110, 98, 108, 1000), isNew: true);
|
||||
double firstValue = squeeze.Momentum.Value;
|
||||
|
||||
// Correction 1
|
||||
squeeze.Update(new TBar(baseTime + 3 * 60000, 108, 115, 105, 90, 1000), isNew: false);
|
||||
squeeze.Update(new TBar(baseTime + (3 * 60000), 108, 115, 105, 90, 1000), isNew: false);
|
||||
|
||||
// Correction 2 - same as first new bar
|
||||
squeeze.Update(new TBar(baseTime + 3 * 60000, 100, 110, 98, 108, 1000), isNew: false);
|
||||
squeeze.Update(new TBar(baseTime + (3 * 60000), 100, 110, 98, 108, 1000), isNew: false);
|
||||
double secondValue = squeeze.Momentum.Value;
|
||||
|
||||
Assert.Equal(firstValue, secondValue, Precision);
|
||||
@@ -355,7 +355,7 @@ public class TtmSqueezeTests
|
||||
|
||||
for (int i = 0; i < 5; i++)
|
||||
{
|
||||
squeeze.Update(new TBar(baseTime + i * 60000, 100, 105, 95, 102, 1000));
|
||||
squeeze.Update(new TBar(baseTime + (i * 60000), 100, 105, 95, 102, 1000));
|
||||
}
|
||||
|
||||
Assert.True(squeeze.IsHot);
|
||||
@@ -375,7 +375,7 @@ public class TtmSqueezeTests
|
||||
// Uptrend
|
||||
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));
|
||||
}
|
||||
|
||||
double upTrendMomentum = squeeze.Momentum.Value;
|
||||
@@ -385,7 +385,7 @@ public class TtmSqueezeTests
|
||||
// Downtrend
|
||||
for (int i = 0; i < 5; i++)
|
||||
{
|
||||
squeeze.Update(new TBar(baseTime + i * 60000, 100 - i * 2, 102 - i * 2, 95 - i * 2, 97 - i * 2, 1000));
|
||||
squeeze.Update(new TBar(baseTime + (i * 60000), 100 - (i * 2), 102 - (i * 2), 95 - (i * 2), 97 - (i * 2), 1000));
|
||||
}
|
||||
|
||||
Assert.NotEqual(upTrendMomentum, squeeze.Momentum.Value);
|
||||
@@ -404,7 +404,7 @@ public class TtmSqueezeTests
|
||||
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
source.Add(new TBar(baseTime + i * 60000, 100, 105, 95, 102, 1000));
|
||||
source.Add(new TBar(baseTime + (i * 60000), 100, 105, 95, 102, 1000));
|
||||
}
|
||||
|
||||
squeeze.Prime(source);
|
||||
@@ -424,7 +424,7 @@ public class TtmSqueezeTests
|
||||
|
||||
for (int i = 0; i < 20; i++)
|
||||
{
|
||||
source.Add(new TBar(baseTime + i * 60000, 100 + i, 105 + i, 95 + i, 102 + i, 1000));
|
||||
source.Add(new TBar(baseTime + (i * 60000), 100 + i, 105 + i, 95 + i, 102 + i, 1000));
|
||||
}
|
||||
|
||||
var result = TtmSqueeze.Batch(source);
|
||||
@@ -449,7 +449,7 @@ public class TtmSqueezeTests
|
||||
|
||||
for (int i = 0; i < 20; i++)
|
||||
{
|
||||
source.Add(new TBar(baseTime + i * 60000, 100, 105, 95, 102, 1000));
|
||||
source.Add(new TBar(baseTime + (i * 60000), 100, 105, 95, 102, 1000));
|
||||
}
|
||||
|
||||
var (results, indicator) = TtmSqueeze.Calculate(source, bbPeriod: 10, bbMult: 2.0, kcPeriod: 10, kcMult: 1.5, momPeriod: 10);
|
||||
|
||||
@@ -303,14 +303,14 @@ public class TtmTrendIndicatorTests
|
||||
// Feed historical bars
|
||||
for (int i = 0; i < 5; i++)
|
||||
{
|
||||
indicator.HistoricalData.AddBar(now.AddMinutes(i), 100 + i * 2, 110 + i * 2, 90 + i * 2, 105 + i * 2);
|
||||
indicator.HistoricalData.AddBar(now.AddMinutes(i), 100 + (i * 2), 110 + (i * 2), 90 + (i * 2), 105 + (i * 2));
|
||||
indicator.ProcessUpdate(new UpdateArgs(UpdateReason.HistoricalBar));
|
||||
}
|
||||
|
||||
// Feed new bars
|
||||
for (int i = 5; i < 8; i++)
|
||||
{
|
||||
indicator.HistoricalData.AddBar(now.AddMinutes(i), 100 + i * 2, 110 + i * 2, 90 + i * 2, 105 + i * 2);
|
||||
indicator.HistoricalData.AddBar(now.AddMinutes(i), 100 + (i * 2), 110 + (i * 2), 90 + (i * 2), 105 + (i * 2));
|
||||
indicator.ProcessUpdate(new UpdateArgs(UpdateReason.NewBar));
|
||||
}
|
||||
|
||||
|
||||
@@ -81,7 +81,7 @@ public class TtmTrendBasicTests
|
||||
// EMA = alpha * value + (1 - alpha) * prevEMA
|
||||
// EMA = 0.2857 * 107 + 0.7143 * 100 = 30.57 + 71.43 = 102.0
|
||||
double alpha = 2.0 / 7.0;
|
||||
double expected = alpha * 107.0 + (1 - alpha) * 100.0;
|
||||
double expected = (alpha * 107.0) + ((1 - alpha) * 100.0);
|
||||
Assert.Equal(expected, result.Value, 10);
|
||||
}
|
||||
|
||||
@@ -360,7 +360,7 @@ public class TtmTrendBarCorrectionTests
|
||||
|
||||
// Should use 105 instead of 110
|
||||
double alpha = 2.0 / 7.0;
|
||||
double expected = alpha * 105.0 + (1 - alpha) * 100.0;
|
||||
double expected = (alpha * 105.0) + ((1 - alpha) * 100.0);
|
||||
Assert.Equal(expected, corrected.Value, 10);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -64,7 +64,7 @@ public class TtmTrendValidationTests
|
||||
// Feed enough bars to warm up, then inject consistently rising prices
|
||||
for (int i = 0; i < 20; i++)
|
||||
{
|
||||
double price = basePrice + i * 2.0;
|
||||
double price = basePrice + (i * 2.0);
|
||||
var bar = new TBar(
|
||||
DateTime.UtcNow.AddMinutes(i),
|
||||
price - 0.5, price + 0.5, price - 0.5, price, 1000);
|
||||
@@ -84,7 +84,7 @@ public class TtmTrendValidationTests
|
||||
// Feed enough bars to warm up, then inject consistently falling prices
|
||||
for (int i = 0; i < 20; i++)
|
||||
{
|
||||
double price = basePrice - i * 2.0;
|
||||
double price = basePrice - (i * 2.0);
|
||||
var bar = new TBar(
|
||||
DateTime.UtcNow.AddMinutes(i),
|
||||
price + 0.5, price + 0.5, price - 0.5, price, 1000);
|
||||
|
||||
@@ -172,8 +172,8 @@ public class VortexTests
|
||||
// VI- = 17 / 27 ≈ 0.630
|
||||
|
||||
Assert.True(vortex.IsHot);
|
||||
Assert.True(Math.Abs(vortex.ViPlus.Value - 32.0 / 27.0) < 0.001);
|
||||
Assert.True(Math.Abs(vortex.ViMinus.Value - 17.0 / 27.0) < 0.001);
|
||||
Assert.True(Math.Abs(vortex.ViPlus.Value - (32.0 / 27.0)) < 0.001);
|
||||
Assert.True(Math.Abs(vortex.ViMinus.Value - (17.0 / 27.0)) < 0.001);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
@@ -205,8 +205,8 @@ public class VortexTests
|
||||
|
||||
for (int i = 0; i < 50; i++)
|
||||
{
|
||||
double price = basePrice + i * 2; // Strong uptrend
|
||||
var bar = new TBar(baseTime + i * 60000, price, price + 1, price - 0.5, price + 0.5, 1000);
|
||||
double price = basePrice + (i * 2); // Strong uptrend
|
||||
var bar = new TBar(baseTime + (i * 60000), price, price + 1, price - 0.5, price + 0.5, 1000);
|
||||
vortex.Update(bar);
|
||||
}
|
||||
|
||||
@@ -225,8 +225,8 @@ public class VortexTests
|
||||
|
||||
for (int i = 0; i < 50; i++)
|
||||
{
|
||||
double price = basePrice - i * 2; // Strong downtrend
|
||||
var bar = new TBar(baseTime + i * 60000, price, price + 0.5, price - 1, price - 0.5, 1000);
|
||||
double price = basePrice - (i * 2); // Strong downtrend
|
||||
var bar = new TBar(baseTime + (i * 60000), price, price + 0.5, price - 1, price - 0.5, 1000);
|
||||
vortex.Update(bar);
|
||||
}
|
||||
|
||||
|
||||
@@ -39,10 +39,10 @@ public class HuberTests
|
||||
for (int i = 0; i < period - 1; i++)
|
||||
{
|
||||
Assert.False(huber.IsHot, $"IsHot should be false at index {i}");
|
||||
huber.Update(i * 10, i * 10 + 5);
|
||||
huber.Update(i * 10, (i * 10) + 5);
|
||||
}
|
||||
|
||||
huber.Update((period - 1) * 10, (period - 1) * 10 + 5);
|
||||
huber.Update((period - 1) * 10, ((period - 1) * 10) + 5);
|
||||
Assert.True(huber.IsHot, "IsHot should be true after period updates");
|
||||
}
|
||||
|
||||
@@ -70,7 +70,7 @@ public class HuberTests
|
||||
|
||||
// Error = 10 (large), Huber = delta * |error| - 0.5 * delta^2 = 1 * 10 - 0.5 = 9.5
|
||||
var res1 = huber.Update(110, 100);
|
||||
Assert.Equal(delta * 10 - halfDeltaSquared, res1.Value, 10);
|
||||
Assert.Equal((delta * 10) - halfDeltaSquared, res1.Value, 10);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
@@ -89,7 +89,7 @@ public class HuberTests
|
||||
var aboveDelta = huber2.Update(105.1, 100);
|
||||
// Should be very close to quadratic at transition
|
||||
// delta * 5.1 - 0.5 * delta^2 = 5 * 5.1 - 12.5 = 25.5 - 12.5 = 13
|
||||
double expected = delta * 5.1 - 0.5 * delta * delta;
|
||||
double expected = (delta * 5.1) - (0.5 * delta * delta);
|
||||
Assert.Equal(expected, aboveDelta.Value, 5);
|
||||
}
|
||||
|
||||
@@ -163,7 +163,7 @@ public class HuberTests
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
tenthActual = i * 10;
|
||||
tenthPredicted = i * 10 + 5;
|
||||
tenthPredicted = (i * 10) + 5;
|
||||
huber.Update(tenthActual, tenthPredicted);
|
||||
}
|
||||
|
||||
@@ -188,7 +188,7 @@ public class HuberTests
|
||||
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
huber.Update(i * 10, i * 10 + 5);
|
||||
huber.Update(i * 10, (i * 10) + 5);
|
||||
}
|
||||
|
||||
Assert.True(huber.IsHot);
|
||||
@@ -267,7 +267,7 @@ public class HuberTests
|
||||
{
|
||||
var bar = gbm.Next();
|
||||
actual[i] = bar.Close;
|
||||
predicted[i] = bar.Close * 1.05 + 2; // Offset prediction
|
||||
predicted[i] = (bar.Close * 1.05) + 2; // Offset prediction
|
||||
}
|
||||
|
||||
// Streaming
|
||||
|
||||
@@ -398,7 +398,7 @@ public class LogCoshTests
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
var bar = gbm.Next(isNew: true);
|
||||
logCosh.Update(bar.Close, bar.Close * (1 + (i % 3 - 1) * 0.1));
|
||||
logCosh.Update(bar.Close, bar.Close * (1 + (((i % 3) - 1) * 0.1)));
|
||||
Assert.True(logCosh.Last.Value >= 0, $"LogCosh should be non-negative, got {logCosh.Last.Value}");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -34,10 +34,10 @@ public class MaeTests
|
||||
for (int i = 0; i < period - 1; i++)
|
||||
{
|
||||
Assert.False(mae.IsHot, $"IsHot should be false at index {i}");
|
||||
mae.Update(i * 10, i * 10 + 5);
|
||||
mae.Update(i * 10, (i * 10) + 5);
|
||||
}
|
||||
|
||||
mae.Update((period - 1) * 10, (period - 1) * 10 + 5);
|
||||
mae.Update((period - 1) * 10, ((period - 1) * 10) + 5);
|
||||
Assert.True(mae.IsHot, "IsHot should be true after period updates");
|
||||
}
|
||||
|
||||
@@ -146,7 +146,7 @@ public class MaeTests
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
tenthActual = i * 10;
|
||||
tenthPredicted = i * 10 + 5;
|
||||
tenthPredicted = (i * 10) + 5;
|
||||
mae.Update(tenthActual, tenthPredicted);
|
||||
}
|
||||
|
||||
@@ -171,7 +171,7 @@ public class MaeTests
|
||||
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
mae.Update(i * 10, i * 10 + 5);
|
||||
mae.Update(i * 10, (i * 10) + 5);
|
||||
}
|
||||
|
||||
Assert.True(mae.IsHot);
|
||||
@@ -249,7 +249,7 @@ public class MaeTests
|
||||
{
|
||||
var bar = gbm.Next();
|
||||
actual[i] = bar.Close;
|
||||
predicted[i] = bar.Close * 1.05 + 2; // Offset prediction
|
||||
predicted[i] = (bar.Close * 1.05) + 2; // Offset prediction
|
||||
}
|
||||
|
||||
// Streaming
|
||||
@@ -305,7 +305,7 @@ public class MaeTests
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
actual.Add(now.AddMinutes(i), i * 10);
|
||||
predicted.Add(now.AddMinutes(i), i * 10 + 5);
|
||||
predicted.Add(now.AddMinutes(i), (i * 10) + 5);
|
||||
}
|
||||
|
||||
var results = Mae.Batch(actual, predicted, 3);
|
||||
|
||||
@@ -56,7 +56,7 @@ public class MapdTests
|
||||
|
||||
// |50 - 60| / 60 * 100 = 16.666...%
|
||||
var res3 = mapd.Update(50, 60);
|
||||
double expected = (100.0 * 10 / 110 + 100.0 * 20 / 220 + 100.0 * 10 / 60) / 3;
|
||||
double expected = ((100.0 * 10 / 110) + (100.0 * 20 / 220) + (100.0 * 10 / 60)) / 3;
|
||||
Assert.Equal(expected, res3.Value, 10);
|
||||
}
|
||||
|
||||
@@ -130,7 +130,7 @@ public class MapdTests
|
||||
for (int i = 1; i <= 10; i++)
|
||||
{
|
||||
tenthActual = i * 10;
|
||||
tenthPredicted = i * 10 + 5;
|
||||
tenthPredicted = (i * 10) + 5;
|
||||
mapd.Update(tenthActual, tenthPredicted);
|
||||
}
|
||||
|
||||
@@ -155,7 +155,7 @@ public class MapdTests
|
||||
|
||||
for (int i = 1; i <= 10; i++)
|
||||
{
|
||||
mapd.Update(i * 10, i * 10 + 5);
|
||||
mapd.Update(i * 10, (i * 10) + 5);
|
||||
}
|
||||
|
||||
Assert.True(mapd.IsHot);
|
||||
@@ -233,7 +233,7 @@ public class MapdTests
|
||||
{
|
||||
var bar = gbm.Next();
|
||||
actual[i] = bar.Close;
|
||||
predicted[i] = bar.Close * 1.05 + 2; // Offset prediction
|
||||
predicted[i] = (bar.Close * 1.05) + 2; // Offset prediction
|
||||
}
|
||||
|
||||
// Streaming
|
||||
|
||||
@@ -146,7 +146,7 @@ public class MapeTests
|
||||
for (int i = 1; i <= 10; i++)
|
||||
{
|
||||
tenthActual = i * 10;
|
||||
tenthPredicted = i * 10 + 5;
|
||||
tenthPredicted = (i * 10) + 5;
|
||||
mape.Update(tenthActual, tenthPredicted);
|
||||
}
|
||||
|
||||
@@ -171,7 +171,7 @@ public class MapeTests
|
||||
|
||||
for (int i = 1; i <= 10; i++)
|
||||
{
|
||||
mape.Update(i * 10, i * 10 + 5);
|
||||
mape.Update(i * 10, (i * 10) + 5);
|
||||
}
|
||||
|
||||
Assert.True(mape.IsHot);
|
||||
@@ -249,7 +249,7 @@ public class MapeTests
|
||||
{
|
||||
var bar = gbm.Next();
|
||||
actual[i] = bar.Close;
|
||||
predicted[i] = bar.Close * 1.05 + 2; // Offset prediction
|
||||
predicted[i] = (bar.Close * 1.05) + 2; // Offset prediction
|
||||
}
|
||||
|
||||
// Streaming
|
||||
|
||||
@@ -198,7 +198,7 @@ public class MaseTests
|
||||
// Generate data where prediction is always perfect
|
||||
for (int i = 0; i < 20; i++)
|
||||
{
|
||||
double actual = 100 + i * 2;
|
||||
double actual = 100 + (i * 2);
|
||||
double perfect = actual; // Perfect prediction
|
||||
mase.Update(new TValue(time.AddSeconds(i), actual), new TValue(time.AddSeconds(i), perfect));
|
||||
}
|
||||
|
||||
@@ -34,10 +34,10 @@ public class MeTests
|
||||
for (int i = 0; i < period - 1; i++)
|
||||
{
|
||||
Assert.False(me.IsHot, $"IsHot should be false at index {i}");
|
||||
me.Update(i * 10, i * 10 + 5);
|
||||
me.Update(i * 10, (i * 10) + 5);
|
||||
}
|
||||
|
||||
me.Update((period - 1) * 10, (period - 1) * 10 + 5);
|
||||
me.Update((period - 1) * 10, ((period - 1) * 10) + 5);
|
||||
Assert.True(me.IsHot, "IsHot should be true after period updates");
|
||||
}
|
||||
|
||||
@@ -172,7 +172,7 @@ public class MeTests
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
tenthActual = i * 10;
|
||||
tenthPredicted = i * 10 + 5;
|
||||
tenthPredicted = (i * 10) + 5;
|
||||
me.Update(tenthActual, tenthPredicted);
|
||||
}
|
||||
|
||||
@@ -197,7 +197,7 @@ public class MeTests
|
||||
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
me.Update(i * 10, i * 10 + 5);
|
||||
me.Update(i * 10, (i * 10) + 5);
|
||||
}
|
||||
|
||||
Assert.True(me.IsHot);
|
||||
@@ -275,7 +275,7 @@ public class MeTests
|
||||
{
|
||||
var bar = gbm.Next();
|
||||
actual[i] = bar.Close;
|
||||
predicted[i] = bar.Close * 1.05 + 2; // Offset prediction
|
||||
predicted[i] = (bar.Close * 1.05) + 2; // Offset prediction
|
||||
}
|
||||
|
||||
// Streaming
|
||||
@@ -331,7 +331,7 @@ public class MeTests
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
actual.Add(now.AddMinutes(i), i * 10);
|
||||
predicted.Add(now.AddMinutes(i), i * 10 + 5);
|
||||
predicted.Add(now.AddMinutes(i), (i * 10) + 5);
|
||||
}
|
||||
|
||||
var results = Me.Batch(actual, predicted, 3);
|
||||
|
||||
@@ -34,10 +34,10 @@ public class MraeTests
|
||||
for (int i = 1; i <= period - 1; i++)
|
||||
{
|
||||
Assert.False(mrae.IsHot, $"IsHot should be false at index {i}");
|
||||
mrae.Update(i * 10, i * 10 + 5);
|
||||
mrae.Update(i * 10, (i * 10) + 5);
|
||||
}
|
||||
|
||||
mrae.Update(period * 10, period * 10 + 5);
|
||||
mrae.Update(period * 10, (period * 10) + 5);
|
||||
Assert.True(mrae.IsHot, "IsHot should be true after period updates");
|
||||
}
|
||||
|
||||
@@ -127,7 +127,7 @@ public class MraeTests
|
||||
for (int i = 1; i <= 10; i++)
|
||||
{
|
||||
tenthActual = i * 100;
|
||||
tenthPredicted = i * 100 + 10;
|
||||
tenthPredicted = (i * 100) + 10;
|
||||
mrae.Update(tenthActual, tenthPredicted);
|
||||
}
|
||||
|
||||
@@ -152,7 +152,7 @@ public class MraeTests
|
||||
|
||||
for (int i = 1; i <= 10; i++)
|
||||
{
|
||||
mrae.Update(i * 10, i * 10 + 5);
|
||||
mrae.Update(i * 10, (i * 10) + 5);
|
||||
}
|
||||
|
||||
Assert.True(mrae.IsHot);
|
||||
@@ -230,7 +230,7 @@ public class MraeTests
|
||||
{
|
||||
var bar = gbm.Next();
|
||||
actual[i] = bar.Close;
|
||||
predicted[i] = bar.Close * 1.05 + 2;
|
||||
predicted[i] = (bar.Close * 1.05) + 2;
|
||||
}
|
||||
|
||||
// Streaming
|
||||
|
||||
@@ -34,10 +34,10 @@ public class MseTests
|
||||
for (int i = 0; i < period - 1; i++)
|
||||
{
|
||||
Assert.False(mse.IsHot, $"IsHot should be false at index {i}");
|
||||
mse.Update(i * 10, i * 10 + 5);
|
||||
mse.Update(i * 10, (i * 10) + 5);
|
||||
}
|
||||
|
||||
mse.Update((period - 1) * 10, (period - 1) * 10 + 5);
|
||||
mse.Update((period - 1) * 10, ((period - 1) * 10) + 5);
|
||||
Assert.True(mse.IsHot, "IsHot should be true after period updates");
|
||||
}
|
||||
|
||||
@@ -152,7 +152,7 @@ public class MseTests
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
tenthActual = i * 10;
|
||||
tenthPredicted = i * 10 + 5;
|
||||
tenthPredicted = (i * 10) + 5;
|
||||
mse.Update(tenthActual, tenthPredicted);
|
||||
}
|
||||
|
||||
@@ -177,7 +177,7 @@ public class MseTests
|
||||
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
mse.Update(i * 10, i * 10 + 5);
|
||||
mse.Update(i * 10, (i * 10) + 5);
|
||||
}
|
||||
|
||||
Assert.True(mse.IsHot);
|
||||
@@ -237,7 +237,7 @@ public class MseTests
|
||||
{
|
||||
var bar = gbm.Next();
|
||||
actual[i] = bar.Close;
|
||||
predicted[i] = bar.Close * 1.05 + 2;
|
||||
predicted[i] = (bar.Close * 1.05) + 2;
|
||||
}
|
||||
|
||||
// Streaming
|
||||
@@ -284,7 +284,7 @@ public class MseTests
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
actual.Add(now.AddMinutes(i), i * 10);
|
||||
predicted.Add(now.AddMinutes(i), i * 10 + 5);
|
||||
predicted.Add(now.AddMinutes(i), (i * 10) + 5);
|
||||
}
|
||||
|
||||
var results = Mse.Batch(actual, predicted, 3);
|
||||
|
||||
@@ -204,7 +204,7 @@ public class PseudoHuberTests
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
var bar = gbm.Next();
|
||||
pseudoHuber.Update(bar.Close, bar.Close + (i % 2 == 0 ? 1 : -1) * (i + 1));
|
||||
pseudoHuber.Update(bar.Close, bar.Close + ((i % 2 == 0 ? 1 : -1) * (i + 1)));
|
||||
Assert.True(pseudoHuber.Last.Value >= 0, "Pseudo-Huber loss should always be non-negative");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -381,7 +381,7 @@ public class QuantileLossTests
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
var bar = gbm.Next(isNew: true);
|
||||
quantileLoss.Update(bar.Close, bar.Close * (1 + (i % 3 - 1) * 0.1));
|
||||
quantileLoss.Update(bar.Close, bar.Close * (1 + (((i % 3) - 1) * 0.1)));
|
||||
Assert.True(quantileLoss.Last.Value >= 0, $"QuantileLoss should be non-negative, got {quantileLoss.Last.Value}");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -148,7 +148,7 @@ public class RaeTests
|
||||
// Different actual values but perfect predictions
|
||||
for (int i = 0; i < 20; i++)
|
||||
{
|
||||
double val = 100 + i * 2;
|
||||
double val = 100 + (i * 2);
|
||||
rae.Update(new TValue(time.AddSeconds(i), val), new TValue(time.AddSeconds(i), val));
|
||||
}
|
||||
|
||||
|
||||
@@ -34,10 +34,10 @@ public class RmseTests
|
||||
for (int i = 0; i < period - 1; i++)
|
||||
{
|
||||
Assert.False(rmse.IsHot);
|
||||
rmse.Update(i * 10, i * 10 + 5);
|
||||
rmse.Update(i * 10, (i * 10) + 5);
|
||||
}
|
||||
|
||||
rmse.Update((period - 1) * 10, (period - 1) * 10 + 5);
|
||||
rmse.Update((period - 1) * 10, ((period - 1) * 10) + 5);
|
||||
Assert.True(rmse.IsHot);
|
||||
}
|
||||
|
||||
@@ -67,8 +67,8 @@ public class RmseTests
|
||||
|
||||
for (int i = 0; i < 20; i++)
|
||||
{
|
||||
rmse.Update(i * 10, i * 10 + 7);
|
||||
mse.Update(i * 10, i * 10 + 7);
|
||||
rmse.Update(i * 10, (i * 10) + 7);
|
||||
mse.Update(i * 10, (i * 10) + 7);
|
||||
}
|
||||
|
||||
Assert.Equal(Math.Sqrt(mse.Last.Value), rmse.Last.Value, 10);
|
||||
@@ -127,7 +127,7 @@ public class RmseTests
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
tenthActual = i * 10;
|
||||
tenthPredicted = i * 10 + 5;
|
||||
tenthPredicted = (i * 10) + 5;
|
||||
rmse.Update(tenthActual, tenthPredicted);
|
||||
}
|
||||
|
||||
@@ -150,7 +150,7 @@ public class RmseTests
|
||||
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
rmse.Update(i * 10, i * 10 + 5);
|
||||
rmse.Update(i * 10, (i * 10) + 5);
|
||||
}
|
||||
|
||||
Assert.True(rmse.IsHot);
|
||||
@@ -196,7 +196,7 @@ public class RmseTests
|
||||
{
|
||||
var bar = gbm.Next();
|
||||
actual[i] = bar.Close;
|
||||
predicted[i] = bar.Close * 1.05 + 2;
|
||||
predicted[i] = (bar.Close * 1.05) + 2;
|
||||
}
|
||||
|
||||
var rmse = new Rmse(period);
|
||||
@@ -238,7 +238,7 @@ public class RmseTests
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
actual.Add(now.AddMinutes(i), i * 10);
|
||||
predicted.Add(now.AddMinutes(i), i * 10 + 5);
|
||||
predicted.Add(now.AddMinutes(i), (i * 10) + 5);
|
||||
}
|
||||
|
||||
var results = Rmse.Batch(actual, predicted, 3);
|
||||
|
||||
@@ -362,7 +362,7 @@ public class RmsleTests
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
var bar = gbm.Next(isNew: true);
|
||||
var result = rmsle.Update(bar.Close, bar.Close * (0.8 + 0.4 * (i % 2)));
|
||||
var result = rmsle.Update(bar.Close, bar.Close * (0.8 + (0.4 * (i % 2))));
|
||||
Assert.True(result.Value >= 0, $"RMSLE should always be non-negative, got {result.Value}");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -148,7 +148,7 @@ public class RseTests
|
||||
// Different actual values but perfect predictions
|
||||
for (int i = 0; i < 20; i++)
|
||||
{
|
||||
double val = 100 + i * 2;
|
||||
double val = 100 + (i * 2);
|
||||
rse.Update(new TValue(time.AddSeconds(i), val), new TValue(time.AddSeconds(i), val));
|
||||
}
|
||||
|
||||
@@ -165,8 +165,8 @@ public class RseTests
|
||||
// Generate data with some error
|
||||
for (int i = 0; i < 20; i++)
|
||||
{
|
||||
double actual = 100 + i * 2;
|
||||
double predicted = actual + (i % 3 - 1) * 2; // Small systematic error
|
||||
double actual = 100 + (i * 2);
|
||||
double predicted = actual + (((i % 3) - 1) * 2); // Small systematic error
|
||||
rse.Update(new TValue(time.AddSeconds(i), actual), new TValue(time.AddSeconds(i), predicted));
|
||||
}
|
||||
|
||||
|
||||
@@ -147,7 +147,7 @@ public class RsquaredTests
|
||||
// Different actual values but perfect predictions
|
||||
for (int i = 0; i < 20; i++)
|
||||
{
|
||||
double val = 100 + i * 2;
|
||||
double val = 100 + (i * 2);
|
||||
r2.Update(new TValue(time.AddSeconds(i), val), new TValue(time.AddSeconds(i), val));
|
||||
}
|
||||
|
||||
@@ -165,8 +165,8 @@ public class RsquaredTests
|
||||
// Generate data with some error
|
||||
for (int i = 0; i < 20; i++)
|
||||
{
|
||||
double actual = 100 + i * 2;
|
||||
double predicted = actual + (i % 3 - 1) * 2;
|
||||
double actual = 100 + (i * 2);
|
||||
double predicted = actual + (((i % 3) - 1) * 2);
|
||||
r2.Update(new TValue(time.AddSeconds(i), actual), new TValue(time.AddSeconds(i), predicted));
|
||||
rse.Update(new TValue(time.AddSeconds(i), actual), new TValue(time.AddSeconds(i), predicted));
|
||||
}
|
||||
@@ -210,7 +210,7 @@ public class RsquaredTests
|
||||
// Linear trend with small random noise in predictions
|
||||
for (int i = 0; i < 20; i++)
|
||||
{
|
||||
double actual = 100 + i * 2;
|
||||
double actual = 100 + (i * 2);
|
||||
double predicted = actual + (i % 2 == 0 ? 0.5 : -0.5); // Small systematic error
|
||||
r2.Update(new TValue(time.AddSeconds(i), actual), new TValue(time.AddSeconds(i), predicted));
|
||||
}
|
||||
@@ -261,8 +261,8 @@ public class RsquaredTests
|
||||
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
double actual = 100 + Math.Sin(i * 0.1) * 20;
|
||||
double predicted = actual + (i % 5 - 2); // Small systematic error
|
||||
double actual = 100 + (Math.Sin(i * 0.1) * 20);
|
||||
double predicted = actual + ((i % 5) - 2); // Small systematic error
|
||||
r2.Update(new TValue(time.AddSeconds(i), actual), new TValue(time.AddSeconds(i), predicted));
|
||||
|
||||
// R² should never exceed 1
|
||||
|
||||
@@ -361,7 +361,7 @@ public class TukeyBiweightTests
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
var bar = gbm.Next(isNew: true);
|
||||
tukey.Update(bar.Close, bar.Close * (1 + (i % 3 - 1) * 0.2));
|
||||
tukey.Update(bar.Close, bar.Close * (1 + (((i % 3) - 1) * 0.2)));
|
||||
Assert.True(tukey.Last.Value >= 0, $"Loss should be non-negative, got {tukey.Last.Value}");
|
||||
Assert.True(tukey.Last.Value <= maxLoss, $"Loss should be <= {maxLoss}, got {tukey.Last.Value}");
|
||||
}
|
||||
|
||||
@@ -34,10 +34,10 @@ public class WrmseTests
|
||||
for (int i = 0; i < period - 1; i++)
|
||||
{
|
||||
Assert.False(wrmse.IsHot);
|
||||
wrmse.Update(i * 10, i * 10 + 5);
|
||||
wrmse.Update(i * 10, (i * 10) + 5);
|
||||
}
|
||||
|
||||
wrmse.Update((period - 1) * 10, (period - 1) * 10 + 5);
|
||||
wrmse.Update((period - 1) * 10, ((period - 1) * 10) + 5);
|
||||
Assert.True(wrmse.IsHot);
|
||||
}
|
||||
|
||||
@@ -49,8 +49,8 @@ public class WrmseTests
|
||||
|
||||
for (int i = 0; i < 20; i++)
|
||||
{
|
||||
wrmse.Update(i * 10, i * 10 + 7);
|
||||
rmse.Update(i * 10, i * 10 + 7);
|
||||
wrmse.Update(i * 10, (i * 10) + 7);
|
||||
rmse.Update(i * 10, (i * 10) + 7);
|
||||
}
|
||||
|
||||
// With default weight of 1.0, WRMSE should equal RMSE
|
||||
@@ -154,7 +154,7 @@ public class WrmseTests
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
tenthActual = i * 10;
|
||||
tenthPredicted = i * 10 + 5;
|
||||
tenthPredicted = (i * 10) + 5;
|
||||
tenthWeight = i + 1.0;
|
||||
wrmse.Update(tenthActual, tenthPredicted, tenthWeight);
|
||||
}
|
||||
@@ -178,7 +178,7 @@ public class WrmseTests
|
||||
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
wrmse.Update(i * 10, i * 10 + 5, i + 1.0);
|
||||
wrmse.Update(i * 10, (i * 10) + 5, i + 1.0);
|
||||
}
|
||||
|
||||
Assert.True(wrmse.IsHot);
|
||||
@@ -238,7 +238,7 @@ public class WrmseTests
|
||||
{
|
||||
var bar = gbm.Next();
|
||||
actual[i] = bar.Close;
|
||||
predicted[i] = bar.Close * 1.05 + 2;
|
||||
predicted[i] = (bar.Close * 1.05) + 2;
|
||||
}
|
||||
|
||||
var wrmse = new Wrmse(period);
|
||||
@@ -271,7 +271,7 @@ public class WrmseTests
|
||||
{
|
||||
var bar = gbm.Next();
|
||||
actual[i] = bar.Close;
|
||||
predicted[i] = bar.Close * 1.05 + 2;
|
||||
predicted[i] = (bar.Close * 1.05) + 2;
|
||||
weights[i] = (i % 5) + 1.0; // Varying weights 1-5
|
||||
}
|
||||
|
||||
@@ -317,7 +317,7 @@ public class WrmseTests
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
actual.Add(now.AddMinutes(i), i * 10);
|
||||
predicted.Add(now.AddMinutes(i), i * 10 + 5);
|
||||
predicted.Add(now.AddMinutes(i), (i * 10) + 5);
|
||||
}
|
||||
|
||||
var results = Wrmse.Batch(actual, predicted, 3);
|
||||
@@ -362,7 +362,7 @@ public class WrmseTests
|
||||
actual.Add(now.AddMinutes(i), i * 10);
|
||||
if (i < 5)
|
||||
{
|
||||
predicted.Add(now.AddMinutes(i), i * 10 + 5);
|
||||
predicted.Add(now.AddMinutes(i), (i * 10) + 5);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -380,7 +380,7 @@ public class WrmseTests
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
actual.Add(now.AddMinutes(i), i * 10);
|
||||
predicted.Add(now.AddMinutes(i), i * 10 + 5);
|
||||
predicted.Add(now.AddMinutes(i), (i * 10) + 5);
|
||||
if (i < 5)
|
||||
{
|
||||
weights.Add(now.AddMinutes(i), 1.0);
|
||||
|
||||
@@ -2,7 +2,6 @@ namespace QuanTAlib;
|
||||
|
||||
public class AgcTests
|
||||
{
|
||||
|
||||
// Helper: generate a sine wave that oscillates around zero
|
||||
private static TSeries MakeSineWave(int count, double amplitude = 1.0, double period = 20.0)
|
||||
{
|
||||
|
||||
@@ -43,7 +43,7 @@ public class AgcValidationTests
|
||||
double[] input = new double[T];
|
||||
for (int i = 0; i < T; i++)
|
||||
{
|
||||
double amplitude = 1.0 + i * 0.01; // grows from 1 to 11
|
||||
double amplitude = 1.0 + (i * 0.01); // grows from 1 to 11
|
||||
input[i] = amplitude * Math.Sin(2.0 * Math.PI * i / 20.0);
|
||||
}
|
||||
|
||||
@@ -92,7 +92,7 @@ public class AgcValidationTests
|
||||
double[] input = new double[500];
|
||||
for (int i = 0; i < input.Length; i++)
|
||||
{
|
||||
input[i] = Math.Sin(2.0 * Math.PI * i / 25.0) * (1.0 + 0.3 * Math.Sin(2.0 * Math.PI * i / 100.0));
|
||||
input[i] = Math.Sin(2.0 * Math.PI * i / 25.0) * (1.0 + (0.3 * Math.Sin(2.0 * Math.PI * i / 100.0)));
|
||||
}
|
||||
|
||||
double[] out1 = new double[input.Length];
|
||||
|
||||
@@ -561,7 +561,7 @@ public class ALaguerreTests
|
||||
// Trending input: 100, 110, 120, ...
|
||||
for (int i = 0; i < 30; i++)
|
||||
{
|
||||
alTrend.Update(new TValue(DateTime.UtcNow, 100 + i * 10.0));
|
||||
alTrend.Update(new TValue(DateTime.UtcNow, 100 + (i * 10.0)));
|
||||
}
|
||||
|
||||
// Flat input: constant 100
|
||||
|
||||
@@ -173,7 +173,7 @@ public sealed class ALaguerreValidationTests : IDisposable
|
||||
Assert.True(filteredVariance < sourceVariance,
|
||||
$"Filtered variance ({filteredVariance:F6}) should be less than source variance ({sourceVariance:F6})");
|
||||
|
||||
_output.WriteLine($"Variance: source={sourceVariance:F6}, filtered={filteredVariance:F6}, reduction={1 - filteredVariance / sourceVariance:P2}");
|
||||
_output.WriteLine($"Variance: source={sourceVariance:F6}, filtered={filteredVariance:F6}, reduction={1 - (filteredVariance / sourceVariance):P2}");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
@@ -202,7 +202,7 @@ public sealed class ALaguerreValidationTests : IDisposable
|
||||
var trendSeries = new TSeries();
|
||||
for (int i = 0; i < 50; i++)
|
||||
{
|
||||
trendSeries.Add(DateTime.UtcNow.Ticks + i, 100.0 + i * 5.0);
|
||||
trendSeries.Add(DateTime.UtcNow.Ticks + i, 100.0 + (i * 5.0));
|
||||
}
|
||||
|
||||
foreach (var item in trendSeries)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user