KB / ARTICLE

撤单与复杂订单

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

本文讲解撤单的三种方式和 OCO、括号单、跟踪止损等复杂订单操作。

撤单

三个方法都只提交撤单请求,返回值都是 None。是否撤成,看 on_order() 里的订单状态。已成交、已撤销、已拒绝或已过期的订单不能再撤。

cancel_order(order_id)

撤销一笔订单。

参数 类型 说明
order_id str 或 OrderReceipt 订单号。传入 OrderReceipt 时只撤 .primary 这一腿
from qmfquant import  Strategy


class MyStrategy(Strategy):

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

cancel_group(group_id)

撤销同一次下单拆出的全部腿。buy() / sell() 被拆成平仓腿和开仓腿时用这个。

参数 类型 说明
group_id str 或 OrderReceipt 逻辑委托号。传入 OrderReceipt 时使用 .group_id,与 str(receipt) 相同
from qmfquant import  Strategy


class MyStrategy(Strategy):

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

cancel_all_orders(symbol=None)

撤销活动订单。

参数 类型 默认值 说明
symbol str \ None None 填写后只撤该标的。省略则撤当前可见的全部活动订单
from qmfquant import  Strategy


class MyStrategy(Strategy):

    def on_bar(self, bar) -> None:
        # 撤销指定合约订单
        self.cancel_all_orders(bar.symbol) 
        # 撤销所有合约订单
        self.cancel_all_orders()

OCO、括号单与跟踪止损

place_oco(first_order_id, second_order_id, group_id=None)

把已经提交成功的两笔订单绑成一组:其中一笔成交后,另一笔自动撤销。OCO 不创建订单,也不检查两笔单的价格和方向是否匹配。

参数 类型 默认值 说明
first_order_id str 或 OrderReceipt 无 第一笔订单号或下单回执
second_order_id str 或 OrderReceipt 无 第二笔订单号或下单回执
group_id str | None None 这组 OCO 的编号。省略时由框架生成

返回值:str,这组 OCO 的编号。它不是其中某一笔的 order.id。

两笔订单号都不能为空,也不能相同。

from qmfquant import  Strategy


class MyStrategy(Strategy):

    def on_bar(self, bar) -> None:
        stop = self.sell(bar.symbol, quantity=100, trigger_price=9.50, tag="stop")
        take = self.sell(bar.symbol, quantity=100, price=11.00, tag="take")
        oco_id = self.place_oco(stop, take)

股票上如果两笔都按全部可卖数量卖出,第二笔可能因为可卖不足被拒绝,这时还绑不成 OCO。止损和止盈要等入场成交后再挂,用下面的 place_bracket()。

place_bracket(...)

一次提交入场、止损、止盈。入场成交后才挂退出单;止损和止盈都有时,框架自动把这两笔退出单绑成 OCO。

参数 类型 默认值 说明
symbol str 无 标的代码
quantity float 无 数量,必须大于 0
entry_price float \ None None 入场限价。省略为市价
stop_trigger_price float \ None None 止损触发价。与止盈价至少填一个
take_profit_price float \ None None 止盈价
time_in_force 枚举或 None None 有效期
entry_tag / stop_tag / take_profit_tag str \ None None 三笔订单各自的标签

返回值:str,入场订单号,对应 on_order() 里的 order.id。止损、止盈此时还没生成。

from qmfquant import  Strategy


class MyStrategy(Strategy):

    def on_bar(self, bar) -> None:
        entry_order_id = self.place_bracket(
            quantity=100,
            entry_price=10.00,
            stop_trigger_price=9.50,
            take_profit_price=11.00,
        )

place_trailing_stop / place_trailing_stop_limit

跟踪止损。价格朝有利方向移动时,触发价跟着移动;价格反向达到触发价后,前者按市价成交,后者按限价成交。

参数 类型 默认值 说明
symbol str 无 标的代码
quantity float 无 数量,必须大于 0
trail_offset float 无 跟踪距离,必须大于 0
price float 无 仅限价版本。触发后的限价,必须大于 0
side str "Sell" 平多使用 "Sell"
trail_reference_price float \ None None 跟踪起点。省略时由执行环境确定
time_in_force 枚举或 None None 有效期
tag str \ None None 订单标签

返回值:OrderReceipt。

from qmfquant import  Strategy


class MyStrategy(Strategy):

    def on_bar(self, bar) -> None:
        receipt = self.place_trailing_stop(
            quantity=100,
            trail_offset=0.50,
            side="Sell",
            trail_reference_price=10.00,
            tag="trail-stop",
        )

这三类订单实盘是否可用,先查 get_execution_capabilities()。


相关阅读

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

返回策略文档板块

评论