You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
38 lines
1.1 KiB
38 lines
1.1 KiB
namespace Mirror
|
|
{
|
|
// implementation of N-day EMA
|
|
// it calculates an exponential moving average roughly equivalent to the last n observations
|
|
// https://en.wikipedia.org/wiki/Moving_average#Exponential_moving_average
|
|
public class ExponentialMovingAverage
|
|
{
|
|
readonly float alpha;
|
|
bool initialized;
|
|
|
|
public double Value;
|
|
public double Var;
|
|
|
|
public ExponentialMovingAverage(int n)
|
|
{
|
|
// standard N-day EMA alpha calculation
|
|
alpha = 2.0f / (n + 1);
|
|
}
|
|
|
|
public void Add(double newValue)
|
|
{
|
|
// simple algorithm for EMA described here:
|
|
// https://en.wikipedia.org/wiki/Moving_average#Exponentially_weighted_moving_variance_and_standard_deviation
|
|
if (initialized)
|
|
{
|
|
double delta = newValue - Value;
|
|
Value += alpha * delta;
|
|
Var = (1 - alpha) * (Var + alpha * delta * delta);
|
|
}
|
|
else
|
|
{
|
|
Value = newValue;
|
|
initialized = true;
|
|
}
|
|
}
|
|
}
|
|
}
|