// Trend Intensity Index // // trend_intensity_index // // Trend Intensity Index // // // // Inputs: 5 // Outputs: 1 // Constants: 1 #include "ts.h" typedef struct { uint_t k; } ts_trend_intensity_index_params_t; ts_parameter_t const ts_trend_intensity_index_p = { .n_inputs = 5, .n_outputs = 1, .n_constants = 1, .params_size = sizeof(ts_trend_intensity_index_params_t) }; uint_t ts_trend_intensity_index_offset( ts_constant_t const *c ) { ( void )c; return ( c ? ((ts_trend_intensity_index_params_t const *)c)->k > 0 ? ((ts_trend_intensity_index_params_t const *)c)->k - 1 : 0 : 0 ); } int ts_trend_intensity_index( 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_trend_intensity_index_p ); if ( !c ) return -1; uint_t k = ((ts_trend_intensity_index_params_t const *)c)->k; if ( k == 0 || n < k ) return -1; fp_t signed_sum = 0; fp_t vol_sum = 0; for ( uint_t i = 1; i <= k; ++i ) { signed_sum += ( ts_c( x, i ) > ts_c( x, i - 1 ) ) ? ts_v( x, i ) : -ts_v( x, i ); vol_sum += ts_v( x, i ); } y[0][k - 1] = vol_sum != 0 ? signed_sum / vol_sum : 0; for ( uint_t i = k + 1; i < n; ++i ) { fp_t cur_signed = ( ts_c( x, i ) > ts_c( x, i - 1 ) ) ? ts_v( x, i ) : -ts_v( x, i ); fp_t old_signed = ( ts_c( x, i - k ) > ts_c( x, i - k - 1 ) ) ? ts_v( x, i - k ) : -ts_v( x, i - k ); signed_sum = signed_sum - old_signed + cur_signed; vol_sum = vol_sum - ts_v( x, i - k ) + ts_v( x, i ); y[0][i] = vol_sum != 0 ? signed_sum / vol_sum : 0; } return 0; }