UNPKG

@dendaio/n8n-nodes-collection

Version:

🚀 Comprehensive n8n node collection for financial analysis and automation. Features 55+ technical indicators (RSI, MACD, Bollinger Bands), 32+ candlestick patterns (Doji, Hammer, Engulfing), automated trading strategies, RSS feed processing, and OAuth2 v

601 lines • 29 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); Object.defineProperty(exports, "__esModule", { value: true }); exports.TrendIndicators = void 0; const n8n_workflow_1 = require("n8n-workflow"); const indicatorts = __importStar(require("indicatorts")); const technicalindicators = __importStar(require("technicalindicators")); class TrendIndicators { constructor() { this.description = { displayName: 'Trend Indicators', name: 'trendIndicators', icon: 'file:icon.svg', group: ['transform'], version: 1, description: 'Calculate trend indicators using the indicatorts library', defaults: { name: 'Trend Indicators', }, inputs: ["main"], outputs: ["main"], properties: [ { displayName: 'Indicators', name: 'indicators', type: 'multiOptions', options: [ { name: 'Absolute Price Oscillator', value: 'absolutePriceOscillator', description: 'APO: Fast EMA minus Slow EMA', }, { name: 'Aroon', value: 'aroon', description: 'Aroon Up/Down trend indicator' }, { name: 'Average Directional Index', value: 'averageDirectionalIndex', description: 'ADX: Trend strength indicator', }, { name: 'Balance of Power', value: 'balanceOfPower', description: 'Strength of buying/selling pressure', }, { name: 'Chande Forecast Oscillator', value: 'chandeForecastOscillator', description: 'Forecast oscillator', }, { name: 'Community Channel Index', value: 'communityChannelIndex', description: 'CCI: Overbought/oversold momentum', }, { name: 'Double Exponential Moving Average', value: 'doubleExponentialMovingAverage', description: 'DEMA', }, { name: 'Exponential Moving Average', value: 'exponentialMovingAverage', description: 'EMA', }, { name: 'Mass Index', value: 'massIndex', description: 'Mass Index for trend reversals' }, { name: 'Moving Average Convergence Divergence', value: 'movingAverageConvergenceDivergence', description: 'MACD', }, { name: 'Moving Max', value: 'movingMax' }, { name: 'Moving Min', value: 'movingMin' }, { name: 'Moving Sum', value: 'movingSum' }, { name: 'Parabolic SAR', value: 'parabolicSAR', }, { name: 'Qstick', value: 'qstick', description: 'Qstick ratio of up/down bars' }, { name: 'Random Index (KDJ)', value: 'randomIndex', description: 'KDJ oscillator' }, { name: 'Rolling Moving Average', value: 'rollingMovingAverage', description: 'RMA' }, { name: 'Simple Moving Average', value: 'simpleMovingAverage', description: 'SMA' }, { name: 'Since', value: 'since', description: 'Since value changed' }, { name: 'Triangular Moving Average', value: 'triangularMovingAverage', description: 'TRIMA', }, { name: 'Triple Exponential Average (TRIX)', value: 'tripleExponentialAverage', description: 'TRIX', }, { name: 'Triple Exponential Moving Average', value: 'tripleExponentialMovingAverage', description: 'TEMA', }, { name: 'Typical Price', value: 'typicalPrice', description: 'Typical price (H+L+C)/3' }, { name: 'Volume Weighted Moving Average', value: 'volumeWeightedMovingAverage', description: 'VWMA', }, { name: 'Vortex', value: 'vortex', description: 'Vortex trend indicator' }, ], default: ['simpleMovingAverage'], noDataExpression: true, }, { displayName: 'OHLCV Data', name: 'ohlcvData', type: 'string', default: '={{ $json.ohlcv }}', description: 'JSON string containing OHLCV data array', }, { displayName: 'APO Fast Period', name: 'apoFast', type: 'number', default: 12, description: 'Fast EMA period for APO', displayOptions: { show: { indicators: ['absolutePriceOscillator'] } }, }, { displayName: 'APO Slow Period', name: 'apoSlow', type: 'number', default: 26, description: 'Slow EMA period for APO', displayOptions: { show: { indicators: ['absolutePriceOscillator'] } }, }, { displayName: 'ADX Period', name: 'adxPeriod', type: 'number', default: 14, description: 'Period for ADX calculation', displayOptions: { show: { indicators: ['averageDirectionalIndex'] } }, }, { displayName: 'Aroon Period', name: 'aroonPeriod', type: 'number', default: 14, description: 'Period for Aroon calculation', displayOptions: { show: { indicators: ['aroon'] } }, }, { displayName: 'CCI Period', name: 'cciPeriod', type: 'number', default: 20, description: 'Period for CCI calculation', displayOptions: { show: { indicators: ['communityChannelIndex'] } }, }, { displayName: 'DEMA Period', name: 'demaPeriod', type: 'number', default: 20, description: 'Period for DEMA calculation', displayOptions: { show: { indicators: ['doubleExponentialMovingAverage'] } }, }, { displayName: 'EMA Period', name: 'emaPeriod', type: 'number', default: 20, description: 'Period for EMA calculation', displayOptions: { show: { indicators: ['exponentialMovingAverage'] } }, }, { displayName: 'Mass Index EMA Period', name: 'miEmaPeriod', type: 'number', default: 9, description: 'EMA period for Mass Index', displayOptions: { show: { indicators: ['massIndex'] } }, }, { displayName: 'Mass Index Period', name: 'miPeriod', type: 'number', default: 25, description: 'Period for Mass Index calculation', displayOptions: { show: { indicators: ['massIndex'] } }, }, { displayName: 'MACD Fast Period', name: 'macdFast', type: 'number', default: 12, description: 'Fast period for MACD calculation', displayOptions: { show: { indicators: ['movingAverageConvergenceDivergence'] } }, }, { displayName: 'MACD Slow Period', name: 'macdSlow', type: 'number', default: 26, description: 'Slow period for MACD calculation', displayOptions: { show: { indicators: ['movingAverageConvergenceDivergence'] } }, }, { displayName: 'MACD Signal Period', name: 'macdSignal', type: 'number', default: 9, description: 'Signal period for MACD calculation', displayOptions: { show: { indicators: ['movingAverageConvergenceDivergence'] } }, }, { displayName: 'Moving Max Period', name: 'mmaxPeriod', type: 'number', default: 20, description: 'Period for Moving Max calculation', displayOptions: { show: { indicators: ['movingMax'] } }, }, { displayName: 'Moving Min Period', name: 'mminPeriod', type: 'number', default: 20, description: 'Period for Moving Min calculation', displayOptions: { show: { indicators: ['movingMin'] } }, }, { displayName: 'Moving Sum Period', name: 'msumPeriod', type: 'number', default: 20, description: 'Period for Moving Sum calculation', displayOptions: { show: { indicators: ['movingSum'] } }, }, { displayName: 'PSAR Step', name: 'psarStep', type: 'number', default: 0.02, description: 'Step for Parabolic SAR', displayOptions: { show: { indicators: ['parabolicSAR'] } }, }, { displayName: 'PSAR Max', name: 'psarMax', type: 'number', default: 0.2, description: 'Max for Parabolic SAR', displayOptions: { show: { indicators: ['parabolicSAR'] } }, }, { displayName: 'Qstick Period', name: 'qstickPeriod', type: 'number', default: 10, description: 'Period for Qstick calculation', displayOptions: { show: { indicators: ['qstick'] } }, }, { displayName: 'KDJ R Period', name: 'kdjRPeriod', type: 'number', default: 9, description: 'R period for KDJ', displayOptions: { show: { indicators: ['randomIndex'] } }, }, { displayName: 'KDJ K Period', name: 'kdjKPeriod', type: 'number', default: 3, description: 'K period for KDJ', displayOptions: { show: { indicators: ['randomIndex'] } }, }, { displayName: 'KDJ D Period', name: 'kdjDPeriod', type: 'number', default: 3, description: 'D period for KDJ', displayOptions: { show: { indicators: ['randomIndex'] } }, }, { displayName: 'RMA Period', name: 'rmaPeriod', type: 'number', default: 14, description: 'Period for Rolling Moving Average', displayOptions: { show: { indicators: ['rollingMovingAverage'] } }, }, { displayName: 'SMA Period', name: 'smaPeriod', type: 'number', default: 20, description: 'Period for SMA calculation', displayOptions: { show: { indicators: ['simpleMovingAverage'] } }, }, { displayName: 'TRIMA Period', name: 'trimaPeriod', type: 'number', default: 20, description: 'Period for TRIMA calculation', displayOptions: { show: { indicators: ['triangularMovingAverage'] } }, }, { displayName: 'TRIX Period', name: 'trixPeriod', type: 'number', default: 15, description: 'Period for TRIX calculation', displayOptions: { show: { indicators: ['tripleExponentialAverage'] } }, }, { displayName: 'TEMA Period', name: 'temaPeriod', type: 'number', default: 20, description: 'Period for TEMA calculation', displayOptions: { show: { indicators: ['tripleExponentialMovingAverage'] } }, }, { displayName: 'VWMA Period', name: 'vwmaPeriod', type: 'number', default: 20, description: 'Period for VWMA calculation', displayOptions: { show: { indicators: ['volumeWeightedMovingAverage'] } }, }, { displayName: 'Vortex Period', name: 'vortexPeriod', type: 'number', default: 14, description: 'Period for Vortex calculation', displayOptions: { show: { indicators: ['vortex'] } }, }, { displayName: 'Options', name: 'options', type: 'collection', placeholder: 'Add Option', default: {}, options: [ { displayName: 'Return Type', name: 'returnType', type: 'options', options: [ { name: 'Values Only', value: 'values', description: 'Return only the calculated values', }, { name: 'With Metadata', value: 'metadata', description: 'Return values with additional metadata', }, ], default: 'values', }, ], }, ], }; } async execute() { const items = this.getInputData(); const returnData = []; for (let i = 0; i < items.length; i++) { try { const indicators = this.getNodeParameter('indicators', i); const ohlcvDataString = this.getNodeParameter('ohlcvData', i); const options = this.getNodeParameter('options', i, {}); let ohlcvData; try { ohlcvData = JSON.parse(ohlcvDataString); } catch (error) { throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Failed to parse OHLCV data: ${error instanceof Error ? error.message : 'Unknown error'}`); } if (!Array.isArray(ohlcvData) || ohlcvData.length === 0) { throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'OHLCV data must be a non-empty array'); } const opens = ohlcvData.map((candle) => candle[0]); const highs = ohlcvData.map((candle) => candle[1]); const lows = ohlcvData.map((candle) => candle[2]); const closes = ohlcvData.map((candle) => candle[3]); const volumes = ohlcvData.map((candle) => candle[4]); const indicatorPromises = indicators.map(async (indicator) => { const mappedParameters = {}; let result; switch (indicator) { case 'absolutePriceOscillator': { mappedParameters.fast = this.getNodeParameter('apoFast', i, 12); mappedParameters.slow = this.getNodeParameter('apoSlow', i, 26); result = indicatorts.absolutePriceOscillator(closes, mappedParameters); break; } case 'averageDirectionalIndex': { mappedParameters.period = this.getNodeParameter('adxPeriod', i, 14); result = technicalindicators.adx({ high: highs, low: lows, close: closes, period: mappedParameters.period, }); break; } case 'aroon': { mappedParameters.period = this.getNodeParameter('aroonPeriod', i, 14); result = indicatorts.aroon(highs, lows, mappedParameters); break; } case 'balanceOfPower': { result = indicatorts.balanceOfPower(opens, highs, lows, closes); break; } case 'chandeForecastOscillator': { result = indicatorts.chandeForecastOscillator(closes); break; } case 'communityChannelIndex': { mappedParameters.period = this.getNodeParameter('cciPeriod', i, 20); result = indicatorts.communityChannelIndex(highs, lows, closes, mappedParameters); break; } case 'doubleExponentialMovingAverage': { mappedParameters.period = this.getNodeParameter('demaPeriod', i, 20); result = indicatorts.doubleExponentialMovingAverage(closes, mappedParameters); break; } case 'exponentialMovingAverage': { mappedParameters.period = this.getNodeParameter('emaPeriod', i, 20); result = indicatorts.exponentialMovingAverage(closes, mappedParameters); break; } case 'massIndex': { mappedParameters.emaPeriod = this.getNodeParameter('miEmaPeriod', i, 9); mappedParameters.miPeriod = this.getNodeParameter('miPeriod', i, 25); result = indicatorts.massIndex(highs, lows, mappedParameters); break; } case 'movingAverageConvergenceDivergence': { mappedParameters.fast = this.getNodeParameter('macdFast', i, 12); mappedParameters.slow = this.getNodeParameter('macdSlow', i, 26); mappedParameters.signal = this.getNodeParameter('macdSignal', i, 9); result = indicatorts.movingAverageConvergenceDivergence(closes, mappedParameters); break; } case 'movingMax': { mappedParameters.period = this.getNodeParameter('mmaxPeriod', i, 20); result = indicatorts.movingMax(closes, mappedParameters); break; } case 'movingMin': { mappedParameters.period = this.getNodeParameter('mminPeriod', i, 20); result = indicatorts.movingMin(closes, mappedParameters); break; } case 'movingSum': { mappedParameters.period = this.getNodeParameter('msumPeriod', i, 20); result = indicatorts.movingSum(closes, mappedParameters); break; } case 'parabolicSAR': { mappedParameters.step = this.getNodeParameter('psarStep', i, 0.02); mappedParameters.max = this.getNodeParameter('psarMax', i, 0.2); result = indicatorts.parabolicSAR(highs, lows, closes, mappedParameters); break; } case 'qstick': { mappedParameters.period = this.getNodeParameter('qstickPeriod', i, 10); result = indicatorts.qstick(opens, closes, mappedParameters); break; } case 'randomIndex': { mappedParameters.rPeriod = this.getNodeParameter('kdjRPeriod', i, 9); mappedParameters.kPeriod = this.getNodeParameter('kdjKPeriod', i, 3); mappedParameters.dPeriod = this.getNodeParameter('kdjDPeriod', i, 3); result = indicatorts.randomIndex(highs, lows, closes, mappedParameters); break; } case 'rollingMovingAverage': { mappedParameters.period = this.getNodeParameter('rmaPeriod', i, 14); result = indicatorts.rollingMovingAverage(closes, mappedParameters); break; } case 'simpleMovingAverage': { mappedParameters.period = this.getNodeParameter('smaPeriod', i, 20); result = indicatorts.simpleMovingAverage(closes, mappedParameters); break; } case 'since': { result = indicatorts.since(closes); break; } case 'triangularMovingAverage': { mappedParameters.period = this.getNodeParameter('trimaPeriod', i, 20); result = indicatorts.triangularMovingAverage(closes, mappedParameters); break; } case 'tripleExponentialAverage': { mappedParameters.period = this.getNodeParameter('trixPeriod', i, 15); result = indicatorts.tripleExponentialAverage(closes, mappedParameters); break; } case 'tripleExponentialMovingAverage': { mappedParameters.period = this.getNodeParameter('temaPeriod', i, 20); result = indicatorts.tripleExponentialMovingAverage(closes, mappedParameters); break; } case 'typicalPrice': { result = indicatorts.typicalPrice(highs, lows, closes); break; } case 'volumeWeightedMovingAverage': { mappedParameters.period = this.getNodeParameter('vwmaPeriod', i, 20); result = indicatorts.volumeWeightedMovingAverage(closes, volumes, mappedParameters); break; } case 'vortex': { mappedParameters.period = this.getNodeParameter('vortexPeriod', i, 14); result = indicatorts.vortex(highs, lows, closes, mappedParameters); break; } default: throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Unsupported indicator: ${indicator}`); } return { indicator, parameters: mappedParameters, result, }; }); const indicatorResults = await Promise.all(indicatorPromises); const outputData = { indicators: indicatorResults, }; if (options.returnType === 'metadata') { outputData.metadata = { inputLength: ohlcvData.length, indicatorsCount: indicators.length, calculationTimestamp: new Date().toISOString(), }; } returnData.push({ json: outputData, }); } catch (error) { if (this.continueOnFail()) { returnData.push({ json: { error: error instanceof Error ? error.message : 'Unknown error occurred', }, }); continue; } throw error; } } return [returnData]; } } exports.TrendIndicators = TrendIndicators; //# sourceMappingURL=TrendIndicators.node.js.map