65 lines
No EOL
2.2 KiB
TypeScript
65 lines
No EOL
2.2 KiB
TypeScript
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);
|
|
});
|
|
} |