You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Socket向Trading Vue.js的DataCube添加数据并实时更新图表?

Trading Vue.js 实时数据更新(Socket 实现)

基础代码回顾

<template>
<trading-vue :data="dc" :extensions="ext"/>
</template>
<script>

import TradingVue from 'trading-vue-js'
import XP from 'tvjs-xp'
import { DataCube } from 'trading-vue-js'

export default {
    name: 'app',
    components: { TradingVue },
    data() {
        return {
            ext: Object.values(XP),
            dc: new DataCube({
                // 初始化K线数据结构:[时间戳, 开盘价, 最高价, 最低价, 收盘价, 成交量]
                ohlcv: [
                    [1620000000000, 50, 60, 45, 55, 1000]
                ]
            })
        }
    }
}
</script>

问题1:通过Socket向DataCube添加新数据

核心是建立Socket连接,在消息回调中调用DataCube的append方法添加符合格式的新数据,步骤如下:

  1. 在组件mounted钩子中创建Socket连接(以WebSocket为例)
  2. 监听Socket的message事件,解析收到的实时数据
  3. 调用dc.append(序列名称, 新数据)完成添加

实现代码示例

<script>
// ... 导入部分不变
export default {
    // ... 其他配置不变
    mounted() {
        // 替换为你的实时数据Socket地址
        const socket = new WebSocket('ws://your-realtime-server.com')
        
        socket.onmessage = (event) => {
            // 解析Socket返回的单条K线数据,格式需与初始化的ohlcv一致
            const newKline = JSON.parse(event.data)
            // 向ohlcv序列添加新数据
            this.dc.append('ohlcv', newKline)
        }

        // 可选:处理连接关闭、错误
        socket.onclose = () => console.log('Socket连接关闭')
        socket.onerror = (err) => console.error('Socket错误:', err)
    }
}
</script>

问题2:监听实时数据实现图表实时更新

Trading Vue.js的DataCube自带响应式特性,修改数据后图表会自动更新。需区分两种常见场景处理:

场景1:添加新的已闭合K线

直接用append方法添加完整K线数据:

// 新的完整K线数据
const newClosedKline = [1620003600000, 55, 65, 52, 60, 1200]
this.dc.append('ohlcv', newClosedKline)

场景2:更新当前未闭合的实时K线

用updateLast方法刷新最后一条K线的最新状态(比如实时价格、成交量):

// 当前K线的最新数据
const updatedCurrentKline = [1620003600000, 55, 68, 52, 63, 1500]
this.dc.updateLast('ohlcv', updatedCurrentKline)

完整综合实现

<script>
// ... 导入部分不变
export default {
    name: 'app',
    components: { TradingVue },
    data() {
        return {
            ext: Object.values(XP),
            dc: new DataCube({
                ohlcv: [
                    [1620000000000, 50, 60, 45, 55, 1000],
                    [1620003600000, 55, 65, 52, 60, 1200]
                ]
            }),
            socket: null
        }
    },
    mounted() {
        this.initSocket()
    },
    beforeUnmount() {
        // 组件销毁前关闭Socket,避免内存泄漏
        this.socket?.close()
    },
    methods: {
        initSocket() {
            this.socket = new WebSocket('ws://your-realtime-server.com')
            
            this.socket.onopen = () => {
                console.log('Socket连接成功')
                // 可选:向服务器发送订阅请求
                this.socket.send(JSON.stringify({ action: 'subscribe', symbol: 'BTC/USDT' }))
            }

            this.socket.onmessage = (event) => {
                const data = JSON.parse(event.data)
                // 根据后端返回的类型区分处理
                if (data.type === 'new') {
                    this.dc.append('ohlcv', data.kline)
                } else if (data.type === 'update') {
                    this.dc.updateLast('ohlcv', data.kline)
                }
            }
        }
    }
}
</script>

关键注意事项

  • 确保Socket返回的数据格式与DataCube中对应序列的格式完全匹配
  • 自定义指标序列(如折线图数据)的更新逻辑与K线完全一致,只需替换序列名称
  • 组件销毁时必须关闭Socket连接,避免无用连接占用资源

内容的提问来源于stack exchange,提问作者omurozbek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 10:01:20