@363045841yyt/klinechart 0.1.4 → 0.2.0
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 +142 -243
- package/dist/components/IndicatorParams.vue.d.ts +28 -0
- package/dist/components/IndicatorSelector.vue.d.ts +10 -0
- package/dist/components/KLineChart.vue.d.ts +14 -17
- package/dist/components/MarkerTooltip.vue.d.ts +10 -0
- package/dist/core/chart.d.ts +84 -47
- package/dist/core/controller/interaction.d.ts +56 -18
- package/dist/core/layout/pane.d.ts +2 -0
- package/dist/core/marker/registry.d.ts +174 -0
- package/dist/core/paneRenderer.d.ts +7 -40
- package/dist/core/renderers/Indicator/boll.d.ts +28 -0
- package/dist/core/renderers/Indicator/bollLegend.d.ts +16 -0
- package/dist/core/renderers/Indicator/cci.d.ts +34 -0
- package/dist/core/renderers/Indicator/fastk.d.ts +34 -0
- package/dist/core/renderers/Indicator/index.d.ts +31 -0
- package/dist/core/renderers/Indicator/kst.d.ts +49 -0
- package/dist/core/renderers/Indicator/ma.d.ts +12 -0
- package/dist/core/renderers/Indicator/maLegend.d.ts +9 -0
- package/dist/core/renderers/Indicator/macd.d.ts +46 -0
- package/dist/core/renderers/Indicator/macdLegend.d.ts +10 -0
- package/dist/core/renderers/Indicator/mom.d.ts +34 -0
- package/dist/core/renderers/Indicator/rsi.d.ts +42 -0
- package/dist/core/renderers/Indicator/stoch.d.ts +43 -0
- package/dist/core/renderers/Indicator/wmsr.d.ts +34 -0
- package/dist/core/renderers/candle.d.ts +17 -4
- package/dist/core/renderers/crosshair.d.ts +13 -20
- package/dist/core/renderers/customMarkers.d.ts +6 -0
- package/dist/core/renderers/extremaMarkers.d.ts +3 -4
- package/dist/core/renderers/globalBorders.d.ts +8 -13
- package/dist/core/renderers/gridLines.d.ts +4 -3
- package/dist/core/renderers/lastPrice.d.ts +3 -3
- package/dist/core/renderers/paneTitle.d.ts +37 -10
- package/dist/core/renderers/subVolume.d.ts +7 -3
- package/dist/core/renderers/timeAxis.d.ts +9 -22
- package/dist/core/renderers/yAxis.d.ts +5 -12
- package/dist/core/scale/priceScale.d.ts +1 -0
- package/dist/core/theme/colors.d.ts +80 -0
- package/dist/core/utils/klineConfig.d.ts +28 -0
- package/dist/core/utils/tickCount.d.ts +7 -0
- package/dist/core/viewport/viewport.d.ts +5 -5
- package/dist/index.cjs +16 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +10540 -1064
- package/dist/klinechart.css +1 -1
- package/dist/plugin/ConfigManager.d.ts +31 -0
- package/dist/plugin/EventBus.d.ts +34 -0
- package/dist/plugin/HookSystem.d.ts +28 -0
- package/dist/plugin/PluginHost.d.ts +47 -0
- package/dist/plugin/PluginRegistry.d.ts +40 -0
- package/dist/plugin/index.d.ts +11 -0
- package/dist/plugin/rendererPluginManager.d.ts +73 -0
- package/dist/plugin/types.d.ts +185 -0
- package/dist/semantic/controller.d.ts +29 -0
- package/dist/semantic/drawShape.d.ts +14 -0
- package/dist/semantic/index.d.ts +8 -0
- package/dist/semantic/schema.json.d.ts +259 -0
- package/dist/semantic/types.d.ts +185 -0
- package/dist/semantic/validator.d.ts +42 -0
- package/dist/types/volumePrice.d.ts +26 -0
- package/dist/utils/kLineDraw/MA.d.ts +5 -5
- package/dist/utils/logger.d.ts +1 -0
- package/dist/utils/volumePrice.d.ts +54 -0
- package/package.json +11 -10
- package/dist/core/renderers/crosshairLabels.d.ts +0 -36
- package/dist/core/renderers/grid.d.ts +0 -6
- package/dist/core/renderers/ma.d.ts +0 -15
- package/dist/core/renderers/maLegend.d.ts +0 -19
- package/dist/core/renderers/paneBorder.d.ts +0 -26
- package/dist/core/renderers/paneSeparator.d.ts +0 -18
package/README.md
CHANGED
|
@@ -2,170 +2,97 @@
|
|
|
2
2
|
|
|
3
3
|
[English](README_EN.md) | 简体中文
|
|
4
4
|
|
|
5
|
-
这是一个基于 Vue
|
|
5
|
+
这是一个基于 Canvas 的金融图表绘制库,提供 Vue 组件封装。专注于高性能 K 线图渲染,支持**语义化 JSON 配置**,便于 AI Agent 直接控制图表渲染。特性包括横向滚动、多种技术指标(MA/BOLL/MACD/RSI 等)、自定义标记标注、多数据源支持(BaoStock、东方财富)。
|
|
6
|
+
|
|
7
|
+

|
|
6
8
|
|
|
7
|
-

|
|
8
9
|
|
|
9
10
|
## 功能特性
|
|
10
11
|
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
14
|
-
-
|
|
15
|
-
-
|
|
16
|
-
-
|
|
17
|
-
-
|
|
12
|
+
- **基于 Canvas**:使用 Canvas 实现高性能的 K 线图绘制
|
|
13
|
+
- **响应式设计**:适配不同屏幕尺寸,支持所有设备像素比(DPR),不同 DPR 下绘制清晰
|
|
14
|
+
- **影线处理**:统一 DPR 坐标计算,底层保证影线在不同 DPR 屏幕下绝对居中并绘制清晰
|
|
15
|
+
- **像素对齐**:统一坐标源,在物理坐标层面实现像素对齐,消除亚像素渲染,确保线条锐利清晰
|
|
16
|
+
- **框架无关**:核心逻辑完全独立,不依赖特定框架
|
|
17
|
+
- **插件化架构**:渲染器插件支持动态注册、配置和生命周期管理
|
|
18
|
+
- **量价关系标注**:自动识别并标注量价齐升、量价背离、量增价跌、量缩价跌四种形态
|
|
19
|
+
|
|
20
|
+
### Agent 语义化控制
|
|
21
|
+
|
|
22
|
+
- **JSON 配置驱动**:通过 `semanticConfig` prop 接收 JSON 配置,AI Agent 可直接控制图表渲染
|
|
23
|
+
- **自定义标记**:支持 6 种预设形状(arrow_up、arrow_down、flag、circle、rectangle、diamond),标记大小随 K 线缩放自适应
|
|
24
|
+
- **完整指标支持**:主图 MA/BOLL,副图 MACD/RSI/CCI/STOCH 等
|
|
25
|
+
- **安全校验**:JSON Schema 校验、原型污染防护、颜色 XSS 防护、输入边界检查
|
|
26
|
+
- **日期友好格式**:使用 `YYYY-MM-DD` 自然日期格式,便于 Agent 输出
|
|
18
27
|
|
|
19
28
|
## 技术栈
|
|
20
29
|
|
|
21
30
|
- [Vue 3](https://vuejs.org/) - 渐进式 JavaScript 框架
|
|
22
|
-
- [Vite](https://vite.dev/) -
|
|
23
|
-
- [TypeScript](https://www.typescriptlang.org/)
|
|
24
|
-
- [Canvas API](https://developer.mozilla.org/zh-CN/docs/Web/API/Canvas_API)
|
|
25
|
-
- [BaoStock](http://baostock.com/) - 开源金融数据接口(推荐)
|
|
26
|
-
- [AKTools](https://github.com/akfamily/aktools) - 开源金融数据接口库(存在反爬限制)
|
|
31
|
+
- [Rolldown Vite](https://cn.vite.dev/guide/rolldown) - 下一代前端构建工具,极速构建
|
|
32
|
+
- [TypeScript](https://www.typescriptlang.org/)
|
|
33
|
+
- [Canvas API](https://developer.mozilla.org/zh-CN/docs/Web/API/Canvas_API)
|
|
27
34
|
- [Vitest](https://vitest.dev/) - 单元测试框架
|
|
28
35
|
|
|
29
36
|
## 项目结构
|
|
30
37
|
|
|
31
38
|
```
|
|
32
39
|
src/
|
|
33
|
-
├── api/
|
|
34
|
-
│ └── data/
|
|
35
|
-
|
|
36
|
-
│
|
|
37
|
-
├──
|
|
38
|
-
│ └──
|
|
39
|
-
├── core/
|
|
40
|
-
│ ├── chart.ts
|
|
41
|
-
│ ├──
|
|
42
|
-
│ │
|
|
43
|
-
│ ├──
|
|
44
|
-
│ │ ├──
|
|
45
|
-
│ │
|
|
46
|
-
│ ├──
|
|
47
|
-
│ └──
|
|
48
|
-
├──
|
|
49
|
-
│ ├──
|
|
50
|
-
│ └──
|
|
51
|
-
├──
|
|
52
|
-
│ ├──
|
|
53
|
-
│ ├──
|
|
54
|
-
│
|
|
55
|
-
├──
|
|
56
|
-
└──
|
|
40
|
+
├── api/ # API 接口定义
|
|
41
|
+
│ └── data/ # 数据源接口
|
|
42
|
+
├── components/ # Vue 组件
|
|
43
|
+
│ ├── KLineChart.vue # K 线图主组件
|
|
44
|
+
│ ├── IndicatorSelector.vue # 指标选择器
|
|
45
|
+
│ └── IndicatorParams.vue # 指标参数编辑
|
|
46
|
+
├── core/ # 核心渲染引擎
|
|
47
|
+
│ ├── chart.ts # 图表控制器
|
|
48
|
+
│ ├── renderers/ # 渲染器插件
|
|
49
|
+
│ │ ├── candle.ts # K 线渲染器
|
|
50
|
+
│ │ ├── ma.ts # MA 均线渲染器
|
|
51
|
+
│ │ ├── boll.ts # BOLL 布林带渲染器
|
|
52
|
+
│ │ ├── macd.ts # MACD 指标渲染器
|
|
53
|
+
│ │ ├── volume.ts # 成交量渲染器
|
|
54
|
+
│ │ └── ... # 其他渲染器
|
|
55
|
+
│ ├── theme/ # 主题配置
|
|
56
|
+
│ ├── marker/ # 标记点系统
|
|
57
|
+
│ └── utils/ # 核心工具
|
|
58
|
+
├── semantic/ # 语义化配置模块(Agent 控制)
|
|
59
|
+
│ ├── types.ts # 类型定义
|
|
60
|
+
│ ├── schema.json # JSON Schema
|
|
61
|
+
│ ├── validator.ts # 校验器
|
|
62
|
+
│ ├── controller.ts # 控制器
|
|
63
|
+
│ └── drawShape.ts # 形状绘制
|
|
64
|
+
├── plugin/ # 插件系统
|
|
65
|
+
│ ├── types.ts # 类型定义
|
|
66
|
+
│ ├── PluginHost.ts # 插件宿主
|
|
67
|
+
│ ├── EventBus.ts # 事件总线
|
|
68
|
+
│ ├── HookSystem.ts # 钩子系统
|
|
69
|
+
│ └── rendererPluginManager.ts # 渲染器管理
|
|
70
|
+
├── types/ # 类型定义
|
|
71
|
+
└── utils/ # 工具函数
|
|
57
72
|
```
|
|
58
73
|
|
|
59
74
|
## 数据源
|
|
60
75
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
| 数据源 | 稳定性 | 反爬限制 | 推荐场景 |
|
|
64
|
-
|--------|--------|----------|----------|
|
|
65
|
-
| [BaoStock](http://baostock.com/) | ⭐⭐⭐ 高 | 无 | 生产环境(推荐) |
|
|
66
|
-
| [AKShare](https://github.com/akfamily/akshare) | ⭐⭐ 中 | 有 | 开发测试 |
|
|
67
|
-
|
|
68
|
-
### BaoStock(推荐)
|
|
69
|
-
|
|
70
|
-
BaoStock 是免费开源的 Python 证券数据接口,提供稳定可靠的金融数据服务。
|
|
71
|
-
|
|
72
|
-
- 官方文档:[http://www.baostock.com/mainContent?file=stockKData.md](http://www.baostock.com/mainContent?file=stockKData.md)
|
|
76
|
+
- [BaoStock](http://baostock.com/) - 开源金融数据接口,每日支持十万次 API 调用
|
|
77
|
+
- [AKTools](https://github.com/akfamily/aktools) - 开源金融数据接口库(可能存在反爬限制)
|
|
73
78
|
|
|
74
|
-
|
|
79
|
+
## 使用 NPM 安装组件库
|
|
75
80
|
|
|
76
81
|
```bash
|
|
77
|
-
|
|
78
|
-
uv pip install baostock
|
|
79
|
-
|
|
80
|
-
# 启动服务(需自行实现服务层或参考 BaoStock 文档)
|
|
81
|
-
python your_baostock_server.py
|
|
82
|
+
npm i @363045841yyt/klinechart
|
|
82
83
|
```
|
|
83
84
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
AKShare 基于 Python 的开源财经数据接口库,数据来源于东方财富等公开渠道。
|
|
87
|
-
|
|
88
|
-
- GitHub:[https://github.com/akfamily/akshare](https://github.com/akfamily/akshare)
|
|
89
|
-
|
|
90
|
-
> **⚠️ 注意:** 存在反爬机制,频繁请求可能导致 IP 被封禁
|
|
91
|
-
|
|
92
|
-
#### 快速开始
|
|
85
|
+
## 快速开始
|
|
93
86
|
|
|
94
87
|
```bash
|
|
95
|
-
#
|
|
96
|
-
uv pip install aktools
|
|
97
|
-
|
|
98
|
-
# 启动服务
|
|
99
|
-
uv run python -m aktools
|
|
100
|
-
|
|
101
|
-
# 或通过本项目脚本启动
|
|
102
|
-
pnpm aktools
|
|
103
|
-
```
|
|
104
|
-
|
|
105
|
-
### 数据接入配置
|
|
106
|
-
|
|
107
|
-
#### Vite 代理配置
|
|
108
|
-
|
|
109
|
-
本项目已配置双数据源代理:
|
|
110
|
-
|
|
111
|
-
```ts
|
|
112
|
-
// vite.config.ts
|
|
113
|
-
proxy: {
|
|
114
|
-
'/api/stock': { // BaoStock (端口 8000)
|
|
115
|
-
target: 'http://127.0.0.1:8000',
|
|
116
|
-
changeOrigin: true,
|
|
117
|
-
},
|
|
118
|
-
'/api/public': { // AKTools (端口 8080)
|
|
119
|
-
target: 'http://127.0.0.1:8080',
|
|
120
|
-
changeOrigin: true,
|
|
121
|
-
},
|
|
122
|
-
}
|
|
123
|
-
```
|
|
124
|
-
|
|
125
|
-
#### 统一接口使用
|
|
126
|
-
|
|
127
|
-
```vue
|
|
128
|
-
<script setup lang="ts">
|
|
129
|
-
import { fetchKLineData, type KLineDataSourceConfig } from '@/api/data'
|
|
130
|
-
|
|
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',
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
const data = await fetchKLineData(DATA_SOURCE, config)
|
|
142
|
-
</script>
|
|
143
|
-
```
|
|
144
|
-
|
|
145
|
-
#### 股票代码格式
|
|
146
|
-
|
|
147
|
-
| 市场 | 格式 | 示例 |
|
|
148
|
-
|------|------|------|
|
|
149
|
-
| 沪市A股 | `sh.` | `sh.600000` |
|
|
150
|
-
| 深市A股 | `sz.` | `sz.000001` |
|
|
151
|
-
|
|
152
|
-
## 使用方法
|
|
153
|
-
|
|
154
|
-
### 1. 安装依赖
|
|
155
|
-
|
|
156
|
-
```sh
|
|
88
|
+
# 安装依赖
|
|
157
89
|
pnpm install
|
|
158
|
-
```
|
|
159
90
|
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
```sh
|
|
91
|
+
# 启动开发服务器
|
|
163
92
|
pnpm dev
|
|
164
93
|
```
|
|
165
94
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
#### 方式一:使用 BaoStock 数据源(推荐)
|
|
95
|
+
## 使用示例
|
|
169
96
|
|
|
170
97
|
```vue
|
|
171
98
|
<template>
|
|
@@ -182,156 +109,128 @@ pnpm dev
|
|
|
182
109
|
<script setup lang="ts">
|
|
183
110
|
import { ref, onMounted } from 'vue'
|
|
184
111
|
import KLineChart from '@/components/KLineChart.vue'
|
|
185
|
-
import { getKlineDataBaoStock } from '@/api/data/baostock'
|
|
186
112
|
import type { KLineData } from '@/types/price'
|
|
187
|
-
import { cache } from '@/utils/cache'
|
|
188
113
|
|
|
189
114
|
const klineData = ref<KLineData[]>([])
|
|
190
115
|
|
|
191
116
|
onMounted(async () => {
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
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)
|
|
117
|
+
// 从数据源获取 K 线数据
|
|
118
|
+
const data = await fetchKLineData('baostock', {
|
|
119
|
+
symbol: 'sh.601360',
|
|
120
|
+
startDate: '2024-01-01',
|
|
121
|
+
endDate: '2024-12-31',
|
|
122
|
+
period: 'daily',
|
|
123
|
+
adjust: 'qfq',
|
|
124
|
+
})
|
|
212
125
|
klineData.value = data
|
|
213
|
-
|
|
214
|
-
// 存入缓存
|
|
215
|
-
cache.set(cacheKey, data)
|
|
216
126
|
})
|
|
217
127
|
</script>
|
|
218
128
|
```
|
|
219
129
|
|
|
220
|
-
|
|
130
|
+
### 语义化 JSON 控制(Agent 模式)
|
|
131
|
+
|
|
132
|
+
通过 `semanticConfig` prop,AI Agent 可以用 JSON 配置完整控制图表渲染:
|
|
221
133
|
|
|
222
134
|
```vue
|
|
223
|
-
<
|
|
224
|
-
|
|
225
|
-
|
|
135
|
+
<template>
|
|
136
|
+
<KLineChart :semanticConfig="config" />
|
|
137
|
+
</template>
|
|
226
138
|
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
139
|
+
<script setup lang="ts">
|
|
140
|
+
import { ref } from 'vue'
|
|
141
|
+
import type { SemanticChartConfig } from '@363045841yyt/klinechart'
|
|
142
|
+
|
|
143
|
+
const config = ref<SemanticChartConfig>({
|
|
144
|
+
version: '1.0.0',
|
|
145
|
+
data: {
|
|
146
|
+
source: 'baostock',
|
|
147
|
+
symbol: '600519',
|
|
148
|
+
exchange: 'SH',
|
|
149
|
+
startDate: '2025-01-01',
|
|
150
|
+
endDate: '2025-04-18',
|
|
230
151
|
period: 'daily',
|
|
231
|
-
start_date: '20250501', // YYYYMMDD 格式
|
|
232
|
-
end_date: '20251230',
|
|
233
152
|
adjust: 'qfq',
|
|
234
|
-
}
|
|
235
|
-
|
|
153
|
+
},
|
|
154
|
+
indicators: {
|
|
155
|
+
main: [{ type: 'MA', enabled: true, params: { periods: [5, 10, 20] } }],
|
|
156
|
+
sub: [{ type: 'MACD', enabled: true }],
|
|
157
|
+
},
|
|
158
|
+
markers: {
|
|
159
|
+
customMarkers: [
|
|
160
|
+
{
|
|
161
|
+
id: 'buy_001',
|
|
162
|
+
date: '2025-02-15',
|
|
163
|
+
shape: 'arrow_up',
|
|
164
|
+
label: { text: '买入' },
|
|
165
|
+
style: { fillColor: '#52c41a' },
|
|
166
|
+
},
|
|
167
|
+
],
|
|
168
|
+
},
|
|
236
169
|
})
|
|
237
170
|
</script>
|
|
238
171
|
```
|
|
239
172
|
|
|
240
|
-
|
|
173
|
+
详细配置说明请参阅 [语义化配置文档](./docs/semantic-config.md)。
|
|
241
174
|
|
|
242
|
-
|
|
243
|
-
| ----------------- | ----------- | ------------------------------------- | ------------------------------ |
|
|
244
|
-
| data | KLineData[] | [] | K 线数据数组 |
|
|
245
|
-
| kWidth | number | 10 | K 线实体宽度 |
|
|
246
|
-
| kGap | number | 2 | K 线间距 |
|
|
247
|
-
| yPaddingPx | number | 60 | Y 轴上下留白像素 |
|
|
248
|
-
| showMA | MAFlags | { ma5: true, ma10: true, ma20: true } | 是否显示移动平均线 |
|
|
249
|
-
| autoScrollToRight | boolean | true | 数据更新后是否自动滚动到最右侧 |
|
|
175
|
+
## 数据源配置
|
|
250
176
|
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
- Node.js: ^20.19.0 || >=22.12.0
|
|
254
|
-
- pnpm: 包管理器
|
|
255
|
-
- Python: 用于运行 AKTools 服务(可选)
|
|
256
|
-
- uv: Python 包与运行器(用于 `pnpm aktools`,可选但推荐)
|
|
257
|
-
|
|
258
|
-
## 构建与部署
|
|
259
|
-
|
|
260
|
-
### 生产环境构建
|
|
261
|
-
|
|
262
|
-
```sh
|
|
263
|
-
pnpm build
|
|
264
|
-
```
|
|
177
|
+
### BaoStock(推荐)
|
|
265
178
|
|
|
266
|
-
|
|
179
|
+
免费开源的 Python 证券数据接口,每日支持十万次 API 调用。
|
|
267
180
|
|
|
268
|
-
```
|
|
269
|
-
|
|
181
|
+
```bash
|
|
182
|
+
uv pip install baostock
|
|
183
|
+
git clone https://github.com/363045841/stockbao.git
|
|
184
|
+
python server.py # 启动服务
|
|
270
185
|
```
|
|
271
186
|
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
### getKlineDataBaoStock
|
|
275
|
-
|
|
276
|
-
从 BaoStock 获取 K 线数据(推荐)。
|
|
187
|
+
### AKTools
|
|
277
188
|
|
|
278
|
-
|
|
189
|
+
基于 Python 的开源财经数据接口,数据来源于东方财富等公开渠道。
|
|
279
190
|
|
|
280
|
-
```
|
|
281
|
-
|
|
282
|
-
|
|
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
|
-
}
|
|
191
|
+
```bash
|
|
192
|
+
uv pip install aktools
|
|
193
|
+
uv run python -m aktools # 启动服务
|
|
289
194
|
```
|
|
290
195
|
|
|
291
|
-
|
|
292
|
-
`Promise<KLineData[]>` - 已转换为标准格式的 K 线数据数组
|
|
196
|
+
> ⚠️ 注意:AKTools 采取直连 API,频繁请求可能触发反爬机制
|
|
293
197
|
|
|
294
|
-
|
|
295
|
-
- ✅ 支持 1 小时本地缓存
|
|
296
|
-
- ✅ 无反爬限制
|
|
297
|
-
- ✅ 数据自动按时间排序
|
|
198
|
+
### 组件属性
|
|
298
199
|
|
|
299
|
-
|
|
200
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
201
|
+
|------|------|--------|------|
|
|
202
|
+
| data | KLineData[] | [] | K 线数据数组 |
|
|
203
|
+
| semanticConfig | SemanticChartConfig | - | 语义化配置(Agent 模式,唯一数据源) |
|
|
204
|
+
| kWidth | number | 10 | K 线实体宽度 |
|
|
205
|
+
| kGap | number | 2 | K 线间距 |
|
|
206
|
+
| yPaddingPx | number | 60 | Y 轴上下留白像素 |
|
|
207
|
+
| showMA | MAFlags | { ma5: true, ma10: true, ma20: true } | 移动平均线配置 |
|
|
208
|
+
| autoScrollToRight | boolean | true | 数据更新后自动滚动到最右侧 |
|
|
300
209
|
|
|
301
|
-
|
|
210
|
+
## 环境要求
|
|
302
211
|
|
|
303
|
-
|
|
212
|
+
- Node.js: ^20.19.0 || >=22.12.0
|
|
213
|
+
- pnpm: 包管理器
|
|
214
|
+
- Python: 用于运行数据源服务(可选)
|
|
215
|
+
- uv: Python 包管理器
|
|
304
216
|
|
|
305
|
-
|
|
217
|
+
## 构建与部署
|
|
306
218
|
|
|
307
|
-
```
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
period: 'daily' | 'weekly' | 'monthly' // 周期
|
|
311
|
-
start_date: string // 开始日期,格式:YYYYMMDD
|
|
312
|
-
end_date: string // 结束日期,格式:YYYYMMDD
|
|
313
|
-
adjust?: 'qfq' | 'hfq' // 复权方式,qfq: 前复权, hfq: 后复权
|
|
314
|
-
timeout?: number // 超时时间(秒)
|
|
315
|
-
}
|
|
219
|
+
```bash
|
|
220
|
+
pnpm build # 生产环境构建
|
|
221
|
+
pnpm preview # 预览生产包
|
|
316
222
|
```
|
|
317
223
|
|
|
318
|
-
**返回值:**
|
|
319
|
-
`Promise<KLineDailyDongCaiResponse[]>` - K 线数据数组(需调用 `toKLineData()` 转换)
|
|
320
|
-
|
|
321
|
-
## 贡献
|
|
322
|
-
|
|
323
|
-
欢迎提交 Issue 和 Pull Request 来改进这个项目。
|
|
324
|
-
|
|
325
|
-
## 许可证
|
|
326
|
-
|
|
327
|
-
本项目采用 MIT 许可证,详情请见 [LICENSE](./LICENSE) 文件。
|
|
328
|
-
|
|
329
224
|
## 相关链接
|
|
330
225
|
|
|
331
226
|
- [Vue.js 官方文档](https://vuejs.org/guide/introduction.html)
|
|
332
227
|
- [Vite 官方文档](https://vite.dev/guide/)
|
|
333
228
|
- [BaoStock 官方文档](http://baostock.com/)
|
|
334
229
|
- [AKTools 官方文档](https://github.com/akfamily/aktools)
|
|
335
|
-
- [AKShare 官方文档](https://akshare.akfamily.xyz/)
|
|
336
230
|
- [Canvas API MDN 文档](https://developer.mozilla.org/zh-CN/docs/Web/API/Canvas_API)
|
|
337
|
-
- [Vitest 官方文档](https://vitest.dev/)
|
|
231
|
+
- [Vitest 官方文档](https://vitest.dev/)
|
|
232
|
+
- [语义化配置文档](./docs/semantic-config.md) - Agent JSON 配置说明
|
|
233
|
+
|
|
234
|
+
## 许可证
|
|
235
|
+
|
|
236
|
+
本项目采用 MIT 许可证,详情请见 [LICENSE](./LICENSE) 文件。
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export interface ParamConfig {
|
|
2
|
+
key: string;
|
|
3
|
+
label: string;
|
|
4
|
+
type: 'number';
|
|
5
|
+
min?: number;
|
|
6
|
+
max?: number;
|
|
7
|
+
step?: number;
|
|
8
|
+
default?: number;
|
|
9
|
+
/** 参数描述 */
|
|
10
|
+
description?: string;
|
|
11
|
+
}
|
|
12
|
+
type __VLS_Props = {
|
|
13
|
+
visible: boolean;
|
|
14
|
+
indicatorId: string;
|
|
15
|
+
indicatorName: string;
|
|
16
|
+
/** 指标描述 */
|
|
17
|
+
indicatorDescription?: string;
|
|
18
|
+
params: ParamConfig[];
|
|
19
|
+
values: Record<string, number>;
|
|
20
|
+
};
|
|
21
|
+
declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
|
|
22
|
+
close: () => any;
|
|
23
|
+
confirm: (values: Record<string, number>) => any;
|
|
24
|
+
}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
25
|
+
onClose?: (() => any) | undefined;
|
|
26
|
+
onConfirm?: ((values: Record<string, number>) => any) | undefined;
|
|
27
|
+
}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
|
|
28
|
+
export default _default;
|
|
@@ -1,17 +1,27 @@
|
|
|
1
|
+
import { ParamConfig } from './IndicatorParams.vue';
|
|
1
2
|
export interface Indicator {
|
|
2
3
|
id: string;
|
|
3
4
|
label: string;
|
|
4
5
|
name: string;
|
|
6
|
+
pane: 'main' | 'sub';
|
|
7
|
+
/** 指标描述 */
|
|
8
|
+
description?: string;
|
|
9
|
+
params?: ParamConfig[];
|
|
5
10
|
}
|
|
6
11
|
type __VLS_Props = {
|
|
7
12
|
/** 当前选中的指标列表 */
|
|
8
13
|
activeIndicators?: string[];
|
|
14
|
+
/** 指标参数配置 */
|
|
15
|
+
indicatorParams?: Record<string, Record<string, number>>;
|
|
9
16
|
};
|
|
10
17
|
declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
|
|
11
18
|
toggle: (indicatorId: string, active: boolean) => any;
|
|
19
|
+
updateParams: (indicatorId: string, params: Record<string, number>) => any;
|
|
12
20
|
}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
13
21
|
onToggle?: ((indicatorId: string, active: boolean) => any) | undefined;
|
|
22
|
+
onUpdateParams?: ((indicatorId: string, params: Record<string, number>) => any) | undefined;
|
|
14
23
|
}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {
|
|
15
24
|
scrollContainerRef: HTMLDivElement;
|
|
25
|
+
itemRefs: HTMLDivElement[];
|
|
16
26
|
}, HTMLDivElement>;
|
|
17
27
|
export default _default;
|
|
@@ -1,18 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
ma5?: boolean;
|
|
4
|
-
ma10?: boolean;
|
|
5
|
-
ma20?: boolean;
|
|
6
|
-
ma30?: boolean;
|
|
7
|
-
ma60?: boolean;
|
|
8
|
-
};
|
|
1
|
+
import { SemanticChartConfig } from '../semantic';
|
|
2
|
+
import { SubIndicatorType } from '../core/renderers/Indicator';
|
|
9
3
|
type __VLS_Props = {
|
|
10
|
-
|
|
4
|
+
/** 语义化配置(必需,唯一控制源) */
|
|
5
|
+
semanticConfig: SemanticChartConfig;
|
|
11
6
|
kWidth?: number;
|
|
12
7
|
kGap?: number;
|
|
13
8
|
yPaddingPx?: number;
|
|
14
|
-
showMA?: MAFlags;
|
|
15
|
-
autoScrollToRight?: boolean;
|
|
16
9
|
minKWidth?: number;
|
|
17
10
|
maxKWidth?: number;
|
|
18
11
|
/** 右侧价格轴宽度 */
|
|
@@ -21,26 +14,30 @@ type __VLS_Props = {
|
|
|
21
14
|
bottomAxisHeight?: number;
|
|
22
15
|
/** 价格标签额外宽度(用于显示涨跌幅,默认 60px) */
|
|
23
16
|
priceLabelWidth?: number;
|
|
24
|
-
/** Pane 高度比例(主/副),默认 [0.85, 0.15] */
|
|
25
|
-
paneRatios?: [number, number];
|
|
26
17
|
};
|
|
27
18
|
declare function scheduleRender(): void;
|
|
19
|
+
declare function addSubPane(indicatorId?: SubIndicatorType, params?: Record<string, number>): boolean;
|
|
20
|
+
declare function removeSubPane(paneId: string): void;
|
|
21
|
+
declare function clearAllSubPanes(): void;
|
|
22
|
+
declare function switchSubIndicator(paneId: string, newIndicatorId: SubIndicatorType): void;
|
|
28
23
|
declare function scrollToRight(): void;
|
|
29
24
|
declare const _default: import('vue').DefineComponent<__VLS_Props, {
|
|
30
25
|
scheduleRender: typeof scheduleRender;
|
|
31
26
|
scrollToRight: typeof scrollToRight;
|
|
27
|
+
addSubPane: typeof addSubPane;
|
|
28
|
+
removeSubPane: typeof removeSubPane;
|
|
29
|
+
switchSubIndicator: typeof switchSubIndicator;
|
|
30
|
+
clearAllSubPanes: typeof clearAllSubPanes;
|
|
31
|
+
plugin: import('..').PluginHostImpl | undefined;
|
|
32
32
|
}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
|
|
33
|
-
yPaddingPx: number;
|
|
34
33
|
kWidth: number;
|
|
35
34
|
kGap: number;
|
|
36
|
-
|
|
35
|
+
yPaddingPx: number;
|
|
37
36
|
rightAxisWidth: number;
|
|
38
37
|
bottomAxisHeight: number;
|
|
39
38
|
minKWidth: number;
|
|
40
39
|
maxKWidth: number;
|
|
41
40
|
priceLabelWidth: number;
|
|
42
|
-
autoScrollToRight: boolean;
|
|
43
|
-
paneRatios: [number, number];
|
|
44
41
|
}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {
|
|
45
42
|
containerRef: HTMLDivElement;
|
|
46
43
|
canvasLayerRef: HTMLDivElement;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { MarkerEntity, CustomMarkerEntity } from '../core/marker/registry';
|
|
2
|
+
type __VLS_Props = {
|
|
3
|
+
marker: MarkerEntity | CustomMarkerEntity | null;
|
|
4
|
+
pos: {
|
|
5
|
+
x: number;
|
|
6
|
+
y: number;
|
|
7
|
+
};
|
|
8
|
+
};
|
|
9
|
+
declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
|
|
10
|
+
export default _default;
|