// Gopalakrishnan Range Index // // gopalakrishnan_range_index // // Gopalakrishnan Range Index // // Measures price range relative to ATR // // Inputs: 4 // Outputs: 1 // Constants: 1 #include #include "ts.h" typedef struct { uint_t k; } ts_gopalakrishnan_range_index_params_t; ts_parameter_t const ts_gopalakrishnan_range_index_p = { .n_inputs = 4, .n_outputs = 1, .n_constants = 1, .params_size = sizeof(ts_gopalakrishnan_range_index_params_t) }; uint_t ts_gopalakrishnan_range_index_offset( ts_constant_t const *c ) { ( void )c; return ( c ? ((ts_gopalakrishnan_range_index_params_t const *)c)->k : 0 ); } int ts_gopalakrishnan_range_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_gopalakrishnan_range_index_p ); if ( !c ) return -1; uint_t k = ((ts_gopalakrishnan_range_index_params_t const *)c)->k; if (k == 0 || n <= k) return -1; fp_t sum_abs = 0; fp_t sum_range = 0; for (uint_t j = 1; j <= k; ++j) { sum_abs += fabs( ts_c( x, j ) - ts_c( x, j - 1 ) ); sum_range += ts_h( x, j ) - ts_l( x, j ); } y[0][k] = sum_range != 0 ? sum_abs / sum_range : 0; for (uint_t i = k + 1; i < n; ++i) { uint_t dj = i - k; sum_abs -= fabs( ts_c( x, dj ) - ts_c( x, dj - 1 ) ); sum_range -= ts_h( x, dj ) - ts_l( x, dj ); sum_abs += fabs( ts_c( x, i ) - ts_c( x, i - 1 ) ); sum_range += ts_h( x, i ) - ts_l( x, i ); y[0][i] = sum_range != 0 ? sum_abs / sum_range : 0; } return 0; }