@363045841yyt/klinechart 0.1.0 → 0.1.1
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 +217 -20
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,48 +1,245 @@
|
|
|
1
|
-
# kmap
|
|
1
|
+
# kmap - 金融图表绘制库
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
这是一个基于 Vue 3 和 Canvas 的金融图表绘制库,专注于提供高性能的 K 线图展示功能。该库支持横向滚动、移动平均线(MA)显示以及从多种数据源(包括 AKTools)获取金融数据。
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## 功能特性
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
- 📊 **K 线图绘制**:使用 Canvas 实现高性能的 K 线图绘制
|
|
8
|
+
- 📈 **移动平均线**:支持 MA5、MA10、MA20 等多种移动平均线显示
|
|
9
|
+
- ↔️ **横向滚动**:支持大量历史数据的横向滚动浏览
|
|
10
|
+
- 🎨 **深色模式**:自动适配系统深色模式
|
|
11
|
+
- 📱 **响应式设计**:适配不同屏幕尺寸
|
|
12
|
+
- ⚡ **高性能**:使用 requestAnimationFrame 优化渲染性能
|
|
8
13
|
|
|
9
|
-
##
|
|
14
|
+
## 技术栈
|
|
10
15
|
|
|
11
|
-
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
-
|
|
15
|
-
|
|
16
|
-
- [Turn on Custom Object Formatter in Firefox DevTools](https://fxdx.dev/firefox-devtools-custom-object-formatters/)
|
|
16
|
+
- [Vue 3](https://vuejs.org/) - 渐进式 JavaScript 框架
|
|
17
|
+
- [Vite](https://vite.dev/) - 下一代前端构建工具
|
|
18
|
+
- [TypeScript](https://www.typescriptlang.org/) - JavaScript 类型检查
|
|
19
|
+
- [Canvas API](https://developer.mozilla.org/zh-CN/docs/Web/API/Canvas_API) - 图形绘制
|
|
20
|
+
- [AKTools](https://github.com/akfamily/aktools) - 开源金融数据接口库
|
|
17
21
|
|
|
18
|
-
##
|
|
22
|
+
## 项目结构
|
|
19
23
|
|
|
20
|
-
|
|
24
|
+
```
|
|
25
|
+
src/
|
|
26
|
+
├── api/ # API 接口定义
|
|
27
|
+
│ └── data/
|
|
28
|
+
│ └── kLine.ts # K 线数据接口
|
|
29
|
+
├── components/ # 组件
|
|
30
|
+
│ └── KLineChart.vue # K 线图主组件
|
|
31
|
+
├── types/ # 类型定义
|
|
32
|
+
│ ├── kLine.ts # K 线类型定义
|
|
33
|
+
│ └── price.ts # 价格类型定义
|
|
34
|
+
├── utils/ # 工具函数
|
|
35
|
+
│ ├── draw/ # 绘制工具
|
|
36
|
+
│ │ ├── kLine.ts # K 线绘制
|
|
37
|
+
│ │ └── MA.ts # 移动平均线绘制
|
|
38
|
+
│ ├── mock/ # 模拟数据生成
|
|
39
|
+
│ ├── logger.ts # 日志工具
|
|
40
|
+
│ └── priceToY.ts # 价格转 Y 坐标
|
|
41
|
+
├── stores/ # 状态管理 (Pinia)
|
|
42
|
+
└── assets/ # 静态资源
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## 数据接入
|
|
46
|
+
|
|
47
|
+
### AKTools 数据接入
|
|
21
48
|
|
|
22
|
-
|
|
49
|
+
AKTools 是一个开源的金融数据接口库,可以免费获取股票、期货、期权等金融产品的历史数据。
|
|
23
50
|
|
|
24
|
-
|
|
51
|
+
#### 安装 AKTools
|
|
25
52
|
|
|
26
|
-
|
|
53
|
+
使用 uv pip 安装:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
# 安装 uv(如果尚未安装)
|
|
57
|
+
pip install uv
|
|
58
|
+
|
|
59
|
+
# 使用 uv 安装 AKTools
|
|
60
|
+
uv pip install aktools
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
或者直接使用 pip 安装:
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
pip install aktools
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
#### 启动 AKTools 数据服务
|
|
70
|
+
|
|
71
|
+
方法一:使用 uv 直接运行 AKTools
|
|
72
|
+
```bash
|
|
73
|
+
uv run python -m aktools
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
方法二:创建自定义后端服务
|
|
77
|
+
除了使用 AKTools 自带的服务外,你也可以根据需要创建自定义的后端服务来处理数据。
|
|
78
|
+
|
|
79
|
+
#### 配置前端环境变量
|
|
80
|
+
|
|
81
|
+
在项目根目录创建 `.env` 文件:
|
|
82
|
+
|
|
83
|
+
```
|
|
84
|
+
VITE_API_BASE_URL=http://127.0.0.1:8080
|
|
85
|
+
VITE_API_PATH=/api/public/stock_zh_a_hist
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
然后在 [vite.config.ts](file:///d:/Code/kmap/kmap/vite.config.ts) 中确保环境变量被正确加载:
|
|
89
|
+
|
|
90
|
+
```ts
|
|
91
|
+
import { defineConfig } from 'vite'
|
|
92
|
+
import vue from '@vitejs/plugin-vue'
|
|
93
|
+
|
|
94
|
+
export default defineConfig({
|
|
95
|
+
plugins: [vue()],
|
|
96
|
+
define: {
|
|
97
|
+
'process.env': process.env
|
|
98
|
+
}
|
|
99
|
+
})
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### 数据格式
|
|
103
|
+
|
|
104
|
+
K 线数据需要包含以下字段:
|
|
105
|
+
|
|
106
|
+
```ts
|
|
107
|
+
interface KLineDailyDongCaiResponse {
|
|
108
|
+
日期: string // 日期
|
|
109
|
+
股票代码: string // 股票代码
|
|
110
|
+
开盘: number // 开盘价
|
|
111
|
+
收盘: number // 收盘价
|
|
112
|
+
最高: number // 最高价
|
|
113
|
+
最低: number // 最低价
|
|
114
|
+
成交量: number // 成交量
|
|
115
|
+
成交额: number // 成交额
|
|
116
|
+
振幅: number // 振幅
|
|
117
|
+
涨跌幅: number // 涨跌幅
|
|
118
|
+
涨跌额: number // 涨跌额
|
|
119
|
+
换手率: number // 换手率
|
|
120
|
+
}
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## 使用方法
|
|
124
|
+
|
|
125
|
+
### 1. 安装依赖
|
|
27
126
|
|
|
28
127
|
```sh
|
|
29
128
|
pnpm install
|
|
30
129
|
```
|
|
31
130
|
|
|
32
|
-
###
|
|
131
|
+
### 2. 启动开发服务器
|
|
33
132
|
|
|
34
133
|
```sh
|
|
35
134
|
pnpm dev
|
|
36
135
|
```
|
|
37
136
|
|
|
38
|
-
###
|
|
137
|
+
### 3. 在组件中使用 K 线图
|
|
138
|
+
|
|
139
|
+
```vue
|
|
140
|
+
<template>
|
|
141
|
+
<KLineChart
|
|
142
|
+
:data="klineData"
|
|
143
|
+
:kWidth="10"
|
|
144
|
+
:kGap="2"
|
|
145
|
+
:yPaddingPx="60"
|
|
146
|
+
:showMA="{ ma5: true, ma10: true, ma20: true }"
|
|
147
|
+
:autoScrollToRight="true"
|
|
148
|
+
/>
|
|
149
|
+
</template>
|
|
150
|
+
|
|
151
|
+
<script setup lang="ts">
|
|
152
|
+
import { ref, onMounted } from 'vue'
|
|
153
|
+
import KLineChart from '@/components/KLineChart.vue'
|
|
154
|
+
import { getKlineDataDongCai } from '@/api/data/kLine'
|
|
155
|
+
import { toKLineData, type KLineData } from '@/types/price'
|
|
156
|
+
|
|
157
|
+
const klineData = ref<KLineData[]>([])
|
|
158
|
+
|
|
159
|
+
onMounted(async () => {
|
|
160
|
+
const raw = await getKlineDataDongCai({
|
|
161
|
+
symbol: '601360', // 三六零股票代码
|
|
162
|
+
period: 'daily',
|
|
163
|
+
start_date: '20250501',
|
|
164
|
+
end_date: '20251230',
|
|
165
|
+
adjust: 'qfq', // 前复权
|
|
166
|
+
})
|
|
167
|
+
klineData.value = toKLineData(raw) // 转换并排序数据
|
|
168
|
+
})
|
|
169
|
+
</script>
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### 组件属性
|
|
173
|
+
|
|
174
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
175
|
+
|------|------|--------|------|
|
|
176
|
+
| data | KLineData[] | [] | K 线数据数组 |
|
|
177
|
+
| kWidth | number | 10 | K 线实体宽度 |
|
|
178
|
+
| kGap | number | 2 | K 线间距 |
|
|
179
|
+
| yPaddingPx | number | 60 | Y 轴上下留白像素 |
|
|
180
|
+
| showMA | MAFlags | { ma5: true, ma10: true, ma20: true } | 是否显示移动平均线 |
|
|
181
|
+
| autoScrollToRight | boolean | true | 数据更新后是否自动滚动到最右侧 |
|
|
182
|
+
|
|
183
|
+
## 性能优化
|
|
184
|
+
|
|
185
|
+
- 使用 `requestAnimationFrame` 优化渲染性能
|
|
186
|
+
- 对于滚动等高频事件,使用 passive 模式提升响应性能
|
|
187
|
+
- Canvas 绘制时使用设备像素比(devicePixelRatio)确保在高分屏上清晰显示
|
|
188
|
+
- 通过路径重置(beginPath)避免路径污染
|
|
189
|
+
|
|
190
|
+
## 环境要求
|
|
191
|
+
|
|
192
|
+
- Node.js: ^20.19.0 || >=22.12.0
|
|
193
|
+
- pnpm: 包管理器
|
|
194
|
+
- Python: 用于运行 AKTools 服务(可选)
|
|
195
|
+
|
|
196
|
+
## 构建与部署
|
|
197
|
+
|
|
198
|
+
### 生产环境构建
|
|
39
199
|
|
|
40
200
|
```sh
|
|
41
201
|
pnpm build
|
|
42
202
|
```
|
|
43
203
|
|
|
44
|
-
###
|
|
204
|
+
### 预览生产包
|
|
45
205
|
|
|
46
206
|
```sh
|
|
47
|
-
pnpm
|
|
207
|
+
pnpm preview
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
## API 接口说明
|
|
211
|
+
|
|
212
|
+
### getKlineDataDongCai
|
|
213
|
+
|
|
214
|
+
获取 K 线数据的异步函数。
|
|
215
|
+
|
|
216
|
+
**参数:**
|
|
217
|
+
|
|
218
|
+
```ts
|
|
219
|
+
interface KLineDailyDongCaiRequest {
|
|
220
|
+
symbol: string // 股票代码
|
|
221
|
+
period: 'daily' | 'weekly' | 'monthly' // 周期
|
|
222
|
+
start_date: string // 开始日期,格式:YYYYMMDD
|
|
223
|
+
end_date: string // 结束日期,格式:YYYYMMDD
|
|
224
|
+
adjust?: 'qfq' | 'hfq' // 复权方式,qfq: 前复权, hfq: 后复权
|
|
225
|
+
timeout?: number // 超时时间(秒)
|
|
226
|
+
}
|
|
48
227
|
```
|
|
228
|
+
|
|
229
|
+
**返回值:**
|
|
230
|
+
`Promise<KLineDailyDongCaiResponse[]>` - K 线数据数组
|
|
231
|
+
|
|
232
|
+
## 贡献
|
|
233
|
+
|
|
234
|
+
欢迎提交 Issue 和 Pull Request 来改进这个项目。
|
|
235
|
+
|
|
236
|
+
## 许可证
|
|
237
|
+
|
|
238
|
+
本项目采用 MIT 许可证,详情请见 [LICENSE](./LICENSE) 文件。
|
|
239
|
+
|
|
240
|
+
## 相关链接
|
|
241
|
+
|
|
242
|
+
- [Vue.js 官方文档](https://vuejs.org/guide/introduction.html)
|
|
243
|
+
- [Vite 官方文档](https://vite.dev/guide/)
|
|
244
|
+
- [AKTools 官方文档](https://github.com/akfamily/aktools)
|
|
245
|
+
- [Canvas API MDN 文档](https://developer.mozilla.org/zh-CN/docs/Web/API/Canvas_API)
|