@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.
- package/README.md +168 -117
- package/dist/App.vue.d.ts +1 -1
- package/dist/api/data/baostock.d.ts +86 -0
- package/dist/api/data/baostock.test.d.ts +1 -0
- package/dist/api/data/index.d.ts +26 -0
- package/dist/api/data/types.d.ts +33 -0
- package/dist/api/data/unified.d.ts +33 -0
- package/dist/components/IndicatorSelector.vue.d.ts +17 -0
- package/dist/components/KLineChart.vue.d.ts +6 -3
- package/dist/core/chart.d.ts +105 -83
- package/dist/core/controller/interaction.d.ts +67 -5
- package/dist/core/draw/pixelAlign.d.ts +114 -0
- package/dist/core/layout/pane.d.ts +29 -22
- package/dist/core/paneRenderer.d.ts +65 -0
- package/dist/core/renderers/candle.d.ts +2 -2
- package/dist/core/renderers/crosshair.d.ts +12 -3
- package/dist/core/renderers/crosshairLabels.d.ts +19 -0
- package/dist/core/renderers/extremaMarkers.d.ts +2 -4
- package/dist/core/renderers/globalBorders.d.ts +18 -0
- package/dist/core/renderers/grid.d.ts +2 -2
- package/dist/core/renderers/gridLines.d.ts +2 -3
- package/dist/core/renderers/lastPrice.d.ts +1 -1
- package/dist/core/renderers/ma.d.ts +6 -2
- package/dist/core/renderers/maLegend.d.ts +10 -0
- package/dist/core/renderers/paneBorder.d.ts +12 -0
- package/dist/core/renderers/paneSeparator.d.ts +8 -0
- package/dist/core/renderers/paneTitle.d.ts +7 -0
- package/dist/core/renderers/subVolume.d.ts +5 -0
- package/dist/core/renderers/timeAxis.d.ts +12 -0
- package/dist/core/renderers/yAxis.d.ts +7 -2
- package/dist/core/theme/colors.d.ts +128 -0
- package/dist/index.cjs +1 -1
- package/dist/index.js +1019 -653
- package/dist/klinechart.css +1 -1
- package/dist/utils/cache.d.ts +33 -0
- package/dist/utils/dateFormat.d.ts +15 -2
- package/dist/utils/kLineDraw/MA.d.ts +7 -3
- package/dist/utils/kLineDraw/axis.d.ts +10 -0
- package/dist/utils/kLineDraw/kLine.d.ts +1 -0
- package/dist/utils/kline/format.d.ts +3 -3
- package/dist/utils/logger.d.ts +1 -0
- package/package.json +59 -57
- package/dist/composables/useKLineInteraction.d.ts +0 -50
- package/dist/composables/useKLineRenderer.d.ts +0 -49
- package/dist/stores/counter.d.ts +0 -13
- package/dist/utils/kLineDraw/pixelAlign.d.ts +0 -48
package/README.md
CHANGED
|
@@ -1,14 +1,19 @@
|
|
|
1
1
|
# kmap - 金融图表绘制库
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[English](README_EN.md) | 简体中文
|
|
4
|
+
|
|
5
|
+
这是一个基于 Vue 3 和 Canvas 的金融图表绘制库,专注于提供高性能的 K 线图展示功能。该库支持横向滚动、移动平均线(MA)显示以及从多种数据源(包括 **BaoStock**、AKTools)获取金融数据。
|
|
6
|
+
|
|
7
|
+

|
|
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
|
-
- [
|
|
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
|
-
│
|
|
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
|
-
│ ├──
|
|
36
|
-
│
|
|
37
|
-
│
|
|
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
|
-
|
|
61
|
+
本项目支持多种数据源,通过统一接口实现无缝切换。
|
|
48
62
|
|
|
49
|
-
|
|
63
|
+
| 数据源 | 稳定性 | 反爬限制 | 推荐场景 |
|
|
64
|
+
|--------|--------|----------|----------|
|
|
65
|
+
| [BaoStock](http://baostock.com/) | ⭐⭐⭐ 高 | 无 | 生产环境(推荐) |
|
|
66
|
+
| [AKShare](https://github.com/akfamily/akshare) | ⭐⭐ 中 | 有 | 开发测试 |
|
|
50
67
|
|
|
51
|
-
|
|
68
|
+
### BaoStock(推荐)
|
|
52
69
|
|
|
53
|
-
|
|
70
|
+
BaoStock 是免费开源的 Python 证券数据接口,提供稳定可靠的金融数据服务。
|
|
54
71
|
|
|
55
|
-
|
|
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
|
-
|
|
60
|
-
uv pip install aktools
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
或者直接使用 pip 安装:
|
|
74
|
+
#### 快速开始
|
|
64
75
|
|
|
65
76
|
```bash
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
#### 启动 AKTools 数据服务
|
|
70
|
-
|
|
71
|
-
方法一:使用 uv 直接运行 AKTools
|
|
77
|
+
# 安装
|
|
78
|
+
uv pip install baostock
|
|
72
79
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
方法一(推荐):通过本项目脚本启动(会自动切换到上级目录的 `aktoolshttp/`)
|
|
78
|
-
|
|
79
|
-
```bash
|
|
80
|
-
pnpm aktools
|
|
80
|
+
# 启动服务(需自行实现服务层或参考 BaoStock 文档)
|
|
81
|
+
python your_baostock_server.py
|
|
81
82
|
```
|
|
82
83
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
如果你希望用手机浏览器访问本机正在运行的 `pnpm dev` 页面,同时前端还能调用本机的 AKTools API,推荐使用 **Vite 代理**(避免 CORS,且手机不需要直连 8080)。
|
|
84
|
+
### AKShare
|
|
86
85
|
|
|
87
|
-
|
|
86
|
+
AKShare 基于 Python 的开源财经数据接口库,数据来源于东方财富等公开渠道。
|
|
88
87
|
|
|
89
|
-
-
|
|
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
|
-
|
|
92
|
+
#### 快速开始
|
|
95
93
|
|
|
96
|
-
|
|
97
|
-
|
|
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
|
-
|
|
98
|
+
# 启动服务
|
|
99
|
+
uv run python -m aktools
|
|
118
100
|
|
|
119
|
-
|
|
101
|
+
# 或通过本项目脚本启动
|
|
102
|
+
pnpm aktools
|
|
103
|
+
```
|
|
120
104
|
|
|
121
|
-
|
|
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
|
-
|
|
109
|
+
本项目已配置双数据源代理:
|
|
129
110
|
|
|
130
111
|
```ts
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
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
|
-
|
|
127
|
+
```vue
|
|
128
|
+
<script setup lang="ts">
|
|
129
|
+
import { fetchKLineData, type KLineDataSourceConfig } from '@/api/data'
|
|
145
130
|
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
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 {
|
|
195
|
-
import {
|
|
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
|
-
|
|
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
|
|
264
|
-
end_date: string
|
|
265
|
-
adjust?: '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, {},
|
|
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
|
-
},
|
|
48
|
+
}, HTMLDivElement>;
|
|
46
49
|
export default _default;
|