// Acceleration Bands // // acceleration_bands - acc_bands // // Upper: SMA of highest high over period k // Middle: SMA of typical price over period k // Lower: SMA of lowest low over period k // // Inputs: 4 (OHLCV) // Outputs: 3 (Upper, Middle, Lower) // Constants: 1 (period) #include #include "ts.h" typedef struct { uint_t k; } ts_acceleration_bands_params_t; ts_parameter_t const ts_acceleration_bands_p = { .n_inputs = 4, .n_outputs = 3, .n_constants = 1, .params_size = sizeof(ts_acceleration_bands_params_t) }; uint_t ts_acceleration_bands_offset( ts_constant_t const *c ) { ( void )c; return ( c ? ((ts_acceleration_bands_params_t const *)c)->k - 1 : 0 ); } int ts_acceleration_bands( 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_acceleration_bands_p ); if ( !c ) return -1; TS_CHECK_INPUT(x, x_n, n); uint_t k = ((ts_acceleration_bands_params_t const *)c)->k; if (k == 0 || n < k) return -1; if (n > SIZE_MAX / sizeof( fp_t )) return -1; fp_t *hh_r = malloc( n * sizeof( fp_t ) ); fp_t *ll_r = malloc( n * sizeof( fp_t ) ); fp_t *tp = malloc( n * sizeof( fp_t ) ); if ( !hh_r || !ll_r || !tp ) { free( hh_r ); free( ll_r ); free( tp ); return -1; } for ( uint_t i = 0; i < n; ++i ) { tp[i] = ( ts_h( x, i ) + ts_l( x, i ) + ts_c( x, i ) ) / 3.0; fp_t hh = ts_h( x, i ); fp_t ll = ts_l( x, i ); for ( uint_t j = 1; j < k && i >= j; ++j ) { if ( ts_h( x, i - j ) > hh ) hh = ts_h( x, i - j ); if ( ts_l( x, i - j ) < ll ) ll = ts_l( x, i - j ); } hh_r[i] = hh; ll_r[i] = ll; } for ( uint_t j = 0; j < n && j < k - 1; ++j ) { y[0][j] = 0; y[1][j] = 0; y[2][j] = 0; } for ( uint_t i = k - 1; i < n; ++i ) { fp_t sum_hh = 0, sum_ll = 0, sum_tp = 0; for ( uint_t j = 0; j < k; ++j ) { sum_hh += hh_r[i - j]; sum_ll += ll_r[i - j]; sum_tp += tp[i - j]; } y[0][i] = sum_hh / (fp_t)k; y[1][i] = sum_tp / (fp_t)k; y[2][i] = sum_ll / (fp_t)k; } free( hh_r ); free( ll_r ); free( tp ); return 0; }