本文讲解撤单的三种方式和 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()。
相关阅读

评论
登录后参与讨论,与站内账号体系共用。