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