12345678910111213141516171819202122232425262728293031323334353637 |
- 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 { get; private set; }
- public double Var { get; private set; }
- 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;
- }
- }
- }
- }
|