@363045841yyt/klinechart 0.1.2 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/README.md +168 -117
  2. package/dist/App.vue.d.ts +1 -1
  3. package/dist/api/data/baostock.d.ts +86 -0
  4. package/dist/api/data/baostock.test.d.ts +1 -0
  5. package/dist/api/data/index.d.ts +26 -0
  6. package/dist/api/data/types.d.ts +33 -0
  7. package/dist/api/data/unified.d.ts +33 -0
  8. package/dist/components/IndicatorSelector.vue.d.ts +17 -0
  9. package/dist/components/KLineChart.vue.d.ts +6 -3
  10. package/dist/core/chart.d.ts +105 -83
  11. package/dist/core/controller/interaction.d.ts +67 -5
  12. package/dist/core/draw/pixelAlign.d.ts +114 -0
  13. package/dist/core/layout/pane.d.ts +29 -22
  14. package/dist/core/paneRenderer.d.ts +65 -0
  15. package/dist/core/renderers/candle.d.ts +2 -2
  16. package/dist/core/renderers/crosshair.d.ts +12 -3
  17. package/dist/core/renderers/crosshairLabels.d.ts +19 -0
  18. package/dist/core/renderers/extremaMarkers.d.ts +2 -4
  19. package/dist/core/renderers/globalBorders.d.ts +18 -0
  20. package/dist/core/renderers/grid.d.ts +2 -2
  21. package/dist/core/renderers/gridLines.d.ts +2 -3
  22. package/dist/core/renderers/lastPrice.d.ts +1 -1
  23. package/dist/core/renderers/ma.d.ts +6 -2
  24. package/dist/core/renderers/maLegend.d.ts +10 -0
  25. package/dist/core/renderers/paneBorder.d.ts +12 -0
  26. package/dist/core/renderers/paneSeparator.d.ts +8 -0
  27. package/dist/core/renderers/paneTitle.d.ts +7 -0
  28. package/dist/core/renderers/subVolume.d.ts +5 -0
  29. package/dist/core/renderers/timeAxis.d.ts +12 -0
  30. package/dist/core/renderers/yAxis.d.ts +7 -2
  31. package/dist/core/theme/colors.d.ts +128 -0
  32. package/dist/index.cjs +1 -1
  33. package/dist/index.js +1019 -653
  34. package/dist/klinechart.css +1 -1
  35. package/dist/utils/cache.d.ts +33 -0
  36. package/dist/utils/dateFormat.d.ts +15 -2
  37. package/dist/utils/kLineDraw/MA.d.ts +7 -3
  38. package/dist/utils/kLineDraw/axis.d.ts +10 -0
  39. package/dist/utils/kLineDraw/kLine.d.ts +1 -0
  40. package/dist/utils/kline/format.d.ts +3 -3
  41. package/dist/utils/logger.d.ts +1 -0
  42. package/package.json +59 -57
  43. package/dist/composables/useKLineInteraction.d.ts +0 -50
  44. package/dist/composables/useKLineRenderer.d.ts +0 -49
  45. package/dist/stores/counter.d.ts +0 -13
  46. package/dist/utils/kLineDraw/pixelAlign.d.ts +0 -48
package/README.md CHANGED
@@ -1,14 +1,19 @@
1
1
  # kmap - 金融图表绘制库
2
2
 
3
- 这是一个基于 Vue 3 和 Canvas 的金融图表绘制库,专注于提供高性能的 K 线图展示功能。该库支持横向滚动、移动平均线(MA)显示以及从多种数据源(包括 AKTools)获取金融数据。
3
+ [English](README_EN.md) | 简体中文
4
+
5
+ 这是一个基于 Vue 3 和 Canvas 的金融图表绘制库,专注于提供高性能的 K 线图展示功能。该库支持横向滚动、移动平均线(MA)显示以及从多种数据源(包括 **BaoStock**、AKTools)获取金融数据。
6
+
7
+ ![](https://s2.loli.net/2026/01/25/LObQPXmoN4ZdFey.png)
4
8
 
5
9
  ## 功能特性
6
10
 
7
11
  - 📊 **K 线图绘制**:使用 Canvas 实现高性能的 K 线图绘制
12
+ - 🎯 **TradingView 级别稳定**:物理像素控制缩放,影线完美居中,无累积偏移
8
13
  - 📈 **移动平均线**:支持 MA5、MA10、MA20 等多种移动平均线显示
9
14
  - ↔️ **横向滚动**:支持大量历史数据的横向滚动浏览
10
15
  - 🎨 **深色模式**:自动适配系统深色模式
11
- - 📱 **响应式设计**:适配不同屏幕尺寸
16
+ - 📱 **响应式设计**:适配不同屏幕尺寸,支持所有设备像素比(DPR)
12
17
  - ⚡ **高性能**:使用 requestAnimationFrame 优化渲染性能
13
18
 
14
19
  ## 技术栈
@@ -17,7 +22,9 @@
17
22
  - [Vite](https://vite.dev/) - 下一代前端构建工具
18
23
  - [TypeScript](https://www.typescriptlang.org/) - JavaScript 类型检查
19
24
  - [Canvas API](https://developer.mozilla.org/zh-CN/docs/Web/API/Canvas_API) - 图形绘制
20
- - [AKTools](https://github.com/akfamily/aktools) - 开源金融数据接口库
25
+ - [BaoStock](http://baostock.com/) - 开源金融数据接口(推荐)
26
+ - [AKTools](https://github.com/akfamily/aktools) - 开源金融数据接口库(存在反爬限制)
27
+ - [Vitest](https://vitest.dev/) - 单元测试框架
21
28
 
22
29
  ## 项目结构
23
30
 
@@ -25,141 +32,123 @@
25
32
  src/
26
33
  ├── api/ # API 接口定义
27
34
  │ └── data/
28
- └── kLine.ts # K 线数据接口
35
+ ├── kLine.ts # 东财/AKTools K 线数据接口
36
+ │ └── baostock.ts # BaoStock K 线数据接口(推荐)
29
37
  ├── components/ # 组件
30
38
  │ └── KLineChart.vue # K 线图主组件
39
+ ├── core/ # 核心渲染引擎
40
+ │ ├── chart.ts # 图表控制器
41
+ │ ├── draw/ # 像素对齐工具
42
+ │ │ └── pixelAlign.ts
43
+ │ ├── renderers/ # 渲染器
44
+ │ │ ├── candle.ts # K 线渲染器
45
+ │ │ └── ...
46
+ │ ├── scale/ # 缩放控制
47
+ │ └── viewport/ # 视口管理
31
48
  ├── types/ # 类型定义
32
49
  │ ├── kLine.ts # K 线类型定义
33
50
  │ └── price.ts # 价格类型定义
34
51
  ├── utils/ # 工具函数
35
- │ ├── draw/ # 绘制工具
36
- ├── kLine.ts # K 线绘制
37
- └── MA.ts # 移动平均线绘制
38
- │ ├── mock/ # 模拟数据生成
39
- │ ├── logger.ts # 日志工具
40
- │ └── priceToY.ts # 价格转 Y 坐标
52
+ │ ├── kLineDraw/ # K 线绘制工具
53
+ │ ├── kline/ # K 线数据处理
54
+ │ └── mock/ # 模拟数据生成
41
55
  ├── stores/ # 状态管理 (Pinia)
42
56
  └── assets/ # 静态资源
43
57
  ```
44
58
 
45
- ## 数据接入
59
+ ## 数据源
46
60
 
47
- ### AKTools 数据接入
61
+ 本项目支持多种数据源,通过统一接口实现无缝切换。
48
62
 
49
- AKTools 是一个开源的金融数据接口库,可以免费获取股票、期货、期权等金融产品的历史数据。
63
+ | 数据源 | 稳定性 | 反爬限制 | 推荐场景 |
64
+ |--------|--------|----------|----------|
65
+ | [BaoStock](http://baostock.com/) | ⭐⭐⭐ 高 | 无 | 生产环境(推荐) |
66
+ | [AKShare](https://github.com/akfamily/akshare) | ⭐⭐ 中 | 有 | 开发测试 |
50
67
 
51
- #### 安装 AKTools
68
+ ### BaoStock(推荐)
52
69
 
53
- 使用 uv pip 安装:
70
+ BaoStock 是免费开源的 Python 证券数据接口,提供稳定可靠的金融数据服务。
54
71
 
55
- ```bash
56
- # 安装 uv(如果尚未安装)
57
- pip install uv
72
+ - 官方文档:[http://www.baostock.com/mainContent?file=stockKData.md](http://www.baostock.com/mainContent?file=stockKData.md)
58
73
 
59
- # 使用 uv 安装 AKTools
60
- uv pip install aktools
61
- ```
62
-
63
- 或者直接使用 pip 安装:
74
+ #### 快速开始
64
75
 
65
76
  ```bash
66
- pip install aktools
67
- ```
68
-
69
- #### 启动 AKTools 数据服务
70
-
71
- 方法一:使用 uv 直接运行 AKTools
77
+ # 安装
78
+ uv pip install baostock
72
79
 
73
- ```bash
74
- uv run python -m aktools
75
- ```
76
-
77
- 方法一(推荐):通过本项目脚本启动(会自动切换到上级目录的 `aktoolshttp/`)
78
-
79
- ```bash
80
- pnpm aktools
80
+ # 启动服务(需自行实现服务层或参考 BaoStock 文档)
81
+ python your_baostock_server.py
81
82
  ```
82
83
 
83
- #### 手机访问本机(开发模式)并调用 AKTools API(推荐)
84
-
85
- 如果你希望用手机浏览器访问本机正在运行的 `pnpm dev` 页面,同时前端还能调用本机的 AKTools API,推荐使用 **Vite 代理**(避免 CORS,且手机不需要直连 8080)。
84
+ ### AKShare
86
85
 
87
- 本项目已在 `vite.config.ts` 配置:
86
+ AKShare 基于 Python 的开源财经数据接口库,数据来源于东方财富等公开渠道。
88
87
 
89
- - dev server 监听 `0.0.0.0`
90
- - 代理转发:`/api` -> `http://127.0.0.1:8080`
88
+ - GitHub:[https://github.com/akfamily/akshare](https://github.com/akfamily/akshare)
91
89
 
92
- 启动步骤:
90
+ > **⚠️ 注意:** 存在反爬机制,频繁请求可能导致 IP 被封禁
93
91
 
94
- 1. 启动 AKTools(本机 8080):
92
+ #### 快速开始
95
93
 
96
- ```bash
97
- pnpm aktools
98
- ```
99
-
100
- 2. 启动前端 dev server(允许局域网访问):
101
-
102
- ```bash
103
- pnpm dev:lan
104
- ```
105
-
106
- 3. 查找本机局域网 IP(例如 `192.168.1.23`),手机浏览器访问:
107
-
108
- ```
109
- http://192.168.1.23:5173
110
- ```
111
-
112
- > 说明:前端请求路径保持 `VITE_API_PATH=/api/public/stock_zh_a_hist`,浏览器请求会先到 5173,再由 Vite 代理到本机 8080,因此通常不会遇到跨域问题。
113
-
114
- 如果你之前在 `.env` 写死了 `VITE_API_BASE_URL=http://127.0.0.1:8080`,手机端会把 `127.0.0.1` 解析成“手机自己”,从而导致 API 连接失败。此时请把 `VITE_API_BASE_URL` 留空(或删除该行),让前端走相对路径并交给 Vite 代理。
94
+ ```bash
95
+ # 安装
96
+ uv pip install aktools
115
97
 
116
- 方法二:创建自定义后端服务
117
- 除了使用 AKTools 自带的服务外,你也可以根据需要创建自定义的后端服务来处理数据。
98
+ # 启动服务
99
+ uv run python -m aktools
118
100
 
119
- #### 配置前端环境变量
101
+ # 或通过本项目脚本启动
102
+ pnpm aktools
103
+ ```
120
104
 
121
- 在项目根目录创建 `.env` 文件:
105
+ ### 数据接入配置
122
106
 
123
- ```
124
- VITE_API_BASE_URL=http://127.0.0.1:8080
125
- VITE_API_PATH=/api/public/stock_zh_a_hist
126
- ```
107
+ #### Vite 代理配置
127
108
 
128
- 然后在 [vite.config.ts](file:///d:/Code/kmap/kmap/vite.config.ts) 中确保环境变量被正确加载:
109
+ 本项目已配置双数据源代理:
129
110
 
130
111
  ```ts
131
- import { defineConfig } from 'vite'
132
- import vue from '@vitejs/plugin-vue'
133
-
134
- export default defineConfig({
135
- plugins: [vue()],
136
- define: {
137
- 'process.env': process.env,
112
+ // vite.config.ts
113
+ proxy: {
114
+ '/api/stock': { // BaoStock (端口 8000)
115
+ target: 'http://127.0.0.1:8000',
116
+ changeOrigin: true,
138
117
  },
139
- })
118
+ '/api/public': { // AKTools (端口 8080)
119
+ target: 'http://127.0.0.1:8080',
120
+ changeOrigin: true,
121
+ },
122
+ }
140
123
  ```
141
124
 
142
- ### 数据格式
125
+ #### 统一接口使用
143
126
 
144
- K 线数据需要包含以下字段:
127
+ ```vue
128
+ <script setup lang="ts">
129
+ import { fetchKLineData, type KLineDataSourceConfig } from '@/api/data'
145
130
 
146
- ```ts
147
- interface KLineDailyDongCaiResponse {
148
- 日期: string // 日期
149
- 股票代码: string // 股票代码
150
- 开盘: number // 开盘价
151
- 收盘: number // 收盘价
152
- 最高: number // 最高价
153
- 最低: number // 最低价
154
- 成交量: number // 成交量
155
- 成交额: number // 成交额
156
- 振幅: number // 振幅
157
- 涨跌幅: number // 涨跌幅
158
- 涨跌额: number // 涨跌额
159
- 换手率: number // 换手率
131
+ const DATA_SOURCE: 'baostock' | 'dongcai' = 'baostock'
132
+
133
+ const config: KLineDataSourceConfig = {
134
+ symbol: '601360', // 统一格式:纯代码
135
+ startDate: '2024-01-01', // 统一格式:YYYY-MM-DD
136
+ endDate: '2024-12-31',
137
+ period: 'daily',
138
+ adjust: 'qfq',
160
139
  }
140
+
141
+ const data = await fetchKLineData(DATA_SOURCE, config)
142
+ </script>
161
143
  ```
162
144
 
145
+ #### 股票代码格式
146
+
147
+ | 市场 | 格式 | 示例 |
148
+ |------|------|------|
149
+ | 沪市A股 | `sh.` | `sh.600000` |
150
+ | 深市A股 | `sz.` | `sz.000001` |
151
+
163
152
  ## 使用方法
164
153
 
165
154
  ### 1. 安装依赖
@@ -176,6 +165,8 @@ pnpm dev
176
165
 
177
166
  ### 3. 在组件中使用 K 线图
178
167
 
168
+ #### 方式一:使用 BaoStock 数据源(推荐)
169
+
179
170
  ```vue
180
171
  <template>
181
172
  <KLineChart
@@ -191,20 +182,57 @@ pnpm dev
191
182
  <script setup lang="ts">
192
183
  import { ref, onMounted } from 'vue'
193
184
  import KLineChart from '@/components/KLineChart.vue'
194
- import { getKlineDataDongCai } from '@/api/data/kLine'
195
- import { toKLineData, type KLineData } from '@/types/price'
185
+ import { getKlineDataBaoStock } from '@/api/data/baostock'
186
+ import type { KLineData } from '@/types/price'
187
+ import { cache } from '@/utils/cache'
196
188
 
197
189
  const klineData = ref<KLineData[]>([])
198
190
 
191
+ onMounted(async () => {
192
+ const params = {
193
+ symbol: 'sh.601360', // 三六零股票代码(带市场前缀)
194
+ start_date: '2024-01-01', // YYYY-MM-DD 格式
195
+ end_date: '2024-12-31',
196
+ period: 'daily' as const,
197
+ adjust: 'qfq' as const, // 前复权
198
+ }
199
+
200
+ // 缓存键
201
+ const cacheKey = `kline:${params.symbol}:${params.start_date}:${params.end_date}`
202
+
203
+ // 先尝试从缓存获取(1小时有效期)
204
+ const cached = cache.get<KLineData[]>(cacheKey)
205
+ if (cached) {
206
+ klineData.value = cached
207
+ return
208
+ }
209
+
210
+ // 从 API 获取
211
+ const data = await getKlineDataBaoStock(params)
212
+ klineData.value = data
213
+
214
+ // 存入缓存
215
+ cache.set(cacheKey, data)
216
+ })
217
+ </script>
218
+ ```
219
+
220
+ #### 方式二:使用 AKTools 数据源
221
+
222
+ ```vue
223
+ <script setup lang="ts">
224
+ import { getKlineDataDongCai } from '@/api/data/kLine'
225
+ import { toKLineData } from '@/types/price'
226
+
199
227
  onMounted(async () => {
200
228
  const raw = await getKlineDataDongCai({
201
- symbol: '601360', // 三六零股票代码
229
+ symbol: '601360',
202
230
  period: 'daily',
203
- start_date: '20250501',
231
+ start_date: '20250501', // YYYYMMDD 格式
204
232
  end_date: '20251230',
205
- adjust: 'qfq', // 前复权
233
+ adjust: 'qfq',
206
234
  })
207
- klineData.value = toKLineData(raw) // 转换并排序数据
235
+ klineData.value = toKLineData(raw)
208
236
  })
209
237
  </script>
210
238
  ```
@@ -220,13 +248,6 @@ onMounted(async () => {
220
248
  | showMA | MAFlags | { ma5: true, ma10: true, ma20: true } | 是否显示移动平均线 |
221
249
  | autoScrollToRight | boolean | true | 数据更新后是否自动滚动到最右侧 |
222
250
 
223
- ## 性能优化
224
-
225
- - 使用 `requestAnimationFrame` 优化渲染性能
226
- - 对于滚动等高频事件,使用 passive 模式提升响应性能
227
- - Canvas 绘制时使用设备像素比(devicePixelRatio)确保在高分屏上清晰显示
228
- - 通过路径重置(beginPath)避免路径污染
229
-
230
251
  ## 环境要求
231
252
 
232
253
  - Node.js: ^20.19.0 || >=22.12.0
@@ -250,25 +271,52 @@ pnpm preview
250
271
 
251
272
  ## API 接口说明
252
273
 
274
+ ### getKlineDataBaoStock
275
+
276
+ 从 BaoStock 获取 K 线数据(推荐)。
277
+
278
+ **参数:**
279
+
280
+ ```ts
281
+ interface BaoStockKLineRequest {
282
+ symbol: string // 股票代码,格式:sh.600000 或 sz.000001
283
+ start_date: string // 开始日期,格式:YYYY-MM-DD
284
+ end_date: string // 结束日期,格式:YYYY-MM-DD
285
+ period?: 'daily' | 'weekly' | 'monthly' | '5' | '15' | '30' | '60'
286
+ adjust?: 'qfq' | 'hfq' | 'none' // qfq: 前复权, hfq: 后复权, none: 不复权
287
+ timeout?: number // 超时时间(秒)
288
+ }
289
+ ```
290
+
291
+ **返回值:**
292
+ `Promise<KLineData[]>` - 已转换为标准格式的 K 线数据数组
293
+
294
+ **特性:**
295
+ - ✅ 支持 1 小时本地缓存
296
+ - ✅ 无反爬限制
297
+ - ✅ 数据自动按时间排序
298
+
253
299
  ### getKlineDataDongCai
254
300
 
255
- 获取 K 线数据的异步函数。
301
+ AKTools/东方财富获取 K 线数据。
302
+
303
+ > **⚠️ 注意:** 此接口依赖 AKShare,存在反爬机制,频繁请求可能导致 IP 被封禁。
256
304
 
257
305
  **参数:**
258
306
 
259
307
  ```ts
260
308
  interface KLineDailyDongCaiRequest {
261
- symbol: string // 股票代码
309
+ symbol: string // 股票代码
262
310
  period: 'daily' | 'weekly' | 'monthly' // 周期
263
- start_date: string // 开始日期,格式:YYYYMMDD
264
- end_date: string // 结束日期,格式:YYYYMMDD
265
- adjust?: 'qfq' | 'hfq' // 复权方式,qfq: 前复权, hfq: 后复权
266
- timeout?: number // 超时时间(秒)
311
+ start_date: string // 开始日期,格式:YYYYMMDD
312
+ end_date: string // 结束日期,格式:YYYYMMDD
313
+ adjust?: 'qfq' | 'hfq' // 复权方式,qfq: 前复权, hfq: 后复权
314
+ timeout?: number // 超时时间(秒)
267
315
  }
268
316
  ```
269
317
 
270
318
  **返回值:**
271
- `Promise<KLineDailyDongCaiResponse[]>` - K 线数据数组
319
+ `Promise<KLineDailyDongCaiResponse[]>` - K 线数据数组(需调用 `toKLineData()` 转换)
272
320
 
273
321
  ## 贡献
274
322
 
@@ -282,5 +330,8 @@ interface KLineDailyDongCaiRequest {
282
330
 
283
331
  - [Vue.js 官方文档](https://vuejs.org/guide/introduction.html)
284
332
  - [Vite 官方文档](https://vite.dev/guide/)
333
+ - [BaoStock 官方文档](http://baostock.com/)
285
334
  - [AKTools 官方文档](https://github.com/akfamily/aktools)
335
+ - [AKShare 官方文档](https://akshare.akfamily.xyz/)
286
336
  - [Canvas API MDN 文档](https://developer.mozilla.org/zh-CN/docs/Web/API/Canvas_API)
337
+ - [Vitest 官方文档](https://vitest.dev/)
package/dist/App.vue.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- declare const _default: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
1
+ declare const _default: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, HTMLDivElement>;
2
2
  export default _default;
@@ -0,0 +1,86 @@
1
+ import { KLineData } from '../../types/price';
2
+ interface BaoStockKDataRequest {
3
+ /** 股票代码,如 `sh.600000`(沪市)、`sz.000001`(深市) */
4
+ stock_code: string;
5
+ /** 开始日期,格式 `YYYY-MM-DD` */
6
+ start_date: string;
7
+ /** 结束日期,格式 `YYYY-MM-DD` */
8
+ end_date: string;
9
+ /** 数据频率:`d`=日K, `w`=周K, `m`=月K, `5`=5分钟, `15`=15分钟, `30`=30分钟, `60`=60分钟 */
10
+ frequency?: 'd' | 'w' | 'm' | '5' | '15' | '30' | '60';
11
+ /** 复权类型:`1`=后复权, `2`=前复权, `3`=不复权 */
12
+ adjustflag?: '1' | '2' | '3';
13
+ timeout?: number;
14
+ }
15
+ interface BaoStockKDataItem {
16
+ /** 交易日期 */
17
+ date: string;
18
+ /** 股票代码 */
19
+ code: string;
20
+ /** 开盘价 */
21
+ open: string;
22
+ /** 最高价 */
23
+ high: string;
24
+ /** 最低价 */
25
+ low: string;
26
+ /** 收盘价 */
27
+ close: string;
28
+ /** 昨收价 */
29
+ preclose: string;
30
+ /** 成交量(股) */
31
+ volume: string;
32
+ /** 成交额(元) */
33
+ amount: string;
34
+ /** 复权状态 */
35
+ adjustflag: string;
36
+ /** 换手率 */
37
+ turn: string;
38
+ /** 交易状态 */
39
+ tradestatus: string;
40
+ /** 涨跌幅(%) */
41
+ pctChg: string;
42
+ /** 是否ST股 */
43
+ isST: string;
44
+ }
45
+ interface BaoStockKDataResponse {
46
+ /** 请求是否成功 */
47
+ success: boolean;
48
+ /** 股票代码 */
49
+ stock_code: string;
50
+ /** 查询开始日期 */
51
+ start_date: string;
52
+ /** 查询结束日期 */
53
+ end_date: string;
54
+ /** 数据条数 */
55
+ data_count: number;
56
+ /** K线数据列表 */
57
+ data: BaoStockKDataItem[];
58
+ /** 错误代码(失败时返回) */
59
+ error_code?: string;
60
+ /** 错误信息(失败时返回) */
61
+ error_msg?: string;
62
+ }
63
+ /**
64
+ * 从 baostock 获取股票K线数据
65
+ * @param param 请求参数
66
+ * @returns Promise<KLineData[]>
67
+ */
68
+ export declare function getKlineDataBaoStock(param: {
69
+ symbol: string;
70
+ start_date: string;
71
+ end_date: string;
72
+ period?: 'daily' | 'weekly' | 'monthly' | '5' | '15' | '30' | '60';
73
+ adjust?: 'qfq' | 'hfq' | 'none';
74
+ timeout?: number;
75
+ }): Promise<KLineData[]>;
76
+ /**
77
+ * 快捷查询最近N天的数据
78
+ * @param param 请求参数
79
+ * @returns Promise<KLineData[]>
80
+ */
81
+ export declare function queryKlineDataBaoStock(param: {
82
+ symbol: string;
83
+ days?: number;
84
+ timeout?: number;
85
+ }): Promise<KLineData[]>;
86
+ export type { BaoStockKDataRequest, BaoStockKDataResponse, BaoStockKDataItem };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,26 @@
1
+ /**
2
+ * K线数据源统一入口
3
+ *
4
+ * 推荐使用方式:
5
+ * ```ts
6
+ * import { fetchKLineData, type KLineDataSourceConfig } from '@/api/data'
7
+ *
8
+ * const config: KLineDataSourceConfig = {
9
+ * symbol: '600000',
10
+ * startDate: '2024-01-01',
11
+ * endDate: '2024-12-31',
12
+ * period: 'daily',
13
+ * adjust: 'qfq',
14
+ * }
15
+ *
16
+ * // 使用 BaoStock(推荐)
17
+ * const data = await fetchKLineData('baostock', config)
18
+ *
19
+ * // 或使用东财
20
+ * const data = await fetchKLineData('dongcai', config)
21
+ * ```
22
+ */
23
+ export { fetchKLineData, DataSourceFactory } from './unified';
24
+ export type { KLineDataSourceConfig, DataSourceType, IKLineDataSource, } from './unified';
25
+ export { getKlineDataBaoStock, queryKlineDataBaoStock } from './baostock';
26
+ export { getKlineDataDongCai } from './kLine';
@@ -0,0 +1,33 @@
1
+ import { KLineData } from '../../types/price';
2
+ /**
3
+ * 统一的数据源配置
4
+ */
5
+ export interface KLineDataSourceConfig {
6
+ /** 股票代码(统一格式,如 600000、000001,不带市场前缀) */
7
+ symbol: string;
8
+ /** 开始日期(YYYY-MM-DD) */
9
+ startDate: string;
10
+ /** 结束日期(YYYY-MM-DD) */
11
+ endDate: string;
12
+ /** 数据周期 */
13
+ period: 'daily' | 'weekly' | 'monthly' | '5min' | '15min' | '30min' | '60min';
14
+ /** 复权方式 */
15
+ adjust: 'qfq' | 'hfq' | 'none';
16
+ /** 超时时间(秒) */
17
+ timeout?: number;
18
+ }
19
+ /**
20
+ * K线数据源统一接口
21
+ * 所有数据源实现此接口,调用方无感知切换
22
+ */
23
+ export interface IKLineDataSource {
24
+ readonly name: string;
25
+ fetchKLineData(config: KLineDataSourceConfig): Promise<KLineData[]>;
26
+ }
27
+ /**
28
+ * 数据源工厂
29
+ */
30
+ export type DataSourceType = 'baostock' | 'dongcai';
31
+ export interface IDataSourceFactory {
32
+ create(type: DataSourceType): IKLineDataSource;
33
+ }
@@ -0,0 +1,33 @@
1
+ import { KLineData } from '../../types/price';
2
+ import { KLineDataSourceConfig, IKLineDataSource, DataSourceType } from './types';
3
+ /**
4
+ * 数据源工厂
5
+ */
6
+ declare class DataSourceFactory {
7
+ private static instances;
8
+ static create(type: DataSourceType): IKLineDataSource;
9
+ }
10
+ /**
11
+ * 获取 K 线数据(统一入口)
12
+ * @param type 数据源类型
13
+ * @param config 统一配置
14
+ * @returns Promise<KLineData[]>
15
+ *
16
+ * 使用示例:
17
+ * ```ts
18
+ * // 使用 BaoStock
19
+ * const data = await fetchKLineData('baostock', {
20
+ * symbol: '600000',
21
+ * startDate: '2024-01-01',
22
+ * endDate: '2024-12-31',
23
+ * period: 'daily',
24
+ * adjust: 'qfq',
25
+ * })
26
+ *
27
+ * // 切换东财只需改第一个参数
28
+ * const data = await fetchKLineData('dongcai', { ... })
29
+ * ```
30
+ */
31
+ export declare function fetchKLineData(type: DataSourceType, config: KLineDataSourceConfig): Promise<KLineData[]>;
32
+ export { DataSourceFactory };
33
+ export type { KLineDataSourceConfig, DataSourceType, IKLineDataSource };
@@ -0,0 +1,17 @@
1
+ export interface Indicator {
2
+ id: string;
3
+ label: string;
4
+ name: string;
5
+ }
6
+ type __VLS_Props = {
7
+ /** 当前选中的指标列表 */
8
+ activeIndicators?: string[];
9
+ };
10
+ declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
11
+ toggle: (indicatorId: string, active: boolean) => any;
12
+ }, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
13
+ onToggle?: ((indicatorId: string, active: boolean) => any) | undefined;
14
+ }>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {
15
+ scrollContainerRef: HTMLDivElement;
16
+ }, HTMLDivElement>;
17
+ export default _default;
@@ -3,6 +3,8 @@ type MAFlags = {
3
3
  ma5?: boolean;
4
4
  ma10?: boolean;
5
5
  ma20?: boolean;
6
+ ma30?: boolean;
7
+ ma60?: boolean;
6
8
  };
7
9
  type __VLS_Props = {
8
10
  data: KLineData[];
@@ -17,6 +19,8 @@ type __VLS_Props = {
17
19
  rightAxisWidth?: number;
18
20
  /** 底部时间轴高度 */
19
21
  bottomAxisHeight?: number;
22
+ /** 价格标签额外宽度(用于显示涨跌幅,默认 60px) */
23
+ priceLabelWidth?: number;
20
24
  /** Pane 高度比例(主/副),默认 [0.85, 0.15] */
21
25
  paneRatios?: [number, number];
22
26
  };
@@ -34,13 +38,12 @@ declare const _default: import('vue').DefineComponent<__VLS_Props, {
34
38
  bottomAxisHeight: number;
35
39
  minKWidth: number;
36
40
  maxKWidth: number;
41
+ priceLabelWidth: number;
37
42
  autoScrollToRight: boolean;
38
43
  paneRatios: [number, number];
39
44
  }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {
40
45
  containerRef: HTMLDivElement;
41
46
  canvasLayerRef: HTMLDivElement;
42
- plotCanvasRef: HTMLCanvasElement;
43
- yAxisCanvasRef: HTMLCanvasElement;
44
47
  xAxisCanvasRef: HTMLCanvasElement;
45
- }, any>;
48
+ }, HTMLDivElement>;
46
49
  export default _default;