refactor(data): 重构交易所适配器,修复 Kline 实体复合主键

- 废弃旧 adapter 体系 (base/binance/types.ts),新增 base_rest/rest.ts
  基于 Binance 官方 SDK 实现 REST K 线拉取
- Kline 实体改为四列复合主键 (exchange/symbol/interval/time),
  修复单列 time PK 导致的跨 symbol 写入冲突
- 新增 filterConsecutive():K 线连续性过滤,首缺口截断策略
- 新增 service/kline.ts:批量 UPSERT K 线入库
- 新增 types/ 共享类型定义、example/ 示例、run/ 运行脚本
This commit is contained in:
Rekey
2026-06-08 18:18:16 +08:00
parent 85a0031a78
commit 5e385547c7
16 changed files with 829 additions and 1043 deletions
+22 -24
View File
@@ -20,21 +20,11 @@ import {
Entity,
PrimaryColumn,
Column,
Index,
CreateDateColumn,
UpdateDateColumn,
} from "typeorm";
/** K 线周期枚举 */
export type KlineInterval =
| "1m"
| "5m"
| "15m"
| "30m"
| "1h"
| "4h"
| "1d"
| "1w";
import type { KlineInterval } from '../../types';
/**
* 1 分钟 K 线 Hypertable
@@ -56,26 +46,34 @@ export type KlineInterval =
},
},
})
@Index(["exchange", "symbol", "interval", "time"], { unique: true })
@Entity("klines")
export class Kline {
/**
* 复合主键:交易所 + 交易对 + 周期 + 时间
*
* 设计原因:
* - 不同 symbol 在同一时刻有各自的 K 线,单列 time PK 会导致跨 symbol 冲突
* - 四列复合主键 = 业务唯一性语义,同时满足 TimescaleDB hypertable 要求
* (分区列 time 必须包含在主键中)
* - 不再需要额外的 @Index unique — 复合主键已保证唯一性
*/
/** 交易所标识(binance / okx / bybit */
@PrimaryColumn("text")
exchange!: string;
/** 交易对符号(如 BTCUSDT */
@PrimaryColumn("text")
symbol!: string;
/** K 线周期(1m */
@PrimaryColumn("text")
interval!: KlineInterval;
/** K 线开盘时间(UTC)— @timescaledb/typeorm 自动标记为时间分区列 */
@TimeColumn()
@PrimaryColumn("timestamptz")
time!: Date;
/** 交易所标识(binance / okx / bybit */
@Column("text")
exchange!: string;
/** 交易对符号(如 BTCUSDT */
@Column("text")
symbol!: string;
/** K 线周期(1m */
@Column("text")
interval!: KlineInterval;
// ============================================================
// OHLCV 价格数据(NUMERIC(20,8) 精度,与交易所对齐)
// ============================================================