Python对接Binance期货下单报错-1111:资产精度超限问题
问题解决:Binance限价单报错-1111(精度超限)
报错原因
BinanceAPIException: APIError(code=-1111): Precision is over the maximum defined for this asset.
翻译:价格精度超出该资产允许的最大值
止损/止盈市价单能正常创建,是因为这类订单的stopPrice精度要求相对宽松;而限价单的price参数必须严格符合标的资产的价格小数位数限制,你当前的处理只考虑了最小价格变动单位(tickSize),忽略了Binance对价格小数位数上限的约束。
问题根源
你的get_ticksize函数仅获取了PRICE_FILTER中的tickSize(最小价格步长),但每个交易对还存在pricePrecision字段——它规定了价格最多能保留的小数位数。比如1INCHUSDT的pricePrecision为4,意味着价格最多只能有4位小数,一旦处理后的价格小数位数超过这个值,就会触发-1111错误。
解决方案
1. 修改函数,同时获取步长和精度参数
def get_price_info(symbol): info = client.futures_exchange_info() for item in info['symbols']: if item['symbol'] == symbol: tick_size = None price_precision = item['pricePrecision'] for f in item['filters']: if f['filterType'] == 'PRICE_FILTER': tick_size = f['tickSize'] return tick_size, price_precision
2. 双重处理价格:先按步长取整,再按精度格式化
# 获取步长和精度参数 tick_size, price_precision = get_price_info(symbol) # 第一步:按最小变动单位取整 price = round_step_size(float(price), float(tick_size)) stopl = round_step_size(float(stopl), float(tick_size)) takep = round_step_size(float(takep), float(tick_size)) # 第二步:按小数位数上限格式化,避免浮点数精度误差 price = "{0:.{1}f}".format(price, price_precision) stopl = "{0:.{1}f}".format(stopl, price_precision) takep = "{0:.{1}f}".format(takep, price_precision)
通过字符串格式化强制保留指定小数位数,能彻底避免浮点数运算导致的末尾多余小数问题,确保价格完全符合Binance的要求。
3. 验证处理结果
以你的输入信号为例:
- 原价格
0.6396→ 处理后仍为0.6396(符合4位小数要求) - 止损价
0.652392→ 按步长取整后为0.6523,格式化后保持0.6523 - 止盈价
0.588432→ 处理后为0.5884
处理后的价格既满足最小变动单位要求,又不超过小数位数上限,限价单即可正常创建。
内容的提问来源于stack exchange,提问作者Wolky
相关产品推荐
相关产品推荐

