UNPKG

candlestick-to-png

Version:

Lightweight library to draw an array of candles into a canvas and render it as png file.

155 lines (154 loc) 4.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.fetchCandles = exports.candleStickToPNG = void 0; const candlestickChart_1 = require("./utils/candlestickChart"); const fs = require("fs"); const binance_api_node_1 = require("binance-api-node"); const canvas_1 = require("@napi-rs/canvas"); const client = (0, binance_api_node_1.default)(); function executeOnCanvas(createCanvas, candleArray, moves, candleStickGraphOptions, candleChartColors, fileName) { const canvas = createCanvas(800, 800); canvas_1.GlobalFonts.registerFromPath(`${__dirname}/fonts/gilroy/gilroy-bold-webfont.woff`, 'gilroy-bold'); canvas_1.GlobalFonts.registerFromPath(`${__dirname}/fonts/gilroy/gilroy-semibold-webfont.woff`, 'gilroy-semibold'); const basicOptions = { granularity: 1, wantBollingerBands: false, wantCandles: true, wantEMA: true, wantLines: true, wantMACD: false, wantRSI: false, wantSMA: false, wantTrades: true, zoom: 0, zoomSpeed: 0, wantGrid: false, wantStats: true, triangleSize: 10, lineWidth: 1, lineWidthGreen: 1, lineWidthRed: 1, wantSideMarksMove: false, baseFontName: 'gilroy-bold', ...candleStickGraphOptions }; const colors = { gridColor: "rgb(24,24,24)", gridTextColor: "#ffffff", mouseHoverBackgroundColor: "#84817a", lineColor: "rgba(238,238,238,0.34)", mouseHoverTextColor: "#000000", greenColor: "#77E15E", redColor: "#E94334FF", greenHoverColor: "#77E15E", redHoverColor: "#E94334FF", debugLineColor: "#D11538", growLineColor: "rgba(255,255,255,0.67)", blackColor: "#000000", whiteColor: "#eeeeee", yellowColor: "#f9ca24", purpleColor: "#e056fd", purpleColorTransparent: "rgba(217,86,253,0.21)", yellowColorTransparent: "rgba(253,206,86,0.2)", whiteColorTrasparent: 'rgba(255,255,255,0.55)', blueColor: '#4ac4e0', greenAreaColor: 'rgba(119,255,1,0.27)', redAreaColor: 'rgba(255,1,22,0.27)', greenAreaColorIntens: 'rgba(119,255,1,0.57)', redAreaColorIntes: 'rgba(255,1,22,0.57)', whiteColorMoreTrasparent: 'rgba(255,255,255,0.25)', logoColor: 'white', ...candleChartColors }; const gen = new candlestickChart_1.CandleStickGraph(basicOptions); gen.applyColors(colors); // @ts-ignore gen.initCanvasHeadless(canvas); gen.concatCandleSticks(candleArray); moves.forEach((el) => gen.addTrade(el)); gen.draw(); const buffer = canvas.toBuffer("image/png"); if (fileName) { fs.writeFileSync(fileName, buffer); } return buffer; } /** * Return buffer * @param candleArray * @param moves * @param candleStickGraphOptions * @param candleChartColors * @param customCanvas * @param fileName */ const candleStickToPNG = (candleArray, moves = [], candleStickGraphOptions = {}, candleChartColors = {}, customCanvas2, fileName) => { try { return executeOnCanvas(customCanvas2 ? (a, b) => customCanvas2 : canvas_1.createCanvas, candleArray, moves, candleStickGraphOptions, candleChartColors, fileName); } catch (e) { console.error(e); } return null; }; exports.candleStickToPNG = candleStickToPNG; const fetchCandles = async (asset, startMillis, endMillis) => { const desiredIntervalString = calculateIntervalBasedOnDuration(startMillis, endMillis); return await client.candles({ interval: desiredIntervalString, symbol: asset + 'USDT', startTime: startMillis, endTime: endMillis }); }; exports.fetchCandles = fetchCandles; function calculateIntervalBasedOnDuration(startMillis, endMillis) { const minutesDuration = (endMillis - startMillis) / 1000 / 60; const hoursDuration = minutesDuration / 60; if (minutesDuration < 60) { return '1m'; } if (hoursDuration < 8) { return '5m'; } if (hoursDuration < 15) { return '15m'; } if (hoursDuration < 20) { return '15m'; } if (hoursDuration < 1.5 * 24) { return '15m'; } if (hoursDuration < 24 * 2) { return '15m'; } if (hoursDuration < 24 * 3) { return '30m'; } if (hoursDuration < 24 * 4) { return '1h'; } if (hoursDuration < 24 * 6) { return '2h'; } if (hoursDuration < 24 * 8) { return '2h'; } if (hoursDuration < 24 * 12) { return '4h'; } if (hoursDuration < 24 * 60) { return '6h'; } if (hoursDuration < 24 * 90) { return '8h'; } if (hoursDuration < 24 * 365) { return '12h'; } if (hoursDuration < 24 * 3 * 365) { return '1d'; } return '1w'; }