Refactor event handling and improve argument validation across indicators

- Updated event handler signatures to use TValueEventArgs for consistency in Mama, Mgdi, Pwma, Rma, Sma, Ssf, Super, T3, Tema, Trima, Usf, Vidya, Wma, and Atr classes.
- Enhanced argument validation by specifying parameter names in exceptions for clarity.
- Adjusted tests to align with new event handler signatures.
- Improved code readability and maintainability by using structured records and lambda expressions.
This commit is contained in:
Miha Kralj
2025-12-27 15:46:28 -08:00
parent 4750c2b1e8
commit d7dbd7078a
73 changed files with 502 additions and 300 deletions
+9 -1
View File
@@ -2,6 +2,14 @@ using System;
namespace QuanTAlib;
public sealed class TValueEventArgs : EventArgs
{
public TValue Value { get; init; }
public bool IsNew { get; init; }
}
public delegate void TValuePublishedHandler(object? sender, TValueEventArgs args);
/// <summary>
/// Interface for objects that publish TValue updates.
/// </summary>
@@ -10,5 +18,5 @@ public interface ITValuePublisher
/// <summary>
/// Event triggered when a new TValue is available.
/// </summary>
event Action<TValue> Pub;
event TValuePublishedHandler? Pub;
}
+2 -2
View File
@@ -298,7 +298,7 @@ public class TSeriesTests
{
var series = new TSeries();
TValue? received = null;
series.Pub += tv => received = tv;
series.Pub += (object? sender, TValueEventArgs args) => received = args.Value;
series.Add(100, 42.0);
@@ -313,7 +313,7 @@ public class TSeriesTests
var series = new TSeries();
TValue? received = null;
series.Add(100, 42.0);
series.Pub += tv => received = tv;
series.Pub += (object? sender, TValueEventArgs args) => received = args.Value;
series.Add(100, 43.0, isNew: false);
+17 -5
View File
@@ -13,12 +13,14 @@ namespace QuanTAlib;
/// </summary>
public class TSeries : IReadOnlyList<TValue>, ITValuePublisher
{
#pragma warning disable MA0016 // Prefer using collection abstraction instead of implementation
protected readonly List<long> _t;
protected readonly List<double> _v;
#pragma warning restore MA0016
public string Name { get; set; } = "Data";
public event Action<TValue>? Pub;
public event TValuePublishedHandler? Pub;
public TSeries() : this(0)
{
@@ -30,10 +32,18 @@ public class TSeries : IReadOnlyList<TValue>, ITValuePublisher
_v = new List<double>(capacity);
}
public TSeries(List<long> time, List<double> values)
public TSeries(IReadOnlyList<long> time, IReadOnlyList<double> values)
{
_t = time;
_v = values;
if (time is List<long> timeList && values is List<double> valueList)
{
_t = timeList;
_v = valueList;
}
else
{
_t = new List<long>(time);
_v = new List<double>(values);
}
}
public int Count
@@ -98,7 +108,9 @@ public class TSeries : IReadOnlyList<TValue>, ITValuePublisher
_t[lastIdx] = value.Time;
_v[lastIdx] = value.Value;
}
Pub?.Invoke(value);
var args = new TValueEventArgs { Value = value, IsNew = isNew };
Pub?.Invoke(this, args);
}
// Overload for backward compatibility (assumes isNew=true)