stock-indicators/test/indicator/linearly-weighted-moving-average.js
2025-03-31 11:20:04 +02:00

85 lines
2.9 KiB
JavaScript
Executable File

'use strict';
import chai from 'chai';
const assert = chai.assert;
import LWMA from '../../lib/indicator/linearly-weighted-moving-average.js';
describe('Lineary wighted moving average', () => {
let data = [10, 15, 16, 18, 20, 18, 17];
let periods = 4;
let expectedResults = [16, 17.85, 18.22, 18.12];
let runTest = async (options, data) => {
let lwma = new LWMA(options);
lwma.setValues(data);
return await lwma.calculate();
};
let assertResults = (results, expectedResults) => {
assert.isArray(results);
results.forEach((result, idx) => {
assert.isObject(result);
assert.containsAllKeys(result, ['price', 'lwma']);
assert.isNumber(result.price);
assert.isNumber(result.lwma);
assert.closeTo(result.lwma, expectedResults[idx], 0.1);
assert.isTrue(result.price == data[periods - 1 + idx]);
});
};
let assertResults_2 = (results, expectedResults) => {
assert.isArray(results);
results.forEach((result, idx) => {
assert.isObject(result);
assert.containsAllKeys(result, ['price', 'lwma']);
assert.isNumber(result.price);
assert.isNumber(result.lwma);
assert.closeTo(result.lwma, expectedResults[idx].lwma, 0.1);
assert.isTrue(result.price == expectedResults[idx].price);
});
};
it('should calculate correctly and return results', () => {
(async () => {
let opts = { periods: periods, lazyEvaluation: true, sliceOffset: true };
let r = await runTest(opts, data);
assertResults(r, expectedResults);
})();
});
it('should calculate correctly with custom options and return results', () => {
(async () => {
let clonedData = [...data];
clonedData.unshift(5);
clonedData.push(20);
let opts = { periods: 4, sliceOffset: true, startIndex: 1, endIndex: clonedData.length - 2, lazyEvaluation: true };
let r = await runTest(opts, clonedData)
assertResults(r, expectedResults);
})();
});
it('should calculate correctly and return results with included offset', () => {
(async () => {
let clonedExpectedResults = [...expectedResults];
let opts = { periods: periods, sliceOffset: false, lazyEvaluation: true };
for (let i = 0; i < opts.periods - 1; i++) {
clonedExpectedResults.unshift(0);
}
let expected = clonedExpectedResults.map((val, idx) => {
return {
lwma: val,
price: data[idx],
};
});
let r = await runTest(opts, data);
assertResults_2(r, expected);
})();
});
});