import schedule from 'node-schedule'; import { IndicatorService } from '../services/indicatorService'; import { BybitService } from '../services/bybitService'; import { KlineIntervalV3 } from 'bybit-api'; import { sendLarkMessage } from '../services/messageService'; import { Candle } from '../dao/candles'; import { Order } from '../dao/order'; import { EventHandler } from '../services/indicatorService'; const indicatorService = new IndicatorService(); const bybitService = new BybitService(process.env.BYBIT_API_KEY!, process.env.BYBIT_API_SECRET!, false); // Hàm thực hiện phân tích nến export async function analyzeCandlesJob(symbol: string, interval: KlineIntervalV3, eventHandler?: EventHandler, end?: number) { // TODO: Lấy client thật nếu cần const candles = await bybitService.getCandles({ symbol, interval, category: 'linear', limit: 500, end }); const wave = await indicatorService.getWave(symbol, interval); const analysis= indicatorService.analyze(candles, wave); if (eventHandler) { indicatorService.handleEvent(analysis, candles, eventHandler); } analysis.symbol = symbol; analysis.interval = interval; await indicatorService.upsertWave({ symbol, interval, trend: analysis.emaDirection as 'Bullish' | 'Bearish', numberTouchEma: analysis.numberTouch200, numberMacdCrossUp: analysis.numberMacdCrossUp, numberMacdCrossDown: analysis.numberMacdCrossDown, lowOrHighPrice: analysis.lowHight, }); } export function createCandleAnalysisSchedule(symbol: string, interval: KlineIntervalV3, eventHandler?: EventHandler) { const rule = new schedule.RecurrenceRule(); rule.tz = 'Asia/Ho_Chi_Minh'; switch (interval) { case '5': rule.minute = [4, 9, 14, 19, 24, 29, 34, 39, 44, 49, 54, 59]; break; case '15': rule.minute = [14, 29, 44, 59]; break; case '30': rule.minute = [29, 59]; break; case '60': rule.minute = [59]; break; case '240': rule.minute = [59]; rule.hour = [2, 6, 10, 14, 18, 22]; break; case 'D': rule.minute = [59]; rule.hour = [6]; break; } rule.second = 59; schedule.scheduleJob(rule, () => { analyzeCandlesJob(symbol, interval, eventHandler); }); }