// Stochastic Fast // // stochastic_fast // // Stochastic Fast %K // // // // Inputs: 4 // Outputs: 2 // Constants: 1 #include "ts.h" typedef struct { uint_t k; } ts_stochastic_fast_params_t; ts_parameter_t const ts_stochastic_fast_p = { .n_inputs = 4, .n_outputs = 2, .n_constants = 1, .params_size = sizeof(ts_stochastic_fast_params_t) }; uint_t ts_stochastic_fast_offset( ts_constant_t const *c ) { ( void )c; return ( c ? ((ts_stochastic_fast_params_t *)c)->k > 0 ? 2 * ((ts_stochastic_fast_params_t *)c)->k - 1 : 0 : 0 ); } int ts_stochastic_fast( 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_stochastic_fast_p ); if ( !c ) return -1; TS_CHECK_INPUT(x, x_n, n); uint_t k = ((ts_stochastic_fast_params_t *)c)->k; if (k == 0 || n < k) return -1; // Initial window max/min fp_t hh = ts_h( x, 0 ); fp_t ll = ts_l( x, 0 ); for( uint_t j = 1; j < k; ++j ) { if( ts_h( x, j ) > hh ) hh = ts_h( x, j ); if( ts_l( x, j ) < ll ) ll = ts_l( x, j ); } { fp_t k_val = ( hh - ll ) == 0 ? 0 : 100.0 * ( ts_c( x, k - 1 ) - ll ) / ( hh - ll ); y[0][k - 1] = k_val; } for( uint_t i = k; i < n; ++i ) { fp_t new_h = ts_h( x, i ); fp_t new_l = ts_l( x, i ); fp_t old_h = ts_h( x, i - k ); fp_t old_l = ts_l( x, i - k ); if ( new_h > hh ) hh = new_h; if ( new_l < ll ) ll = new_l; if ( old_h == hh || old_l == ll ) { hh = ts_h( x, i - k + 1 ); ll = ts_l( x, i - k + 1 ); for( uint_t j = i - k + 2; j <= i; ++j ) { if( ts_h( x, j ) > hh ) hh = ts_h( x, j ); if( ts_l( x, j ) < ll ) ll = ts_l( x, j ); } } fp_t k_val = ( hh - ll ) == 0 ? 0 : 100.0 * ( ts_c( x, i ) - ll ) / ( hh - ll ); y[0][i] = k_val; if (i >= k + 1) { fp_t d_sum = 0; for( uint_t j = 0; j < 3; ++j ) d_sum += y[0][i - j]; y[1][i] = d_sum / 3.0; } else { y[1][i] = 0; } } return 0; }