@ldrick/trade-indicators
Version:
Trade Indicators
14 lines (13 loc) • 773 B
JavaScript
import { apply as AP, either as E, function as F, readonlyNonEmptyArray as RNEA } from 'fp-ts/lib';
import * as arr from '../utils/array.js';
import * as num from '../utils/number.js';
const calculation = (values, period, cb) => F.pipe(RNEA.range(0, values.length - period), RNEA.traverse(E.Applicative)((r) => F.pipe(values.slice(r, period + r), arr.validateRequiredSize(period), E.map(cb))));
/**
* Moving Average
*
* @internal
*/
export const ma = (values, period, cb) => F.pipe(AP.sequenceS(E.Applicative)({
periodV: num.validatePositiveInteger(period),
valuesV: arr.validateRequiredSize(period)(values),
}), E.bind('valuesB', ({ valuesV }) => arr.toBig(valuesV)), E.chain(({ valuesB, periodV }) => calculation(valuesB, periodV, cb)), E.map(arr.toNumber));