From 07e18043145f3d91c8ea7ec3ad41b3c905585277 Mon Sep 17 00:00:00 2001 From: Ethan Werner Date: Wed, 1 Jul 2026 09:42:39 +0400 Subject: initial commit: ts time series analysis library v0.1.0 - 354 financial and mathematical time-series indicators - Uniform C11 API with consistent function signatures - 349 passing tests with -Werror - Static and shared library builds - pkg-config integration - Python bindings - Fuzzing and sanitizer support - Security hardening flags --- lib/oscillator_cross.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 lib/oscillator_cross.c (limited to 'lib/oscillator_cross.c') diff --git a/lib/oscillator_cross.c b/lib/oscillator_cross.c new file mode 100644 index 0000000..0c6c5f8 --- /dev/null +++ b/lib/oscillator_cross.c @@ -0,0 +1,70 @@ +// Oscillator Cross +// +// oscillator_cross +// +// Oscillator crossover detector +// +// +// +// Inputs: 1 +// Outputs: 1 +// Constants: 2 + + +#include "ts.h" + +typedef struct { + fp_t fast; + fp_t slow; +} ts_oscillator_cross_params_t; + +ts_parameter_t const ts_oscillator_cross_p = { .n_inputs = 1, .n_outputs = 1, .n_constants = 2, .params_size = sizeof(ts_oscillator_cross_params_t) }; + +uint_t ts_oscillator_cross_offset( ts_constant_t const *c ) +{ + ( void )c; + return ( c ? (uint_t)((ts_oscillator_cross_params_t *)c)->slow : 0 ); +} + +int ts_oscillator_cross( + 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_oscillator_cross_p ); + if ( !c ) return -1; + fp_t const fast = ((ts_oscillator_cross_params_t *)c)->fast; + fp_t const slow = ((ts_oscillator_cross_params_t *)c)->slow; + if (fast == 0 || slow == 0) return -1; + if (n == 0) return -1; + fp_t const fast_a = 1.0 / fast; + fp_t const slow_a = 1.0 / slow; + fp_t fast_e = x[0][0]; + fp_t slow_e = x[0][0]; + uint_t const offset = (uint_t)slow; + if (offset >= n) return -1; + + for( uint_t i = 0; i < offset; ++i ) + y[0][i] = 0; + + for( uint_t i = 1; i < n; ++i ) + { + fp_t pf = fast_e; + fp_t ps = slow_e; + fast_e = fast_e + fast_a * ( x[0][i] - fast_e ); + slow_e = slow_e + slow_a * ( x[0][i] - slow_e ); + + if( i >= offset ) + { + if( fast_e > slow_e && pf <= ps ) + y[0][i] = 1; + else if( fast_e < slow_e && pf >= ps ) + y[0][i] = -1; + else + y[0][i] = 0; + } + } + return 0; +} + -- cgit v1.3.1