🚀 AI 一键生成 joinquant 策略代码

JoinQuant 聚宽平台科创板股票下单报错“市价单需要指定保护限价”怎么解决?

joinquant | 发布时间: 2026/5/22
以下内容由 EasyQuant 生成。

问题描述

order_value函数针对科创版总是失败?

stock,cash都已经前面计算好了。
问题是如果是科创版股票,利用marketorderstyle(1000)来提供限价,仍然报错。

order_value(security=stock, value=Cash, style=MarketOrderStyle(1000))

报错如下:
2023-01-12 09:30:00 - ERROR - 订单委托失败:StockOrder(entrust_id=1705070297 security=688669.XSHG mode=OrderTargetValue: _value=0.0 style=MarketOrderStyle: _limit_price=0.0 side=long action=close margin=False entrust_time=2023-01-12 09:30:00 cancel_time=None finish_time=None comment= error=科创板市价单需要指定保护限价,取值必须大于 0 且小于 1 万元)

解决方案

根据您提供的报错日志,问题其实并不是出在您买入时的 order_value 代码上,而是出在您卖出平仓的代码上。

错误原因分析

请仔细观察您的报错日志:

mode=OrderTargetValue: _value=0.0 style=MarketOrderStyle: _limit_price=0.0 side=long action=close

日志中明确显示:

  1. mode=OrderTargetValue: _value=0.0:说明触发报错的函数是 order_target_value,且目标价值为 0
  2. action=close:说明这是一个**平仓(卖出)**操作。
  3. _limit_price=0.0:说明在这个卖出操作中,保护限价为 0。

结论:您在买入时确实写了 style=MarketOrderStyle(1000),但在策略的另一处(可能是止损、调仓或清仓的代码中),您使用了类似 order_target_value(stock, 0)order_target(stock, 0) 来卖出科创板股票,却忘记了在卖出时也加上 MarketOrderStyle 保护限价。默认情况下,不传 style 会使用普通的市价单(保护限价为0),从而导致科创板规则校验失败。

解决方法

在科创板交易中,无论是买入还是卖出,只要使用市价单,都必须指定保护限价

1. 修正卖出/清仓代码

找到您策略中卖出该股票的代码(通常是 order_target_value(stock, 0)),将其修改为带有保护限价的形式。例如,卖出时可以将保护限价设置为跌停价或一个较低的合理价格:

# 获取跌停价作为卖出的保护限价(推荐做法)
current_data = get_current_data()
lower_limit = current_data[stock].low_limit

# 清仓卖出,必须带上 style
order_target_value(stock, 0, style=MarketOrderStyle(lower_limit))

2. 规范买入代码

您目前的买入代码 order_value(security=stock, value=Cash, style=MarketOrderStyle(1000)) 语法是正确的。但为了更严谨,建议买入时的保护限价设置为当天的涨停价,而不是写死的 1000:

# 获取涨停价作为买入的保护限价
current_data = get_current_data()
high_limit = current_data[stock].high_limit

# 按价值买入
order_value(stock, Cash, style=MarketOrderStyle(high_limit))

总结

科创板的市价单保护限价逻辑如下:

  • 市价买入时:成交的最高价格不高于保护限价(建议设为涨停价)。
  • 市价卖出时:成交的最低价格不低于保护限价(建议设为跌停价)。

请全局搜索您的策略代码,确保所有针对科创板股票(688开头)的 orderorder_valueorder_targetorder_target_value 函数调用,都正确传入了 style=MarketOrderStyle(保护限价) 参数。