简介
在传统金融期货以及 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 执行流程
建立空仓(
sell_open):- 交易员执行
sell_open 1 桶石油(在期货/DEX 合约中,不需要真正搬运一桶物理石油,而是建立一个虚拟空头头寸)。 - 此时交易员账户生成了 Short 1 桶 的仓位,锁定卖出基准价格:$120\ \text{USD}$。
- 交易员执行
市场行情验证(价格下跌):
- 一段时间后,石油价格如预期暴跌至 60 美元。
- 交易员认为目标位已达到,需要锁定战果,退出市场。
结束空头头寸(
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 | 【做多 Long】: |
四、 核心数学认知:带符号仓位流转模型(Signed Position)
在高性能交易撮合系统或智能合约内部,无需为“多头”和“空头”设计两套复杂账本,通常使用**带符号的数值(Signed Number)**来统一建模:
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 | // 1. 用户提交订单: sell_open 1 BTC |
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 | [ 用户意向订单 ] ── (Order) |
🎯 终极速记口诀
- 开仓增敞口:
buy_open= 买入开多sell_open= 卖出开空
- 平仓归零位:
sell_close= 卖出平多buy_close= 买入平空