更新记录

1.0.0(2026-10-27)

  • 首次发布 Chen KChart Pro UTS 组件。
  • 支持蜡烛图、空心蜡烛图、分时线和买卖深度图,并提供深色、浅色主题切换。
  • 支持 MA、EMA、BOLL、SAR 主图指标,以及 VOL、MACD、KDJ、RSI、WR、CCI、OBV、STOCH RSI 副图指标。
  • 支持行情全量替换、历史数据追加、最新 K 线实时更新及滚动加载更多历史数据。
  • 支持十字线、双指缩放、拖动浏览、视口复位、内容适配、定位最新数据,以及按索引或时间跳转。
  • 支持趋势线、水平线、垂直线等画线交互,并提供撤销、重做、清空和绘图数据同步能力。
  • 支持买卖成交标记、订单线、持仓线、止盈止损线,以及点击和拖动事件回调。
  • 提供完整的 uni-app nvue 示例页面、组件属性、Ref 方法和事件回调文档。

平台兼容性

uni-app(4.25)

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
√ √ × × - √ √ √ √
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟
× × × × × × × × × × × ×

uni-app x

Chrome Safari Android iOS 鸿蒙 微信小程序
× × - - - ×

其他

多语言 暗黑模式 宽屏模式 蒸汽模式
√ √ √ ×

Chen KChart Pro UTS Demo

uni-app 专业 K 线图组件

在线体验

类型 地址 说明
Web 效果预览 打开 KChart 在线演示 用于 PC、H5 预览 KChart 功能和交互效果
Android Demo 下载 KChart APK 下载并安装到 Android 手机体验完整 Demo

功能概览

  • 支持蜡烛图、空心蜡烛图、分时图、成交量图和买卖深度图。
  • 支持浅色、深色及色觉友好配色。
  • 支持 MA、EMA、BOLL、SAR 主图指标。
  • 支持 VOL、MACD、KDJ、RSI、WR、CCI、OBV、STOCH RSI 副图指标。
  • 支持指标参数、线条颜色和序列显隐配置。
  • 支持拖动浏览、双指缩放、十字线、回到最新、内容适配和指定时间跳转。
  • 支持趋势线、趋势角、箭头、垂直线、水平线、水平射线、射线和十字线绘图。
  • 支持连续绘图、磁铁吸附、显示/隐藏、撤销、重做、清空和绘图恢复。
  • 支持买卖 B/S 标记、订单线、持仓线、强平线、止盈止损线和未实现盈亏。
  • 支持历史行情分页加载、全量替换和最新 K 线实时更新。
  • 支持通过 Props、Ref 方法和事件与 uni-app 页面双向交互。

运行环境

项目 要求
HBuilderX 4.25 或更高版本
页面类型 classic uni-app 的 .nvue 页面
Android API 24 或更高版本;armeabi-v7a、arm64-v8a、x86_64
iOS iOS 13.0 或更高版本;当前原生产物为 arm64
Vue Vue 2、Vue 3

当前插件不支持普通 App Vue 页面、H5 和各类小程序。

项目结构

uniapp-plugin-demo/
├── pages/
│   └── sample/
│       └── kchart-module.nvue       # 完整 KChart 交易页 Demo
├── uni_modules/
│   └── chen-kchart/
│       ├── package.json             # UTS 插件清单
│       ├── readme.md                # 插件市场说明
│       ├── changelog.md             # 版本日志
│       └── utssdk/
│           ├── app-android/         # Android UTS
│           └── app-ios/             # iOS UTS
├── manifest.json
├── pages.json
└── README.md

运行当前 Demo

1. 使用 HBuilderX 打开项目

打开本仓库根目录:

/Users/victor/UniProjects/uniapp-plugin-demo

入口页面已在 pages.json 中配置为:

pages/sample/kchart-module.nvue

Demo 默认使用 500 根本地模拟 OHLCV 数据,不依赖网络即可验证 K 线、指标和交互。页面右上角可切换到实盘模式,实盘模式会由 Demo 页面请求 Binance 的 BTC/USDT 行情和深度数据。

2. 重新制作自定义基座

首次运行、升级插件,或修改以下内容后,需要重新制作自定义基座:

  • uni_modules/chen-kchart/utssdk 中的 UTS、Java、Swift 代码;
  • Android libs 中的 AAR/JAR;
  • iOS Frameworks;
  • 插件 config.json 或原生依赖配置。

在 HBuilderX 中执行:

运行 -> 运行到手机或模拟器 -> 制作自定义调试基座

制作完成后,选择对应自定义基座运行到已连接的真机。只修改普通 .nvue 页面逻辑和样式时,通常可以热更新,不必重复制作基座。

3. 验证功能

Demo 页面可直接验证:

  • 模拟/实盘行情切换;
  • 分时以及 1m、5m、15m、30m、1h、4h、1d、1w 周期;
  • K 线、深度图、亮暗主题和色觉友好模式;
  • 主副图指标及指标参数设置;
  • 画线、撤销、重做、磁铁和连续绘图;
  • 成交标记、订单/持仓及止盈止损线;
  • 实时更新和左滑加载历史行情。

接入业务项目

1. 复制插件

将整个目录复制到业务项目,不要遗漏原生依赖:

uni_modules/chen-kchart/

不需要再复制或勾选 nativeplugins/Chen-KChartPro。复制后重新制作包含该 UTS 组件的自定义基座。

2. 在 nvue 页面使用

组件可通过 easycom 自动注册,无需手动 import。原生组件必须设置明确的宽高:

<template>
  <view class="page">
    <chen-kchart
      ref="chart"
      style="width:750rpx;height:900rpx;"
      :dataJson="barsJson"
      :optionsJson="chartOptionsJson"
      theme="dark"
      mainIndicator="MA"
      secondaryIndicator="KDJ"
      candleBodyMode="solid"
      :showVolume="true"
      :lineMode="false"
      mode="KLINE"
      :depthJson="depthJson"
      :tradeMarkersJson="tradeMarkersJson"
      :tradingOverlayJson="tradingOverlayJson"
      @ready="onChartReady"
      @crosshair="onCrosshair"
      @viewport-change="onViewportChange"
      @load-more="onLoadMore"
      @error="onChartError"
    />
  </view>
</template>

<script>
export default {
  data() {
    return {
      bars: [],
      depth: { bids: [], asks: [] },
      tradeMarkers: [],
      tradingOverlay: { visible: false, lines: [] },
      chartOptions: {
        showNowPrice: true,
        showInfoDialog: true,
        enableDrawingTools: true,
        precision: 4,
        minScale: 0.35,
        maxScale: 5
      }
    }
  },
  computed: {
    barsJson() {
      return JSON.stringify(this.bars)
    },
    depthJson() {
      return JSON.stringify(this.depth)
    },
    tradeMarkersJson() {
      return JSON.stringify(this.tradeMarkers)
    },
    tradingOverlayJson() {
      return JSON.stringify(this.tradingOverlay)
    },
    chartOptionsJson() {
      return JSON.stringify(this.chartOptions)
    }
  },
  methods: {
    onChartReady() {
      this.$refs.chart.scrollToLatest()
    },
    onCrosshair(event) {
      console.log('crosshair:', event.detail || event)
    },
    onViewportChange(event) {
      console.log('viewport:', event.detail || event)
    },
    onLoadMore(event) {
      console.log('load more:', event.detail || event)
    },
    onChartError(event) {
      console.error('KChart error:', event.detail || event)
    }
  }
}
</script>

为什么推荐 JSON 字符串接口

classic uni-app/nvue 将对象数组传入 UTS 组件时,复杂对象的内部字段可能被序列化为空对象 {}。表现通常是 K 线没有蜡烛实体、只出现一条直线,或指标全部基于零值计算。

因此,复杂数据应在页面 JavaScript 层先调用 JSON.stringify(),再通过以下属性或方法跨越 UTS 边界:

  • dataJson / replaceDataJson() / appendDataJson() / updateLastDataJson();
  • optionsJson / applyOptionsJson();
  • depthJson / setDepthDataJson();
  • tradeMarkersJson / applyTradeMarkersJson();
  • tradingOverlayJson / applyTradingOverlayJson();
  • setDrawingsJson()。

组件仍保留对象/数组形式的兼容接口,但 classic uni-app/nvue 项目应优先使用 JSON 字符串接口。

K 线数据格式

每根 K 线使用以下字段:

{
  time: 1790481600000, // Unix 毫秒时间戳
  open: 50000,
  high: 50200,
  low: 49800,
  close: 50100,
  vol: 123.45
}

数据要求:

  • time 必须是 Unix 毫秒时间戳;
  • open、high、low、close、vol 必须是有效数字;
  • high 不应低于 open 和 close,low 不应高于 open 和 close;
  • 数据按时间从旧到新排列;
  • 业务端负责根据周期生成或请求 OHLCV,组件不负责把逐笔成交聚合为 K 线;
  • 切换交易对或周期后,使用 replaceDataJson() 全量替换数据。

组件属性

属性 类型 默认值 说明
dataJson String '' JSON.stringify(OHLCV数组),推荐
optionsJson String '' JSON.stringify(图表配置),推荐
data Array [] OHLCV 数组,兼容入口
options Object {} 图表配置,兼容入口
theme String dark dark / light
mainIndicator String MA MA / EMA / BOLL / SAR / NONE
secondaryIndicator String VOL VOL / MACD / KDJ / RSI / WR / CCI / OBV / STOCH_RSI / NONE
candleBodyMode String solid solid / hollow
showVolume Boolean true 是否显示成交量区域
lineMode Boolean false 是否使用分时线模式
mode String KLINE KLINE / DEPTH
depthJson String '' JSON.stringify({ bids, asks }),推荐
tradeMarkersJson String '' JSON.stringify(成交标记数组),推荐
tradingOverlayJson String '' JSON.stringify(交易叠加配置),推荐
depth Object {bids:[], asks:[]} 深度数据兼容入口
tradeMarkers Array [] 成交标记兼容入口
tradingOverlay Object {visible:false, lines:[]} 交易叠加兼容入口

options 配置

参数 类型 说明
theme String light / dark
mainIndicator String 主图指标
secondaryIndicator String 副图指标
showVolume Boolean 是否显示成交量
isLine Boolean 是否启用分时模式
mode String KLINE / DEPTH
showNowPrice Boolean 是否显示最新价线
showInfoDialog Boolean 是否显示十字线详情
enableDrawingTools Boolean 是否启用绘图能力
colorBlind Boolean 是否启用色觉友好配色
candleBodyMode String solid / hollow
precision Number 价格小数精度,范围 0-12
minScale Number 最小缩放比例
maxScale Number 最大缩放比例
indicatorConfigs Array 指标参数、颜色、序列显隐和启停配置

指标配置示例:

const options = {
  indicatorConfigs: [
    {
      id: 'BOLL',
      parameters: { period: 20, multiplier: 2 },
      colors: { mb: '#2962ff', up: '#ff9800', dn: '#7e57c2' },
      hiddenSeries: [],
      enabled: true
    },
    {
      id: 'KDJ',
      parameters: { period: 9, kSmoothing: 3, dSmoothing: 3 },
      colors: { k: '#2962ff', d: '#ff9800', j: '#7e57c2' },
      hiddenSeries: ['j'],
      enabled: true
    }
  ]
}

this.$refs.chart.applyOptionsJson(JSON.stringify(options))

完整指标编辑数据结构可参考 pages/sample/kchart-module.nvue。

Ref 方法

行情数据

方法 参数 说明
replaceDataJson(json) String 全量替换行情,推荐
appendDataJson(json) String 追加历史或新增行情,推荐
updateLastDataJson(json) String 更新最后一根或追加新 K 线,推荐
setData(bars) Array 全量替换兼容接口
appendData(bars) Array 追加数据兼容接口
updateLastData(bar) Object 实时更新兼容接口
// 首次加载、刷新、切换交易对或周期
this.$refs.chart.replaceDataJson(JSON.stringify(bars))

// 左滑加载更早历史数据
this.$refs.chart.appendDataJson(JSON.stringify(olderBars))

// WebSocket 或轮询更新当前 K 线
this.$refs.chart.updateLastDataJson(JSON.stringify(realtimeBar))

同一次更新不要既修改 dataJson 又调用增量方法,否则可能同时触发全量和增量更新。用户浏览历史区域时,实时更新不会强制拉回最新位置,可根据 viewport-change 中的 isAtLatest 决定是否显示“回到最新”。

基础配置

方法 参数 说明
applyOptionsJson(json) String 批量应用图表配置,推荐
applyOptions(options) Object 批量配置兼容接口
applyTheme(theme) String 设置 light / dark
applyMainIndicator(value) String 设置主图指标
applySecondaryIndicator(value) String 设置副图指标
applyCandleBodyMode(value) String 设置 solid / hollow
applyShowVolume(value) Boolean 显示或隐藏成交量
applyLineMode(value) Boolean 切换分时模式
setChartMode(value) String 切换 KLINE / DEPTH

深度与交易

方法 参数 说明
setDepthDataJson(json) String 设置 {bids, asks} 深度数据
applyTradeMarkersJson(json) String 设置成交 B/S 标记
applyTradingOverlayJson(json) String 设置订单、持仓和止盈止损等交易线
setDepthData(data) Object 深度数据兼容接口
setTradeMarkers(markers) Array 成交标记兼容接口
applyTradingOverlay(overlay) Object 交易叠加兼容接口

绘图工具

方法 参数 说明
setDrawingTool(type) String 设置绘图类型,NONE 取消当前工具
setDrawingMode(enabled) Boolean 开启或关闭绘图模式
setDrawingOptions(options) Object 设置连续绘图、磁铁、颜色、线宽等
setDrawingsJson(json) String 恢复序列化的绘图数据,推荐
setDrawings(drawings) Array 恢复绘图数据兼容接口
clearDrawings() 无 清除全部绘图
undoDrawing() 无 撤销
redoDrawing() 无 重做

支持的绘图类型:

trendLine、trendAngle、arrow、verticalLine、horizontalLine、
horizontalRay、ray、crossLine、NONE
this.$refs.chart.setDrawingOptions({
  continuous: true,
  magnet: true,
  magnetThreshold: 50,
  color: '#f2b84b',
  strokeWidth: 2,
  lineStyle: 'solid', // solid / dashed / dotted
  visible: true
})

视口与十字线

方法 参数 说明
zoomIn() 无 放大图表
zoomOut() 无 缩小图表
resetViewport() 无 重置缩放并回到最新位置
fitContent() 无 自适应显示全部数据
scrollToLatest() 无 滚动到最新 K 线
jumpToIndex(index) Number 跳转到指定数据索引
jumpToTime(time) Number 跳转到指定 Unix 毫秒时间
setLogicalRange(range) Object 设置 {from, to} 逻辑范围
setPriceRange(range) Object 设置 {min, max} 价格范围
clearPriceRange() 无 恢复自动价格范围
showCrosshair(value) Object 通过 {time, price} 或 {index, price} 显示十字线
hideCrosshair() 无 隐藏十字线

深度与交易数据

深度图

const depth = {
  bids: [
    { price: 50000, volume: 10 },
    { price: 49990, volume: 18 }
  ],
  asks: [
    { price: 50010, volume: 8 },
    { price: 50020, volume: 15 }
  ]
}

this.$refs.chart.setDepthDataJson(JSON.stringify(depth))
this.$refs.chart.setChartMode('DEPTH')

volume 建议传入从盘口中心向外累计后的数量。

成交标记

const markers = [
  {
    id: 'buy-1',
    time: 1790481600000,
    price: 50000,
    side: 'buy', // buy / sell
    label: 'B',
    style: 'badge', // badge / arrow
    color: '#00c087',
    size: 12,
    visible: true
  }
]

this.$refs.chart.applyTradeMarkersJson(JSON.stringify(markers))

订单与持仓线

const overlay = {
  visible: true,
  showOrders: true,
  showPositions: true,
  showLiquidationPrice: true,
  showTakeProfitStopLoss: true,
  showTradeHistory: true,
  lines: [
    {
      id: 'position-1',
      price: 50000,
      kind: 'position',
      side: 'buy',
      label: '多仓',
      quantity: '0.50 BTC',
      unrealizedPnl: 42.8,
      unrealizedPnlPercent: 1.72
    },
    {
      id: 'tp-1',
      price: 51000,
      kind: 'takeProfit',
      side: 'sell',
      label: '止盈',
      draggable: true,
      dashed: true
    }
  ]
}

this.$refs.chart.applyTradingOverlayJson(JSON.stringify(overlay))

kind 支持 order、position、liquidation、takeProfit、stopLoss。订单 status 支持 pending、open、partiallyFilled、filled、canceled、rejected。

组件事件

事件 主要返回数据 说明
ready 图表状态 图表初始化且初始状态应用完成
crosshair index/time/price/x/y、OHLCV 十字线选中变化
crosshair-hidden 空对象 十字线隐藏
crossline-label-tap {price} 点击十字线价格标签
viewport-change 可见索引、时间、价格范围、isAtLatest 可见区域变化
scale-change {scale} 缩放比例变化
drawing-change count/canUndo/canRedo/drawings 绘图或历史状态变化
data-change 数据状态 行情数据发生变化
load-more {history, prefetch} 到达历史边缘,请求更早数据
trade-marker-tap {id, time, price, side} 点击成交标记
trading-line-tap {id, price, kind, side} 点击交易线
trading-line-drag-end {id, price} 确认拖动后的新价格
error {method, message} 原生调用、JSON 解析或数据处理异常

不同 uni-app/HBuilderX 版本可能会把事件内容再包装在 detail 中,可使用:

const detail = event && event.detail !== undefined ? event.detail : event

权限、数据与广告说明

  • Android Demo 在 manifest.json 中声明 android.permission.INTERNET,用于实盘模式请求行情;该权限不是危险权限。
  • iOS 不需要额外申请系统权限。
  • 插件自身不采集、不存储、不上传用户数据,只渲染宿主传入的数据。
  • 插件不包含广告。
  • Demo 的 Binance 网络请求由示例页面发起,不属于插件的数据采集行为。

打包与发布

  • 本地调试必须使用包含 chen-kchart 的自定义基座,标准基座不包含原生产物。
  • 更新 UTS 或原生产物后,旧基座不会自动更新,必须重新制作基座或重新打包。
  • Android manifest.json 中只保留一条 android.permission.INTERNET,避免 HBuilderX 报权限重复。
  • 不要删除 utssdk/app-android/libs 或 utssdk/app-ios/Frameworks 中的文件。
  • 发布插件前,在 HBuilderX 中右键 uni_modules/chen-kchart/package.json,选择“发布到插件市场”。
  • 插件类型选择“UTS 插件 / uni-app 兼容模式组件”。
  • 按插件市场要求,将 package.json 的 id 调整为“作者 ID-插件名称”,并确保 package.json 与 changelog.md 的发布版本一致。

常见问题

1. 页面空白或组件完全不显示

依次检查:

  1. 页面是否为 .nvue;
  2. <chen-kchart> 是否设置了明确的宽度和高度;
  3. 是否重新制作并选择了包含当前插件的自定义基座;
  4. 真机系统版本是否满足 Android API 24 或 iOS 13.0;
  5. 是否收到组件的 ready 或 error 事件。

2. 只显示一条线,没有正常蜡烛图

通常是复杂数组跨 UTS 边界后元素变成 {}。不要直接传 :data="bars",改用:

<chen-kchart :dataJson="JSON.stringify(bars)" />

实时更新使用:

this.$refs.chart.updateLastDataJson(JSON.stringify(bar))

同时确认每根数据都包含有效的 time/open/high/low/close/vol,且价格没有被传成 undefined、null 或非数字字符串。

3. 修改插件后真机仍是旧效果

UTS 原生组件、Java/Swift 代码产物都编译在基座内。修改这些内容后仅刷新页面不够,需要重新制作自定义基座,并确认运行时选择的是新基座。

4. 实盘模式无法加载

检查网络、Android 的 INTERNET 权限及 Binance 接口在当前网络环境中的可访问性。实盘请求失败时,当前 Demo 会自动切回模拟数据;该问题不影响插件使用业务方自行提供的行情。

5. 图表初始化后被重复刷新

同一种数据选择一种更新路径:响应式更新 dataJson,或调用 Ref 方法。不要在同一个行情回调中同时修改完整数组并调用 updateLastDataJson()。

相关文档

技术支持

如有接入问题、功能需求或商业合作,请添***:Chen-Taurus-0510,添加时请备注 KChart。

隐私、权限声明

1. 本插件需要申请的系统权限列表:

无

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

无

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

无

暂无用户评论。