关于 klinecharts
这是一个用于集成 JavaScript 图表库 `klinecharts` 的开发指南 Skill,涵盖数据加载、框架生命周期、指标、绘图覆盖层、迁移和故障排查。
主要功能
- 01图表最小化初始化
- 02REST 与流式数据加载指南
- 03React 和 Vue 集成模式
- 04指标与绘图覆盖层
- 05v9 到 v10 迁移指南
- 06排查图表和数据问题
适用场景
- 01在 Web 项目中添加蜡烛图
- 02将图表数据连接到后端
- 03把集成从 v9 升级到 v10
- 04诊断空白图表或过期数据
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ klinecharts/ klinechart --skill klinecharts安装后在 Claude Code 中输入/klinecharts确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
api-reference.mdexamples.mdprompts.md详细介绍
KLineChart 集成指南
帮助开发者在项目中集成 KLineChart(npm:klinecharts,当前为 v10)。
按场景选择
| 用户需求 | 从这里开始 |
|---|---|
| 首次集成,快速创建图表 | → 最简示例 |
| 真实后端(REST/WebSocket) | → 数据加载 |
| React / Vue / 其他框架 | → 框架集成 |
| 指标 / 绘图工具 | → 指标和叠加图形 |
| 从 v9 升级 | → v9 → v10 迁移 |
| 图表空白 / 数据未更新 | → 故障排除 |
如果不确定版本,请检查 package.json 中的 klinecharts。v10 不再使用 applyNewData / updateData。
最简示例
import { init, dispose } from 'klinecharts'
const chart = init('chart') // HTMLElement or id; container needs width and height
chart.setSymbol({ ticker: 'BTCUSDT', pricePrecision: 2, volumePrecision: 0 })
chart.setPeriod({ span: 1, type: 'day' })
chart.setDataLoader({
getBars: ({ callback }) => {
callback([
{ timestamp: 1517846400000, open: 7424.6, high: 7511.3, low: 6032.3, close: 7310.1, volume: 224461 },
])
}
})
// cleanup: dispose('chart')
必需顺序: init → setSymbol → setPeriod → setDataLoader
数据模型
// KLineData — all price/volume fields must be numbers
{ timestamp: number, open: number, high: number, low: number, close: number, volume?: number, turnover?: number }
// Period
{ span: 5, type: 'minute' } // 5-minute bars; type: second | minute | hour | day | week | month | year
// SymbolInfo
{ ticker: string, pricePrecision: number, volumePrecision: number }
timestamp 必须以毫秒为单位。只有 EMV 和 AVP 指标需要 turnover。
数据加载(setDataLoader)
v10 使用 setDataLoader,而不是旧版数据 API。getBars 可以是 async,但必须始终调用 callback。
chart.setDataLoader({
getBars: ({ type, timestamp, symbol, period, callback }) => {
// type: 'init' | 'forward' | 'backward'
// init: first load, timestamp = null
// forward: scrolled to left edge, timestamp = leftmost bar time
// backward: scrolled to right edge, timestamp = rightmost bar time
callback(bars, { forward: true, backward: false })
},
subscribeBar: ({ symbol, period, callback }) => {
// fires after init; call callback with one KLineData per push
// same timestamp → update last bar; larger timestamp → append
},
unsubscribeBar: ({ symbol, period }) => {
// tear down WebSocket/polling on symbol/period change or dispose
}
})
规则:
getBars必须始终调用callback,即使失败也不例外(传入[])- K 线按
timestamp升序排列,且不得重复 subscribeBar每次推送一根 K 线,而不是数组more控制分页:可以是boolean或{ forward?, backward? }
更改周期或品种时,chart.setPeriod(...) 或 chart.setSymbol(...) 会自动重新加载。
框架集成
容器必须设置明确的宽度和高度。在挂载时调用 init,在卸载时调用 dispose,并在尺寸变化时调用 chart.resize()。
// React pattern
useEffect(() => {
const chart = init(containerRef.current!)
chart.setSymbol({ ticker: 'TEST', pricePrecision: 2, volumePrecision: 0 })
chart.setPeriod({ span: 1, type: 'day' })
chart.setDataLoader(loader)
const ro = new ResizeObserver(() => chart.resize())
ro.observe(containerRef.current!)
return () => { ro.disconnect(); dispose(containerRef.current!) }
}, [])
CDN:klinecharts.init(...) / klinecharts.dispose(...)
指标和叠加图形
chart.createIndicator('MACD') // separate pane
chart.createIndicator({ name: 'MA', paneId: 'candle_pane' }, true) // stack on main chart
chart.createOverlay('segment') // interactive drawing
chart.createOverlay({ name: 'priceLine', points: [{ timestamp, value }] }) // programmatic
可在主图上堆叠显示的内置指标:BBI、BOLL、EMA、MA、SAR、SMA
运行时查询:getSupportedIndicators() / getSupportedOverlays()
自定义类型:registerIndicator(...) / registerOverlay(...) — 在 init 之前注册。
常用实例 API
| 方法 | 用途 |
|---|---|
setStyles(partial) | 更新样式(浅合并) |
setLayoutOptions(partial) | 更新后续创建的窗格和 Y 轴的默认值 |
getLayoutOptions() | 获取当前完整的默认布局选项 |
setPaneOptions(opts) | 窗格高度/状态 |
overrideYAxis(opts) | Y 轴位置/刻度 |
subscribeAction(type, cb) | 十字线、点击等 |
scrollToRealTime() | 滚动到最新 K 线 |
getDataList() | 当前 K 线数据 |
resetData() | 重新加载数据 |
getConvertPictureUrl() | 导出图像 |
操作类型:onCrosshairChange、onCandleBarClick、onZoom、onScroll、onVisibleRangeChange、onPaneDrag
初始布局
init(container, {
layout: {
barSpaceLimit: { min: 2, max: 40 },
pane: { minHeight: 120 },
yAxis: { position: 'right' }
},
locale: 'zh-CN',
timezone: 'Asia/Shanghai',
styles: 'dark'
})
如需在初始化后更改布局默认值,请使用 setLayoutOptions(partial)。它会增量合并,且只影响之后创建的窗格和 Y 轴;对于现有图表元素,请使用 setPaneOptions、overrideYAxis 或 overrideXAxis。使用 getLayoutOptions() 读取当前完整的默认值。
v9 → v10 迁移
| v9(已移除) | v10 |
|---|---|
applyNewData(data) | getBars,类型为 'init' |
updateData(bar) | subscribeBar 回调 |
applyMoreData(data, more) | getBars,类型为 'forward' / 'backward' |
setLoadDataCallback | setDataLoader |
setPriceVolumePrecision | setSymbol({ pricePrecision, volumePrecision }) |
setCustomApi | setFormatter |
指标 calc 返回数组 | calc 返回 Record<timestamp, value> |
故障排除
- 没有数据——是否依次调用了 setSymbol/setPeriod/setDataLoader?getBars 是否调用了回调?时间戳是否以毫秒为单位?
- 分页异常——回调中的
more.forward/more.backward是否正确? - 实时数据未更新——subscribeBar 是否推送了一根 K 线?时间戳是否 ≥ 最新一根 K 线的时间戳?
- 切换交易品种后数据过期——unsubscribeBar 是否关闭了旧订阅?
- 容器空白——宽度/高度是否为 0?是否调用了 resize?
延伸阅读
- 可直接复制的提示词:prompts.md
- 完整示例:examples.md
- API 参考:api-reference.md
- 官方文档:https://klinecharts.com/guide/data-integration