4、订单类型与路由:限价单、市价单、冰山订单、Smart Order Routing
订单类型和路由策略,说白了就是你的交易指令怎么发、发到哪里的问题。
很多人觉得这玩意儿简单——不就是买和卖吗?
嗯,我刚开始做量化的时候也这么想。直到有一次,一个市价单在流动性极差的市场里把我账户打穿了,我才意识到:订单类型选不对,算法再牛逼也白费。
4.1 限价单(Limit Order)
限价单,就是指定一个价格,只在这个价格或更优的价格成交。
比如你想买BTC,当前盘口卖一价30000,你挂个29900的买单。那你就等着,有人愿意29900卖给你,才成交。
我个人习惯在套利策略里大量使用限价单。为什么?因为套利赚的就是价差,如果市价进场,价差可能直接被吃掉,白忙活。
举个例子,我在做跨交易所套利时,A交易所买一价100.00,B交易所卖一价100.05。理论上价差0.05,够覆盖手续费吗?
如果你用市价单在A买、B卖,实际成交价可能变成100.02买、100.03卖,价差只剩0.01,亏死。
所以,限价单是套利者的命根子。
4.2 市价单(Market Order)
市价单,就是不管价格,立即按当前最优价成交。
你下个市价买单,系统直接吃掉盘口所有的卖单,直到你的数量满足为止。
我记得有一次做一个小币种的套利,流动性极差。我下了一个市价卖单,结果盘口买一只有0.1个币,买二、买三全是空单。最后我的单子一路吃到了买十,成交价比预期低了3%。
嗯,那次教训挺深刻的。
市价单什么时候用?
- 抢速度的时候:比如套利机会转瞬即逝,限价单可能来不及成交。
- 流动性极好的市场:比如BTC/USDT在币安,滑点几乎可以忽略。
- 止损平仓:这时候价格不重要,跑出来最重要。
4.3 冰山订单(Iceberg Order)
冰山订单,说白了就是大单隐藏器。
你想买1000个BTC,直接挂个限价单,盘口上显示1000个买单,别人一看就知道有大户在买,可能会拉高价格跟你抢。
冰山订单的做法是:只显示一小部分,比如50个,成交完再补50个,直到全部成交。
我曾经在做一个大额套利时,需要买入500个ETH。如果直接挂单,盘口瞬间多出500个买单,价格肯定被推高。用冰山订单,每次只显示30个,市场几乎没反应,我慢慢吃完了整个订单。
冰山订单的代码实现其实不复杂:
class IcebergOrder:
def __init__(self, total_qty, display_qty, price, exchange):
self.total_qty = total_qty
self.display_qty = display_qty
self.price = price
self.exchange = exchange
self.remaining = total_qty
self.active_order = None
def start(self):
self._place_iceberg()
def _place_iceberg(self):
if self.remaining <= 0:
return
qty = min(self.display_qty, self.remaining)
self.active_order = self.exchange.limit_buy(self.price, qty)
def on_fill(self, fill_qty):
self.remaining -= fill_qty
if self.remaining > 0:
self._place_iceberg()
else:
print("冰山订单全部成交")
嗯,这里要注意:冰山订单的撤单和重挂频率不能太高,否则会被交易所判定为滥用API。
4.4 Smart Order Routing(SOR)
SOR,智能订单路由。说白了就是:你的订单该发到哪个交易所?
如果你同时在币安、OKX、火币都有账户,你想买100个ETH。SOR会帮你分析:
- 哪个交易所的流动性最好?
- 哪个交易所的价格最优?
- 哪个交易所的手续费最低?
- 哪个交易所的延迟最小?
然后,SOR会把你的大单拆成小单,分别发到不同的交易所。
我做过一个SOR系统,它的决策流程大概是这样的:
SOR的代码实现,核心就是一个路由表:
class SmartOrderRouter:
def __init__(self, exchanges):
self.exchanges = exchanges # 交易所列表
def route(self, order):
# 获取各交易所的报价和流动性
quotes = []
for ex in self.exchanges:
bid, ask, volume = ex.get_market_data(order.symbol)
quotes.append({
'exchange': ex,
'price': ask if order.side == 'buy' else bid,
'volume': volume,
'fee': ex.get_fee_rate()
})
# 按综合成本排序
quotes.sort(key=lambda q: q['price'] * (1 + q['fee']))
# 拆单执行
remaining = order.qty
for q in quotes:
if remaining <= 0:
break
trade_qty = min(remaining, q['volume'])
q['exchange'].place_order(order.side, trade_qty, q['price'])
remaining -= trade_qty
if remaining > 0:
print(f"警告:剩余 {remaining} 未成交")
4.5 四种订单类型的对比
| 订单类型 | 价格确定性 | 成交确定性 | 市场影响 | 适用场景 |
|---|---|---|---|---|
| 限价单 | 高 | 低 | 低 | 套利、做市、低延迟策略 |
| 市价单 | 低 | 高 | 高 | 抢速度、止损、高流动性市场 |
| 冰山订单 | 高 | 中 | 极低 | 大额交易、隐藏意图 |
| SOR | 中 | 高 | 分散 | 多交易所、大额拆单 |
嗯,总结一下:
限价单是套利的基础,市价单是应急的工具,冰山订单是大户的伪装,SOR是跨交易所的指挥官。
我个人建议,套利策略里至少80%的订单用限价单,剩下的20%留给市价单做应急处理。冰山订单和SOR,看你的资金量和交易所数量来决定是否使用。
好了,订单类型和路由就聊到这里。记住一句话:选对订单类型,比选对方向更重要。
公众号:蓝海资料掘金营,微信deep3321