You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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")

关键优化点说明

  1. API方法修正:用ccxt统一的set_leverage方法替代币安专属接口,确保MEXC兼容
  2. 止盈比例修正:将原代码的1%盈利比例调整为需求的0.01%
  3. 仓位计算优化:
    • 使用合约账户可用余额,避免全仓操作风险
    • 预留10%余额防止价格波动导致下单失败
    • 用amount_to_precision处理数量精度,符合交易所规则
  4. 持仓状态判断:通过fetch_positions获取真实持仓,替代原代码依赖订单状态的逻辑
  5. 错误处理:添加异常捕获,避免程序意外崩溃
  6. API限流控制:添加1秒休眠,降低触发交易所限流的概率
  7. 交互体验优化:增加退出选项,提升易用性

内容的提问来源于stack exchange,提问作者Jad AHMAD

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 07:27:44