永续合约面试手册 | MetaNode社区
适用于交易所、衍生品、量化交易、撮合引擎、清算与风险平台相关岗位。
- 🔴:最高优先级,面试高频且容易被追问
- 🟡:应掌握原理与基本计算
- 🟢:拓展内容,用于拉开回答差距
1用户下单
2 → 前置风控与保证金检查
3 → 撮合成交
4 → 更新仓位、成交均价与手续费
5 → 计算未实现盈亏和账户权益
6 → 资金费率定期结算
7 → 标记价格触发风险检查
8 → 追加保证金或强制平仓
9 → 保险基金 / ADL 处理穿仓
- 撮合:决定谁和谁、以什么价格成交。
- 清算:处理成交后的账户、仓位、手续费和资金变化。
- 风控:判断账户能否继续交易以及何时强平。
资金费率:让没有到期日的永续合约长期锚定现货或指数价格。
永续合约没有到期交割,因此需要通过资金费率让合约价格锚定现货。交易进入系统后,先经过保证金和限额检查,再由撮合引擎按价格优先、时间优先成交。成交结果进入清算系统,更新仓位、成本、手续费和保证金。风险系统持续使用标记价格计算账户权益和维持保证金,当保证金不足时触发撤单、减仓或强平;若强平后仍发生穿仓,则由保险基金或 ADL 承接尾部风险。
- 买单按价格从高到低排列。
- 卖单按价格从低到高排列。
- 最高买价是 Best Bid,最低卖价是 Best Ask。
- 两者之差是 Spread。
- 常见规则是价格优先、同价时间优先(FIFO)。
1卖盘:101 元 5 张;100 元 3 张
2买盘: 99 元 4 张; 98 元 6 张
- 先以 100 元成交 3 张。
- 再以 101 元成交 3 张。
- 订单全部成交。
成交价通常取订单簿中已有 Maker 订单的价格,而不是新进入的 Taker 限价。
| 类型 | 含义 | 高频追问 |
|---|
| Limit | 指定最差可接受价格 | 是否保证成交? |
| Market | 立即按盘口成交 | 如何限制滑点? |
| IOC | 立即成交可成交部分,其余取消 | 与 FOK 有何区别? |
| FOK | 必须立即全部成交,否则全部取消 | 是否允许部分成交? |
| Post Only | 只做 Maker | 若会立即成交如何处理? |
| Reduce Only | 只能减少仓位 | 如何处理并发减仓单? |
| Stop | 达到触发条件后生成真实订单 | 使用什么价格触发? |
用户持有多仓 10 张,同时提交两笔各 10 张的 Reduce Only 卖单。若只在下单时分别检查,两笔都可能通过,最终平掉 20 张并反向开空。
- 为减仓订单预占“可平数量”。
- 将已有未成交减仓订单纳入校验。
- 成交、撤单或仓位变化时重新裁剪订单数量。
- 在最终清算层保证仓位不会越过零点。
1API Gateway
2 → 身份与基础校验
3 → 前置风控
4 → Sequencer(全序)
5 → Matching Engine
6 → 成交事件流
7 → Clearing / Position / Market Data
- 单交易对内顺序确定。
- 低延迟、高吞吐。
- 不丢单、不重复成交。
- 支持快照、日志重放和故障恢复。
- 避免锁竞争。
- 保证价格和时间优先级的确定性。
- 方便日志重放与状态恢复。
- 降低并发修改订单簿造成的争议。
扩容通常通过交易对分片,以及把行情、持久化和清算异步化实现,而不是并发修改同一本订单簿。
- 价格层:平衡树、跳表或有序映射。
- 同价格订单:队列或双向链表。
orderId → order node:哈希表,支持快速撤单。
- 最优买卖价:树的首尾节点或额外指针。
生产系统通常会增加最大滑点、价格保护带和最大成交名义价值,或者将市价单转化为带保护价的 IOC 限价单。
- 客户端订单号或幂等键。
- Sequencer 分配唯一序号。
- 下游按事件 ID 去重。
- 客户端重试时返回原请求结果。
超时不代表下单失败。客户端应通过客户端订单号查询最终状态;重试时系统返回原结果,而不是创建第二张订单。
永续合约没有到期日,无法依靠交割使价格回归现货,因此需要资金费率机制:
- 永续价格明显高于现货时,通常多头向空头支付。
- 永续价格明显低于现货时,通常空头向多头支付。
- 支付激励套利者建立反向仓位,使价格回归指数附近。
资金费通常是交易者之间的转移,交易所原则上不是资金费的收益方。
1资金费用 = 持仓名义价值 × 资金费率
2持仓名义价值 = 持仓数量 × 结算价格
例:持有 2 BTC 多仓,结算价 50,000 USDT,资金费率 0.01%:
1名义价值 = 2 × 50,000 = 100,000 USDT
2资金费用 = 100,000 × 0.01% = 10 USDT
若费率为正且规则规定多头支付,则多头支付 10 USDT,空头收取。
1Funding Rate ≈ Premium Component + Interest Component
- Premium:反映永续相对指数价格的溢价或折价。
- Interest:反映基础资产与计价资产的利率差。
- 最终费率通常还有上下限。
溢价指标常使用 TWAP、冲击买卖价和异常值过滤,而不是某一瞬间的最新成交价。
不能。它只提供经济激励;单边行情、套利资金不足、借币成本、跨市场限制和流动性不足仍会造成偏离。
取决于平台的持仓快照规则。重点是明确结算边界、成交与结算的先后顺序,并确保事件顺序确定且可重放。
- 基差可能继续扩大。
- 资金费率可能变化。
- 存在强平、滑点、手续费和借贷成本。
- 还存在跨平台信用、转账和提现风险。
| 价格 | 含义 | 主要用途 |
|---|
| Last Price | 最新成交价 | 行情展示、部分条件单触发 |
| Index Price | 多个现货市场形成的参考价格 | 公允价值基准 |
| Mark Price | 指数价格经基差等因素调整后的合理价格 | 盈亏计算、风险判断和强平 |
最新成交价容易受到小额成交操纵、瞬时流动性枯竭、异常插针和单一市场故障影响。若直接用于强平,攻击者可能用较小资金触发大量账户清算。
- 数据源超时和陈旧价格。
- 单一成分市场停机。
- 异常偏离与权重调整。
- 稳定币或法币偏离。
- 有效成分不足时的降级规则。
指数价格不能只做简单平均。应检查成分价格的新鲜度和偏差,对异常成分临时剔除并重新归一化权重;有效成分不足时进入预定义的保护或降级状态。
1多仓未实现盈亏 = 数量 ×(标记价格 - 开仓均价)
2空仓未实现盈亏 = 数量 ×(开仓均价 - 标记价格)
3
4UPnL = signedPosition × (markPrice - entryPrice)
5Equity = Wallet Balance + Unrealized PnL
6
7Available Margin
8= Equity - Initial Margin - Order Margin - 其他占用
先以 50,000 买入 1 BTC,再以 52,000 买入 1 BTC:
1平均开仓价 = (1 × 50,000 + 1 × 52,000) / 2
2 = 51,000 USDT
1已实现盈亏 = 0.5 × (53,000 - 51,000)
2 = 1,000 USDT
回答前应说明平台采用移动加权平均、FIFO 还是其他成本模型。
| 模式 | 特点 | 主要风险 |
|---|
| 逐仓 Isolated | 单仓位使用独立保证金 | 该仓位保证金耗尽时强平 |
| 全仓 Cross | 多个仓位共享账户权益 | 单个仓位可能消耗整个账户余额 |
组合保证金还可能考虑仓位对冲、相关性、压力场景和集中度附加保证金。
1账户权益 ≤ 维持保证金 + 预计平仓费用 + 风险缓冲
1Maintenance Margin
2= Position Notional × MMR - Deduction
大仓位需要更高的维持保证金率,因为更难快速平仓、市场冲击和尾部损失也更大。
- 冻结账户或禁止新增风险。
- 撤销增加风险的挂单,释放订单保证金。
- 重新计算账户风险。
- 尝试部分减仓或分层清算。
- 将剩余仓位移交清算引擎。
- 使用限价、分片和时间窗口平仓。
- 负余额由保险基金承接。
- 保险基金不足时触发 ADL 或损失分摊。
开仓挂单会占用保证金。撤单后可能释放足够保证金,使账户重新满足要求;但 Reduce Only 等降低风险的订单不一定需要撤销。
- 强平价格:账户达到维持保证金要求、开始被清算的价格。
- 破产价格:账户权益接近零或保证金完全耗尽的价格。
- 两者间的缓冲用于支付平仓成本并保护系统。
计算精确强平价还需要知道手续费、资金费、风险档位、标记价格规则及保证金计价方式。题目信息不足时,不应声称存在唯一精确答案。
保险基金用于吸收强平后的负余额,资金可能来自清算剩余、平台注资或特定费用。
**ADL(自动减仓)**在穿仓损失无法由保险基金覆盖时,从盈利对手方中选择账户自动减仓。排序通常考虑盈利程度、有效杠杆、仓位规模或风险贡献。
ADL 的代价是盈利用户的仓位可能在非主动情况下被关闭。
- 账户状态、权限与余额。
- 初始保证金和最大名义价值。
- 最大仓位、价格保护带和频率限制。
- Reduce Only 与自成交保护。
- 风险档位检查。
- 指数价格和标记价格监控。
- 实时权益与维持保证金。
- 大户集中度和市场流动性。
- 清算队列与保险基金覆盖水平。
- 订单、成交、仓位和余额对账。
- 负余额与异常成交检查。
- 压力测试与风险参数回溯。
- 每笔成交的买方数量等于卖方数量。
- 资产不能凭空创造或销毁。
- 手续费和资金费的借贷双方可以对账。
- 仓位变化等于成交、清算等事件的累计结果。
- 同一事件不能被清算两次。
- 账本余额等于历史账务分录汇总。
- 日志重放后的状态与故障前一致。
典型竞态:余额只够一笔订单,用户并发提交两笔;两个风控实例同时读取旧余额,导致两笔都通过。
- 预占保证金。
- 单账户事件按顺序处理。
- 原子条件更新。
- 账户命令进入同一消息分区。
- 使用版本号或乐观并发控制。
- 清算层设置最终安全边界。
- 指数成分市场集体异常。
- 撮合正常但清算延迟。
- 大量账户同时触发强平。
- 清算订单冲击薄弱盘口。
- 保险基金快速下降。
- 稳定币脱锚。
常见措施:动态限仓、价格保护带、分段清算、清算节流、熔断或只减仓模式、多源指数和压力测试。
- 单向持仓还是双向持仓?
- 线性合约还是反向合约?
- 逐仓、全仓还是组合保证金?
- 支持哪些订单类型?
- 目标 TPS、交易对数量和延迟是多少?
- 一致性、可用性和恢复目标是什么?
1API / Authentication
2Order Management
3Pre-trade Risk
4Sequencer
5Matching Engine
6Market Data
7Clearing & Ledger
8Position Service
9Funding Service
10Mark / Index Price
11Liquidation Engine
12Insurance Fund / ADL
13Reconciliation & Audit
OrderAccepted
OrderRejected
OrderCancelled
TradeExecuted
PositionUpdated
FundingSettled
MarginChanged
LiquidationStarted
LiquidationFilled
ADLExecuted
每个事件至少包含唯一事件 ID、全局或分区序号、账户和订单标识、时间以及可审计的计算输入与结果。
- 单订单簿由 Sequencer 建立全序。
- 单账户资金和仓位事件保持顺序。
- 跨服务使用事件驱动和幂等消费。
- 资产账本使用复式记账或等价平衡模型。
- 使用周期性快照与追加式日志。
- 从快照加载后按序重放。
- 主备切换时防止双主和重复出单。
永续没有到期交割,通过资金费率锚定现货;交割合约在到期日结算,基差会随到期临近自然收敛。
不一定。杠杆首先表示保证金相对名义敞口的比例;是否存在真实借贷取决于产品和账户模型。
全仓账户中,其他仓位亏损可能侵蚀账户权益;资金费、手续费、抵押品贬值或风险参数变化也可能导致保证金不足。
已有挂单提供流动性,是 Maker;新进入并吃掉流动性的订单是 Taker。
已成交部分不可撤销,只取消剩余数量,并释放对应订单保证金。
不一定。常由条件单服务监听触发价格,触发后向订单系统提交真实订单。重点是可靠性、幂等性和触发顺序。
- 止损尚未触发。
- 触发后订单没有成交。
- 盘口跳空或流动性不足。
- 止损触发价与强平使用的标记价格不同。
- 强平条件先于止损满足。
巨大市价单可能造成严重滑点,引发更多强平,形成清算瀑布,因此通常需要分片、限价、节流和流动性评估。
不一定。真正的清算必须在订单簿成交,风险还取决于可成交深度和市场冲击成本。
Q:数据库显示订单成功,但撮合引擎中没有订单怎么办?
应明确权威状态源:订单状态由有序命令和撮合事件驱动,数据库作为持久化视图;通过序号、事件日志和对账发现差异。
Q:消息队列能实现 Exactly Once 吗?
端到端更现实的目标是 At-least-once 加幂等处理。资金系统还需要唯一业务键、账本约束、事务边界和对账,不能只依赖消息队列语义。
账户余额 10,000 USDT,以 50,000 买入 1 BTC,标记价格为 48,000:
1未实现盈亏 = 1 × (48,000 - 50,000) = -2,000 USDT
2账户权益 = 10,000 - 2,000 = 8,000 USDT
判断是否强平还需要维持保证金率、其他持仓和挂单、预计手续费及资金费。
持有 5 ETH 多仓,结算价格 3,000 USDT,资金费率 -0.02%:
1名义价值 = 5 × 3,000 = 15,000 USDT
2资金费绝对值 = 15,000 × 0.02% = 3 USDT
若负费率表示空头向多头支付,则多头收到 3 USDT。
假设账户权益为 2,500,维持保证金为 2,000,平台定义:
1Margin Ratio = Maintenance Margin / Equity
2 = 2,000 / 2,500
3 = 80%
若强平阈值为 100%,账户尚未触发,但已处于高风险状态。不同平台可能采用相反定义,回答前应确认公式。
- 标记价格、指数价格和最新成交价的区别。
- 资金费率如何锚定现货,以及为什么不是无风险套利。
- 账户权益、未实现盈亏、初始保证金和维持保证金的关系。
- 强平价、破产价、保险基金和 ADL 的关系。
- 完整强平流程:撤单、重算、部分清算、保险基金、ADL。
- 价格优先、时间优先以及 Maker/Taker 逻辑。
- 撮合的确定性、Sequencer、快照和日志重放。
- 下单风控与清算之间的一致性。
- 幂等、重复消息和客户端超时重试。
- 账本、仓位的关键不变量和对账机制。
- 线性合约未实现盈亏。
- 加权开仓均价和部分平仓盈亏。
- 资金费用。
- 初始保证金和维持保证金。
- 简化强平条件。
- 大仓位风险档位。
- 反向合约的盈亏公式。
- 组合保证金和压力测试。
- 指数异常值处理。
- 清算市场冲击模型。
- 稳定币脱锚风险。
- 多交易对与多账户分片。
- 双主防护和灾难恢复。
- ADL 排序的公平性。
1给出定义
2 → 解释机制
3 → 提供数字例子
4 → 补充异常场景
5 → 说明系统实现与风险边界
这种结构可以同时体现业务理解、计算能力、系统设计能力和风险意识。