5static double update(WU_MVar self,
double value) {
6 if (isnan(value))
return NAN;
7 if (self->len < self->window_size)
10 double prev = self->prev_values[self->pos];
11 self->sum2 -= prev * prev;
13 self->prev_values[self->pos] = value;
14 self->pos = (self->pos + 1) % self->window_size;
15 self->sum2 += value * value;
17 if (self->len < self->window_size) {
20 self->value = (self->sum2 - self->window_size * mean * mean) /
21 (self->window_size - self->dof);
26static void delete(WU_MVar mvar) {
28 free(mvar->prev_values);
33 if (window_size <= dof + 1) {
34 fprintf(stderr,
"Window size must be greater that degrees of freedom\n");
37 WU_MVar mvar = malloc(
sizeof(
struct WU_MVar_));
38 if (!mvar)
return NULL;
40 mvar->prev_values = malloc(window_size *
sizeof(
double));
41 if (!mvar->prev_values) {
48 free(mvar->prev_values);
54 mvar->window_size = window_size;
56 for (
int i = 0; i < window_size; i++) {
57 mvar->prev_values[i] = NAN;
63 mvar->delete =
delete;
static double update(WU_EMA ema, double value)
#define wu_indicator_delete(indicator)
Delete the indicator and free any resources allocated by it.
#define wu_indicator_update(indicator, value)
Header file for technical indicators.
WU_SMA wu_sma_new(int window_size)
Creates a new WU_SMA (Simple Moving Average) indicator with the specified window size.
static double update(WU_MVar self, double value)
WU_MVar wu_mvar_new(int window_size, int dof)
Creates a new WU_MVar (Moving Variance) indicator with the specified window size and degree of freedo...
The WU_MVar (Moving Variance) is an indicator that calculates the variance of the last N values,...