第一章:交易系统核心概念

做FPGA交易系统这些年,我经常被问到同一个问题:「一个交易系统到底长什么样?」

说白了,它就是个处理订单的流水线。从市场数据进来,到订单成交,再到结果返回,每一步都有讲究。今天我就把这几个核心概念掰开揉碎了讲给你听。

1.1 订单簿(Order Book)

订单簿是什么?你可以把它想象成一个实时更新的买卖挂单列表。买方出价(Bid),卖方要价(Ask),两边排队等着成交。

我个人习惯把订单簿分成三层来看:

  • 价格层:每个价格点上的挂单数量
  • 时间层:同一价格下,谁先挂单谁优先
  • 类型层:限价单、市价单、冰山单……各有各的玩法

关键指标:买卖价差(Spread)和订单深度(Depth)。价差越小,流动性越好;深度越厚,大单冲击越小。

我在项目中遇到过一个问题:订单簿更新频率太高,软件处理不过来。后来改用FPGA做硬件解析,延迟直接从微秒级降到了纳秒级。嗯,这就是我们做FPGA交易系统的意义所在。

1.2 撮合引擎(Matching Engine)

撮合引擎,说白了就是订单的「红娘」。它负责把买单和卖单配对,然后生成成交记录。

撮合规则其实不复杂:

  1. 价格优先:买单出价高的先成交,卖单要价低的先成交
  2. 时间优先:价格相同,先挂单的先成交
  3. 数量匹配:部分成交、全部成交、还是拒绝?

避坑指南:我曾经在撮合逻辑里忽略了一种边界情况——当两个订单价格相同但数量交叉时,处理顺序错了会导致死锁。后来我加了个超时保护,才彻底解决。

你想想看,撮合引擎每秒可能要处理几十万笔订单。用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交易系统核心概念关系图。你看一眼就能明白各个模块是怎么串起来的。

市场数据 Market Data 订单簿 Order Book 撮合引擎 Matching Engine 成交 低延迟设计原则 • 流水线化:拆解处理阶段,并行执行 • 减少握手:用valid/ready信号替代复杂握手协议 • 避免回环:组合逻辑回环是FPGA大忌 • 资源换速度:用更多LUT和BRAM换更低延迟

从这张图你可以看到:市场数据流入订单簿,订单簿维护着当前的买卖挂单状态。撮合引擎根据订单簿的状态进行撮合,最终输出成交结果。而整个流程,都必须在低延迟设计原则的指导下完成。

一句话总结:订单簿是状态,撮合引擎是逻辑,市场数据是输入,低延迟是目标。四者缺一不可。

好了,这一章的内容就到这里。记住这些核心概念,后面我们就要开始动手写代码了。


公众号:蓝海资料掘金营,微信deep3321