UNPKG

@neabyte/chart-to-image

Version:

Convert trading charts to images using Node.js canvas with advanced features: 6 chart types, VWAP/EMA/SMA indicators, custom colors, themes, hide elements, scaling, and PNG/JPEG export formats.

70 lines (69 loc) 2.15 kB
export function formatPrice(price) { if (price >= 1000) { return price.toFixed(0); } else if (price >= 100) { return price.toFixed(1); } else if (price >= 10) { return price.toFixed(2); } else { return price.toFixed(4); } } export function formatTime(timestamp) { const date = new Date(timestamp); const now = new Date(); const isToday = date.toDateString() === now.toDateString(); if (isToday) { return date.toLocaleTimeString('en-US', { hour: '2-digit', minute: '2-digit', hour12: false }); } else { return date.toLocaleDateString('en-US', { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit', hour12: false }); } } export function calculatePriceRange(ohlc, config) { const prices = ohlc.flatMap(candle => [candle.high, candle.low]); let minPrice = Math.min(...prices); let maxPrice = Math.max(...prices); if (config.scale?.autoScale) { const padding = 0.05; const range = maxPrice - minPrice; minPrice -= range * padding; maxPrice += range * padding; } if (config.scale?.x) { const centerX = (minPrice + maxPrice) / 2; const rangeX = (maxPrice - minPrice) * config.scale.x; minPrice = centerX - rangeX / 2; maxPrice = centerX + rangeX / 2; } if (config.scale?.y) { const centerY = (minPrice + maxPrice) / 2; const rangeY = (maxPrice - minPrice) * config.scale.y; minPrice = centerY - rangeY / 2; maxPrice = centerY + rangeY / 2; } if (config.scale?.minScale !== undefined) { minPrice = Math.max(minPrice, config.scale.minScale); } if (config.scale?.maxScale !== undefined) { maxPrice = Math.min(maxPrice, config.scale.maxScale); } const priceRange = maxPrice - minPrice; return { minPrice, maxPrice, priceRange }; } export function hasVolumeData(ohlc) { return ohlc.some(candle => candle.volume !== undefined && candle.volume > 0); }