// Fill Indicator // // fill_indicator - FI // // SMA of |C-O|/(H-L)*100, measures candle body fill ratio // // Inputs: 4 (OHLC) // Outputs: 1 (FI) // Constants: 1 (period) #include #include "ts.h" typedef struct { uint_t k; } ts_fill_indicator_params_t; ts_parameter_t const ts_fill_indicator_p = { .n_inputs = 4, .n_outputs = 1, .n_constants = 1, .params_size = sizeof(ts_fill_indicator_params_t) }; uint_t ts_fill_indicator_offset( ts_constant_t const *c ) { ( void )c; return ( c ? ((ts_fill_indicator_params_t *)c)->k > 0 ? ((ts_fill_indicator_params_t *)c)->k - 1 : 0 : 0 ); } int ts_fill_indicator( 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_fill_indicator_p ); if ( !c ) return -1; uint_t k = ((ts_fill_indicator_params_t *)c)->k; if (k == 0 || n < k) return -1; uint_t xi = 0; uint_t yi = k - 1; fp_t sum = 0; for( ; xi < k; ++xi ) { fp_t range = ts_h( x, xi ) - ts_l( x, xi ); if (range != 0) sum += fabs( ts_c( x, xi ) - ts_o( x, xi ) ) / range * 100; } y[0][yi] = sum / k; ++yi; for( ; xi < n; ++xi, ++yi ) { fp_t range = ts_h( x, xi ) - ts_l( x, xi ); fp_t fv = range != 0 ? fabs( ts_c( x, xi ) - ts_o( x, xi ) ) / range * 100 : 0; fp_t range_old = ts_h( x, xi - k ) - ts_l( x, xi - k ); fp_t fo = range_old != 0 ? fabs( ts_c( x, xi - k ) - ts_o( x, xi - k ) ) / range_old * 100 : 0; y[0][yi] = y[0][yi - 1] + ( fv - fo ) / k; } return 0; }