使用CCXT调用Phemex接口获取持仓无输出问题求助
问题分析与解决方案
可能的问题原因
- 未捕获的异常:API调用过程中可能抛出错误(如密钥无效、权限不足、参数错误),但代码没有异常处理逻辑,导致程序直接崩溃,无任何输出。
- 参数格式错误:Phemex API对参数的要求与你当前使用的
code参数不匹配,导致请求失败。 - 符号格式不匹配:CCXT中Phemex合约的符号格式为
BTC/USDT:USDT,而非BTCUSDT,参数中的符号格式错误会导致无法获取持仓。
修复步骤
1. 添加异常处理
在API调用处添加try-except块,捕获并打印错误信息,明确程序失败的原因。
2. 修正API请求参数
fetch_balance参数:Phemex API使用currency而非code来指定币种,将params改为{"type": "swap", "currency": "USDT"}。fetch_positions参数:使用正确的合约符号格式BTC/USDT:USDT,或直接获取所有持仓再筛选(更灵活)。
3. 调整持仓筛选逻辑
确保筛选的符号与CCXT返回的格式一致,避免遗漏持仓。
修正后的代码
import ccxt import api import time exchange = ccxt.phemex({ 'apiKey': api.contract_apiKey, 'secret': api.contract_secret, 'enableRateLimit': True, 'options': { 'defaultType': 'swap', # 设置默认类型为合约,简化后续调用 }, }) def get_balance(): try: params = {"type": "swap", "currency": "USDT"} response = exchange.fetch_balance(params=params) return response except Exception as e: print(f"获取余额失败: {str(e)}") return None def get_positions(): try: # 指定符号获取单个合约持仓,或不传参数获取所有合约持仓 positions = exchange.fetch_positions(symbols=['BTC/USDT:USDT']) return positions except Exception as e: print(f"获取持仓失败: {str(e)}") return [] def print_balance(): balance = get_balance() if balance is None: return print("Egyenleg:") for currency, amount in balance['total'].items(): print(f"{currency}: {amount}") def print_positions(): positions = get_positions() if len(positions) > 0: print("Aktuális pozíciók:") for position in positions: print(f"Pozíció: {position['symbol']}") print(f" Méret: {position['info']['size']}") print(f" Átlagos nyitási ár: {position['info']['avgEntryPrice']}") print(f" Nyitott oldal: {'Long' if position['info']['side'] == 'buy' else 'Short'}") print("---------------") else: print("Nincsenek aktuális pozíciók.") while True: print_balance() print_positions() print("------------------------------") time.sleep(10)
额外检查项
- 确认API密钥具有合约账户的读取权限(在Phemex后台设置)。
- 检查
api.py中的contract_apiKey和contract_secret是否正确,无多余空格或拼写错误。 - 确保网络连接正常,能够访问Phemex的API服务器。
内容的提问来源于stack exchange,提问作者Skrihy
相关产品推荐
相关产品推荐

