基于 Wails v2 + Vue 3 + ECharts 构建的跨平台股票 K 线分析工具

14 阅读6分钟

K 线 - 中国股市 K 线图桌面应用

一款基于 Wails v2 + Vue 3 + ECharts 构建的跨平台股票 K 线分析工具,支持实时查询、交互式图表展示和技术指标分析。

Go Wails Vue License


📖 目录


🚀 项目简介

K 线是一款专注于中国 A 股市场的轻量级桌面应用程序。它整合了新浪财经数据接口,提供流畅的 K 线图可视化体验,支持均线叠加显示和交互缩放功能。

核心亮点

  • 原生性能:基于 Go 后端,启动速度快,资源占用低
  • 跨平台:支持 Windows/macOS/Linux,一套代码多端运行
  • 离线缓存:股票字典本地存储,减少网络请求
  • 实时更新:直连新浪财经 API,获取最新行情数据

✨ 功能特性

股票查询

  • 📝 智能搜索:支持股票代码或名称模糊匹配
  • 即时联想:输入时自动补全建议列表
  • 💾 本地缓存:股票字典持久化存储,首次加载后无需联网

K 线图展示

  • 📊 蜡烛图:标准 OHLC(开盘价/最高价/最低价/收盘价)展示
  • 📈 技术指标:内置 MA5、MA10、MA30 移动平均线
  • 🎯 交叉提示:十字光标精准定位,显示详细数值

交互操作

  • 🔍 缩放控制:滑块调节时间范围,鼠标滚轮快捷缩放
  • 🔄 刷新数据:一键重新获取最新行情
  • 📐 自适应布局:窗口大小变化自动重绘图表

🏗️ 技术架构

整体架构图

┌─────────────────────────────────────────────────────────┐
│                    Wails Desktop App                     │
├──────────────────────────┬──────────────────────────────┤
│       Frontend           │          Backend             │
│      (Vue.js 3)          │            (Go)              │
│                          │                              │
│  ┌──────────────────┐    │  ┌─────────────────────────┐ │
│  │  Element Plus    │    │  │  HTTP Client            │ │
│  │  UI Components   │◄──►│  │  API Integration        │ │
│  └──────────────────┘    │  └─────────────────────────┘ │
│  ┌──────────────────┐    │  ┌─────────────────────────┐ │
│  │  ECharts         │    │  │  LRU Cache (gcache)     │ │
│  │  Chart Engine    │    │  │  Data Persistence       │ │
│  └──────────────────┘    │  └─────────────────────────┘ │
└──────────────────────────┴──────────────────────────────┘
                                │
                    ┌───────────┴───────────┐
                    ▼                       ▼
          ┌─────────────────┐    ┌─────────────────┐
          │ Sina Finance    │    │ Local File DB   │
          │ API (External)  │    │ (JSON Format)   │
          └─────────────────┘    └─────────────────┘

技术栈详情

层级技术版本说明
框架Wailsv2.5.1前端与 Go 后端桥接
后端语言Go1.18+高性能系统编程
前端框架Vue.js3.2.37渐进式 JS 框架
UI 组件库Element Plus2.2.28基于 Vue 3 的组件库
图表引擎ECharts5.4.1Apache 可视化库
构建工具Vite3.0.7下一代前端工具链
缓存gcachev0.0.2Go LRU 缓存实现
日志logrusv1.9.0结构化日志库

📦 快速开始

环境要求

  • Go 1.18 或更高版本
  • Node.js 16+ 和 npm
  • Wails CLI (go install github.com/wailsapp/wails/v2/cmd/wails@latest)

安装步骤

# 1. 克隆项目
git clone <repository-url>
cd stock-gui

# 2. 安装 Go 依赖
go mod download

# 3. 安装前端依赖
cd frontend
npm install
cd ..

# 4. 启动开发模式
wails dev

# 5. 构建生产版本
wails build

构建选项

# 标准构建
wails build

# 使用 UPX 压缩减小二进制体积
wails build -upx

# 清理并重新构建
wails build -clean

# 同时启用 UPX 和清理
wails build -upx -clean

📚 使用说明

界面布局

┌────────────────────────────────────────────────────┐
│  [🔍 股票搜索框] [🔄 刷新按钮]                     │
│                                                    │
│                                                    │
│            ┌──────────────────────┐               │
│            │                      │               │
│            │                      │               │
│            │      K 线图区域       │               │
│            │                      │               │
│            │                      │               │
│            │                      │               │
│            └──────────────────────┘               │
│                                                    │
│  缩放:[====●======] 5% ~ 100%                    │
└────────────────────────────────────────────────────┘

操作流程

  1. 搜索股票:在搜索框输入股票代码(如 600519)或名称(如 贵州茅台
  2. 选择标的:从下拉列表中点击选择目标股票
  3. 查看 K 线:图表自动加载并展示历史行情数据
  4. 交互分析
    • 移动鼠标查看具体日期价格信息
    • 拖动滑块调整时间跨度
    • 滚动鼠标滚轮快速缩放
  5. 刷新数据:点击刷新按钮获取最新行情

🔌 API 设计

外部数据源

1. 股票字典接口
GET http://api.jinshuyuan.net/get_stk_dic

响应格式:

[
  {"code": "000001", "name": "平安银行"},
  {"code": "000002", "name": "万科 A"},
  ...
]
2. K 线数据接口
GET http://money.finance.sina.com.cn/quotes_service/api/json_v2.php/CN_MarketData.getKLineData
  ?symbol=${symbol}&scale=${scale}&ma=${ma}

参数说明:

参数类型必填说明
symbolstring股票代码,如 sh600519
scaleint周期(默认 5 分钟),1=日 K, 5=5 分钟等
mastring均线配置,如 MA5,MA10,MA30

响应格式:

{
  "data": {
    "close": ["1700.00", "1705.50", ...],
    "date": ["2024-01-01", "2024-01-02", ...],
    "open": ["1695.00", "1700.00", ...],
    "high": ["1710.00", "1715.00", ...],
    "low": ["1690.00", "1698.00", ...],
    "volume": ["1000000", "1200000", ...],
    "averages": {"MA5": [...], "MA10": [...], "MA30": [...]}
  }
}

Go 后端方法暴露

方法参数返回值说明
StockList(query)搜索关键词[]Stock返回匹配的股票列表
StockData(symbol)股票代码*KlineData返回 K 线及均线数据

📁 项目结构

stock-gui/
├── main.go                          # 应用入口,Wails 初始化
├── app.go                           # 业务逻辑层(Go)
├── go.mod                           # Go 模块依赖
├── go.sum                           # 依赖校验
├── wails.json                       # Wails 项目配置
├── README.md                        # 项目文档
├── stock.db                         # 股票字典缓存(运行时生成)
├── build/                           # 构建资源
│   ├── appicon.png                  # 应用图标
│   └── windows/
│       ├── icon.ico                 # Windows 图标
│       ├── info.json                # 可执行文件元数据
│       └── wails.exe.manifest       # Windows 清单文件
└── frontend/                        # Vue.js 前端
    ├── package.json                 # NPM 依赖
    ├── vite.config.js               # Vite 配置
    ├── index.html                   # HTML 入口
    └── src/
        ├── main.js                  # Vue 应用初始化
        ├── App.vue                  # 根组件
        ├── style.css                # 全局样式
        └── components/
            └── StockShow.vue        # K 线图表主组件

👨‍💻 开发指南

调试模式

# 启动开发服务器(带热重载)
wails dev

访问 http://localhost:34115 可在浏览器中调试前端,同时保留对 Go 方法的完整访问能力。

代码组织建议

Go 后端(app.go)

type App struct {
    ctx    context.Context
    cache  gcache.Cache[string, *[]Stock]  // LRU 缓存
    dbPath string                          // 数据库文件路径
    mu     sync.Mutex                      // 并发锁
}

// 导出给前端调用的方法
func (a *App) StockList(query string) ([]Stock, error)
func (a *App) StockData(symbol string) (*KlineData, error)

Vue 前端(StockShow.vue)

<script setup>
import { reactive, onMounted, onUnmounted } from 'vue'
import * as echarts from 'echarts'

const state = reactive({
  searchQuery: '',
  currentSymbol: null,
  chartData: null,
  zoomRange: [0, 100]
})

let chartInstance = null

onMounted(() => {
  chartInstance = echarts.init(dom, 'svg')
  window.addEventListener('resize', handleResize)
})

onUnmounted(() => {
  chartInstance.dispose()
  window.removeEventListener('resize', handleResize)
})
</script>

⚡ 性能优化

已实施的优化措施

优化项实现方式效果
LRU 缓存gcache 1000 条容量减少重复 API 请求
文件持久化JSON 格式本地存储冷启动速度提升
缓存过期1 小时 TTL平衡数据新鲜度与性能
SVG 渲染ECharts SVG 模式高分辨率屏幕适配
GOMAXPROCS动态设置 CPU 核数充分利用多核性能
UPX 压缩可选构建选项二进制体积减少 50%+

潜在优化方向

  • 增量数据更新(WebSocket 推送)
  • 更多技术指标(MACD、KDJ、BOLL)
  • 多股票对比视图
  • 自定义均线参数
  • 导出图表为图片/PDF

❓ 常见问题

Q: 为什么搜索没有结果?

A: 可能是以下原因:

  1. 网络连接问题,无法获取股票字典
  2. 输入的代码或名称不存在于数据库中
  3. 检查 stock.db 文件是否生成成功

Q: K 线图加载失败怎么办?

A:

  1. 确认股票代码格式正确(如 sh600519sz000001
  2. 检查是否能访问新浪财经 API
  3. 查看控制台日志获取详细错误信息

Q: 如何添加新的技术指标?

A:

  1. frontend/src/components/StockShow.vue 中找到 ECharts 配置
  2. series 数组中添加新的折线系列
  3. 计算对应的指标数据(可在 Go 后端或 Vue 前端实现)

Q: 打包后的程序图标不显示?

A: 确保 build/windows/info.json 中的图标路径正确,并重新执行 wails build


📄 许可证

本项目采用 MIT 许可证。详见 LICENSE 文件。


🙏 致谢

  • Wails - 优秀的 Go + Web 桌面应用框架
  • Vue.js - 渐进式 JavaScript 框架
  • ECharts - 强大的可视化库
  • 新浪财经 - 行情数据提供者

Made with ❤️ using Go and Vue.js