1. HFT系统架构全景:从行情接入到订单执行的全链路拆解

做高频交易这些年,我见过不少团队把架构图画得跟蜘蛛网似的。其实说白了,HFT系统的核心链路就那么几条——行情怎么进来,策略怎么决策,订单怎么出去。今天咱们就把这条链路从头到尾捋一遍。

核心观点: HFT系统的本质是“低延迟管道”,每一微秒的优化都可能转化为真金白银的收益。

1.1 全链路总览:数据流与资金流

先看一张我手绘的架构图。这张图我改过至少五版,现在这个版本是我在实盘环境中验证过的。

HFT系统核心架构全链路 行情网关 Market Data Gateway UDP组播 · 硬件解码 策略引擎 Strategy Engine FPGA · 微秒级决策 风控模块 Risk Control 事前 · 事中 · 事后 订单管理系统 OMS 订单路由 · 状态机 交易所 Exchange 撮合引擎 行情数据 订单指令 FIX/Gateway 风控校验 成交回报 典型延迟分布(从行情到成交) 行情解码: 1-3μs 策略计算: 5-20μs 订单发送: 10-50μs 交易所处理: 20-100μs

这张图里,行情从左边进来,经过策略引擎加工,再通过订单管理系统发出去。风控模块像个“交警”,在关键路口做检查。我当年第一次搭这个架构时,犯了个低级错误——把风控放在了订单管理系统后面。结果有一次策略出bug,订单都发出去了风控才报警,那叫一个尴尬。

1.2 行情网关:系统的“眼睛”

行情网关是HFT系统的第一道关卡。它的任务很简单:从交易所接收行情数据,解码后送给策略引擎。但简单不代表容易。

实战经验: 我个人习惯用FPGA做行情解码。CPU解码的延迟通常在5-10微秒,FPGA可以压到1微秒以内。别小看这几微秒,在抢单场景下,这就是胜负手。

行情网关的核心功能包括:

  • 数据接收:通常通过UDP组播接收交易所的原始行情。我建议用双网卡绑定,避免单点故障。
  • 协议解码:不同交易所的协议千奇百怪。上期所的STEP、中金所的FAST、国外的ITCH——每个都得单独写解码器。
  • 数据分发:解码后的行情要广播给所有策略实例。这里要注意,分发延迟必须稳定,不能有抖动。

嗯,这里要注意一个坑。行情网关最容易出问题的地方是“数据粘包”。我曾经在生产环境遇到过,交易所突然加大数据量,UDP缓冲区溢出,导致行情断层。后来我加了个环形缓冲区,才彻底解决这个问题。

1.3 策略引擎:系统的“大脑”

策略引擎是整个系统最核心的部分。它接收行情,运行交易策略,输出买卖指令。说白了,这就是个“信号发生器”。

策略引擎的典型工作流程:

  1. 行情订阅:策略告诉引擎“我要看哪些品种的行情”。
  2. 信号计算:运行各种指标——价差、动量、订单簿不平衡度等等。
  3. 决策生成:根据信号和参数,决定是否下单、下什么单。
  4. 指令输出:把订单指令发给订单管理系统。
关键指标: 策略引擎的“决策延迟”必须控制在10微秒以内。超过这个数,你的策略就比别人慢半拍。

你想想看,为什么很多HFT团队用FPGA做策略引擎?因为CPU的指令流水线有不确定性——缓存未命中、分支预测失败,都会导致延迟抖动。FPGA是硬件逻辑,延迟是确定的。我见过一个团队,用CPU做策略引擎,延迟均值是8微秒,但P99能飙到50微秒。换成FPGA后,延迟稳定在3微秒,P99不超过5微秒。

1.4 订单管理系统:系统的“手”

订单管理系统(OMS)负责把策略生成的指令变成真正的订单,发到交易所。它要处理的事情比想象中多得多。

功能模块 职责 我踩过的坑
订单路由 选择最优的交易所或做市商 有一次路由算法没考虑交易所维护时间,订单全被拒了
订单状态机 跟踪每个订单的生命周期 状态机少了个“已撤销”状态,导致订单卡死
订单簿管理 维护本地订单簿,用于决策 本地订单簿和交易所不一致,导致重复下单
重连机制 断线后自动重连并恢复状态 重连时没清空旧订单,造成大量废单

OMS的延迟要求比策略引擎宽松一些,但也不能超过50微秒。我建议用无锁队列做模块间通信,避免锁竞争带来的延迟。

1.5 风控模块:系统的“刹车”

风控模块是HFT系统里最容易被忽视、但最重要的部分。没有风控,一次策略bug就能让你亏掉一年的利润。

风控通常分三层:

  • 事前风控:订单发出前检查。比如单笔金额上限、日内累计交易量、自成交检查。我习惯在策略引擎和OMS之间加一道事前风控,这样即使策略发疯,订单也出不去。
  • 事中风控:订单在途时监控。比如检查订单是否超时未成交、是否被交易所拒绝。我曾经遇到交易所网关超时,事中风控自动撤单,避免了资金占用。
  • 事后风控:交易结束后分析。比如检查是否有异常交易、是否触及风控阈值。这部分可以离线做,不要求低延迟。
警告: 风控模块绝对不能成为性能瓶颈。我见过有人把风控做得太复杂,导致订单延迟增加了200微秒。记住,风控要快,哪怕牺牲一些检查的粒度。

1.6 组件间的交互逻辑

这四个组件不是孤立的,它们之间的交互决定了系统的整体性能。我总结了一个“三原则”:

  1. 数据流单向:行情从网关到策略,指令从策略到OMS,成交回报从OMS回策略。不要搞成网状结构,否则调试起来想死。
  2. 控制流双向:风控和策略之间要有双向通信。策略可以查询风控状态,风控也可以强制停止策略。
  3. 心跳保活:每个组件之间都要有心跳检测。我习惯用共享内存做心跳,延迟最低。

举个例子,有一次策略引擎的行情订阅突然断了,但OMS还在正常发单。因为没有行情更新,策略用的全是旧数据,结果连续下了几十笔错误订单。后来我加了个“行情健康检查”——如果行情超过100毫秒没更新,策略自动进入“冻结模式”,不再产生新指令。

避坑指南: 我曾经在组件间用TCP通信,结果网络抖动导致订单延迟飙升。后来全部改成共享内存+信号量,延迟从100微秒降到了1微秒。记住,HFT系统里,能不用网络就别用网络。

好了,这一章的内容就到这里。HFT系统的架构其实不复杂,难的是把每个组件的延迟压到极致,同时保证系统的稳定性。下一章我们会深入行情网关,聊聊如何用FPGA实现微秒级的行情解码。


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