mcpField
K
klinecharts

klinecharts

github.com/klinecharts开发4.3k153 次安装1 周前更新
代码仓库

关于 klinecharts

这是一个用于集成 JavaScript 图表库 `klinecharts` 的开发指南 Skill,涵盖数据加载、框架生命周期、指标、绘图覆盖层、迁移和故障排查。

主要功能

  1. 01图表最小化初始化
  2. 02REST 与流式数据加载指南
  3. 03React 和 Vue 集成模式
  4. 04指标与绘图覆盖层
  5. 05v9 到 v10 迁移指南
  6. 06排查图表和数据问题

适用场景

  1. 01在 Web 项目中添加蜡烛图
  2. 02将图表数据连接到后端
  3. 03把集成从 v9 升级到 v10
  4. 04诊断空白图表或过期数据

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/klinecharts/klinechart --skill klinecharts

安装后在 Claude Code 中输入/klinecharts确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

api-reference.md
examples.md
prompts.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'
setLoadDataCallbacksetDataLoader
setPriceVolumePrecisionsetSymbol({ pricePrecision, volumePrecision })
setCustomApisetFormatter
指标 calc 返回数组calc 返回 Record<timestamp, value>

故障排除

  1. 没有数据——是否依次调用了 setSymbol/setPeriod/setDataLoader?getBars 是否调用了回调?时间戳是否以毫秒为单位?
  2. 分页异常——回调中的 more.forward / more.backward 是否正确?
  3. 实时数据未更新——subscribeBar 是否推送了一根 K 线?时间戳是否 ≥ 最新一根 K 线的时间戳?
  4. 切换交易品种后数据过期——unsubscribeBar 是否关闭了旧订阅?
  5. 容器空白——宽度/高度是否为 0?是否调用了 resize?

延伸阅读

评论

支持 Markdown