KB / ARTICLE

报单与成交

策略文档修订 R1发布于 2026-11-05

本文讲解开平仓的四种意图、下单方法的共用参数、订单类型判定,以及下单回执与委托腿的字段含义。

报单意图

开平有四种。股票现券使用 buy() 开多、sell() 平多。期权需要空头时,用 short() 开空、cover() 平空。close_position() 把该标的持仓清掉。后续期货也沿用这四个方向。

意图 方法 默认语义
开多 / 加多 buy() side="Buy",position_effect="auto"
平多 sell() side="Sell",position_effect="auto"
开空 short() side="Sell",position_effect="open"
平空 cover() side="Buy",position_effect="close"
清仓 close_position() 把该标的持仓调到 0

buy() 和 sell() 的 auto 会按可平仓自动拆成平仓腿和开仓腿。可平仓 = 结算持仓 − 同一根 bar 内已提交、尚未成交的平仓单。期权、期货要明确开空或平空时,直接调用 short() 或 cover()。

账户是否允许开空,用 self.get_execution_capabilities() 看 supports_short_sell 和 account_mode。A 股现券账户调用 short() 会被拒绝,平多仍用 sell()。

buy、sell、short、cover

buy()、sell()、short()、cover() 使用同一组参数。short() 和 cover() 多一个 reduce_only。

buy(symbol=None, quantity=None, price=None, trigger_price=None, )
参数 类型 默认值 说明
symbol str \ None 当前标的 交易代码。股票如 600000.SH,期权填合约代码
quantity float | None 见各方法 数量。股票为股,期权为张。不是金额,也不是仓位比例
price float \ None None 限价。省略表示市价
trigger_price float \ None None 止损、止盈触发价
reduce_only bool False 仅 short()、cover()。True 时只减仓,不开反向仓

symbol=None 只适合当前有 Bar 或 Tick 的回调。盘前、启动和定时回调里要写出合约代码。

price 和 trigger_price 决定订单类型:

price trigger_price 含义
None None 市价单
有值 None 限价单
None 有值 触发后市价单
有值 有值 触发后限价单

实盘是否接受某种订单类型,以所连接的交易通道为准。

buy(...)

开多或加多。

返回值:OrderReceipt。表示请求已提交,不表示已经成交。

quantity=None 时,数量由当前仓位管理器计算。股票策略建议写出股数。

from qmfquant import  Strategy


class MyStrategy(Strategy):

    def on_bar(self, bar) -> None:
        receipt = self.buy(bar.symbol, quantity=100, price=10.50)

sell(...)

平多。卖出已有多头。

返回值:OrderReceipt。

quantity=None 时,按当前可处理的多头数量卖出。股票仍应先读可卖数量再传入。卖出数量超过 get_available_position() 时,订单会被拒绝。

from qmfquant import  Strategy


class MyStrategy(Strategy):

    def on_bar(self, bar) -> None:
        available = self.get_available_position(bar.symbol)
        if available >= 100:
            receipt = self.sell(bar.symbol, quantity=100)

short(...)

开空。默认就是卖出开仓,用于期权等支持做空的账户。

short(symbol=None, quantity=None, price=None, reduce_only=False)

返回值:None。是否接受、是否成交看 on_order() 和 on_trade()。

quantity=None 时由仓位管理器计算。reduce_only=True 时只减已有仓位,不开反向仓。

from qmfquant import  Strategy


class MyStrategy(Strategy):

    def on_bar(self, bar) -> None:
        self.short(bar.symbol, quantity=100,)

现券账户 supports_short_sell=False,调用会直接报错,提示改用 sell() 平多。

cover(...)

平空。买入平掉已有空头。参数与 short() 相同。

返回值:None。

quantity=None 时,尝试平掉当前标的的全部空头。

from qmfquant import  Strategy


class MyStrategy(Strategy):

    def on_bar(self, bar) -> None:
        self.cover(bar.symbol, quantity=100, reduce_only=True)

close_position(symbol=None)

把指定标的的持仓调到 0。多头走平多,空头走平空。symbol 省略时使用当前标的。

参数 类型 默认值 说明
symbol str | None 当前标的 要清掉的代码

返回值:None。返回后持仓不一定已经为 0,以 on_trade() 和 get_position() 为准。

数量差额不受整手取整限制,按实际持仓清。股票 T+1 下,当天买入的部分仍然不可卖,能否全部平掉取决于可卖数量。

from qmfquant import  Strategy


class MyStrategy(Strategy):

    def on_bar(self, bar) -> None:
        if self.get_available_position(bar.symbol) > 0:
            self.close_position(bar.symbol)

OrderReceipt

buy() 和 sell() 返回 OrderReceipt 对象,不是字典,也不是成交结果。short()、cover()、close_position() 返回 None,不走这个对象。

参数 参数名称 参数类型 描述
primary 首腿订单号 str 多数场景当作这笔下单的订单号,与 on_order 里的 order.id 对应
group_id 逻辑委托号 str 把拆出的多腿关联为同一次下单。单腿时与 primary 相同
order_ids 全部腿订单号 tuple[str] 元组,元素是订单号字符串。单腿时长度为 1
legs 委托腿 tuple[OrderLeg] 元组,元素是 OrderLeg 对象
failure 失败信息 None 或其他 提交成功时为 None

str(receipt) 与 group_id 相同,可用于撤这一组委托。

OrderLeg 是 legs 里的对象:

参数 参数名称 参数类型 描述
position_effect 开平方向 str 如 "auto"
quantity 该腿数量 float 腿上的数量字段。委托数量以 Order.quantity 为准
client_order_id 客户订单号 str 该腿客户订单号
broker_order_id 通道订单号 str 该腿通道订单号
from qmfquant import  Strategy


class MyStrategy(Strategy):

    def on_bar(self, bar) -> None:
        receipt = self.buy(bar.symbol, quantity=100)
        self.log(f"订单号:{receipt.primary}")
        self.cancel_group(receipt)

成交回报用 trade.order_id 对应 Order.id 和 receipt.primary。Trade 对象上没有 group_id。多腿的逻辑编号看 receipt.group_id。

持有反向仓位时,一次 buy() 或 sell() 可能拆成两腿,order_ids 长度大于 1,primary 只是其中一腿。整笔撤销用 cancel_group(receipt)。

期货若要区分平今、平昨,使用 submit_order(..., position_effect="close_today") 或 "close_yesterday"。股票和期权的四个快捷方法已经覆盖开多、平多、开空、平空。


相关阅读

已复制到剪贴板
策略文档修订 R1

返回策略文档板块

评论