问题描述
解决方案
在 ptrade 量化交易平台中,使用 order_target(指定目标数量买卖)函数进行委托下单时,如果创建订单失败,函数会返回 None。导致下单失败返回 None 的常见原因主要包括以下几个方面:
1. 行情快照获取失败(市价单场景)
在交易场景中,如果您调用 order_target 时没有传入 limit_price(限价)参数,系统会默认使用行情快照数据中的最新价进行报单。如果此时行情快照获取失败(例如网络延迟、未开通对应行情权限或盘前无数据),就会导致委托失败并返回 None。系统通常会在日志中增加相关提醒。
2. 资金或持仓不足
- 买入时资金不足:根据目标数量与当前持仓计算出的需要买入的数量,乘以委托价格后,所需的资金总额大于账户当前可用资金。
- 卖出时持仓不足:虽然
order_target是调整到目标数量,但如果计算出需要卖出的数量大于当前可用持仓数量,也会导致委托失败。
3. 标的状态异常
如果委托的标的(如股票)处于以下状态,柜台将拒绝报单:
- 股票处于停牌状态。
- 股票未上市或已退市。
- 输入的股票代码不存在或格式错误(请注意代码尾缀,如
.SS或.SZ)。
4. 价格精度不符合规范
如果您传入了 limit_price,需要注意不同品种的价格精度要求。如果小数位数处理不当,会导致委托失败:
- 股票:价格精度为小数点后两位。
- 可转债、ETF、LOF:价格精度为小数点后三位。
- 股指期货:小数点后一位。
5. 委托数量不符合规范
order_target在委托股票时会自动取整为 100股 的整数倍,委托可转债时取整为 10张。如果目标数量设置不合理,可能会导致计算出的实际委托数量为 0 或不符合交易所规则。- 注意:卖出所有股票(即
order_target(security, 0))时不受 100 股整数倍的限制。
6. 不支持的交易类型
order_target 函数不支持国债逆回购交易。如果尝试对逆回购代码使用该函数,将直接返回 None。
💡 排查建议
- 检查日志:仔细查看 ptrade 运行日志,通常系统会打印出具体的警告或错误信息(如资金不足、行情获取失败等)。
- 检查入参:确认股票代码是否正确,
limit_price的精度是否符合品种要求。 - 增加异常处理:在策略中判断返回值,如果返回
None,可以通过log.error打印当前资金、持仓和最新价,以便定位问题。
order_id = order_target('600570.SS', 1000, limit_price=45.00)
if order_id is None:
log.error('下单失败,请检查资金、持仓或标的状态!')