This commit is contained in:
KienVT9 2025-07-16 15:37:26 +07:00
parent 9cde60bb9c
commit c35d84cf07
11 changed files with 2109 additions and 68 deletions

View file

@ -5,52 +5,23 @@ 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);
function sendMessage(message: string) {
sendLarkMessage('oc_f9b2e8f0309ecab0c94e3e134b0ddd29', message);
}
// Hàm thực hiện phân tích nến
export async function analyzeCandlesJob(symbol: string, interval: KlineIntervalV3, end?: number) {
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);
console.log(wave);
const analysis= indicatorService.analyze(candles, wave);
indicatorService.handleEvent(analysis, candles, {
onBuy: (order: Order, reason: string) => {
sendMessage(`Buy ${symbol} ${interval}M ${reason}
symbol: ${order.symbol}
side: ${order.side}
entry: ${order.entry}
stopLoss: ${order.stopLoss}
volume: ${order.volume}
reason: ${reason}
`);
console.log(`Buy ${symbol} ${interval}M ${reason} ${candles[0].time}`);
},
onSell: (order: Order, reason: string) => {
sendMessage(`Sell ${symbol} ${interval}M ${reason}
symbol: ${order.symbol}
side: ${order.side}
entry: ${order.entry}
stopLoss: ${order.stopLoss}
volume: ${order.volume}
reason: ${reason}
`);
console.log(`Sell ${symbol} ${interval}M ${reason} ${candles[0].time}`);
},
onEvent: (data: any, eventType: string) => {
sendMessage(`${eventType} ${symbol} ${interval}M ${data.close}`)
console.log(`${eventType} ${symbol} ${interval}M ${JSON.stringify(data)}`);
},
});
if (eventHandler) {
indicatorService.handleEvent(analysis, candles, eventHandler);
}
analysis.symbol = symbol;
analysis.interval = interval;
console.log(analysis);
await indicatorService.upsertWave({
symbol,
interval,
@ -62,7 +33,7 @@ export async function analyzeCandlesJob(symbol: string, interval: KlineIntervalV
});
}
export function createCandleAnalysisSchedule(symbol: string, interval: KlineIntervalV3) {
export function createCandleAnalysisSchedule(symbol: string, interval: KlineIntervalV3, eventHandler?: EventHandler) {
const rule = new schedule.RecurrenceRule();
rule.tz = 'Asia/Ho_Chi_Minh';
switch (interval) {
@ -89,6 +60,6 @@ export function createCandleAnalysisSchedule(symbol: string, interval: KlineInte
}
rule.second = 59;
schedule.scheduleJob(rule, () => {
analyzeCandlesJob(symbol, interval);
analyzeCandlesJob(symbol, interval, eventHandler);
});
}