@thi.ng/transducers-stats
Version:
Transducers for statistical / technical analysis
36 lines (35 loc) • 841 B
JavaScript
import { illegalArgs } from "@thi.ng/errors/illegal-arguments";
import { compR } from "@thi.ng/transducers/compr";
import { iterator1 } from "@thi.ng/transducers/iterator";
function ema(period, src) {
if (src) {
return iterator1(ema(period), src);
}
period |= 0;
period < 2 && illegalArgs("period must be >= 2");
const k = 2 / (period + 1);
return (rfn) => {
const reduce = rfn[2];
let window = [];
let ema2;
let sum = 0;
return compR(rfn, (acc, x) => {
if (ema2 != null) {
ema2 += (x - ema2) * k;
return rfn[2](acc, ema2);
} else {
window.push(x);
sum += x;
if (window.length == period) {
ema2 = sum / period;
window = null;
return reduce(acc, ema2);
}
return acc;
}
});
};
}
export {
ema
};