UNPKG

trading-utils

Version:

A collection of helpful trading utility functions.

64 lines 3.11 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.MacdIndicatorImpl = void 0; const lodash_1 = require("lodash"); const movingAverageService_1 = require("../common/movingAverageService"); class MacdIndicatorImpl { calculate(prices) { const dataPoints = this.calculateMACDIndicator(prices); const previousDataPoint = dataPoints[dataPoints.length - 2]; const previousDifference = previousDataPoint.macd - previousDataPoint.signal; const latestDataPoint = dataPoints[dataPoints.length - 1]; const latestDifference = latestDataPoint.macd - latestDataPoint.signal; if (latestDifference >= 0 && latestDifference > previousDifference) { return 'LONG'; } else if (latestDifference < 0 && latestDifference < previousDifference) { return 'SHORT'; } else { return 'NEUTRAL'; } } /** * Calculates the MACD for the given dataset. * @param prices The dataset which will be used for calculating the MACD. */ calculateMACDIndicator(prices) { if (prices.length < 36) { throw new Error('Given parameter "prices" does not have the minimum length of 35'); } const twelveDayMultiplier = 2 / (12 + 1); const twelveDaySMA = movingAverageService_1.movingAverageService.calculateSMA(prices.slice(0, 12)); const twelveDayEMAs = [twelveDaySMA]; for (let i = 12, a = 0; i < prices.length; i++, a++) { twelveDayEMAs.push(movingAverageService_1.movingAverageService.calculateEMA(prices[i], twelveDayEMAs[a], twelveDayMultiplier)); } const twentySixDayMultiplier = 2 / (26 + 1); const twentySixDaySMA = movingAverageService_1.movingAverageService.calculateSMA(prices.slice(0, 26)); const twentySixDayEMAs = [twentySixDaySMA]; for (let i = 26, a = 0; i < prices.length; i++, a++) { twentySixDayEMAs.push(movingAverageService_1.movingAverageService.calculateEMA(prices[i], twentySixDayEMAs[a], twentySixDayMultiplier)); } const macds = []; for (let i = 0, a = 14; i < twentySixDayEMAs.length; i++, a++) { macds.push(twelveDayEMAs[a] - twentySixDayEMAs[i]); } const nineDayMultiplier = 2 / (9 + 1); const nineDaySma = movingAverageService_1.movingAverageService.calculateSMA(macds.slice(0, 9)); const nineDayEMAs = [nineDaySma]; const macdDataPoint = []; for (let i = 9, a = 0; i < macds.length; i++, a++) { const macd = macds[i]; const ema = movingAverageService_1.movingAverageService.calculateEMA(macd, nineDayEMAs[a], nineDayMultiplier); nineDayEMAs.push(ema); macdDataPoint.push({ macd: lodash_1.round(macd, 2), signal: lodash_1.round(ema, 2) }); } return macdDataPoint; } } exports.MacdIndicatorImpl = MacdIndicatorImpl; //# sourceMappingURL=macdIndicator.js.map