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个,直到全部成交。

实战技巧: 冰山订单的显示数量,我一般设置为总量的5%-10%。太小了容易被频繁撤单,太大了又起不到隐藏效果。

我曾经在做一个大额套利时,需要买入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系统,它的决策流程大概是这样的:

SOR 智能订单路由决策流程 订单输入(买100 ETH) SOR引擎:分析各交易所状态 评估:价格、流动性、手续费、延迟 币安:40 ETH @ 100.00 OKX:35 ETH @ 100.02 火币:25 ETH @ 100.01 最终执行:拆单后发往各交易所

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} 未成交")
避坑指南: 我曾经在SOR里只考虑了价格和流动性,忽略了延迟。结果订单发到延迟最高的交易所时,价格已经变了,反而亏了。后来我加上了延迟惩罚因子,效果好了很多。

4.5 四种订单类型的对比

订单类型 价格确定性 成交确定性 市场影响 适用场景
限价单 套利、做市、低延迟策略
市价单 抢速度、止损、高流动性市场
冰山订单 极低 大额交易、隐藏意图
SOR 分散 多交易所、大额拆单

嗯,总结一下:

限价单是套利的基础,市价单是应急的工具,冰山订单是大户的伪装,SOR是跨交易所的指挥官。

我个人建议,套利策略里至少80%的订单用限价单,剩下的20%留给市价单做应急处理。冰山订单和SOR,看你的资金量和交易所数量来决定是否使用。

一个小技巧: 如果你发现某个套利机会的价差特别大,别急着用市价单冲。先挂个限价单试试,说不定能吃到更好的价格。我靠这个习惯,每年多赚了不少。

好了,订单类型和路由就聊到这里。记住一句话:选对订单类型,比选对方向更重要


公众号:蓝海资料掘金营,微信deep3321