// Kaufman Adaptive Ma // // kaufman_adaptive_ma // // Kaufman Adaptive Moving Average // // AMA based on efficiency ratio // // Inputs: 1 // Outputs: 1 // Constants: 1 #include #include "ts.h" typedef struct { uint_t k; } ts_kaufman_adaptive_ma_params_t; ts_parameter_t const ts_kaufman_adaptive_ma_p = { .n_inputs = 1, .n_outputs = 1, .n_constants = 1, .params_size = sizeof(ts_kaufman_adaptive_ma_params_t) }; uint_t ts_kaufman_adaptive_ma_offset( ts_constant_t const *c ) { ( void )c; return ( c ? ((ts_kaufman_adaptive_ma_params_t const *)c)->k : 0 ); } int ts_kaufman_adaptive_ma( fp_t * const *y, uint_t y_n, fp_t const * const *x, uint_t x_n, uint_t n, ts_constant_t const *c ) { TS_PROLOGUE( ts_kaufman_adaptive_ma_p ); if ( !c ) return -1; uint_t k = ((ts_kaufman_adaptive_ma_params_t const *)c)->k; if (k == 0 || n < k) return -1; fp_t ama = x[0][0]; fp_t sm = 2.0 / ((fp_t)k + 1.0); fp_t sn = 2.0 / (sqrt((fp_t)k) + 1.0); for (uint_t i = k; i < n; ++i) { fp_t price_change = fabs(x[0][i] - x[0][i - k]); fp_t noise = 0; for (uint_t j = i - k + 1; j <= i; ++j) noise += fabs(x[0][j] - x[0][j - 1]); fp_t er = noise != 0 ? price_change / noise : 0; fp_t er_sq = er * er; fp_t sc = er_sq * (sn - sm) + sm; sc = sc * sc; ama = ama + sc * (x[0][i] - ama); y[0][i] = ama; } return 0; }