第一章:交易系统核心概念
做FPGA交易系统这些年,我经常被问到同一个问题:「一个交易系统到底长什么样?」
说白了,它就是个处理订单的流水线。从市场数据进来,到订单成交,再到结果返回,每一步都有讲究。今天我就把这几个核心概念掰开揉碎了讲给你听。
1.1 订单簿(Order Book)
订单簿是什么?你可以把它想象成一个实时更新的买卖挂单列表。买方出价(Bid),卖方要价(Ask),两边排队等着成交。
我个人习惯把订单簿分成三层来看:
- 价格层:每个价格点上的挂单数量
- 时间层:同一价格下,谁先挂单谁优先
- 类型层:限价单、市价单、冰山单……各有各的玩法
关键指标:买卖价差(Spread)和订单深度(Depth)。价差越小,流动性越好;深度越厚,大单冲击越小。
我在项目中遇到过一个问题:订单簿更新频率太高,软件处理不过来。后来改用FPGA做硬件解析,延迟直接从微秒级降到了纳秒级。嗯,这就是我们做FPGA交易系统的意义所在。
1.2 撮合引擎(Matching Engine)
撮合引擎,说白了就是订单的「红娘」。它负责把买单和卖单配对,然后生成成交记录。
撮合规则其实不复杂:
- 价格优先:买单出价高的先成交,卖单要价低的先成交
- 时间优先:价格相同,先挂单的先成交
- 数量匹配:部分成交、全部成交、还是拒绝?
避坑指南:我曾经在撮合逻辑里忽略了一种边界情况——当两个订单价格相同但数量交叉时,处理顺序错了会导致死锁。后来我加了个超时保护,才彻底解决。
你想想看,撮合引擎每秒可能要处理几十万笔订单。用CPU做?延迟太高。用FPGA做?流水线一铺,一拍一个结果。这就是为什么高频交易公司都在抢FPGA工程师。
1.3 市场数据(Market Data)
市场数据就是交易所发出来的实时行情。包括:
- 逐笔成交(Trade)
- 订单簿快照(Snapshot)
- 订单簿增量更新(Incremental Update)
- 统计指标(开盘价、收盘价、成交量等)
这里有个坑:数据格式。不同交易所用的协议不一样,有的是二进制,有的是FIX/FAST,还有的是自定义格式。我建议你一开始就设计一个统一的数据接口层,把解析逻辑独立出来。这样换交易所时,只需要改解析模块,不用动核心逻辑。
注意:市场数据有延迟。从交易所发出,到网络传输,再到解析处理,每一步都在消耗时间。FPGA的优势就在于——它可以在数据到达的瞬间完成解析,几乎零延迟。
1.4 低延迟设计原则
做FPGA交易系统,核心就四个字:低延迟。我总结了几个原则:
| 原则 | 说明 | 我的经验 |
|---|---|---|
| 流水线化 | 把处理拆成多个阶段,并行执行 | 我曾经把单阶段处理改成5级流水线,吞吐量提升了4倍 |
| 减少握手 | 能不握手就不握手,用valid/ready信号控制 | 握手多了,延迟就上去了,能省则省 |
| 避免回环 | 组合逻辑回环是FPGA大忌 | 有一次我写了个回环,仿真没问题,上板直接死机 |
| 资源换速度 | 用更多的LUT和BRAM换更低的延迟 | FPGA就是用来堆资源的,别心疼 |
为什么会这样?因为FPGA不像CPU那样有缓存、分支预测这些「不确定」的东西。FPGA的延迟是确定性的——你写多少级流水线,延迟就是多少个时钟周期。这一点在交易系统中太重要了。
1.5 知识体系总览
下面这张图,是我自己画的一个FPGA交易系统核心概念关系图。你看一眼就能明白各个模块是怎么串起来的。
从这张图你可以看到:市场数据流入订单簿,订单簿维护着当前的买卖挂单状态。撮合引擎根据订单簿的状态进行撮合,最终输出成交结果。而整个流程,都必须在低延迟设计原则的指导下完成。
一句话总结:订单簿是状态,撮合引擎是逻辑,市场数据是输入,低延迟是目标。四者缺一不可。
好了,这一章的内容就到这里。记住这些核心概念,后面我们就要开始动手写代码了。
公众号:蓝海资料掘金营,微信deep3321