UNPKG

candlestick-chart-generator

Version:

A Node.js library for generating candlestick chart screenshots using financial data

114 lines (97 loc) 4.34 kB
const DataFetcher = require("./dataFetcher"); const ChartRendererSimple = require("./chartRenderer_simple"); const fs = require("fs"); class CandlestickChartGeneratorSimple { constructor() { this.dataFetcher = new DataFetcher(); this.chartRenderer = null; } /** * Generate a candlestick chart screenshot using Simple Canvas Renderer * @param {Object} params - Chart generation parameters * @param {string} params.symbol - The ticker symbol (e.g., 'AAPL', 'BTC-USD', 'EURUSD=X') * @param {string} params.interval - The time interval ('1m', '1h', '1d', etc.) * @param {string|Date} [params.startDate] - Start date for historical data * @param {string|Date} [params.endDate] - End date for historical data * @param {string} [params.outputPath='chart.png'] - Path where the screenshot will be saved * @param {number} [params.width=1200] - Chart width in pixels * @param {number} [params.height=600] - Chart height in pixels * @param {Object} [params.chartOptions={}] - Chart rendering options for simple renderer * @returns {Promise<string>} Path to the saved screenshot */ async generateChartScreenshot({ symbol, interval, startDate = null, endDate = null, outputPath = "chart.png", width = 1200, height = 600, chartOptions = {} }) { try { // Initialize chart renderer with specified dimensions this.chartRenderer = new ChartRendererSimple(width, height); // Fetch historical data console.log(`Fetching data for ${symbol} with interval ${interval}...`); const data = await this.dataFetcher.fetchHistoricalData(symbol, interval, startDate, endDate); if (!data || data.length === 0) { throw new Error(`No data available for ${symbol} with the specified parameters`); } console.log(`Fetched ${data.length} data points`); // Render the chart console.log("Rendering chart with Simple Canvas..."); const chartBuffer = await this.chartRenderer.renderChart(data, { symbol, timeframe: interval, chartOptions }); // Save the chart to file console.log(`Saving chart to ${outputPath}...`); fs.writeFileSync(outputPath, chartBuffer); console.log(`Chart screenshot saved successfully to ${outputPath}`); return outputPath; } catch (error) { throw new Error(`Failed to generate chart screenshot: ${error.message}`); } } /** * Generate chart as base64 image data instead of saving to file * @param {Object} params - Same parameters as generateChartScreenshot (except outputPath) * @returns {Promise<string>} Base64 encoded image data */ async generateChartBase64(params) { const { outputPath, ...chartParams } = params; try { // Initialize chart renderer with specified dimensions this.chartRenderer = new ChartRendererSimple( chartParams.width || 1200, chartParams.height || 600 ); // Fetch and render chart (same as generateChartScreenshot) const data = await this.dataFetcher.fetchHistoricalData( chartParams.symbol, chartParams.interval, chartParams.startDate, chartParams.endDate ); const chartBuffer = await this.chartRenderer.renderChart(data, { symbol: chartParams.symbol, timeframe: chartParams.interval, chartOptions: chartParams.chartOptions || {} }); // Return base64 data return chartBuffer.toString("base64"); } catch (error) { throw new Error(`Failed to generate chart base64: ${error.message}`); } } /** * Close and clean up resources (no-op for canvas renderer) */ async close() { // No cleanup needed for canvas renderer console.log("Simple Canvas chart generator closed"); } } module.exports = CandlestickChartGeneratorSimple;