订单
订单 (Order) 是指投资者向交易所提交的买卖指令。订单是交易的起点。订单的目的是修改账户。
订单的标准化是具有挑战的。在不同的交易所和不同的产品中,订单的字段和状态可能有所不同。
订单本质上是一种交易指令,是一种具有特定目的的智能程序。对于中心化交易所,订单的执行由交易所负责。对于去中心化交易所,订单的执行由智能合约负责,也就是以验证节点们达成共识并上链为标志。
对于简单的订单,只需要指定产品、方向、量和价格即可。但对于复杂的订单,可能需要指定更多的字段,如止损、止盈、有效期等。
订单是一个委托动作,从订单生成,到订单中委托的量完全成交或者取消为止。
订单目的
订单的交易目的意味着当订单成功执行后,账户会发生什么变化。
- 交易对象:哪个账户?哪个产品?甚至哪个持仓?
- 交易方向:买入还是卖出?开仓还是平仓?
- 交易数量:买入或卖出多少?
交易对象
交易对象是指订单的目标。订单的目标可以是账户、产品、持仓等。
- 订单用
account_id
字段指定交易对象。account_id
是账户的唯一标识符。 - 订单用
product_id
字段指定产品。product_id
是产品的唯一标识符。 - 订单用
position_id
字段指定持仓。position_id
是持仓的唯一标识符。
交易方向
做多时,如果价格上涨,那么盈利;做空时,如果价格下跌,那么盈利。
一般语境下,买入和做多是同一个意思。由于做空合约的存在,使得买入做空合约不再是做多。
这说明买入和卖出是有歧义的。而做多和做空是没有歧义的。
目前,订单方向仅有四种取值:
"OPEN_LONG"
: 开多,建立多头持仓"OPEN_SHORT"
: 开空,建立空头持仓"CLOSE_LONG"
: 平多,退出多头持仓"CLOSE_SHORT"
: 平空,退出空头持仓
因为没有信息率的增益。
理论上,做空是买入了看空的合约,本质上还是买入了纸面合约的现货。那么仿照这个逻辑,设计两个不同的产品来分别代表做多和做空是在逻辑上是可行的,可以将订单方向这个字段简化为买入和卖出。
举个例子,由于每个产品都会有自己的报价和历史行情。如果用两个产品来分别代表做多和做空,那么就会有两个不同的报价。可能会导致一个产品的历史报价被存储两次,这样会导致数据冗余。或者需要引入一个新的字段去解决这个问题,涉及一些联表操作,反而变得更复杂了。总之,整体代价比较高,而收益仅有将 4 取值字段简化为 2 取值而已。
因为它们确实有不同的报价行情。
例如 BTC-USDT CALL @ 60000 和 BTC-USDT PUT @ 60000 的报价确实是不同的。这涉及期权的实值和虚值,期权的定价逻辑,按下不表。
现代计算机和编程语言的性能已经足够强大,在可接受的空间、索引效率成本下,可以使用字符串作为枚举值,相比于传统的数字枚举值,字符串枚举值的可读性显著提高。 有利于前端展示,可以直接展示给用户。对拓展更开放,可以接受更多的枚举值,应对未来可能的变化。
交易数量
交易数量是指订单的数量。订单的数量是一个正数。负数和零都是非法值。
- 订单的数量用
volume
字段指定。这是一个正数,这可以是一个小数。
交易数量的价值是由相关产品规格说明的,请参考产品中的相关内容。
这是一种盐,与糖相对的。 这是为了刻意制造一个约束,可以检出一些不必要的错误。 例如用户的策略因为一些运算错误导致了一个负数的订单,这可能并非出自用户的本意,但是会造成非常严重的后果。
订单执行
订单类型
订单类型决定了订单的执行方式。
-
"LIMIT"
: 限价单,指定价格买入或卖出限价单是最基本的订单类型。其他类型的订单都可以用限价单来模拟。
必须用
price
字段指定价格。在做多限价单的情况下,如果价格低于委托价格,那么订单会被立即成交; 在做空限价单的情况下,如果价格高于委托价格,那么订单会被立即成交。
-
"MARKET"
: 市价单,以市场最优价格买入或卖出市价单是最常见的订单类型。市价单的特点是立即成交,但是成交价格不确定。
买入市价单可以等价一个价格显著比较高的限价单; 卖出市价单可以等价一个价格显著比较低的限价单。
-
"STOP"
: 触发/止损单,当价格达到指定价格时买入或卖出触发/止损单是一种保护性的订单类型。当价格达到指定价格时,订单会被立即成交。
必须用
price
字段指定价格。在做多止损单的情况下,如果价格高于委托价格,那么订单会被立即成交; 在做空止损单的情况下,如果价格低于委托价格,那么订单会被立即成交。
常见的交易机制
交易中,最常用的交易机制是 中央限价订单簿(CLOB) 和 流动性池(LP)。然而,还有几种其他的交易和流动性提供机制,它们在不同的交易场景和平台上被使用,我们有必要去介绍他们,以便开拓视野,更好地理解订单标准化的概念。例如,CLOB 一定支持限价单,但不一定支持市价单。LP 一定支持市价单,但不一定支持限价单。
CLOB(Central Limit Order Book,中央限价订单簿): CLOB 是传统交易所中最常见的交易机制,它通过一个集中的订单簿来匹配买卖双方的订单。每个订单都有一个特定的价格和数量,系统根据价格优先和时间优先的原则来撮合交易。
LP(Liquidity Pools,流动性池): 流动性池通常与 "自动做市商" (AMM) 相关联。流动性池是由用户提供的资金池,用于支持特定资产的交易。在 AMM 中,流动性池用于自动计算资产价格和执行交易。
RFQ(Request for Quote,报价请求): RFQ 是一种交易机制,其中交易者向流动性提供者(通常是做市商或专业交易公司)请求特定资产的报价。流动性提供者随后提供买入和卖出的价格,交易者可以根据这些报价决定是否进行交易。这种机制常见于外汇市场和大宗交易。例如银行和 MetaTrader 4/5。对于一般交易者来说,RFQ 可以看作是一种特别简化版本的 CLOB。
P2P(Peer-to-Peer,点对点): P2P 交易允许用户直接与其他用户进行交易,而不是通过中心化的交易所或做市商。这种交易方式在加密货币领域尤为流行,它提供了更高的隐私性和自主性。例如,比特币的 OTC 交易,更宽泛地,电商平台都可以认为是此类。
Auction-Based Models(拍卖模型): 在拍卖模型中,资产的价格通过拍卖过程确定。这种机制常见于新发行资产的首次交易,如 IPO(首次公开募股)或 ICO(首次代币发行)。
订单状态
订单状态是订单在交易所内部的状态。从交易所的接口中获取最基本的订单状态,我们不额外追加状态,可以了解订单的执行状态。
"ONGOING"
: 已接受,订单已被交易所接受,等待成交。订单处于进行中状态,可能会对账户产生影响。"COMPLETE"
: 已完成,订单已被完全成交,或者被取消。订单处于已完成状态,不再对账户产生任何影响。"ERROR"
: 错误,订单出现错误,原因可能是参数问题、价格不合理、数量不合理等,要求外部力量介入以修复错误。
因为部分成交等效于"已成交量"小于"委托量",且订单处于已完成的状态。 我们不需要额外的状态来表示部分成交。
因为我们不关心已取消的订单。 取消也是完成的一种,只是完成的原因不同。 已取消的订单不会对账户产生任何影响,也不会对交易所产生任何影响。
已过期的订单等同于已取消,只是取消的原因不同。
执行结果
订单的结果就是已经成交的价格和数量。
- 订单的已成交量用
traded_volume
字段指定。这 是一个正数,这可以是一个小数。 - 订单的已成交均价用
traded_price
字段指定。这个价格不受产品的price_step
限制。
交易时间
订单的执行有若干个关键时间点。创建时间、提交时间、完全成交时间、取消时间、完成时间、最后更新时间等。
然而,交易所的接口,不一定会返回所有的时间点。因此,我们需要假设一些时间点的信息是缺失的。
完整订单字段
字段名称 | 描述 | 示例值 |
---|---|---|
order_id | 订单 ID | "12398174263" |
account_id | 账户 ID (必填) | "Some-Account-ID" |
product_id | 产品 ID (必填) | "XAUUSD" |
position_id | 指定持仓 ID,如果指定,只能交易对应持仓 | "Some-Position-ID" |
order_direction | 订单方向 | "OPEN_LONG" |
volume | 委托量 | 3 |
order_type | 订单类型 | "MARKET" |
price | 委托价格 | 1762.23 |
traded_volume | 已成交量 | 2 |
traded_price | 已成交均价 | 1762.23 |
order_status | 订单状态 | "ACCEPTED" |
submitted_at | 委托时间戳 (Unix 毫秒风格) | 1722104965015 |
filled_at | 完全成交时间戳 (Unix 毫秒风格) | 1722104965015 |
comment | 备注 | "Powered by Yuan" |