统一限流闸
所有外部请求经过一个统一的闸门:限制并发数、按数据源设置最小请求间隔、失败后进入冷却、连续失败则熔断。按数据源互相隔离,一个源出问题不会拖垮其它源。
首页 / 技术能力
技术能力
这一页写给技术评估的人看:用了什么、为什么这么选、有哪些硬约束,以及哪些地方我们承认做不到。
做金融数据软件的难点不在界面,而在三件事:数据可不可信、 断网或接口异常时还能不能用、算出来的东西能不能复现。 下面按这三件事说明我们的做法。
技术栈
全部为业界通用的成熟组件,不引入小众框架,便于长期维护与交接。
| 层面 | 选型 | 说明 |
|---|---|---|
| 界面框架 | .NET 8 + WPF + CommunityToolkit.Mvvm | 桌面交互与性能;MVVM 让界面逻辑可被单元测试覆盖。 |
| 代码组织 | Modules / Services / Models / Indicators | 每个业务板块自含界面与逻辑;共享服务统一收敛,新增功能不影响其它板块。 |
| 图表 | OxyPlot.Wpf + WebView2 | K 线主图用 native 图表渲染;专业图表模式用内嵌浏览器加载本地化的图表脚本,离线可用。 |
| 本地存储 | SQLite(Microsoft.Data.Sqlite,WAL) | 单文件、免安装;写操作走单写者队列,避免并发写冲突。 |
| 回测 | Python 3.9+ + backtrader(按需) | 回测生态成熟。这一块不随程序打包:目标机自己装一次 Python 与依赖即可,不做回测的机器不用装。界面通过子进程调用,配了依赖探测(缺了按钮直接置灰)、全局锁与超时中断。 |
| 行情来源 | 东方财富 / 新浪 / 腾讯(基金走天天基金) | 公开接口;多源互为备份,单源不可信自动换源,逐行标注数据来源与时间。 |
| 日志 | Serilog | 滚动文件日志,出问题能查;三套环境(生产/测试/开发)的配置、数据库与日志相互隔离。 |
| 发布门禁 | 自动化自检 | 五个工程编译通过、每个程序真启动一遍并扫运行日志里的致命错误、文案过一遍合规用词扫描,任一项不过就不出版本。 |
| 外部依赖 | WebView2 运行时、网络 | 内嵌图表页需要 WebView2(缺了只影响那一页);已发布的是自包含单文件,不需要另装 .NET 运行时。回测另需本机 Python。 |
第一件事
金融数据软件最怕的是"看起来正常但其实数据是错的"。我们在这上面花的力气最多。
行情全部来自公开接口。外部源失败时必须提示,不允许回退到模拟数据,也不允许用报价数据拼凑 K 线。拿不到就说拿不到,界面上直接说明。
同一只标的会在多个数据源之间比对价格、成交量与交易时段是否合理。主源数据不可信时自动切换到备用源。成交量明显异常的记录会被标记,并且不喂给评分与 AI 归纳。
每条行情都带数据时间。数据过期时界面显示提示条与「截至时间」,不把昨天的价格当成今天的现价展示。
缓存键包含标的、市场、周期与复权方式四个要素,避免不同口径的数据串用。不同周期用不同的过期时间,并对并发请求做合并,防止同一份数据被重复拉取。
第二件事
公开行情接口有频率限制,也会偶尔失败。这不是异常情况,是常态,必须当成常态来设计。
所有外部请求经过一个统一的闸门:限制并发数、按数据源设置最小请求间隔、失败后进入冷却、连续失败则熔断。按数据源互相隔离,一个源出问题不会拖垮其它源。
界面定时刷新只是重绘本地缓存,真实网络请求另有更长的最小间隔。这样"表上的数字一直在动"不等于"一直在打接口",避免触发接口方的频率限制。
数据源异常时状态栏明确提示是哪个源、什么问题、什么时候重试。宁可显示"这块数据暂时取不到",也不显示一个看起来正常的错数。
已下载的 K 线、已保存的研究记录、回测功能都可以离线使用。行情刷新与 AI 对话需要联网,断网时页面会说明。
所有写数据库的操作排成一条队列,由单一写入者执行。避免多个界面同时写导致锁等待或数据损坏。
内嵌浏览器控件在用完后显式释放;长列表使用虚拟化。长时间开着不用的页面不会一直占用内存。
第三件事
一个数字如果换台机器就算不出来,那它就不能作为判断依据。
技术指标与统计计算只用语言自带的标准库实现,不引入来源不明的计算库。同一份输入在不同机器上得到同一份结果。
回测输出的不只是收益率和最大回撤,还包括这次回测的参数、区间、手续费与周期,一共十二项绩效。报告里记录了本次运行的配置,便于事后核对与对比。
发布前每个程序都要真启动一遍(各 15 秒),只扫这一次运行新写入的日志,出现致命错误、未处理异常或数据库错误就判不通过。早先只看"截图文件在不在",结果是软件其实已经起不来了也照样过关,所以改成了真启动。
生产、测试、开发环境的配置、数据库与日志完全分开,界面上用标记区分,避免拿测试数据当真实结果。
结构
分层的目的是让"数据怎么来的"这件事始终可追。
如实说明
写在这里,是为了避免合作方按错误的预期来谈需求。
已知限制
以下是我们清楚知道、目前没有解决的问题可核对
如果你在评估是否合作,这些点可以直接要求我们当场演示或提供材料。
技术沟通
把场景说清楚,我们按你的问题回答,不绕。
可以直接发邮件到 2392654341@qq.com, 或到首页的联系表单留下联系方式与问题。
评估性提问建议附上:目标平台、数据来源、使用者人数、是否需要私有化部署。这些信息能让我们给出更具体的答复。