@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
JavaScript
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);
}