本文讲解开平仓的四种意图、下单方法的共用参数、订单类型判定,以及下单回执与委托腿的字段含义。
报单意图
开平有四种。股票现券使用 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"。股票和期权的四个快捷方法已经覆盖开多、平多、开空、平空。
相关阅读

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