chore: repo cleanup and code quality improvements

- Remove global.json (SDK pinning unnecessary)

- Remove nuget.config, move MyGet source to .csproj RestoreAdditionalProjectSources

- Gitignore ndepend/ entirely, move badges to docs/img/

- Update README.md and docs/ndepend.md badge paths

- Add NDepend project property to QuanTAlib.slnx

- Expand .editorconfig ReSharper/diagnostic suppressions

- Use ArgumentOutOfRangeException instead of ArgumentException

- Use discard _ for unused event sender parameters

- Remove quantalib.code-workspace and sonar-suppressions.json

- Add filter signature SVGs
This commit is contained in:
Miha Kralj
2026-03-03 09:22:55 -08:00
parent e1a6743bda
commit 1910fdca93
131 changed files with 216046 additions and 2027 deletions
-8
View File
@@ -94,8 +94,6 @@ public sealed class Bbb : AbstractBase
/// Standard deviation multiplier.
/// </summary>
public double Multiplier => _multiplier;
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public override TValue Update(TValue input, bool isNew = true)
{
@@ -167,8 +165,6 @@ public sealed class Bbb : AbstractBase
PubEvent(Last, isNew);
return Last;
}
/// <inheritdoc/>
public override TSeries Update(TSeries source)
{
Reset();
@@ -304,8 +300,6 @@ public sealed class Bbb : AbstractBase
_state.SumSq += v * v;
}
}
/// <inheritdoc/>
public override void Prime(ReadOnlySpan<double> source, TimeSpan? step = null)
{
for (int i = 0; i < source.Length; i++)
@@ -313,8 +307,6 @@ public sealed class Bbb : AbstractBase
Update(new TValue(DateTime.UtcNow, source[i]), isNew: true);
}
}
/// <inheritdoc/>
public override void Reset()
{
_buffer.Clear();
-8
View File
@@ -110,8 +110,6 @@ public sealed class Bbi : AbstractBase
/// <summary>True when enough bars have been processed for valid (full-window) output.</summary>
public override bool IsHot => _s.Index >= WarmupPeriod;
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public override TValue Update(TValue input, bool isNew = true)
{
@@ -202,8 +200,6 @@ public sealed class Bbi : AbstractBase
PubEvent(Last, isNew);
return Last;
}
/// <inheritdoc/>
public override TSeries Update(TSeries source)
{
int len = source.Count;
@@ -227,8 +223,6 @@ public sealed class Bbi : AbstractBase
return new TSeries(t, v);
}
/// <inheritdoc/>
public override void Prime(ReadOnlySpan<double> source, TimeSpan? step = null)
{
for (int i = 0; i < source.Length; i++)
@@ -236,8 +230,6 @@ public sealed class Bbi : AbstractBase
Update(new TValue(DateTime.UtcNow, source[i]), isNew: true);
}
}
/// <inheritdoc/>
public override void Reset()
{
Array.Clear(_buf1);
-8
View File
@@ -81,8 +81,6 @@ public sealed class Cfo : AbstractBase
/// Period of the indicator.
/// </summary>
public int Period => _period;
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public override TValue Update(TValue input, bool isNew = true)
{
@@ -153,8 +151,6 @@ public sealed class Cfo : AbstractBase
PubEvent(Last, isNew);
return Last;
}
/// <inheritdoc/>
public override TSeries Update(TSeries source)
{
int len = source.Count;
@@ -191,8 +187,6 @@ public sealed class Cfo : AbstractBase
_state.SumXY += i * v;
}
}
/// <inheritdoc/>
public override void Prime(ReadOnlySpan<double> source, TimeSpan? step = null)
{
for (int i = 0; i < source.Length; i++)
@@ -200,8 +194,6 @@ public sealed class Cfo : AbstractBase
Update(new TValue(DateTime.UtcNow, source[i]), isNew: true);
}
}
/// <inheritdoc/>
public override void Reset()
{
_buffer.Clear();
-8
View File
@@ -118,8 +118,6 @@ public sealed class Crsi : AbstractBase
/// Percent rank lookback period.
/// </summary>
public int RankPeriod => _rankPeriod;
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public override TValue Update(TValue input, bool isNew = true)
{
@@ -224,8 +222,6 @@ public sealed class Crsi : AbstractBase
PubEvent(Last, isNew);
return Last;
}
/// <inheritdoc/>
public override TSeries Update(TSeries source)
{
int len = source.Count;
@@ -250,8 +246,6 @@ public sealed class Crsi : AbstractBase
Last = new TValue(tSpan[len - 1], vSpan[len - 1]);
return new TSeries(t, v);
}
/// <inheritdoc/>
public override void Prime(ReadOnlySpan<double> source, TimeSpan? step = null)
{
for (int i = 0; i < source.Length; i++)
@@ -259,8 +253,6 @@ public sealed class Crsi : AbstractBase
Update(new TValue(DateTime.UtcNow, source[i]), isNew: true);
}
}
/// <inheritdoc/>
public override void Reset()
{
_priceRsi.Reset();
-10
View File
@@ -77,14 +77,10 @@ public sealed class Cti : AbstractBase
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private void Handle(object? sender, in TValueEventArgs e) => Update(e.Value, e.IsNew);
/// <inheritdoc/>
public override bool IsHot => _buffer.IsFull;
/// <summary>Period of the indicator.</summary>
public int Period => _period;
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public override TValue Update(TValue input, bool isNew = true)
{
@@ -151,8 +147,6 @@ public sealed class Cti : AbstractBase
PubEvent(Last, isNew);
return Last;
}
/// <inheritdoc/>
public override TSeries Update(TSeries source)
{
int len = source.Count;
@@ -207,8 +201,6 @@ public sealed class Cti : AbstractBase
_s.SumXY = Math.FusedMultiplyAdd(i, v, _s.SumXY);
}
}
/// <inheritdoc/>
public override void Prime(ReadOnlySpan<double> source, TimeSpan? step = null)
{
for (int i = 0; i < source.Length; i++)
@@ -216,8 +208,6 @@ public sealed class Cti : AbstractBase
Update(new TValue(DateTime.UtcNow, source[i]), isNew: true);
}
}
/// <inheritdoc/>
public override void Reset()
{
_buffer.Clear();
-2
View File
@@ -278,7 +278,6 @@ public sealed class Dem : ITValuePublisher
double prevHigh = double.NaN;
double prevLow = double.NaN;
int idx = 0;
int count = 0;
for (int i = 0; i < len; i++)
{
@@ -302,7 +301,6 @@ public sealed class Dem : ITValuePublisher
deMinSum += deMin;
idx = (idx + 1) % period;
count++;
prevHigh = h;
prevLow = l;
-10
View File
@@ -143,11 +143,7 @@ public sealed class Dosc : AbstractBase
}
source.Pub += Handle;
}
/// <inheritdoc/>
public override bool IsHot => _s.Count >= WarmupPeriod;
/// <inheritdoc/>
public override void Prime(ReadOnlySpan<double> source, TimeSpan? step = null)
{
if (source.Length == 0)
@@ -195,8 +191,6 @@ public sealed class Dosc : AbstractBase
}
return s.LastValidSrc;
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
public override TValue Update(TValue input, bool isNew = true)
{
@@ -226,8 +220,6 @@ public sealed class Dosc : AbstractBase
PubEvent(Last, isNew);
return Last;
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveOptimization)]
public override TSeries Update(TSeries source)
{
@@ -428,8 +420,6 @@ public sealed class Dosc : AbstractBase
TSeries results = indicator.Update(source);
return (results, indicator);
}
/// <inheritdoc/>
public override void Reset()
{
_s = State.New();
-8
View File
@@ -78,8 +78,6 @@ public sealed class Dpo : AbstractBase
/// Displacement of the SMA lookback.
/// </summary>
public int Displacement => _displacement;
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public override TValue Update(TValue input, bool isNew = true)
{
@@ -141,8 +139,6 @@ public sealed class Dpo : AbstractBase
PubEvent(Last, isNew);
return Last;
}
/// <inheritdoc/>
public override TSeries Update(TSeries source)
{
int len = source.Count;
@@ -164,8 +160,6 @@ public sealed class Dpo : AbstractBase
return new TSeries(t, v);
}
/// <inheritdoc/>
public override void Prime(ReadOnlySpan<double> source, TimeSpan? step = null)
{
for (int i = 0; i < source.Length; i++)
@@ -173,8 +167,6 @@ public sealed class Dpo : AbstractBase
Update(new TValue(DateTime.UtcNow, source[i]), isNew: true);
}
}
/// <inheritdoc/>
public override void Reset()
{
_smaBuffer.Clear();
-8
View File
@@ -143,8 +143,6 @@ public sealed class Dymoi : AbstractBase
/// <summary>Maximum allowable dynamic period.</summary>
public int MaxPeriod => _maxPeriod;
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public override TValue Update(TValue input, bool isNew = true)
{
@@ -276,8 +274,6 @@ public sealed class Dymoi : AbstractBase
PubEvent(Last, isNew);
return Last;
}
/// <inheritdoc/>
public override TSeries Update(TSeries source)
{
int len = source.Count;
@@ -302,8 +298,6 @@ public sealed class Dymoi : AbstractBase
Last = new TValue(tSpan[len - 1], vSpan[len - 1]);
return new TSeries(t, v);
}
/// <inheritdoc/>
public override void Prime(ReadOnlySpan<double> source, TimeSpan? step = null)
{
for (int i = 0; i < source.Length; i++)
@@ -311,8 +305,6 @@ public sealed class Dymoi : AbstractBase
Update(new TValue(DateTime.UtcNow, source[i]), isNew: true);
}
}
/// <inheritdoc/>
public override void Reset()
{
_s = new State(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.0, true, double.NaN, double.NaN);
-8
View File
@@ -73,8 +73,6 @@ public sealed class Er : AbstractBase
/// Period of the indicator.
/// </summary>
public int Period => _period;
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public override TValue Update(TValue input, bool isNew = true)
{
@@ -141,8 +139,6 @@ public sealed class Er : AbstractBase
PubEvent(Last, isNew);
return Last;
}
/// <inheritdoc/>
public override TSeries Update(TSeries source)
{
int len = source.Count;
@@ -164,8 +160,6 @@ public sealed class Er : AbstractBase
return new TSeries(t, v);
}
/// <inheritdoc/>
public override void Prime(ReadOnlySpan<double> source, TimeSpan? step = null)
{
TimeSpan interval = step ?? TimeSpan.FromTicks(1);
@@ -175,8 +169,6 @@ public sealed class Er : AbstractBase
Update(new TValue(baseTime + (interval * i), source[i]), isNew: true);
}
}
/// <inheritdoc/>
public override void Reset()
{
_closeBuf.Clear();
-8
View File
@@ -90,8 +90,6 @@ public sealed class Fisher : AbstractBase
/// Current Signal line value.
/// </summary>
public double Signal => _state.Signal;
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public override TValue Update(TValue input, bool isNew = true)
{
@@ -172,8 +170,6 @@ public sealed class Fisher : AbstractBase
PubEvent(Last, isNew);
return Last;
}
/// <inheritdoc/>
public override TSeries Update(TSeries source)
{
int len = source.Count;
@@ -195,8 +191,6 @@ public sealed class Fisher : AbstractBase
return new TSeries(t, v);
}
/// <inheritdoc/>
public override void Prime(ReadOnlySpan<double> source, TimeSpan? step = null)
{
TimeSpan interval = step ?? TimeSpan.FromTicks(1);
@@ -206,8 +200,6 @@ public sealed class Fisher : AbstractBase
Update(new TValue(baseTime + (interval * i), source[i]), isNew: true);
}
}
/// <inheritdoc/>
public override void Reset()
{
_buffer.Clear();
-8
View File
@@ -88,8 +88,6 @@ public sealed class Fisher04 : AbstractBase
/// Current Signal line value.
/// </summary>
public double Signal => _state.Signal;
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public override TValue Update(TValue input, bool isNew = true)
{
@@ -168,8 +166,6 @@ public sealed class Fisher04 : AbstractBase
PubEvent(Last, isNew);
return Last;
}
/// <inheritdoc/>
public override TSeries Update(TSeries source)
{
int len = source.Count;
@@ -191,8 +187,6 @@ public sealed class Fisher04 : AbstractBase
return new TSeries(t, v);
}
/// <inheritdoc/>
public override void Prime(ReadOnlySpan<double> source, TimeSpan? step = null)
{
TimeSpan interval = step ?? TimeSpan.FromTicks(1);
@@ -202,8 +196,6 @@ public sealed class Fisher04 : AbstractBase
Update(new TValue(baseTime + (interval * i), source[i]), isNew: true);
}
}
/// <inheritdoc/>
public override void Reset()
{
_buffer.Clear();
-6
View File
@@ -230,8 +230,6 @@ public sealed class Gator : AbstractBase
PubEvent(Last, isNew);
return Last;
}
/// <inheritdoc/>
public override TSeries Update(TSeries source)
{
if (source.Count == 0)
@@ -257,8 +255,6 @@ public sealed class Gator : AbstractBase
Last = new TValue(tSpan[len - 1], vSpan[len - 1]);
return new TSeries(t, v);
}
/// <inheritdoc/>
public override void Prime(ReadOnlySpan<double> source, TimeSpan? step = null)
{
if (source.Length == 0)
@@ -555,8 +551,6 @@ public sealed class Gator : AbstractBase
}
}
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public override void Reset()
{
-8
View File
@@ -83,8 +83,6 @@ public sealed class Inertia : AbstractBase
/// Period of the indicator.
/// </summary>
public int Period => _period;
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public override TValue Update(TValue input, bool isNew = true)
{
@@ -155,8 +153,6 @@ public sealed class Inertia : AbstractBase
PubEvent(Last, isNew);
return Last;
}
/// <inheritdoc/>
public override TSeries Update(TSeries source)
{
int len = source.Count;
@@ -193,8 +189,6 @@ public sealed class Inertia : AbstractBase
_state.SumXY += i * v;
}
}
/// <inheritdoc/>
public override void Prime(ReadOnlySpan<double> source, TimeSpan? step = null)
{
for (int i = 0; i < source.Length; i++)
@@ -202,8 +196,6 @@ public sealed class Inertia : AbstractBase
Update(new TValue(DateTime.UtcNow, source[i]), isNew: true);
}
}
/// <inheritdoc/>
public override void Reset()
{
_buffer.Clear();
-10
View File
@@ -59,14 +59,10 @@ public sealed class Kri : AbstractBase
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private void Handle(object? sender, in TValueEventArgs e) => Update(e.Value, e.IsNew);
/// <inheritdoc/>
public override bool IsHot => _buffer.IsFull;
/// <summary>Period of the indicator.</summary>
public int Period => _period;
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public override TValue Update(TValue input, bool isNew = true)
{
@@ -120,8 +116,6 @@ public sealed class Kri : AbstractBase
PubEvent(Last, isNew);
return Last;
}
/// <inheritdoc/>
public override TSeries Update(TSeries source)
{
int len = source.Count;
@@ -140,8 +134,6 @@ public sealed class Kri : AbstractBase
return new TSeries(t, v);
}
/// <inheritdoc/>
public override void Prime(ReadOnlySpan<double> source, TimeSpan? step = null)
{
TimeSpan interval = step ?? TimeSpan.FromTicks(1);
@@ -151,8 +143,6 @@ public sealed class Kri : AbstractBase
Update(new TValue(baseTime + (interval * i), source[i]), isNew: true);
}
}
/// <inheritdoc/>
public override void Reset()
{
_buffer.Clear();
-10
View File
@@ -62,14 +62,10 @@ public sealed class Psl : AbstractBase
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private void Handle(object? sender, in TValueEventArgs e) => Update(e.Value, e.IsNew);
/// <inheritdoc/>
public override bool IsHot => _buffer.IsFull;
/// <summary>Period of the indicator.</summary>
public int Period => _period;
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public override TValue Update(TValue input, bool isNew = true)
{
@@ -126,8 +122,6 @@ public sealed class Psl : AbstractBase
PubEvent(Last, isNew);
return Last;
}
/// <inheritdoc/>
public override TSeries Update(TSeries source)
{
int len = source.Count;
@@ -146,8 +140,6 @@ public sealed class Psl : AbstractBase
return new TSeries(t, v);
}
/// <inheritdoc/>
public override void Prime(ReadOnlySpan<double> source, TimeSpan? step = null)
{
TimeSpan interval = step ?? TimeSpan.FromTicks(1);
@@ -157,8 +149,6 @@ public sealed class Psl : AbstractBase
Update(new TValue(baseTime + (interval * i), source[i]), isNew: true);
}
}
/// <inheritdoc/>
public override void Reset()
{
_buffer.Clear();
-10
View File
@@ -108,11 +108,7 @@ public sealed class Reflex : AbstractBase
}
source.Pub += Handle;
}
/// <inheritdoc/>
public override bool IsHot => _s.Count >= _period;
/// <inheritdoc/>
public override void Prime(ReadOnlySpan<double> source, TimeSpan? step = null)
{
if (source.Length == 0)
@@ -160,8 +156,6 @@ public sealed class Reflex : AbstractBase
}
return s.LastValid;
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
public override TValue Update(TValue input, bool isNew = true)
{
@@ -183,8 +177,6 @@ public sealed class Reflex : AbstractBase
PubEvent(Last, isNew);
return Last;
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveOptimization)]
public override TSeries Update(TSeries source)
{
@@ -396,8 +388,6 @@ public sealed class Reflex : AbstractBase
TSeries results = indicator.Update(source);
return (results, indicator);
}
/// <inheritdoc/>
public override void Reset()
{
_s = State.New();
-10
View File
@@ -122,11 +122,7 @@ public sealed class ReverseEma : AbstractBase
}
source.Pub += Handle;
}
/// <inheritdoc/>
public override bool IsHot => _s.IsHot;
/// <inheritdoc/>
public override void Prime(ReadOnlySpan<double> source, TimeSpan? step = null)
{
if (source.Length == 0)
@@ -185,8 +181,6 @@ public sealed class ReverseEma : AbstractBase
}
return _lastValidValue;
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
public override TValue Update(TValue input, bool isNew = true)
{
@@ -213,8 +207,6 @@ public sealed class ReverseEma : AbstractBase
PubEvent(Last, isNew);
return Last;
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveOptimization)]
public override TSeries Update(TSeries source)
{
@@ -415,8 +407,6 @@ public sealed class ReverseEma : AbstractBase
TSeries results = indicator.Update(source);
return (results, indicator);
}
/// <inheritdoc/>
public override void Reset()
{
_s = State.New();
-10
View File
@@ -99,11 +99,7 @@ public sealed class Trendflex : AbstractBase
}
source.Pub += Handle;
}
/// <inheritdoc/>
public override bool IsHot => _s.Count >= _period;
/// <inheritdoc/>
public override void Prime(ReadOnlySpan<double> source, TimeSpan? step = null)
{
if (source.Length == 0)
@@ -148,8 +144,6 @@ public sealed class Trendflex : AbstractBase
}
return s.LastValid;
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
public override TValue Update(TValue input, bool isNew = true)
{
@@ -171,8 +165,6 @@ public sealed class Trendflex : AbstractBase
PubEvent(Last, isNew);
return Last;
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveOptimization)]
public override TSeries Update(TSeries source)
{
@@ -337,8 +329,6 @@ public sealed class Trendflex : AbstractBase
TSeries results = indicator.Update(source);
return (results, indicator);
}
/// <inheritdoc/>
public override void Reset()
{
_s = State.New();
-8
View File
@@ -96,8 +96,6 @@ public sealed class Trix : AbstractBase
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private void Handle(object? sender, in TValueEventArgs e) => Update(e.Value, e.IsNew);
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public override TValue Update(TValue input, bool isNew = true)
{
@@ -198,8 +196,6 @@ public sealed class Trix : AbstractBase
PubEvent(Last, isNew);
return Last;
}
/// <inheritdoc/>
public override TSeries Update(TSeries source)
{
int len = source.Count;
@@ -223,8 +219,6 @@ public sealed class Trix : AbstractBase
return new TSeries(t, v);
}
/// <inheritdoc/>
public override void Prime(ReadOnlySpan<double> source, TimeSpan? step = null)
{
for (int i = 0; i < source.Length; i++)
@@ -232,8 +226,6 @@ public sealed class Trix : AbstractBase
Update(new TValue(DateTime.UtcNow, source[i]), isNew: true);
}
}
/// <inheritdoc/>
public override void Reset()
{
_s = new State(0, 0, 0, 1.0, 1.0, 1.0, 0, 0, 0);