import { CancelOrderParamsV5, GetAccountOrdersParamsV5, GetKlineParamsV5, OrderParamsV5, RestClientV5 } from 'bybit-api'; import { Candle } from '../dao/candles'; export class BybitService { private client: RestClientV5; constructor(apiKey: string, apiSecret: string, testnet: boolean = true) { this.client = new RestClientV5({ key: apiKey, secret: apiSecret, testnet }); } async createOrder(orderData: OrderParamsV5): Promise { try { const res = await this.client.submitOrder(orderData); return { success: true, data: res }; } catch (error: any) { return { success: false, error: error.message }; } } async listOrders(params: GetAccountOrdersParamsV5): Promise { try { const res = await this.client.getActiveOrders(params); return res.result?.list || []; } catch (error: any) { return []; } } async cancelOrder(params: CancelOrderParamsV5): Promise { try { const res = await this.client.cancelOrder(params); return { success: true, data: res }; } catch (error: any) { return { success: false, error: error.message }; } } async listPositions(params: any): Promise { try { const res = await this.client.getPositionInfo(params); return res.result?.list || []; } catch (error: any) { return []; } } async getCandles(params: GetKlineParamsV5): Promise { try { const res = await this.client.getKline(params); const list = res.result?.list || []; // Bybit trả về: [timestamp, open, high, low, close, volume, turnover] return list.map((item: any[]) => ({ time: new Date(Number(item[0])).toISOString(), timestamp: Number(item[0]), open: Number(item[1]), high: Number(item[2]), low: Number(item[3]), close: Number(item[4]), volume: Number(item[5]), turnover: Number(item[6]) })); } catch (error: any) { return []; } } }