当前位置: 首页 > news >正文

使用grafana v11 建立k线(蜡烛图)仪表板

先看实现的结果

沪铜主力合约 2025-02-12 的1分钟k线图

功能介绍: 左上角支持切换主力合约,日期,实现动态加载数据.

项目背景: 我想通过前端展示期货指定品种某1天的1分钟k线,类似tqsdk 的web_gui

生成图形化界面— TianQin Python SDK 3.7.8 文档

项目架构:

后端: fastapi

期货行情数据: tqsdk 获取k线序列数据 — TianQin Python SDK 3.7.8 文档

前端: Grafana v11.5.0, 需要的插件: Business Charts(支持ECharts的插件),infinity(请求api后端的接口)

Business Charts插件需求如下:

Requirements

  • The Business Charts panel 6.X requires Grafana 10 or Grafana 11.
  • Apache ECharts panel 5.X requires Grafana 9 or Grafana 10.
  • Apache ECharts panel 3.X and 4.X require Grafana 8.5 or Grafana 9.

部分细节介绍:

1. 变量设置:

点击Dashboard仪表板右上角的Settings

 

然后设置以下2个变量,

这里我用的是SQL语句查询出变量,需要添加一个数据库源,这里省略添加数据库源的步骤.也可以通过请求API接口实现.

引用变量时在名称前添加 $,如: $end_date

其中 main_continue的配置如下:主要就是设置 变量名称,以及对应SQL语句.

2. 指定品种的k线数据是通过tqsdk 以下接口获取的,官方连接在这里:获取k线序列数据 — TianQin Python SDK 3.7.8 文档

get_kline_serial(symbol: str | List[str]duration_seconds: intdata_length: int = 200adj_type: str | None = None**kwargs)→ DataFrame

3. infinity-datasource 数据源配置

假设GET请求

/kline/?main_continue=KQ.m%40SHFE.au&end_date=2025-02-11

接口返回的数据格式如下:

{
  "futures": [
              {
                "close": 76568,
                "close_interest": 171959,
                "create_time": "2025-02-12T07:06:18.427622+00:00",
                "days": 5,
                "duration_seconds": 60,
                "end_date": "2025-02-12",
                "high": 76616,
                "hour_minute": "21:00:00",
                "id": 24121,
                "low": 76520,
                "main_continue": "KQ.m@SHFE.cu",
                "open": 76568,
                "open_interest": 172210,
                "update_time": null,
                "volume": 1692
              },
              {
                "close": 76570,
                "close_interest": 171822,
                "create_time": "2025-02-12T07:06:18.427622+00:00",
                "days": 5,
                "duration_seconds": 60,
                "end_date": "2025-02-12",
                "high": 76608,
                "hour_minute": "21:01:00",
                "id": 24122,
                "low": 76534,
                "main_continue": "KQ.m@SHFE.cu",
                "open": 76568,
                "open_interest": 171959,
                "update_time": null,
                "volume": 800
              },
    ]
}

则需要参照如下配置infinity请求;

4. 可视化配置选择: Business Charts

Editor Mode 选择 Code

然后在Code 中粘贴下方的代码内容:

const upColor = '#ec0000';
const upBorderColor = '#8A0000';
const downColor = '#00da3c';
const downBorderColor = '#008F28';

context.panel.data.series.map((s) => {
  categories = s.fields.find((f) => f.name === 'hour_minute').values;
  open = s.fields.find((f) => f.name === 'open').values;
  close = s.fields.find((f) => f.name === 'close').values;
  low = s.fields.find((f) => f.name === 'low').values;
  high = s.fields.find((f) => f.name === 'high').values;
});

let values = open.map((item, index) => [item, close[index], low[index], high[index],]);

let data0 = { categoryData: categories, values: values }

return {
  tooltip: {
    trigger: 'axis',
    axisPointer: {
      type: 'cross'
    }
  },
  legend: {
    data: ['1分钟K线']
  },
  grid: {
    left: '10%',
    right: '10%',
    bottom: '15%'
  },
  xAxis: {
    type: 'category',
    data: data0.categoryData,
    boundaryGap: false,
    axisLine: { onZero: false },
    splitLine: { show: false },
    min: 'dataMin',
    max: 'dataMax'
  },
  yAxis: {
    scale: true,
    splitArea: {
      show: true
    }
  },
  series: [
    {
      name: '1分钟K线',
      type: 'candlestick',
      data: data0.values,
      itemStyle: {
        color: upColor,
        color0: downColor,
        borderColor: upBorderColor,
        borderColor0: downBorderColor
      },
    }
  ]
}

Code中的代码:重点就是通过

context.panel.data.series.map

获取到 infinity GET 请求并处理后的数据

完结撒花,以上就是通过 fastapi,grafana 实现的可视化k线(蜡烛图)功能.

相关文章:

  • 两个实用且热门的 Python 爬虫案例,结合动态/静态网页抓取和反爬策略,附带详细代码和实现说明
  • GoC题解(21) 725.画迷宫(下册第4课)
  • 一场因软件技术窃取引发的法律风暴
  • 2、树莓派5第一次开机三种方式:使用外设 / 使用网线 / 使用wifi
  • Matlab离线安装硬件支持包的方法
  • 《代码随想录》刷题笔记——回溯篇【java实现】
  • WEB安全--SQL注入--floor报错注入
  • 数据结构与算法-栈与队列的应用递归表达式求值
  • 当扩展屏显示【输入不支持】怎么解决?!
  • 当Ollama遇上划词翻译:我的Windows本地AI服务搭建日记
  • 一些常用的Yum源
  • 项目版本号生成
  • 嵌入式玩具--无人机字幕
  • 【C++】32.C++11​(4)
  • 了解module_driver宏
  • Flask中获取请求参数的一些方式总结
  • 什么是GraphQL?
  • Day45(补)【软考】2022年下半年软考软件设计师综合知识真题-计算机软件知识1
  • 电子制造企业数字化转型实战:基于Odoo构建MES平台的深度解决方案
  • DC-7靶机渗透测试全过程
  • 夜读丨读《汉书》一得
  • 兰州大学教授安成邦加盟复旦大学中国历史地理研究所
  • Manus向全球用户开放注册
  • 北京“准80后”干部兰天跨省份调任新疆生态环境厅副厅长
  • 火车站员工迟到,致出站门未及时开启乘客被困?铁路部门致歉
  • 被流量绑架人生,《人生开门红》能戳破网络时代的幻象吗