1. 项目背景与功能
项目定位:
QuantDinger 旨在打造一个 Local-First(本地优先)的开源 AI 量化交易工作台。它被设计为 TradingView 和 QuantConnect 的私有化替代方案,核心理念是将数据所有权归还给用户。针对昂贵的 SaaS 平台痛点,它提供了一个集数据获取、AI 投研、策略回测、实盘交易于一体的自托管解决方案。

核心功能实体:
- 多源数据聚合: 统一封装了加密货币(CCXT)、美股(YFinance/Finnhub)、A 股(AkShare)的数据接口,提供标准化的 OHLCV(开高低收量)数据格式。
- 策略开发环境: 内置基于 Monaco Editor 的代码编辑器,支持 Python 语言编写策略。
- 可视化图表: 集成 TradingView 的 Lightweight Charts 库,用于 K 线展示和技术指标分析。
- LLM 辅助工具: 通过 API 调用外部大模型(OpenRouter),辅助生成代码片段或解读市场新闻(作为一个功能模块存在,而非系统核心)。
- 实盘/模拟交易: 支持对接交易所 API 进行订单路由和资产管理。





2. 技术选型与架构图
代码库目录结构(推断基于常见 Flask/Vue 项目):
QuantDinger/
├── backend_api_python/ # 后端核心代码
│ ├── app/
│ │ ├── routes/ # API 路由层 (Controller)
│ │ ├── services/ # 业务逻辑层 (Service)
│ │ ├── models/ # 数据库模型 (ORM)
│ │ └── utils/ # 工具类 (加密、日志等)
│ ├── quantdinger.db # SQLite 数据库文件
│ ├── requirements.txt # Python 依赖
│ └── run.py # Flask 启动入口
├── quantdinger_vue/ # 前端代码
│ ├── src/ # Vue 源码
│ └── package.json # Node 依赖
└── docker-compose.yml # 容器编排配置
技术栈详情:
- 前端: Vue.js 3, Vite, TypeScript, Lightweight Charts (K 线图), Element Plus (UI 组件)。
- 后端: Python Flask (Web 框架), SQLAlchemy (ORM), Pydantic (数据校验)。
- 数据适配层:
- ccxt: 处理 100+ 加密货币交易所的 REST/WebSocket 数据。
- akshare: 爬取 A 股财经数据。
- yfinance: 获取美股历史数据。
- 持久化: SQLite (轻量级文件数据库,无需额外部署 MySQL/PG)。
3. 数据库设计
项目采用 SQLite (quantdinger.db) 存储元数据,避免了繁重的数据库维护。主要数据表(Model)设计如下:
- users 表
- 用于基础的身份验证。
- 字段:id, username, password_hash, api_token。
- api_keys 表
- 存储交易所的访问凭证。
- 字段:id, exchange_name, api_key (AES 加密存储), secret_key (AES 加密存储), user_id。
- strategies 表
- 存储用户编写的策略代码及配置。
- 字段:id, name, code_content (Text 类型,存储 Python 源码), timeframe (如 '1h', '1d'), symbol (如 'BTC/USDT'), status (RUNNING/STOPPED)。
- logs / trade_history 表
- 记录策略运行时的信号和成交记录。
- 字段:id, strategy_id, timestamp, action (BUY/SELL), price, amount, message。
4. 核心模块实现详解
4.1 后端接口层 (app/routes)
基于 Flask Blueprint 实现 RESTful API,主要包含:
- Market Route (/api/market): 接收前端的时间范围、标的参数,调用数据服务层,返回 JSON 格式的 K 线数组。
- Strategy Route (/api/strategy):
- POST /save: 接收 Python 代码字符串并存入数据库。
- POST /run: 触发策略执行逻辑。
- GET /logs: 轮询读取策略运行日志。
- LLM Route (/api/llm): 作为一个透传代理,将前端的 Prompt 封装后转发给 OpenRouter API,并将返回的 Code 或 Text 传回前端。
4.2 数据适配服务 (app/services/data_factory.py)
这是一个典型的工厂模式实现,用于屏蔽不同数据源的差异:
- 定义统一接口 IDataSource,包含方法 fetch_ohlcv(symbol, timeframe, limit)。
- Crypto 实现类: 实例化 ccxt.binance() 或 ccxt.okx(),处理 API 签名和网络请求。
- Stock 实现类: 调用 akshare 的函数或 yfinance.download(),并将返回的 Pandas DataFrame 转换为统一的 [timestamp, open, high, low, close, volume] 列表格式。
4.3 策略执行引擎 (app/services/execution_engine.py)
这是系统的核心,负责运行用户的 Python 代码。
- 动态执行: 使用 Python 内置的 exec() 函数或 importlib 动态加载用户编写的代码字符串。
- 沙箱/上下文注入: 在执行 exec() 时,通过 locals 参数注入系统封装好的 API 对象(如 buy(), sell(), get_data()),使得用户代码可以直接调用这些函数而无需关心底层实现。
- 进程管理: 为了防止策略死循环阻塞 Web 服务,每个运行的策略通常由 multiprocessing 启动一个独立进程或线程来运行。
5. 部署运行步骤
项目依赖环境较为复杂(涉及 Python 数据科学库和 Node 环境),强烈建议使用 Docker。
- 环境配置:
- 在项目根目录创建 .env 文件。
- Backend 容器: 基于 python:3.10-slim,自动 pip install 依赖并启动 Flask (Gunicorn)。
- Frontend 容器: 基于 Nginx,构建 Vue 产物并托管静态文件,同时配置反向代理将 /api 请求转发给 Backend 容器。
- 访问:
- 浏览器访问 http://localhost:80 (或 docker-compose 中映射的端口)。
- 初始化管理员账号(首次启动时可能需要查看 docker logs 获取初始密码或手动创建)。
构建与启动:
# 利用 Docker Compose 编排前后端
docker-compose up -d --build
配置关键变量:
FLASK_APP=run.py FLASK_ENV=production SECRET_KEY=your_secure_key # 用于 Session 加密
OPENROUTER_API_KEY=sk-xxx # 如果不需要 LLM 功能可留空
6. 项目总结与优化方向
项目总结: QuantDinger 本质上是一个 Web 版的 Python 量化脚本运行器。它通过 Web 界面降低了 ccxt 和 pandas 的使用门槛,利用 SQLite 实现了轻量级的数据持久化。其去中心化的架构使得交易策略和 API 密钥完全掌握在用户手中,适合对隐私敏感且具备一定 Python 基础的个人交易者。
优化方向 (代码与架构层面):
- 安全性增强 (Sandboxing): 目前使用 exec() 执行用户代码存在安全风险。建议引入 Docker 里的 Docker (DinD) 或使用 gVisor 为每个策略分配独立的沙箱容器,防止恶意代码读取文件系统。
- 数据存储升级: SQLite 并不适合存储海量 Tick 级金融数据。建议引入 TimescaleDB 或 InfluxDB 替换 SQLite 作为行情数据的存储后端,提高查询效率。
- 事件驱动引擎: 目前架构偏向于简单的脚本轮询。建议重构为事件驱动 (Event-Driven) 架构,引入消息队列 (Redis/RabbitMQ),实现'行情更新 -> 触发事件 -> 策略响应 -> 交易执行'的低延迟链路。
- 代码复用模块化: 允许用户上传自定义的 Python 库或模块(.py 文件),而不仅仅是单文件脚本,以便复用复杂的指标计算逻辑。


