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