python-binance创建币安合约限价卖单报Precision精度错误如何解决
币安期货限价单精度报错解决方案
错误原因
"Precision is over the maximum defined for this asset." 报错的核心是你提交的限价单价格小数位数超过了该交易对官方规定的最大价格精度:
- 不同交易对的价格精度不统一,不存在通用的「保留5位小数」规则,比如ONEUSDT的价格精度为4位,你硬截5位本身就不符合要求
- 你先切割价格到5位小数再叠加0.3%溢价的逻辑存在漏洞:溢价计算完成后会产生新的小数位,之前的精度处理完全失效
修复方案
不要硬编码小数位数,优先通过币安接口动态获取当前交易对的精度规则,再对价格、数量做合规处理,修改后的完整代码如下:
import math import time coinName = "ONEUSDT" print(coinName) symbol = coinName amount = "1" leverage = "20" # 调整杠杆 self.client.futures_change_leverage(symbol=symbol, leverage=leverage) # 获取当前价格 price = float(self.client.get_symbol_ticker(symbol=symbol)["price"]) print(price) amount = float(amount) leverage = float(leverage) # 新增:动态获取交易对精度规则 exchange_info = self.client.futures_exchange_info() symbol_info = next(item for item in exchange_info["symbols"] if item["symbol"] == symbol) # 获取价格精度 price_filter = next(f for f in symbol_info["filters"] if f["filterType"] == "PRICE_FILTER") tick_size = float(price_filter["tickSize"]) # 获取数量精度(同步修复数量硬编码转int的潜在问题) lot_filter = next(f for f in symbol_info["filters"] if f["filterType"] == "LOT_SIZE") step_size = float(lot_filter["stepSize"]) # 处理下单数量,对齐数量精度要求 quantity = (amount * leverage) / price quantity = math.floor(quantity / step_size) * step_size # 数量精度为0的币种统一转int if step_size >= 1: quantity = int(quantity) # 开多仓 self.client.futures_create_order(symbol=symbol, side="BUY", type="MARKET", quantity=quantity) time.sleep(3) # 处理卖单价格:先算溢价,再对齐价格精度要求 sell_price = price * (1 + 0.3 / 100) sell_price = math.floor(sell_price / tick_size) * tick_size # 提交限价卖单 self.client.futures_create_order( symbol=symbol, side="SELL", type="LIMIT", price=sell_price, quantity=quantity, timeInForce="GTC" )
注意事项
- 所有币种的精度规则都要通过
futures_exchange_info接口动态获取,不要写死固定小数位,换交易对时不需要改代码 - 价格计算逻辑要先算最终目标价,再做精度对齐,不要先对齐再做算术运算,避免运算后产生多余小数位
内容的提问来源于stack exchange,提问作者Berke Ertep
相关产品推荐
相关产品推荐

