首页 / 技术能力

技术能力

桌面金融数据软件是怎么做出来的

这一页写给技术评估的人看:用了什么、为什么这么选、有哪些硬约束,以及哪些地方我们承认做不到。

做金融数据软件的难点不在界面,而在三件事:数据可不可信、 断网或接口异常时还能不能用、算出来的东西能不能复现。 下面按这三件事说明我们的做法。

技术栈

用了什么

全部为业界通用的成熟组件,不引入小众框架,便于长期维护与交接。

五套软件共用的技术构成 V1.0
层面选型说明
界面框架.NET 8 + WPF + CommunityToolkit.Mvvm桌面交互与性能;MVVM 让界面逻辑可被单元测试覆盖。
代码组织Modules / Services / Models / Indicators每个业务板块自含界面与逻辑;共享服务统一收敛,新增功能不影响其它板块。
图表OxyPlot.Wpf + WebView2K 线主图用 native 图表渲染;专业图表模式用内嵌浏览器加载本地化的图表脚本,离线可用。
本地存储SQLite(Microsoft.Data.Sqlite,WAL)单文件、免安装;写操作走单写者队列,避免并发写冲突。
回测Python 3.9+ + backtrader(按需)回测生态成熟。这一块不随程序打包:目标机自己装一次 Python 与依赖即可,不做回测的机器不用装。界面通过子进程调用,配了依赖探测(缺了按钮直接置灰)、全局锁与超时中断。
行情来源东方财富 / 新浪 / 腾讯(基金走天天基金)公开接口;多源互为备份,单源不可信自动换源,逐行标注数据来源与时间。
日志Serilog滚动文件日志,出问题能查;三套环境(生产/测试/开发)的配置、数据库与日志相互隔离。
发布门禁自动化自检五个工程编译通过、每个程序真启动一遍并扫运行日志里的致命错误、文案过一遍合规用词扫描,任一项不过就不出版本。
外部依赖WebView2 运行时、网络内嵌图表页需要 WebView2(缺了只影响那一页);已发布的是自包含单文件,不需要另装 .NET 运行时。回测另需本机 Python。

第一件事

让数据可信,而不是让界面好看

金融数据软件最怕的是"看起来正常但其实数据是错的"。我们在这上面花的力气最多。

不造假

行情全部来自公开接口。外部源失败时必须提示,不允许回退到模拟数据,也不允许用报价数据拼凑 K 线。拿不到就说拿不到,界面上直接说明。

多源逐只校验

同一只标的会在多个数据源之间比对价格、成交量与交易时段是否合理。主源数据不可信时自动切换到备用源。成交量明显异常的记录会被标记,并且不喂给评分与 AI 归纳。

标注数据时间

每条行情都带数据时间。数据过期时界面显示提示条与「截至时间」,不把昨天的价格当成今天的现价展示。

分级缓存

缓存键包含标的、市场、周期与复权方式四个要素,避免不同口径的数据串用。不同周期用不同的过期时间,并对并发请求做合并,防止同一份数据被重复拉取。

第二件事

接口会抽风,软件要扛得住

公开行情接口有频率限制,也会偶尔失败。这不是异常情况,是常态,必须当成常态来设计。

统一限流闸

所有外部请求经过一个统一的闸门:限制并发数、按数据源设置最小请求间隔、失败后进入冷却、连续失败则熔断。按数据源互相隔离,一个源出问题不会拖垮其它源。

界面刷新与取数分层

界面定时刷新只是重绘本地缓存,真实网络请求另有更长的最小间隔。这样"表上的数字一直在动"不等于"一直在打接口",避免触发接口方的频率限制。

坏了要能看出来

数据源异常时状态栏明确提示是哪个源、什么问题、什么时候重试。宁可显示"这块数据暂时取不到",也不显示一个看起来正常的错数。

离线可用范围

已下载的 K 线、已保存的研究记录、回测功能都可以离线使用。行情刷新与 AI 对话需要联网,断网时页面会说明。

写库不打架

所有写数据库的操作排成一条队列,由单一写入者执行。避免多个界面同时写导致锁等待或数据损坏。

按需释放资源

内嵌浏览器控件在用完后显式释放;长列表使用虚拟化。长时间开着不用的页面不会一直占用内存。

第三件事

算出来的结果要能复现

一个数字如果换台机器就算不出来,那它就不能作为判断依据。

算法不用第三方计算包

技术指标与统计计算只用语言自带的标准库实现,不引入来源不明的计算库。同一份输入在不同机器上得到同一份结果。

参数与区间一起记录

回测输出的不只是收益率和最大回撤,还包括这次回测的参数、区间、手续费与周期,一共十二项绩效。报告里记录了本次运行的配置,便于事后核对与对比。

真启动才算过

发布前每个程序都要真启动一遍(各 15 秒),只扫这一次运行新写入的日志,出现致命错误、未处理异常或数据库错误就判不通过。早先只看"截图文件在不在",结果是软件其实已经起不来了也照样过关,所以改成了真启动。

三套环境隔离

生产、测试、开发环境的配置、数据库与日志完全分开,界面上用标记区分,避免拿测试数据当真实结果。

结构

程序的分层

分层的目的是让"数据怎么来的"这件事始终可追。

界面层 · Views / ViewModels 工作台 · 自选 · 行情 · K 线 · 回测 · 基金 · AI · 研究 · 设置 业务模块层 · Modules/<板块> 每个板块自含界面与逻辑, 板块之间不互相调用内部实现 服务层 · Services 行情聚合与校验 · 数据库访问(单写者队列) · 模型服务 · 定时任务 · 通知 · 回测子进程 · 配置 数据层 SQLite 本地库(WAL) 运行日志 · 配置(不含密钥) 回测脚本(运行时按需自装) 外部接口(统一走限流闸) 东方财富 / 新浪 / 腾讯(基金:天天基金) 模型服务(使用者自填地址与密钥) 通知渠道(飞书 / 钉钉 / 本机) 箭头表示调用方向; 外部接口一律经服务层的限流闸, 界面不直接发请求
分层结构示意。实际实现随版本演进,以交付的软件为准。

如实说明

目前做不到的几件事

写在这里,是为了避免合作方按错误的预期来谈需求。

已知限制

以下是我们清楚知道、目前没有解决的问题
  • 只能跑在 Windows 上。界面框架决定了这一点,目前没有 macOS 或 Linux 版本。若需要跨平台,需要另起一套界面实现。
  • 行情依赖第三方公开接口。这些接口随时可能调整或加强限制。我们做了多源与限流,但无法保证它们长期稳定,也无法承诺任何服务水平。
  • 不提供全市场历史数据。只按需拉取并缓存关注的标的与周期,首次查看某个长周期图表时需要等待下载。
  • AI 功能要使用者自己准备模型服务。我们只做协议对接,不代管密钥,也不对模型的输出内容负责。模型输出必须经过使用者的判断。
  • 没有服务端,因此没有多设备同步。数据在本机,换一台电脑就是一套新数据。选择本机优先是为了让研究内容不离开使用者的机器。
  • 自动化程度有限。当前只做了定时任务与表单化的筛选,没有可视化的策略编排界面。

可核对

上面的说法都能验

如果你在评估是否合作,这些点可以直接要求我们当场演示或提供材料。

可以要求我们现场演示

  • 拔掉网线,确认已缓存的图表与回测仍可用,且界面明确提示数据时间;
  • 故意填一个错误的模型服务地址,确认失败提示是清楚的,而不是静默失败;
  • 把回测参数抄一遍在另一台机器上跑,核对十二项绩效是否一致;
  • 在数据源返回异常时查看状态栏提示,确认没有回退到模拟数据。

可以提供书面材料

  • 软件著作权登记相关材料(名称、版本、著作权人);
  • 运行环境与部署说明;
  • 模块清单与功能边界说明(即本页与产品页的内容);
  • 数据来源清单(不包含任何使用者数据与密钥)。

技术沟通

有具体的技术问题想问

把场景说清楚,我们按你的问题回答,不绕。

可以直接发邮件到 2392654341@qq.com, 或到首页的联系表单留下联系方式与问题。

评估性提问建议附上:目标平台、数据来源、使用者人数、是否需要私有化部署。这些信息能让我们给出更具体的答复。