调用币安API的.create_margin_order()方法下单失败问题排查
问题排查与解决方案
1. 先修复异常捕获逻辑获取具体报错
你当前的代码使用了无差别裸except,会吞噬币安接口返回的具体错误信息,首先修改异常捕获代码拿到明确错误:
def limit_order(symbol, side, quantity, price, type=ORDER_TYPE_LIMIT): try: order = client.create_margin_order(symbol, side, quantity, price, type) # 原有业务逻辑不变 output = { 'status': True, 'symbol': symbol, 'side': side, 'quantity': quantity, 'price': price } print("Sending order:") print(output) except Exception as e: output = { 'status': False } print(f"订单错误详情:{e}") # 新增打印具体异常信息 print(symbol, side, quantity, price, type) print("There was an order error") return output return output
打印出的错误码/错误信息可以直接定位是权限问题、参数问题还是账户问题。
2. 权限返回仅SPOT的问题排查
- 你调用的
client.get_account()是现货账户专属接口,本身就只会返回现货相关权限,要查询杠杆账户权限需要调用保证金专用接口client.get_margin_account(),接口调用错了自然拿不到杠杆权限信息。 - 确认你使用的API密钥对应账户的实际权限:
- 区分主网/测试网密钥:如果是测试网环境,测试网账户需要单独开通杠杆权限,和主网权限不互通。
- 重新核对API后台权限:确认「启用现货与杠杆交易」「启用杠杆借贷、还款与划转」两个选项都已勾选,且账户完成了币安要求的对应KYC等级(大部分地区需要中级及以上KYC才能使用杠杆功能)。
- 确认账户本身没有被平台限制杠杆交易,可先在币安APP/网页端手动下一笔杠杆订单验证账户功能正常。
3. 大概率触发异常的直接原因:参数调用错误
你当前调用create_margin_order用的是位置传参,但是python-binance的该接口要求使用关键字参数传参,且限价单必须传入timeInForce参数,你漏传了该必填参数,同时参数顺序也不符合SDK要求,正确的调用写法参考:
order = client.create_margin_order( symbol=symbol, side=side, type=type, quantity=quantity, price=price, timeInForce=TIME_IN_FORCE_GTC # 限价单必填,GTC表示永久有效直到成交/撤销 )
另外你的quantity精度超出了BTCUSDT的允许步长(BTCUSDT的数量最小精度为6位小数,你传的数值有18位小数),需要先查询交易对规则后对数量做精度适配:
# 查询交易对精度规则 symbol_info = client.get_symbol_info(symbol) step_size = float([f for f in symbol_info['filters'] if f['filterType'] == 'LOT_SIZE'][0]['stepSize']) # 按精度截断数量 quantity = round(quantity - (quantity % step_size), 8)
内容的提问来源于stack exchange,提问作者Mo0rBy
相关产品推荐
相关产品推荐

