QMT实盘成交市价还是限价好
成交率、滑点和自动追单之间,应该如何取舍?
先说结论
如果只比较成交率,一般是:
市价类委托最高;买入挂卖一、卖出挂买一其次;买入挂买一、卖出挂卖一最低。
但是,自动交易不能只看成交率。市价类委托可能连续匹配多个价位,在盘口较薄时造成更大的滑点;过于保守的限价单又可能长时间不成交,让实盘仓位偏离策略目标。
对于我的低频ETF轮动与微盘组合,更合适的基础方案是:
对手价限价单+价格保护+部分成交处理+有限次数追单。
风险退出时可以适当提高成交优先级,普通调仓则应优先控制价格。具体市价类型和可用品种,必须以开户券商提供的QMT版本与柜台权限为准。
先理解买一和卖一
盘口由买方与卖方的未成交委托组成:
- 买一:当前买方愿意支付的最高价格;
- 卖一:当前卖方愿意接受的最低价格;
- 买一和卖一之间的差额,就是买卖价差。
如果想主动买入,通常要去匹配卖盘,因此参考卖一;如果想主动卖出,通常要去匹配买盘,因此参考买一。
三种常见执行方式
本方价限价
本方价限价指:
- 买入挂买一;
- 卖出挂卖一。
这种方式通常不会主动跨过买卖价差,而是加入本方排队。优点是成交价格更有利,缺点是只有对方主动来成交时才能完成,而且同一价格前面可能已有很长的队列。
如果行情正在上涨,买一委托可能一直追不上;如果行情正在下跌,卖一委托也可能持续卖不出去。因此它不适合要求准时完成换仓的策略。
对手价限价
对手价限价指:
- 买入挂当前卖一;
- 卖出挂当前买一。
这种委托会主动匹配当时最优的对手盘,同时仍然保留明确的最高买价或最低卖价。它通常能够兼顾成交率和价格控制,是低频自动交易很实用的起点。
但对手价并不保证成交。从QMT读取行情、生成委托、经过柜台再到交易所存在时间差。在快速行情中,原来的卖一可能已经上移,原来的买一也可能已经下移;卖一或买一的挂单数量也可能不足以覆盖全部委托。
市价类委托
A股所说的“市价委托”并不一定等于没有任何边界地扫完整个盘口。交易所存在不同市价申报类型,例如“最优五档即时成交剩余撤销”和“最优五档即时成交剩余转限价”。
其中,最优五档即时成交剩余撤销会依次与对手方五个最优价位成交,剩余部分自动撤销。因此它的成交率通常高于只挂卖一或买一,但仍然不能保证全部成交。
市价类委托的主要风险是成交均价不确定。当委托数量大于卖一或买一数量时,它可能继续成交到卖二、卖三或更深价位。
一张表看懂取舍
| 委托方式 | 买入方法 | 卖出方法 | 成交率 | 价格控制 | 更适合的场景 |
|---|---|---|---|---|---|
| 本方价限价 | 买一 | 卖一 | 较低 | 最强 | 不急成交、提供流动性 |
| 对手价限价 | 卖一 | 买一 | 较高 | 较强 | 普通低频调仓 |
| 市价类委托 | 匹配多档卖盘 | 匹配多档买盘 | 最高 | 较弱 | 紧急退出、流动性充足品种 |
实际成交率还取决于委托大小、盘口深度、行情速度、交易时段、涨跌停状态以及券商柜台实现,不能把表中的顺序理解为绝对保证。
为什么我的策略不宜全部使用市价?
ETF单笔金额可能较大
在ETF_ONLY状态下,ETF目标仓位约为总资产的98%。以100万元账户计算,一次ETF委托可能接近98万元。即使ETF日成交额较大,某一时刻卖一或买一的数量也未必足够。
如果直接使用会匹配多档的市价类委托,成交均价可能明显偏离聚宽回测价格,尤其是在开盘、午后快速拉升或突发消息期间。
微盘股更容易出现薄盘口
DUAL状态下,微盘目标仓位约49%,分成10只后,每只目标市值约为总资产的4.9%。对于100万元账户,单只约4.9万元。
金额看起来不大,但微盘股票可能存在:
- 买卖价差较宽;
- 五档挂单数量很少;
- 快速上涨时卖盘撤走;
- 快速下跌时买盘消失;
- 接近涨跌停时无法正常完成目标。
因此,微盘股尤其不适合没有保护边界的追价逻辑。
聚宽与QMT的一致性需要价格纪律
如果回测按当时可见价格成交,实盘却为了追求完成率不断跨档扫单,长期滑点会逐渐拉大两边净值差距。用对手价限价和有限追价,更有利于保持策略与实盘执行的一致性。
推荐的三档执行优先级
普通ETF调仓
正常换仓时,可以从对手价开始,并设置小幅保护范围:
买入保护上限 = 卖一价 ×(1 + 最大允许滑点)
卖出保护下限 = 买一价 ×(1 - 最大允许滑点)
流动性较好的ETF可以从约0.05%—0.10%的保护范围开始测试。更严谨的做法不是固定百分比,而是同时参考最小报价单位、买卖价差和五档盘口数量。
这只是初始研究范围,不应不经验证直接写死到实盘。应先根据QMT模拟成交记录统计真实滑点,再确定参数。
普通微盘调仓
微盘股建议:
- 首单按卖一买入、买一卖出;
- 委托金额较大时拆单;
- 只允许在预设保护价内追单;
- 盘口价差异常时暂停;
- 涨停不追买,跌停通常无法保证卖出;
- 未成交必须记录并通知。
微盘部分与其设置统一的0.1%,不如限制为若干最小价格档位,再叠加百分比上限。
风险退出与状态清仓
止损、利润保护触发或者策略进入ETF_ONLY时,卖出优先级高于普通调仓,因为继续持有会违反风险规则。
这时可以:
- 缩短检查与追单间隔;
- 允许更宽但仍有限的保护价格;
- 对流动性充足的ETF考虑券商支持的五档市价类委托;
- 对微盘股仍要防止无边界追价;
- 跌停无法成交时保留持仓状态,次日继续处理并发送告警。
“风险退出优先”不等于“不计任何价格卖出”。程序仍需限制追单次数与异常价格。
比选择市价或限价更重要:追单状态机
一次委托无法覆盖实盘中的全部情况。真正可靠的执行模块,应当知道订单是未报、已报、部分成交、全部成交、已撤还是废单。
推荐流程:
- 读取最新买一、卖一、五档数量和涨跌停价;
- 根据目标仓位计算剩余买卖数量;
- 首次按对手价限价委托;
- 等待3—10秒并查询真实成交回报;
- 已部分成交时,只处理剩余数量;
- 撤销旧的未成交委托,确认撤单结果;
- 更新盘口后重新定价;
- 最多追单2—3轮;
- 超过保护价、盘口消失或次数用尽时停止;
- 把未完成目标写入日志并发送通知。
这里最重要的不是“等待几秒”这个具体数字,而是不能在旧订单状态未确认时重复发送新订单,否则可能造成重复成交和仓位超标。
QMT伪代码示例
下面只展示执行思想,并非可以直接复制到所有券商QMT运行的完整代码。不同券商版本的行情字段、委托函数、价格类型常量和回报接口可能不同。
def execute_with_protection(symbol, side, target_qty, max_rounds=3):
remaining = target_qty
for round_no in range(max_rounds):
quote = get_latest_quote(symbol)
if quote.paused or quote.bid1 <= 0 or quote.ask1 <= 0:
notify(f"{symbol} 无有效盘口,停止委托")
break
if side == "BUY":
base_price = quote.ask1
limit_price = min(
base_price + round_no * quote.tick_size,
quote.buy_protection_price,
quote.high_limit,
)
else:
base_price = quote.bid1
limit_price = max(
base_price - round_no * quote.tick_size,
quote.sell_protection_price,
quote.low_limit,
)
order_id = send_limit_order(symbol, side, remaining, limit_price)
wait_for_order_update(order_id, seconds=5)
status = query_order_status(order_id)
remaining -= status.filled_qty
if remaining <= 0:
return True
if status.is_cancelable:
cancel_order(order_id)
wait_until_cancel_confirmed(order_id)
notify(f"{symbol} 尚有 {remaining} 股未完成")
return False正式实现还必须处理100股整数、可用资金、可卖数量、ETF最小价格单位、撤单失败、废单、网络重连、重复回报和程序重启后的订单恢复。
哪些时间不适合盲目使用对手价?
集合竞价阶段
集合竞价与连续竞价的撮合逻辑不同,买一和卖一可能不是最终成交价。市价申报的适用时间和品种也受交易所规则限制。程序不能把连续竞价的追单逻辑原样用于集合竞价。
开盘与收盘附近
开盘后几分钟和临近收盘时,行情变化速度、交易拥挤程度可能更高。低频策略如果没有必须立即成交的原因,可以避开最剧烈的短暂阶段。
涨跌停附近
涨停时买入可能排队很久,跌停时卖出可能没有有效买盘。此时反复撤单重报不一定提高成交率,反而可能失去已有队列位置。
盘口数量明显不足
如果目标数量远大于五档对手盘总量,应考虑拆单、延长执行时间或放弃本轮,而不是假设一个市价单可以无成本完成。
实盘应该记录哪些数据?
要判断市价还是限价更适合,最终应依靠自己的QMT成交数据,而不是只凭经验。每笔订单至少记录:
- 信号产生时间;
- 委托发送时间;
- 当时买一、卖一及五档数量;
- 委托类型、委托价和数量;
- 每笔成交时间、价格和数量;
- 撤单时间与结果;
- 最终完成率;
- 相对信号价、卖一或买一的滑点;
- 未成交原因和异常状态。
运行一段时间后,可以分别统计ETF与微盘股的成交率、平均滑点、95%分位滑点和追单次数,届时再决定哪些ETF允许使用五档市价,哪些股票必须使用严格限价。
我的最终选择
对于当前100万元规模的0.5低频策略,我会这样安排:
| 场景 | 首选方式 | 执行重点 |
|---|---|---|
| 正常ETF换仓 | 对手价限价 | 小幅保护、有限追单 |
| 正常微盘调仓 | 对手价限价 | 拆单、盘口检查、严格保护 |
| ETF风险退出 | 更积极的保护限价;必要时使用受保护的市价类型 | 成交优先,但不无限追价 |
| 微盘风险退出 | 对手价起步、加快有限追单 | 跌停无法成交时告警并持续管理 |
| 不急于成交 | 本方价限价 | 接受排队与未成交风险 |
因此,这个问题的答案不是简单的“市价一定好”或者“限价一定好”:
市价类委托更重视立即成交,限价委托更重视成交边界;对低频自动策略,最实用的折中通常是带保护的对手价限价和可靠的追单状态机。
参考资料
本文用于量化交易系统研究,不构成投资建议。不同券商QMT版本、交易市场和证券品种支持的委托类型可能不同,启用实盘前必须在模拟环境和小额账户中验证委托、撤单、部分成交与断线恢复逻辑。