85 lines
2.9 KiB
JavaScript
Executable File
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);
|
|
})();
|
|
});
|
|
|
|
});
|