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

118 lines
2.9 KiB
JavaScript
Executable File

'use strict';
import chai from 'chai';
const assert = chai.assert;
import MACD from '../../lib/indicator/moving-average-convergence-divergence.js';
import Fixture from '../fixtures/moving-average-convergence-divergence.js';
describe('Moving Average Convergence Divergence', () => {
let data = Fixture.data;
let results_slow = {
periods: 26,
items: [
40.45,
40.49,
40.51,
40.54,
40.76,
]
};
let results_fast = {
periods: 12,
items: [
38.90,
38.71,
38.42,
38.11,
38.18,
]
};
let results_macd = {
items: [
-1.55,
-1.78,
-2.09,
-2.43,
-2.58,
]
};
let results_signal = {
items: [
-1.96,
-2.07,
-2.14,
-2.15,
-2.08,
]
};
let runTest = async (opts, values, expectedLength) => {
let macd = new MACD(opts);
macd.setValues(values);
let result = await macd.calculate();
assert.isArray(result);
assert.isTrue(result.length == 1);
result = result[0];
assert.isObject(result);
assert.isArray(result.slow_ema);
assert.isArray(result.fast_ema);
assert.isArray(result.signal_ema);
assert.isArray(result.macd);
assert.isArray(result.prices);
assert.isTrue(result.slow_ema.length == expectedLength);
assert.isTrue(result.fast_ema.length == expectedLength);
assert.isTrue(result.signal_ema.length == expectedLength);
assert.isTrue(result.macd.length == expectedLength);
assert.isTrue(result.prices.length == expectedLength);
results_slow.items.forEach((result_val, idx) => {
let val = result.slow_ema[result.slow_ema.length - 1 - idx];
assert.closeTo(val, result_val, 0.05);
});
results_fast.items.forEach((result_val, idx) => {
let val = result.fast_ema[result.fast_ema.length - 1 - idx];
assert.closeTo(val, result_val, 0.05);
});
results_macd.items.forEach((result_val, idx) => {
let val = result.macd[result.macd.length - 1 - idx];
assert.closeTo(val, result_val, 0.05);
});
results_signal.items.forEach((result_val, idx) => {
let val = result.signal_ema[result.signal_ema.length - 1 - idx];
assert.closeTo(val, result_val, 0.05);
});
}
it('should calculate and return results', () => {
(async () => {
let opts = { fastPeriods: results_fast.periods, slowPeriods: results_slow.periods, signalPeriods: 9, lazyEvaluation: true, sliceOffset: true };
let expectedLength = data.length - results_slow.periods - opts.signalPeriods + 2;
let dataCopy = [...data];
await runTest(opts, dataCopy.reverse(), expectedLength);
})();
});
it('should calculate and return results with offset', () => {
(async () => {
let opts = { fastPeriods: results_fast.periods, slowPeriods: results_slow.periods, signalPeriods: 9, sliceOffset: false, lazyEvaluation: true };
let expectedLength = data.length;
let dataCopy = [...data];
await runTest(opts, dataCopy.reverse(), expectedLength);
})();
});
});