QMT实盘成交市价还是限价好

成交率、滑点和自动追单之间,应该如何取舍?

QMT
自动交易
ETF
微盘股
实盘执行
比较QMT实盘中的市价委托、对手价限价和本方价限价,并给出适合低频ETF与微盘策略的执行方案。
作者

WZ ETF

发布于

2026-08-18

先说结论

如果只比较成交率,一般是:

市价类委托最高;买入挂卖一、卖出挂买一其次;买入挂买一、卖出挂卖一最低。

但是,自动交易不能只看成交率。市价类委托可能连续匹配多个价位,在盘口较薄时造成更大的滑点;过于保守的限价单又可能长时间不成交,让实盘仓位偏离策略目标。

对于我的低频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时,卖出优先级高于普通调仓,因为继续持有会违反风险规则。

这时可以:

  1. 缩短检查与追单间隔;
  2. 允许更宽但仍有限的保护价格;
  3. 对流动性充足的ETF考虑券商支持的五档市价类委托;
  4. 对微盘股仍要防止无边界追价;
  5. 跌停无法成交时保留持仓状态,次日继续处理并发送告警。

“风险退出优先”不等于“不计任何价格卖出”。程序仍需限制追单次数与异常价格。

比选择市价或限价更重要:追单状态机

一次委托无法覆盖实盘中的全部情况。真正可靠的执行模块,应当知道订单是未报、已报、部分成交、全部成交、已撤还是废单。

QMT低频策略使用对手价、查询成交、撤单和有限追价的执行流程

推荐流程:

  1. 读取最新买一、卖一、五档数量和涨跌停价;
  2. 根据目标仓位计算剩余买卖数量;
  3. 首次按对手价限价委托;
  4. 等待3—10秒并查询真实成交回报;
  5. 已部分成交时,只处理剩余数量;
  6. 撤销旧的未成交委托,确认撤单结果;
  7. 更新盘口后重新定价;
  8. 最多追单2—3轮;
  9. 超过保护价、盘口消失或次数用尽时停止;
  10. 把未完成目标写入日志并发送通知。

这里最重要的不是“等待几秒”这个具体数字,而是不能在旧订单状态未确认时重复发送新订单,否则可能造成重复成交和仓位超标。

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版本、交易市场和证券品种支持的委托类型可能不同,启用实盘前必须在模拟环境和小额账户中验证委托、撤单、部分成交与断线恢复逻辑。