KLineChart 库生成一个股票K线图

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: 本文介绍如何使用 KLineChart 库结合 StockTV API 实现股票K线图,涵盖数据获取、图表初始化、样式定制与实时更新。提供完整代码示例,支持多股票切换与周期选择,助你快速构建交互式金融图表。(238字)

下面我将为您介绍如何使用 KLineChart 库生成一个股票K线图 Demo,并提供完整的代码示例和关键步骤说明。

🧰 准备工作

首先需要引入必要的 JavaScript 库,并准备好 StockTV API 密钥。

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>StockTV K线图实战Demo</title>
    <!-- 引入KLineChart库 -->
    <script src="https://cdn.dolphindb.cn/vendors/klinecharts/dist/umd/klinecharts.min.js"></script>
</head>
<body>
    <div id="k-line-chart" style="height: 600px; width: 100%;"></div>

    <script>
        // 配置参数
        const API_KEY = 'YOUR_API_KEY_HERE'; // 请替换为你的真实API密钥
        const API_BASE = 'https://api.stocktv.top';

        // 你的代码将在这里编写
    </script>
</body>
</html>

📡 获取股票K线数据

通过 StockTV API 获取股票数据需要两个步骤:先获取股票唯一ID,再请求K线数据。

// 配置股票参数
const symbol = 'AAPL'; // 股票代码
const interval = 'P1D'; // K线周期:日线

async function fetchKLineData() {
   
    try {
   
        // 1. 根据股票代码查询其唯一产品ID (pid)
        const listUrl = `${
     API_BASE}/stock/stocks?countryId=1&symbol=${
     symbol}&key=${
     API_KEY}`;
        const listResponse = await fetch(listUrl);
        const listData = await listResponse.json();

        if (listData.code !== 200 || listData.data.length === 0) {
   
            console.error('未找到该股票:', listData.message);
            return;
        }

        const stockPid = listData.data[0].id; // 获取股票的pid

        // 2. 使用pid请求历史K线数据
        const klineUrl = `${
     API_BASE}/stock/kline?pid=${
     stockPid}&interval=${
     interval}&key=${
     API_KEY}`;
        const klineResponse = await fetch(klineUrl);
        const klineData = await klineResponse.json();

        if (klineData.code === 200) {
   
            return klineData.data; // 返回数据用于绘图
        } else {
   
            console.error('获取K线数据失败:', klineData.message);
            return null;
        }
    } catch (error) {
   
        console.error('请求失败:', error);
        return null;
    }
}

⚙️ 初始化K线图表与数据转换

获取到数据后,需要将其转换为 KLineChart 可识别的格式并初始化图表。

// 初始化K线图容器
const chart = klinecharts.init('k-line-chart');

async function initChart() {
   
    const apiData = await fetchKLineData();
    if (!apiData) return;

    // 数据格式转换:将API返回的字段名映射为KLineChart要求的字段名
    const klineChartData = apiData.map(item => ({
   
        timestamp: item.time,   // 将 'time' 映射为 'timestamp'
        open: Number(item.open),
        high: Number(item.high),
        low: Number(item.low),
        close: Number(item.close),
        volume: Number(item.volume)
    }));

    // 按时间排序(防止API返回乱序)
    klineChartData.sort((a, b) => a.timestamp - b.timestamp);

    // 使用转换后的数据渲染图表
    chart.applyNewData(klineChartData);
    console.log('K线图初始化完成!');
}

// 执行初始化
initChart();

🎨 自定义样式与技术指标

KLineChart 支持丰富的样式自定义和技术指标添加。

// 设置样式选项
chart.setStyleOptions({
   
    candle: {
   
        type: 'candle_solid', // 蜡烛图类型
        bar: {
   
            upColor: '#26A69A', // 上涨颜色
            downColor: '#EF5350', // 下跌颜色
        },
        priceMark: {
    // 价格标记
            high: {
    show: true },
            low: {
    show: true }
        }
    },
    grid: {
    // 网格线
        show: true
    }
});

// 添加技术指标(如移动平均线MA)
chart.createIndicator('MA', false, {
    id: 'candle_pane' });
// 添加成交量指标
chart.createIndicator('VOL');

🔄 实现实时数据更新

对于金融应用,实时性很重要。以下是定时轮询的实现方式。

// 定时轮询更新函数
async function startPolling(pid) {
   
    setInterval(async () => {
   
        try {
   
            const klineUrl = `${
     API_BASE}/stock/kline?pid=${
     pid}&interval=${
     interval}&key=${
     API_KEY}`;
            const response = await fetch(klineUrl);
            const result = await response.json();

            if (result.code === 200 && result.data.length > 0) {
   
                const latestData = result.data[result.data.length - 1];
                const formattedData = {
   
                    timestamp: latestData.time,
                    open: Number(latestData.open),
                    high: Number(latestData.high),
                    low: Number(latestData.low),
                    close: Number(latestData.close),
                    volume: Number(latestData.volume)
                };

                // 增量更新图表
                chart.updateData(formattedData);
            }
        } catch (error) {
   
            console.error('实时更新失败:', error);
        }
    }, 5000); // 每5秒轮询一次
}

💡 完整示例代码

以下是整合所有功能的完整 HTML 示例。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>StockTV K线图Demo</title>
    <script src="https://cdn.dolphindb.cn/vendors/klinecharts/dist/umd/klinecharts.min.js"></script>
    <style>
        body {
     margin: 20px; font-family: Arial, sans-serif; }
        .controls {
     margin-bottom: 20px; }
        button {
     padding: 8px 15px; margin-right: 10px; cursor: pointer; }
    </style>
</head>
<body>
    <div class="controls">
        <h3>股票K线图示例</h3>
        <button onclick="loadData('AAPL')">苹果(AAPL)</button>
        <button onclick="loadData('MSFT')">微软(MSFT)</button>
        <select id="intervalSelect">
            <option value="P1D">日线</option>
            <option value="PT1H">1小时</option>
            <option value="PT15M">15分钟</option>
        </select>
    </div>

    <div id="k-line-chart" style="height: 600px; width: 100%;"></div>

    <script>
        const API_KEY = 'YOUR_API_KEY_HERE'; // 请替换为你的真实API密钥
        const API_BASE = 'https://api.stocktv.top';
        const chart = klinecharts.init('k-line-chart');

        // 设置默认样式
        chart.setStyleOptions({
    
            candle: {
    
                bar: {
    
                    upColor: '#26A69A',
                    downColor: '#EF5350',
                }
            }
        });

        async function loadData(symbol, interval = 'P1D') {
    
            if (!interval) interval = document.getElementById('intervalSelect').value;

            try {
    
                // 获取股票PID
                const listUrl = `${
      API_BASE}/stock/stocks?countryId=1&symbol=${
      symbol}&key=${
      API_KEY}`;
                const listResponse = await fetch(listUrl);
                const listData = await listResponse.json();

                if (listData.code !== 200 || listData.data.length === 0) {
    
                    alert('未找到该股票');
                    return;
                }

                const stockPid = listData.data[0].id;

                // 获取K线数据
                const klineUrl = `${
      API_BASE}/stock/kline?pid=${
      stockPid}&interval=${
      interval}&key=${
      API_KEY}`;
                const klineResponse = await fetch(klineUrl);
                const klineData = await klineResponse.json();

                if (klineData.code !== 200) {
    
                    alert('获取数据失败: ' + klineData.message);
                    return;
                }

                // 数据转换
                const chartData = klineData.data.map(item => ({
    
                    timestamp: item.time,
                    open: Number(item.open),
                    high: Number(item.high),
                    low: Number(item.low),
                    close: Number(item.close),
                    volume: Number(item.volume)
                })).sort((a, b) => a.timestamp - b.timestamp);

                // 渲染图表
                chart.applyNewData(chartData);
                chart.createIndicator('MA');
                chart.createIndicator('VOL');

            } catch (error) {
    
                console.error('Error:', error);
                alert('请求失败,请检查控制台日志');
            }
        }

        // 页面加载默认数据
        window.onload = () => loadData('AAPL');

        // 响应式调整大小
        window.addEventListener('resize', () => {
    
            chart.resize();
        });
    </script>
</body>
</html>

📋 关键注意事项

  1. API密钥安全:切勿将真实 API 密钥直接硬编码在前端代码中并上传到公开仓库。生产环境应通过后端服务器转发请求。

  2. 数据格式转换:StockTV API 返回的数据字段需要转换为 KLineChart 要求的格式,特别是时间戳字段的映射。

  3. 错误处理:完善的错误处理能提升应用健壮性,包括网络请求失败、API返回错误码等情况。

  4. 频率限制:遵守 StockTV API 的调用频率限制,避免过于频繁的请求。

这个Demo展示了如何使用 KLineChart 和 StockTV API 快速构建一个功能完整的股票K线图应用,您可以根据实际需求进一步扩展功能。

相关文章
|
9天前
|
数据采集 人工智能 安全
|
4天前
|
机器学习/深度学习 人工智能 前端开发
构建AI智能体:七十、小树成林,聚沙成塔:随机森林与大模型的协同进化
随机森林是一种基于决策树的集成学习算法,通过构建多棵决策树并结合它们的预测结果来提高准确性和稳定性。其核心思想包括两个随机性:Bootstrap采样(每棵树使用不同的训练子集)和特征随机选择(每棵树分裂时只考虑部分特征)。这种方法能有效处理大规模高维数据,避免过拟合,并评估特征重要性。随机森林的超参数如树的数量、最大深度等可通过网格搜索优化。该算法兼具强大预测能力和工程化优势,是机器学习中的常用基础模型。
298 164
|
3天前
|
机器学习/深度学习 自然语言处理 机器人
阿里云百炼大模型赋能|打造企业级电话智能体与智能呼叫中心完整方案
畅信达基于阿里云百炼大模型推出MVB2000V5智能呼叫中心方案,融合LLM与MRCP+WebSocket技术,实现语音识别率超95%、低延迟交互。通过电话智能体与座席助手协同,自动化处理80%咨询,降本增效显著,适配金融、电商、医疗等多行业场景。
311 155
|
11天前
|
SQL 自然语言处理 调度
Agent Skills 的一次工程实践
**本文采用 Agent Skills 实现整体智能体**,开发框架采用 AgentScope,模型使用 **qwen3-max**。Agent Skills 是 Anthropic 新推出的一种有别于mcp server的一种开发方式,用于为 AI **引入可共享的专业技能**。经验封装到**可发现、可复用的能力单元**中,每个技能以文件夹形式存在,包含特定任务的指导性说明(SKILL.md 文件)、脚本代码和资源等 。大模型可以根据需要动态加载这些技能,从而扩展自身的功能。目前不少国内外的一些框架也开始支持此种的开发方式,详细介绍如下。
857 6
|
5天前
|
机器学习/深度学习 人工智能 前端开发
构建AI智能体:六十九、Bootstrap采样在大模型评估中的应用:从置信区间到模型稳定性
Bootstrap采样是一种通过有放回重抽样来评估模型性能的统计方法。它通过从原始数据集中随机抽取样本形成多个Bootstrap数据集,计算统计量(如均值、标准差)的分布,适用于小样本和非参数场景。该方法能估计标准误、构建置信区间,并量化模型不确定性,但对计算资源要求较高。Bootstrap特别适合评估大模型的泛化能力和稳定性,在集成学习、假设检验等领域也有广泛应用。与传统方法相比,Bootstrap不依赖分布假设,在非正态数据中表现更稳健。
250 113