WU Trading Library 0.2.0
A backtesting and trading strategy library
Loading...
Searching...
No Matches
mvar.c
Go to the documentation of this file.
1#include <stdlib.h>
2#include <stdio.h>
3#include "wu/indicators.h"
4
5static double update(WU_MVar self, double value) {
6 if (isnan(value)) return NAN;
7 if (self->len < self->window_size)
8 self->len++;
9 else {
10 double prev = self->prev_values[self->pos];
11 self->sum2 -= prev * prev;
12 }
13 self->prev_values[self->pos] = value;
14 self->pos = (self->pos + 1) % self->window_size;
15 self->sum2 += value * value;
16 double mean = wu_indicator_update(self->sma, value);
17 if (self->len < self->window_size) {
18 self->value = NAN;
19 } else {
20 self->value = (self->sum2 - self->window_size * mean * mean) /
21 (self->window_size - self->dof);
22 }
23 return self->value;
24}
25
26static void delete(WU_MVar mvar) {
27 wu_indicator_delete(mvar->sma);
28 free(mvar->prev_values);
29 free(mvar);
30}
31
32WU_MVar wu_mvar_new(int window_size, int dof) {
33 if (window_size <= dof + 1) {
34 fprintf(stderr, "Window size must be greater that degrees of freedom\n");
35 return NULL;
36 }
37 WU_MVar mvar = malloc(sizeof(struct WU_MVar_));
38 if (!mvar) return NULL;
39
40 mvar->prev_values = malloc(window_size * sizeof(double));
41 if (!mvar->prev_values) {
42 free(mvar);
43 return NULL;
44 }
45
46 mvar->sma = wu_sma_new(window_size);
47 if (!mvar->sma) {
48 free(mvar->prev_values);
49 free(mvar);
50 return NULL;
51 }
52
53 mvar->value = NAN;
54 mvar->window_size = window_size;
55 mvar->dof = dof;
56 for (int i = 0; i < window_size; i++) {
57 mvar->prev_values[i] = NAN;
58 }
59 mvar->sum2 = 0.0;
60 mvar->pos = 0;
61 mvar->len = 0;
62 mvar->update = update;
63 mvar->delete = delete;
64 return mvar;
65}
static double update(WU_EMA ema, double value)
Definition ema.c:4
#define wu_indicator_delete(indicator)
Delete the indicator and free any resources allocated by it.
Definition indicators.h:56
#define wu_indicator_update(indicator, value)
Header file for technical indicators.
Definition indicators.h:41
WU_SMA wu_sma_new(int window_size)
Creates a new WU_SMA (Simple Moving Average) indicator with the specified window size.
Definition sma.c:22
static double update(WU_MVar self, double value)
Definition mvar.c:5
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...
Definition mvar.c:32
The WU_MVar (Moving Variance) is an indicator that calculates the variance of the last N values,...
Definition indicators.h:113