Bitget CCXT对冲模式止盈订单跨设备异常排查求助
针对你遇到的相同代码在本地正常、Docker容器内止盈报错的问题,可按以下方向逐步排查:
1. 对齐容器与本地的CCXT版本
不同CCXT版本对Bitget接口的参数映射、对冲模式处理可能存在差异。在Docker容器内执行pip show ccxt,对比Win11笔记本/台式机的CCXT版本,确保完全一致。若版本不同,统一为本地正常运行的版本后重新测试。
2. 验证容器内账户的实际仓位模式
不要仅依赖本地配置的hedge_mode参数,在容器内的代码中添加日志,打印exchange.fetch_account()['info']['hedgeMode']的实时返回值,确认账户确实处于对冲模式。
同时检查API密钥的权限配置,确保与本地使用的密钥完全一致(虽然开仓正常,但止盈操作可能涉及更严格的状态校验)。
3. 对比本地与容器的止盈请求参数差异
在止盈订单发送前,添加详细日志打印所有请求参数,包括holdSide、tradeSide、reduceOnly、positionSide、type等核心字段,对比本地正常请求和容器报错请求的参数是否完全一致。
重点排查:参数大小写是否符合Bitget要求、枚举值(如positionSide的long/short)是否被意外修改、布尔值(如reduceOnly)的序列化格式是否正确。
4. 检查容器的时间同步与网络环境
- Bitget接口对请求时间戳的有效性有严格要求,执行
date命令对比容器与本地系统时间,确保两者同步(时间偏差可能导致接口返回异常状态)。 - 排查容器网络是否存在代理、防火墙干扰,是否有中间件篡改请求参数(比如将
hedge_mode的true改为false)。可在容器内抓包,对比请求内容与本地正常请求的差异。
5. 运行极简测试脚本隔离问题
在容器内运行极简脚本,仅包含初始化CCXT、确认对冲模式、开测试仓、发送止盈订单的逻辑,排除原代码中分支逻辑、全局变量等干扰因素:
import ccxt exchange = ccxt.bitget({ 'apiKey': 'YOUR_API_KEY', 'secret': 'YOUR_API_SECRET', 'password': 'YOUR_API_PASSWORD', }) # 打印实时对冲模式状态 print("Current hedge mode:", exchange.fetch_account()['info']['hedgeMode']) # 开极小金额测试仓(以USDT本位为例) open_order = exchange.create_order( 'BTC/USDT:USDT', 'market', 'buy', 0.0001, None, {'positionSide': 'long'} ) print("Open order result:", open_order) # 发送止盈订单 take_profit_order = exchange.create_order( 'BTC/USDT:USDT', 'limit', 'sell', 0.0001, (float(open_order['price']) * 1.001), {'positionSide': 'long', 'reduceOnly': True} ) print("Take profit order result:", take_profit_order)
若极简脚本正常运行,说明原代码中存在容器环境下触发的逻辑异常(如缓存的账户状态过期、全局变量被意外修改)。
6. 复刻本地Python依赖环境
检查容器内的Python版本、依赖包版本是否与本地完全一致。生成本地的requirements.txt,在容器内重新安装所有依赖,排除因依赖版本差异导致的请求序列化问题。
内容的提问来源于stack exchange,提问作者Smokey Van Den Berg

