问题描述
使用order_target Value 会出现
科创板市价单需要指定保护限价
各位如何处理?
解决方案
报错原因分析
在 JoinQuant(聚宽)平台上交易科创板股票(代码以 688 开头,后缀为 .XSHG)时,根据交易所的交易规则,科创板的市价申报必须指定保护限价。如果没有指定保护限价,系统就会抛出 科创板市价单需要指定保护限价 的错误。
保护限价的逻辑如下:
- 市价买入时:成交的最高价格不高于该保护限价,若最优一档的价格高于该价格,剩余未成交部分撤单。
- 市价卖出时:成交的最低价格不低于该保护限价,若最优一档的价格低于该价格,剩余未成交部分撤单。
解决方法
在使用 order_target_value(或其他下单函数如 order, order_target, order_value)时,需要通过 style 参数传入带有保护限价的 MarketOrderStyle 对象。
代码示例
假设你要将科创板股票 688001.XSHG 的仓位调整到 10000 元,并且设置保护限价为 10 元,正确的写法如下:
# 导入聚宽函数库
from jqdata import *
def handle_data(context, data):
security = '688001.XSHG'
target_value = 10000
# 获取当前价格作为参考,或者根据你的策略计算出一个合理的保护价
# 这里假设我们以当前价格的 1.02 倍作为买入保护限价(防止买得太贵)
current_price = data[security].close
protect_price = current_price * 1.02
# 使用 MarketOrderStyle 指定保护限价
order_target_value(security, target_value, style=MarketOrderStyle(protect_price))
其他下单函数的对应写法
不仅是 order_target_value,其他下单函数处理科创板市价单的方式也是一样的:
# 按股数下单:买入 200 股,保护价 10 元
order('688001.XSHG', 200, MarketOrderStyle(10))
# 目标股数下单:调整仓位至 100 股,保护价 10 元
order_target('688001.XSHG', 100, MarketOrderStyle(10))
# 按价值下单:买入价值 10000 元的股票,保护价 10 元
order_value('688001.XSHG', 10000, MarketOrderStyle(10))
总结建议
在编写涉及全市场选股的策略时,建议在下单前对股票代码进行判断。如果是科创板股票(security.startswith('688')),则动态计算一个保护限价(例如现价的 ±2%)并传入 MarketOrderStyle(limit_price);如果是普通 A 股,则可以直接使用默认的市价单。