币安API报错code=-1111:精度超出资产定义最大值如何解决
问题描述
基于python-binance库开发币安合约自动化交易策略时,运行如下做多开单逻辑:
if side == "LONG" and client.futures_get_open_orders(symbol=symbol) == []: print(data) pos = "BUY" q = tbal / price q = round(q, 1) print(tbal) print(q) client.futures_change_leverage(symbol=symbol, leverage=info.laverage) buyorder = client.futures_create_order(symbol=symbol, side=pos, type="LIMIT", quantity=q, price=price, timeInForce="GTC")
程序抛出如下异常:
binance.exceptions.BinanceAPIException: APIError(code=-1111): Precision is over the maximum defined for this asset.
多次调整参数后问题仍未解决,需要对应的排查思路与修复方案。
错误根因
code=-1111 精度超限错误的核心触发原因是传入的下单参数不符合币安对应交易对的精度规则,原代码存在两个明显问题:
- 硬编码下单数量保留1位小数,完全没有匹配交易对的官方精度要求,不同合约交易对的数量、价格允许精度差异极大,固定1位小数对绝大多数交易对都不适用
- 仅对数量做了精度处理,完全忽略了限价单的
price参数同样需要符合交易对的价格精度要求,任意一个参数精度超限都会触发该报错
排查思路
- 先排查硬编码精度的逻辑:所有写死
round(x, 固定数字)的精度处理都是高风险点,必须替换为从币安接口实时拉取的对应交易对规则 - 同步校验两类精度:不要只检查
quantity的精度,必须同时检查price的精度是否符合要求 - 确认步长规则:部分交易对的参数允许值不是单纯的N位小数,而是要求参数值必须为指定步长的整数倍,仅做小数位截断无法满足要求
- 排除浮点误差:Python浮点数运算存在精度误差,比如0.1实际存储为0.1000000000000001,即使逻辑上做了截断,浮点误差也可能导致最终传入值超出精度限制
修复方案
- 每次启动策略/切换交易对时,从币安接口拉取对应交易对的完整交易规则,不要硬编码任何精度值
- 编写通用的精度调整函数,基于接口返回的步长规则处理参数,规避浮点误差问题
- 对下单的数量、价格两个参数都做精度校验后再传入下单接口
完整修复代码参考:
def adjust_precision(value, step): # 按步长将参数调整为合法值,规避浮点运算误差 step_str = str(step).rstrip('0') if '.' in step_str: precision = len(step_str.split('.')[-1]) else: precision = 0 adjusted_val = round(value - (value % step), precision) return adjusted_val # 初始化时拉取交易对规则,可缓存避免重复请求 exchange_info = client.futures_exchange_info() target_symbol_info = next(item for item in exchange_info['symbols'] if item['symbol'] == symbol) qty_step = 0.0 price_step = 0.0 for filter_item in target_symbol_info['filters']: if filter_item['filterType'] == 'LOT_SIZE': qty_step = float(filter_item['stepSize']) if filter_item['filterType'] == 'PRICE_FILTER': price_step = float(filter_item['tickSize']) # 开单逻辑 if side == "LONG" and client.futures_get_open_orders(symbol=symbol) == []: print(data) pos = "BUY" q = tbal / price # 替换原硬编码round逻辑,按规则调整数量 q = adjust_precision(q, qty_step) # 同步调整限价单价格精度 valid_price = adjust_precision(price, price_step) print(tbal) print(q) client.futures_change_leverage(symbol=symbol, leverage=info.laverage) buyorder = client.futures_create_order( symbol=symbol, side=pos, type="LIMIT", quantity=q, price=valid_price, timeInForce="GTC" )
额外注意事项
- 交易规则可以本地缓存,不需要每次下单都拉取,避免触发接口限频
- 如果调整精度后仍报错,可额外检查下单名义价值是否满足交易对的最小下单额要求,部分场景下最小额不满足也会返回同类错误
- 市价单不需要传price参数,但仍然需要对quantity做精度校验
内容的提问来源于stack exchange,提问作者Andrey Kanava
相关产品推荐
相关产品推荐

