一、订单类型基础:限价单与市价单
做量化交易这些年,我见过太多新手在订单类型上栽跟头。说实话,这玩意儿看着简单,但真到了实盘,一个不小心就是几万块的学费。今天咱们就把限价单和市价单这俩最基础的订单类型彻底聊透。
1.1 什么是限价单?
限价单,说白了就是你给交易所下的一道死命令:「低于这个价我不卖,高于这个价我不买」。你指定一个价格,只有市场达到或优于这个价格时,订单才会成交。
举个例子。假设BTC当前价格30000美元,你想在29500买入。你下一个限价买单,价格设29500。那么只有市场价格跌到29500或以下时,你的单子才会成交。如果价格一直没到,那这单就一直挂着。
限价单的两种常见类型:
- 限价买单:指定一个最高买入价,只接受不高于此价格的成交
- 限价卖单:指定一个最低卖出价,只接受不低于此价格的成交
1.2 什么是市价单?
市价单就简单粗暴了——「不管什么价,给我立刻成交」。你只关心数量,不关心价格。交易所会以当前市场上最优的可成交价格帮你吃掉对手盘。
还是那个例子。BTC当前30000美元,你想立刻买入1个。你下市价买单,系统会从卖一价开始吃,卖一不够就吃卖二,直到买够1个为止。最终成交价可能30001、30002,取决于当时的盘口深度。
市价单的常见变种:
- 市价买单:以当前最优卖价成交,直到买够数量
- 市价卖单:以当前最优买价成交,直到卖够数量
1.3 核心区别对比
咱们用一张表把区别说清楚:
| 对比维度 | 限价单 | 市价单 |
|---|---|---|
| 价格控制 | 完全控制,指定价格 | 无控制,接受当前市价 |
| 成交确定性 | 不确定,可能不成交 | 确定,立即成交 |
| 滑点风险 | 无滑点 | 有滑点,尤其在流动性差时 |
| 交易成本 | 通常为Maker费用(较低) | 通常为Taker费用(较高) |
| 适用场景 | 追求最优价格,不急于成交 | 追求快速成交,价格次要 |
你想想看,这两者的本质区别其实就是「你要价格确定性,还是要成交确定性」。鱼和熊掌不可兼得,这就是交易中最基本的权衡。
1.4 适用场景对比
光讲理论没意思,咱们直接上实战场景。我根据自己这些年的经验,把典型场景列出来:
限价单的典型场景:
- 挂单做市:你想在关键支撑位挂买单,在阻力位挂卖单。比如ETH在1800有强支撑,你挂个1799的限价买单,等着接货。
- 分批建仓:大资金进场不想吃滑点。我习惯把大单拆成几十个小限价单,分散在不同价位,这样平均成本更优。
- 套利交易:价差套利需要精确控制入场价,限价单是标配。
- 降低手续费:很多交易所对Maker(挂单方)有费率优惠,限价单可以帮你省手续费。
市价单的典型场景:
- 紧急止损:行情突然反转,你必须在第一时间离场。这时候别犹豫,直接市价单。我曾经因为犹豫用限价单止损,结果价格直接穿过去了,损失扩大了一倍。
- 追涨杀跌:趋势行情启动,你怕踏空。市价单能保证你第一时间上车。
- 流动性好的品种:比如交易BTC/USDT这种深度极好的品种,市价单的滑点几乎可以忽略不计。
- 小资金快速进出:资金量小,滑点影响不大,追求速度更重要。
1.5 知识体系结构图
下面这张图把限价单和市价单的核心逻辑梳理清楚了:
1.6 实战代码示例
光说不练假把式。下面我用Python演示一下限价单和市价单的核心逻辑:
# 模拟限价单与市价单执行逻辑
# 作者:蓝海资料掘金营
class OrderExecutor:
"""订单执行模拟器"""
def __init__(self, order_book):
# order_book: 订单簿,格式为 {'bids': [[price, qty], ...], 'asks': [[price, qty], ...]}
self.order_book = order_book
def limit_buy(self, price, quantity):
"""限价买单:只在不高于指定价格时成交"""
filled = 0
total_cost = 0
for ask_price, ask_qty in self.order_book['asks']:
if ask_price > price:
break # 价格超出限价,停止成交
trade_qty = min(ask_qty, quantity - filled)
filled += trade_qty
total_cost += trade_qty * ask_price
if filled >= quantity:
break
avg_price = total_cost / filled if filled > 0 else 0
return {
'filled': filled,
'avg_price': avg_price,
'status': 'filled' if filled >= quantity else 'partial'
}
def market_buy(self, quantity):
"""市价买单:以当前最优价立即成交"""
filled = 0
total_cost = 0
for ask_price, ask_qty in self.order_book['asks']:
trade_qty = min(ask_qty, quantity - filled)
filled += trade_qty
total_cost += trade_qty * ask_price
if filled >= quantity:
break
avg_price = total_cost / filled if filled > 0 else 0
return {
'filled': filled,
'avg_price': avg_price,
'slippage': avg_price - self.order_book['asks'][0][0] # 滑点计算
}
# 模拟订单簿
order_book = {
'bids': [[29900, 5], [29850, 10], [29800, 15]],
'asks': [[30000, 3], [30010, 5], [30020, 8], [30050, 10]]
}
executor = OrderExecutor(order_book)
# 测试限价买单
print("=== 限价买单测试 ===")
result = executor.limit_buy(price=30010, quantity=10)
print(f"成交数量: {result['filled']}, 均价: {result['avg_price']:.2f}")
# 测试市价买单
print("\n=== 市价买单测试 ===")
result = executor.market_buy(quantity=10)
print(f"成交数量: {result['filled']}, 均价: {result['avg_price']:.2f}")
print(f"滑点: {result['slippage']:.2f} 美元")
1.7 本章小结
限价单和市价单,说白了就是交易中最基本的两个工具。一个帮你控制价格,一个帮你保证成交。没有谁比谁高级,关键看你怎么用。
我个人这些年总结下来就一句话:想省手续费、控价格,用限价单;想快进快出、保成交,用市价单。 别纠结,根据场景选就对了。
公众号:蓝海资料掘金营,微信deep3321