MEXC合约Python脚本报错AttributeError及代码优化求助
问题排查与代码优化方案
错误原因分析
报错AttributeError: 'mexc' object has no attribute 'fapiPrivate_post_leverage'的核心原因:
fapiPrivate_post_leverage是币安(Binance)专属的合约杠杆设置API方法,MEXC交易所的ccxt封装并未提供该方法- 代码注释中误写
# Assuming exchange is Binance,明显混淆了不同交易所的API规范
修改后的完整代码
import ccxt import time # 配置信息 api_key = '你的API_KEY' secret = '你的API_SECRET' leverage = 100 symbol = 'BTC/USDT' take_profit_percentage = 0.0001 # 原代码0.01对应1%盈利,修正为需求的0.01%即0.0001 exchange = ccxt.mexc({ 'apiKey': api_key, 'secret': secret, 'enableRateLimit': True, 'options': { 'defaultType': 'future' # 指定使用合约账户 } }) def set_leverage(): """设置合约杠杆""" try: # 使用ccxt统一的杠杆设置方法(跨交易所兼容) exchange.set_leverage(leverage, symbol) print(f"成功设置{symbol}杠杆为{leverage}倍") except Exception as e: print(f"设置杠杆失败: {str(e)}") raise def create_long_order(): """开多单""" # 先设置杠杆 set_leverage() # 获取当前市价 ticker = exchange.fetch_ticker(symbol) market_price = ticker['last'] print(f"当前市价: {market_price} USDT") # 获取合约账户USDT可用余额(避免全仓操作) balance = exchange.fetch_balance() usdt_available = balance['free']['USDT'] # 计算下单量:用可用余额的90%+杠杆倍数,同时做精度处理 raw_amount = (usdt_available * 0.9 * leverage) / market_price amount_btc = exchange.amount_to_precision(symbol, raw_amount) # 市价开多 order = exchange.create_market_buy_order(symbol, amount_btc) print(f"多单已开仓,订单ID: {order['id']},成交均价: {order['average']}") return order, market_price # 返回开仓价格用于止盈判断 def close_order_at_market(): """市价平多单""" try: # 获取当前持仓量 positions = exchange.fetch_positions([symbol]) if not positions or positions[0]['contracts'] <= 0: print("当前无持仓,无需平仓") return None position = positions[0] amount = position['contracts'] # 市价平仓 order = exchange.create_market_sell_order(symbol, amount) print(f"持仓已平仓,订单ID: {order['id']}") return order except Exception as e: print(f"平仓失败: {str(e)}") raise if __name__ == "__main__": while True: action = input("输入1开仓并等待止盈,输入3市价平仓,输入q退出: ") if action == '1': try: order, open_price = create_long_order() target_price = open_price * (1 + take_profit_percentage) print(f"等待止盈,开仓价格: {open_price},止盈价格: {target_price}") while True: # 获取最新市价 current_price = exchange.fetch_ticker(symbol)['last'] # 检查止盈条件 if current_price >= target_price: close_order_at_market() print(f"已触发止盈,当前价格: {current_price}") break # 检查是否已手动平仓 positions = exchange.fetch_positions([symbol]) if not positions or positions[0]['contracts'] <= 0: print("持仓已消失,退出止盈监控") break # 控制API调用频率 time.sleep(1) except Exception as e: print(f"开仓或止盈过程出错: {str(e)}") elif action == '3': close_order_at_market() elif action.lower() == 'q': print("退出程序") break else: print("无效输入,请输入1/3/q")
关键优化点说明
- API方法修正:用ccxt统一的
set_leverage方法替代币安专属接口,确保MEXC兼容 - 止盈比例修正:将原代码的1%盈利比例调整为需求的0.01%
- 仓位计算优化:
- 使用合约账户可用余额,避免全仓操作风险
- 预留10%余额防止价格波动导致下单失败
- 用
amount_to_precision处理数量精度,符合交易所规则
- 持仓状态判断:通过
fetch_positions获取真实持仓,替代原代码依赖订单状态的逻辑 - 错误处理:添加异常捕获,避免程序意外崩溃
- API限流控制:添加1秒休眠,降低触发交易所限流的概率
- 交互体验优化:增加退出选项,提升易用性
内容的提问来源于stack exchange,提问作者Jad AHMAD
相关产品推荐
相关产品推荐

