如何用python-binance获取锁定资产价格?锁定余额显示异常求助
问题描述
以下代码本应返回账户余额列表:
from binance.client import Client client = Client(api_key, api_secret) account_balances = client.get_account()["balances"] wallet_coins = [balance for balance in balances if float(balance['free']) > 0 or float(balance['locked']) > 0] for coin in wallet_coins: asset = coin['asset'] free_balance = coin['free'] locked_balance = coin['locked'] print(f"Asset: {asset}, Free: {free_balance}, Locked: {locked_balance}")
预期结果:所有余额数据准确显示。
实际结果:所有锁定资产的余额显示为0(但币安网页端显示正常):
Asset: LDATOM, Free: 0.12485302, Locked: 0.00000000 Asset: LDSOL, Free: 0.14696155, Locked: 0.00000000 Asset: LDAPT, Free: 0.34394733, Locked: 0.00000000 Asset: LDSUI, Free: 0.63988096, Locked: 0.00000000
求助如何通过python-binance正确获取锁定资产的余额及解决显示异常问题。
解决方案
1. 先修正变量名错误
代码里存在明显的变量名不一致问题:已经定义了account_balances存储账户余额,但列表推导式里误用了未定义的balances,先修正这一点:
wallet_coins = [balance for balance in account_balances if float(balance['free']) > 0 or float(balance['locked']) > 0]
2. 区分普通资产与锁仓类资产
你看到的LD开头的资产是币安的锁仓质押类资产(比如Launchpad锁仓、Staking锁仓),这类资产的余额不在get_account()返回的balances字段中,需要调用专门的接口获取:
获取Staking质押锁仓资产
使用get_staking_product_position()接口获取质押类锁仓资产:
staking_positions = client.get_staking_product_position() for pos in staking_positions: asset = pos['asset'] locked_amount = pos['amount'] print(f"质押锁仓资产: {asset}, 锁定金额: {locked_amount}")
获取Launchpad锁仓资产
如果是Launchpad活动的锁仓资产,需要结合get_launchpad_projects()和get_launchpad_user_capital()接口:
# 获取当前Launchpad项目列表 projects = client.get_launchpad_projects() for project in projects: project_id = project['projectId'] # 获取当前用户该项目的锁仓信息 user_capital = client.get_launchpad_user_capital(project_id=project_id) for capital in user_capital: asset = capital['asset'] locked_amount = capital['lockedAmount'] print(f"Launchpad锁仓资产: {asset}, 锁定金额: {locked_amount}")
3. 统一获取所有类型资产(含锁仓)
如果需要一次性汇总普通资产、质押锁仓、Launchpad锁仓的所有数据,可以组合多个接口的结果:
# 获取普通账户余额 account_balances = client.get_account()["balances"] normal_assets = [ {"类型": "普通资产", "币种": b["asset"], "可用余额": b["free"], "锁定余额": b["locked"]} for b in account_balances if float(b["free"]) + float(b["locked"]) > 0 ] # 获取Staking质押锁仓资产 staking_assets = [ {"类型": "质押锁仓", "币种": p["asset"], "锁定余额": p["amount"]} for p in client.get_staking_product_position() if float(p["amount"]) > 0 ] # 获取Launchpad锁仓资产 launchpad_assets = [] for project in client.get_launchpad_projects(): user_capital = client.get_launchpad_user_capital(project_id=project["projectId"]) for capital in user_capital: if float(capital["lockedAmount"]) > 0: launchpad_assets.append({ "类型": "Launchpad锁仓", "币种": capital["asset"], "锁定余额": capital["lockedAmount"] }) # 合并所有资产数据 all_assets = normal_assets + staking_assets + launchpad_assets # 打印所有资产信息 for asset in all_assets: if asset["类型"] == "普通资产": print(f"{asset['类型']}: {asset['币种']}, 可用: {asset['可用余额']}, 锁定: {asset['锁定余额']}") else: print(f"{asset['类型']}: {asset['币种']}, 锁定金额: {asset['锁定余额']}")
4. 锁仓资产的价格获取
锁仓资产(如LDATOM)的价格可以通过其对应基础资产的交易对获取,比如LDATOM对应ATOM,可以查询ATOMUSDT的价格:
def get_asset_price(asset): # 去除LD前缀,获取基础币种 base_asset = asset.replace("LD", "") symbol = f"{base_asset}USDT" try: ticker = client.get_symbol_ticker(symbol=symbol) return ticker['price'] except: # 若USDT交易对不存在,可根据需求扩展其他交易对逻辑 return None # 示例:获取LDATOM的价格 ldatom_price = get_asset_price("LDATOM") print(f"LDATOM 当前价格: {ldatom_price} USDT")
内容的提问来源于stack exchange,提问作者Stefan Papp
相关产品推荐
相关产品推荐

