rsi = (len, bars) => {
if (bars.length < len * 2) {
throw new Error(`rsi: bars.length ${bars.length} must be bigger than ${len * 2}`);
}
const c = changes("close", bars)
const max = c.map(val => Math.max(val, 0))
const min = c.map(val => -1 * Math.min(val, 0))
const up = rma(len, max.reverse())
const down = rma(len, min.reverse())
const rsiValues = [];
for (let i = 0; i < up.length; i++) {
const upValue = up[i];
const downValue = down[i];
if (downValue === 0) {
rsiValues.push(100);
} else if (upValue === 0) {
rsiValues.push(0);
} else {
rsiValues.push(100 - (100 / (1 + upValue / downValue)));
}
}
return rsiValues
}