问题描述
订单委托失败:StockOrder(entrust_id=1609787183 security=688111.XSHG mode=OrderTargetValue: _value=1000000.0 style=MarketOrderStyle: _limit_price=0.0 side=long action=open margin=False entrust_time=2021-01-04 09:30:00 error=科创板市价单需要指定保护限价,取值必须大于 0 且小于 1 万元)
解决方案
报错原因分析
在 JoinQuant 平台中,当您使用 order_target_value(或 order、order_value 等下单函数)且不指定 style 参数时,系统默认使用市价单(MarketOrderStyle)。
根据上交所科创板的交易规则,科创板的市价申报必须包含保护限价。保护限价是指投资者能够接受的最高买价(买入时)或最低卖价(卖出时)。如果未指定保护限价,或者限价为 0,系统就会抛出您遇到的错误:科创板市价单需要指定保护限价,取值必须大于 0 且小于 1 万元。
解决方法
要解决这个问题,您需要在调用下单函数时,显式地传入 style 参数,并为其指定一个合理的保护限价。您可以选择继续使用带保护限价的市价单,或者改用限价单。
方法一:使用带保护限价的市价单(推荐)
使用 MarketOrderStyle(limit_price),其中 limit_price 就是您的保护限价。
- 买入时:成交价不得高于该保护价。
- 卖出时:成交价不得低于该保护价。
代码示例:
# 假设您要将 688111.XSHG 的仓位调整到 1000000 元
security = '688111.XSHG'
target_value = 1000000
# 获取当前最新价作为参考(也可以使用涨跌停价等)
current_data = get_current_data()
current_price = current_data[security].last_price
# 设定保护价:例如买入时,愿意接受的最高价格为当前价上浮 2%
protect_price = current_price * 1.02
# 使用 MarketOrderStyle 传入保护价
order_target_value(security, target_value, style=MarketOrderStyle(protect_price))
方法二:改用限价单
如果您希望以确定的价格进行委托,可以直接使用限价单 LimitOrderStyle(limit_price)。
代码示例:
security = '688111.XSHG'
target_value = 1000000
# 获取当前最新价
current_data = get_current_data()
current_price = current_data[security].last_price
# 直接以当前价(或您计算出的其他价格)下限价单
order_target_value(security, target_value, style=LimitOrderStyle(current_price))
注意事项
- 保护价的合理性:设置保护价时,请确保它在当日的涨跌停板范围内。如果买入保护价高于涨停价,或卖出保护价低于跌停价,可能会导致废单。可以通过
get_current_data()[security].high_limit和low_limit获取涨跌停价。 - 科创板交易数量规则:科创板单笔申报数量应当不小于 200 股,超过 200 股的部分,可以以 1 股为单位递增(例如 201 股、202 股)。JoinQuant 引擎在处理
order_target_value时会自动计算股数,但了解此规则有助于排查资金不足导致的未完全成交问题。 - 通用性:
MarketOrderStyle(limit_price)中的limit_price参数仅对科创板标的有效。如果您将带有保护价的MarketOrderStyle用于主板或中小创股票,引擎会自动忽略该保护价,按普通市价单处理。因此,您可以统一封装下单逻辑,无需为科创板单独写一套完全不同的下单函数。