Files
QuanTAlib/lib/cycles/ht_dcphase/HtDcphase.Tests.cs
T
Miha Kralj 26280ce80b Add Choppiness Index (CHOP) implementation and tests
- Implemented ChopIndicator for Quantower with configurable period and cold value display.
- Created Chop class for calculating the Choppiness Index with detailed documentation.
- Added comprehensive unit tests for Chop functionality, covering various market conditions and edge cases.
- Developed markdown documentation for CHOP, detailing its historical context, mathematical foundation, and usage examples.
- Established a remediation plan for channel indicators documentation, identifying gaps and prioritizing updates.
2026-02-05 19:42:49 -08:00

91 lines
2.2 KiB
C#

using System;
using QuanTAlib;
using Xunit;
namespace QuanTAlib.Tests.Cycles;
public class HtDcphaseTests
{
[Fact]
public void Constructor_SetsDefaults()
{
var ht = new HtDcphase();
Assert.Equal("HtDcphase", ht.Name);
Assert.Equal(63, ht.WarmupPeriod);
Assert.False(ht.IsHot);
}
[Fact]
public void Update_BecomesHotAfterWarmup()
{
var ht = new HtDcphase();
var gbm = new GBM(seed: 42);
var bars = gbm.Fetch(100, DateTime.UtcNow.Ticks, TimeSpan.FromMinutes(1));
foreach (var bar in bars)
{
ht.Update(new TValue(bar.Time, bar.Close));
}
Assert.True(ht.IsHot);
Assert.True(double.IsFinite(ht.Last.Value));
}
[Fact]
public void Reset_ClearsState()
{
var ht = new HtDcphase();
var now = DateTime.UtcNow;
for (int i = 0; i < 80; i++)
{
ht.Update(new TValue(now.AddMinutes(i), 100 + i));
}
Assert.True(ht.IsHot);
ht.Reset();
Assert.False(ht.IsHot);
Assert.Equal(default, ht.Last);
}
[Fact]
public void PhaseRange_IsValid()
{
var ht = new HtDcphase();
var gbm = new GBM(seed: 42);
var bars = gbm.Fetch(200, DateTime.UtcNow.Ticks, TimeSpan.FromMinutes(1));
foreach (var bar in bars)
{
ht.Update(new TValue(bar.Time, bar.Close));
}
// After warmup, phase should be in valid range
double phase = ht.Last.Value;
Assert.True(phase >= -45.0 && phase <= 315.0,
$"Phase {phase} should be in range [-45, 315]");
}
[Fact]
public void SameBarUpdate_ReturnsSameValue()
{
var ht = new HtDcphase();
var now = DateTime.UtcNow;
// Prime with data
for (int i = 0; i < 70; i++)
{
ht.Update(new TValue(now.AddMinutes(i), 100 + Math.Sin(i * 0.1) * 10));
}
Assert.True(ht.IsHot);
// First update (new bar)
var result1 = ht.Update(new TValue(now.AddMinutes(70), 105), isNew: true);
// Same bar update
var result2 = ht.Update(new TValue(now.AddMinutes(70), 106), isNew: false);
Assert.Equal(result1.Value, result2.Value);
}
}