问题描述
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
日志中明确显示:
mode=OrderTargetValue: _value=0.0:说明触发报错的函数是order_target_value,且目标价值为0。action=close:说明这是一个**平仓(卖出)**操作。_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开头)的 order、order_value、order_target、order_target_value 函数调用,都正确传入了 style=MarketOrderStyle(保护限价) 参数。