// Twiggs Money Flow // // twiggs_money_flow // // Twiggs Money Flow // // // // Inputs: 1 // Outputs: 1 // Constants: 0 #include #include "ts.h" ts_parameter_t const ts_twiggs_money_flow_p = { .n_inputs = 1, .n_outputs = 1, .n_constants = 0, .params_size = 0 }; uint_t ts_twiggs_money_flow_offset( ts_constant_t const *c ) { ( void )c; return ( 35 ); } int ts_twiggs_money_flow( 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_twiggs_money_flow_p ); (void)c; if (n < 2) return -1; uint_t period = n - 2; fp_t pos_sum = 0; fp_t neg_sum = 0; for( uint_t j = 0; j < period; ++j ) y[0][j] = 0; for( uint_t i = 1; i <= period; ++i ) { fp_t change = x[0][i] - x[0][i - 1]; if( change >= 0 ) pos_sum += change; else neg_sum += fabs( change ); } fp_t total = pos_sum + neg_sum; y[0][period] = ( total != 0 ) ? ( pos_sum - neg_sum ) / total * 100.0 : 0; for( uint_t j = 1; j < n - period; ++j ) { fp_t new_change = x[0][period + j] - x[0][period + j - 1]; fp_t old_change = x[0][j] - x[0][j - 1]; if( new_change >= 0 ) pos_sum += new_change; else neg_sum += fabs( new_change ); if( old_change >= 0 ) pos_sum -= old_change; else neg_sum -= fabs( old_change ); total = pos_sum + neg_sum; y[0][period + j] = ( total != 0 ) ? ( pos_sum - neg_sum ) / total * 100.0 : 0; } return 0; }