mirror of
https://github.com/mihakralj/QuanTAlib.git
synced 2026-08-16 01:28:05 +00:00
64 lines
1.3 KiB
C#
64 lines
1.3 KiB
C#
namespace QuanTAlib;
|
|
|
|
public class WMA
|
|
{
|
|
private CircularBuffer buffer = null!;
|
|
private CircularBuffer weights = null!;
|
|
private int period;
|
|
public TValue Value { get; private set; }
|
|
public bool IsHot { get; private set; }
|
|
|
|
public WMA(int period)
|
|
{
|
|
Init(period);
|
|
}
|
|
|
|
public void Init(int period)
|
|
{
|
|
this.period = period;
|
|
this.buffer = new CircularBuffer(period);
|
|
this.weights = new CircularBuffer(period);
|
|
CalculateWeights();
|
|
this.IsHot = false;
|
|
this.Value = default;
|
|
}
|
|
|
|
public TValue Update(TValue input, bool IsNew = true)
|
|
{
|
|
if (IsNew)
|
|
{
|
|
buffer.Add(input);
|
|
}
|
|
else if (buffer.Count > 0)
|
|
{
|
|
buffer[buffer.Count - 1] = input;
|
|
}
|
|
else
|
|
{
|
|
buffer.Add(input);
|
|
}
|
|
|
|
double wma = 0;
|
|
double totalWeights = 0;
|
|
|
|
for (int i = 0; i < buffer.Count; i++)
|
|
{
|
|
wma += buffer[i] * weights[i];
|
|
totalWeights += weights[i];
|
|
}
|
|
|
|
wma /= totalWeights;
|
|
|
|
IsHot = buffer.Count >= period;
|
|
Value = new TValue(input.Time, wma, IsNew, IsHot);
|
|
return Value;
|
|
}
|
|
|
|
private void CalculateWeights()
|
|
{
|
|
for (int i = 1; i <= period; i++)
|
|
{
|
|
weights.Add(i);
|
|
}
|
|
}
|
|
} |