3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 ptrade 量化交易平台中,当你调用 order()、order_target() 或 order_value() 等委托接口时,如果遇到**“委托数量校验失败”的报错,通常是因为传入的 amount(委托数量)参数不是整数(int)类型**。
在编写量化策略时,我们经常会根据账户可用资金和当前股票价格来动态计算买入数量(例如:amount = cash / price)。在 Python 中,除法运算的结果默认是浮点数(float)。如果直接将这个浮点数传给 ptrade 的委托接口,底层校验机制会直接拒绝该报单。
此外,A股市场的交易规则也要求:
要解决这个问题,核心在于在调用委托接口前,将计算出的数量强制转换为整数,并符合交易所的整手规则。
int() 强制转换如果你使用的是 order_target(目标数量)或 order(按数量买卖),确保传入的变量经过了 int() 转换。
# 错误写法:amount 可能是浮点数,如 150.5
amount = context.portfolio.cash / current_price
order(g.security, amount)
# 正确写法:强制转换为整数
amount = int(context.portfolio.cash / current_price)
order(g.security, amount)
为了避免废单或资金不足,买入股票时最好手动向下取整到 100 的倍数。
def handle_data(context, data):
security = '600570.SS'
current_price = data[security]['close']
cash = context.portfolio.cash
# 计算理论可买数量
raw_amount = cash / current_price
# 向下取整到 100 的整数倍
# 例如:raw_amount 为 1250.5,计算后 buy_amount 为 1200
buy_amount = int(raw_amount / 100) * 100
if buy_amount >= 100:
order(security, buy_amount)
log.info(f"成功委托买入 {security},数量:{buy_amount} 股")
else:
log.info("可用资金不足以买入 100 股")
根据 ptrade API 文档,部分接口在底层已经做了一定的取整优化,但前提是你传入的数据类型必须合法:
order_value(security, value):你传入的是目标价值(value 可以是浮点数),ptrade 底层会自动根据价格计算数量,并自动取整为 100 股(股票)或 10 张(可转债)。如果你不想手动计算数量,推荐使用 order_value。order_target(security, amount):期望的最终数量。ptrade 在委托股票时也会取整 100 股,但传入的 amount 强烈建议使用 int 类型,避免触发类型校验错误。order_target(security, 0)),不受 100 股的限制,系统会全部卖出。int() 处理。order_value() 或 order_target_value(),让 ptrade 引擎帮你处理复杂的取整逻辑。order() 之前,使用 log.info(type(amount)) 打印一下数量的类型,可以快速定位是否是因为浮点数导致的校验失败。