我用 Python 构建了一个迷你衍生品交易所。以下是我如何使用 Cursor 而不让它主导一切。
I’m sorry, but I can’t translate the article without the actual text. Could you please paste the content you’d like translated (excluding any code blocks or URLs you want to keep unchanged)? Once I have the text, I’ll provide a Simplified‑Chinese translation while preserving the original formatting.
动机
今年,我想在 AI 辅助编码方面提升自己,作为一名高级工程师,同时探索交易领域。我构建了一个纸上衍生品交易所,包含订单簿、限价单和市价单、撮合引擎以及仓位跟踪。技术栈是 Python、FastAPI 和 PostgreSQL。整个项目中我使用了 Cursor,但并不是那种“只输入提示即可生成完整应用”的方式。
规划
单页架构
我先打开了一个文档(而不是 IDE),写了一个包含以下内容的单一架构和项目文件:
- 仓库拆分 – 前端和后端始终分离,每个后端对应一个可部署单元。
- 仓库职责 – 交易所 API、演示 UI,以及未来游戏化集成的占位符。
- 技术选型 – FastAPI、PostgreSQL、Binance 公共 API 用于价格(尚未使用 Kafka)。
- 模块边界 –
core、market_data、orders、matching、positions、integration,每个模块都有明确的职责和公共接口。
那份文档成为了指导 Cursor 的计划。当 Cursor 建议将 UI 放在与 API 同一仓库时,我指回那份文档并说不。这本质上就是 Cursor 的 计划模式:在让代理编写代码之前,先完成设计和文件层面的计划。
架构
我选择了 模块化单体:一个服务,一个数据库,但严格的模块边界。每个模块都公开一个接口(例如 OrderService.place、OrderBook.add)。没有模块会导入其他模块的内部实现。
为什么选择模块化单体?
- 保持运营简单。
- 让我能够给 Cursor 分配非常聚焦的任务,例如 “实现
orders模块中的OrderService.place并将其连接到撮合引擎”,而不是 “构建完整的交易流程”。
实现细节
匹配引擎
匹配引擎是系统的核心。我希望实现价格‑时间优先级,支持限价单和市价单,并且能够在成交时更新持仓并可选地调用游戏化 API。
我将实现拆分为小的、可审查的步骤:
- 数据结构 – 定义
Order、Fill和OrderBook(按价格层级的买单和卖单)。我描述了期望的行为,并让 Cursor 实现了诸如add、insert、cancel、best_bid和best_ask等方法。 - 匹配逻辑 – 当下单时,从数据库加载订单簿(所有未完成的限价单),执行
book.add(order),并得到一个Fills列表。Cursor 生成了代码;我审查了成交如何应用到订单和持仓上。 - 持久化 – 订单和持仓存储在 PostgreSQL 中。每次下单和撤单操作时都会从数据库重新构建订单簿,避免了长期驻留的内存状态。此权衡在原型阶段更倾向于简洁性和正确性,而非超低延迟。
每一步都是一个聚焦的提示,具有明确的成功标准。当出现问题时(例如,maker 订单在成交后未更新),我会回滚、收紧计划并重新运行代理,而不是在聊天中无休止地修补。
保持提示可管理
我从不把整个代码库粘贴到提示中。相反,我把架构文档和 README 作为“规则”。我指示 Cursor 查看已有文件,例如:“在我们应用成交的地方添加集成调用,遵循 positions/service.py 中的相同模式”。Cursor 使用 grep 和语义搜索定位订单保存位置和持仓更新位置,使提示保持简短,且代理在我设定的边界内工作。
结果
- 限价单和市价单的订单簿。
- 持仓跟踪。
- 来自 Binance 的实时市场数据(无需 API 密钥)。
- 可选的在成交后向游戏化 API 发送 POST 请求。
- 包含架构图、系统设计说明和 API 表的 README。
- 用于本地开发的 Docker Compose 配置。
生产就绪检查清单
在认为项目已具备生产就绪条件之前,我会补充以下内容:
- 限流(例如,使用 Redis)。
- 对匹配引擎的全面单元测试(
OrderBook.add、insert、cancel)。 - 对订单下单、撤单以及订单簿重建的集成测试。
要点
- 首先编写架构和模块映射。
- 将实现拆分为小的、可审查的步骤。
- 为代理提供明确的边界和具体示例,而不是“构建所有内容”的请求。
- 当输出偏离规范时,回滚并完善计划。
结果是一个我可以在面试中解释的代码库,以及一个关于我如何利用 AI 而不让它主导设计的故事。
Repo Links
- Backend:
mini-derivatives-exchange– 包含 API、撮合引擎和数据库层。 - Frontend:
mini-exchange-ui– 一个演示 UI,用于调用 API。
两个仓库都包含带有架构图、API 文档和系统设计说明的 README。