// Volatility Stop // // volatility_stop // // Volatility Stop // // // // Inputs: 4 // Outputs: 2 // Constants: 2 #include #include "ts.h" typedef struct { uint_t k; fp_t mult; } ts_volatility_stop_params_t; ts_parameter_t const ts_volatility_stop_p = { .n_inputs = 4, .n_outputs = 2, .n_constants = 2, .params_size = sizeof(ts_volatility_stop_params_t) }; uint_t ts_volatility_stop_offset( ts_constant_t const *c ) { ( void )c; return ( c ? ((ts_volatility_stop_params_t *)c)->k : 0 ); } int ts_volatility_stop( 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_volatility_stop_p ); if ( !c ) return -1; uint_t k = ((ts_volatility_stop_params_t *)c)->k; fp_t mult = ((ts_volatility_stop_params_t *)c)->mult; if (k == 0 || n < k) return -1; for( uint_t i = k; i < n; ++i ) { fp_t hh = ts_h(x, i - k); fp_t ll = ts_l(x, i - k); for( uint_t j = i - k + 1; j <= i; ++j ) { if( ts_h(x, j) > hh ) hh = ts_h(x, j); if( ts_l(x, j) < ll ) ll = ts_l(x, j); } fp_t atr = 0; for( uint_t j = i - k; j <= i; ++j ) { fp_t tr = ts_h(x, j) - ts_l(x, j); if( j > 0 ) { fp_t prev_close = ts_c(x, j - 1); fp_t tr2 = fabs(ts_h(x, j) - prev_close); fp_t tr3 = fabs(ts_l(x, j) - prev_close); if( tr2 > tr ) tr = tr2; if( tr3 > tr ) tr = tr3; } atr += tr; } atr /= (k + 1); y[0][i] = hh - mult * atr; y[1][i] = ll + mult * atr; } return 0; }