Abel'Blog

我干了什么?究竟拿了时间换了什么?

0%

期货 - DEX 永续合约核心概念

简介

在传统金融期货以及 Web3 去中心化衍生品交易所(DEX 永续合约,如 GMX、dYdX、Hyperliquid、Drift 等)的研发与交易中,最基础也最核心的概念就是订单动作与仓位流转:buy_open(买入开仓)、sell_open(卖出开仓)、sell_close(卖出平仓) 与 buy_close(买入平仓)。

交易本质上由两个独立维度交织而成:

  • 方向(Side):Buy(买入)与 Sell(卖出)
  • 动作(Action):Open(开仓 / 建立风险敞口)与 Close(平仓 / 对冲消除敞口)

理解了这四种组合及其在底层引擎中的状态转移逻辑,就真正掌握了永续合约最核心的底座。


一、 核心操作维度矩阵

将“交易方向”与“交易动作”组合,即可得到标准交易系统的四种核心订单指令:

操作指令 (Order Action) 交易动作 对应建立 / 关闭的仓位 说明与操作意图
buy_open 买入开仓 建立多头 (Long) 看涨标的,买入资产建立正向敞口
sell_open 卖出开仓 建立空头 (Short) 看跌标的,借入资产卖出建立负向敞口
sell_close 卖出平仓 关闭多头 卖出之前买入的多单,了结利润或止损
buy_close 买入平仓 关闭空头 买回标的平掉之前的空单,结束空头风险

二、 经典案例推演:用“石油现货”直观理解做空

很多人对“做多”容易理解(低买高卖),但常常难以直观感受“做空”的物理本质。

2.1 案例设定

  • 初始状态:当前 1 桶石油的价格为 120 美元。
  • 交易员判断:全球产能过剩,未来石油价格必然下跌。
  • 交易目标:“先在高位卖掉,等未来跌入低谷时再低价买回来”。

2.2 执行流程

  1. 建立空仓(sell_open):

    • 交易员执行 sell_open 1 桶石油(在期货/DEX 合约中,不需要真正搬运一桶物理石油,而是建立一个虚拟空头头寸)。
    • 此时交易员账户生成了 Short 1 桶 的仓位,锁定卖出基准价格:$120\ \text{USD}$。
  2. 市场行情验证(价格下跌):

    • 一段时间后,石油价格如预期暴跌至 60 美元。
    • 交易员认为目标位已达到,需要锁定战果,退出市场。
  3. 结束空头头寸(buy_close):

    • 交易员执行 buy_close 1 桶石油,以 $60\ \text{USD}$ 的市价买入一笔等额反向头寸,冲销原有空头。
    • 最终利润计算:
      $$\text{盈亏 (PnL)} = \text{卖出价格} - \text{买入价格} = 120\ \text{USD} - 60\ \text{USD} = +60\ \text{USD}$$

三、 深度思辨:为什么平空操作是 buy_close 而非 sell_close?

这是初学者最容易产生混淆的地方:

“既然我当初是卖出做空的,为什么最终离场时不是‘卖出平仓’,而是‘买入平仓’?”

核心本质剖析:

  • 开空(sell_open)之后,你的仓位状态是负数(Short):
    在会计或资产负债表上,你相当于“预支”并卖出了标的资产,你的账户欠交易系统一个买入动作。
  • 对冲平仓必须遵循“反向抵消”原则:
    要消除对系统的标的负债、将仓位归零,你必须从市场上**“买回来”**。因此,平掉空头仓位所对应的动作必然是 buy_close(买入以平仓)。

对比做多(Long)流程:

1
2
3
4
5
【做多 Long】: 
buy_open ($60买入开多) ── 价格上涨至 $120 ──> sell_close ($120卖出平多) => 净赚 $60

【做空 Short】:
sell_open ($120卖出开空) ── 价格下跌至 $60 ──> buy_close ($60买入平空) => 净赚 $60

四、 核心数学认知:带符号仓位流转模型(Signed Position)

在高性能交易撮合系统或智能合约内部,无需为“多头”和“空头”设计两套复杂账本,通常使用**带符号的数值(Signed Number)**来统一建模:

1
2
3
4
5
6
7
8
9
              [ 0 (空仓状态) ]
↗ ↖
buy_open (+1) buy_close (+1)
/ \
[ +1 (多头 Long) ] [ -1 (空头 Short) ]
\ /
sell_close (-1) sell_open (-1)
↘ ↗
[ 0 (空仓状态) ]

1. 多头生命周期

$$\text{初始仓位: } 0 \xrightarrow{+\ 1\ (\text{buy_open})} +1 \xrightarrow{-\ 1\ (\text{sell_close})} 0$$

2. 空头生命周期

$$\text{初始仓位: } 0 \xrightarrow{-\ 1\ (\text{sell_open})} -1 \xrightarrow{+\ 1\ (\text{buy_close})} 0$$

关键规律:

  • 任何带有 open 的指令,其本质是拉大仓位绝对值(增加风险敞口);
  • 任何带有 close 的指令,其本质是缩小仓位绝对值向 0 收敛(消除风险敞口)。

五、 DEX 永续合约系统架构实战

在像 GMX、dYdX、Hyperliquid、Drift 等去中心化衍生品交易所中,上述概念体现在核心数据结构的设计中:

5.1 订单对象(Order)vs 持仓对象(Position)

  • 订单(Order):表示用户的交易意图(想做什么)。
  • 持仓(Position):表示链上或账本上当前用户的实际敞口(拥有什么)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 1. 用户提交订单: sell_open 1 BTC
{
"order_type": "MARKET",
"action": "sell_open",
"symbol": "BTC-USD-PERP",
"size": 1.0
}

// 2. 撮合成交后,系统更新用户的 Position 状态
{
"account": "0xAbCd...1234",
"symbol": "BTC-USD-PERP",
"side": "SHORT",
"size": 1.0, // 仓位符号为负 (Short 1 BTC)
"entry_price": 68000.0, // 开仓均价
"leverage": 10 // 杠杆倍数
}

5.2 浮动盈亏(Unrealized PnL)公式

衍生品引擎通过预言机(Oracle)推送的实时标记价格(Mark Price)持续计算未结盈亏:

  • 多头头寸(Long PnL):
    $$\text{PnL} = (\text{MarkPrice} - \text{EntryPrice}) \times \text{Size}$$
  • 空头头寸(Short PnL):
    $$\text{PnL} = (\text{EntryPrice} - \text{MarkPrice}) \times \text{Size}$$

当用户后续发送 buy_close 交易时,系统结算已实现盈亏(Realized PnL),退还可用保证金并清空该标的的 Position。


六、 架构开发视角与记忆口诀

对交易系统、对账中间件及量化交易系统研发而言,整个生命周期由五个阶段闭环驱动:

1
2
3
4
5
6
7
8
9
[ 用户意向订单 ] ── (Order) 
↓
[ 撮合 / 链上记账 ] ── (Trade Match & Execution)
↓
[ 状态机仓位更新 ] ── (Position State Machine: +1 / -1 / 0)
↓
[ 实时标记价格驱动 ] ── (Oracle Price Feed)
↓
[ 风险控制与结算退出 ] ── (Margin, PnL & Settlement)

🎯 终极速记口诀

  • 开仓增敞口:
    • buy_open = 买入开多
    • sell_open = 卖出开空
  • 平仓归零位:
    • sell_close = 卖出平多
    • buy_close = 买入平空