CCXT修改限价挂单止盈止损时出现float对象无upper属性错误
问题分析与解决
错误原因
你调用exchange.edit_order时参数顺序完全错误,导致函数把浮点数类型的amount当成了订单类型参数传入。ccxt的edit_order方法内部会对订单类型字符串调用.upper()方法,但你传入的是浮点数,自然触发AttributeError: 'float' 对象没有属性 'upper'。
修正步骤
1. 明确ccxt edit_order的正确参数顺序
ccxt标准的edit_order参数顺序为:
exchange.edit_order( order_id, # 订单ID symbol, # 交易对 type, # 订单类型(如'limit') side, # 买卖方向(如'sell') amount, # 订单数量 price, # 订单价格 params={} # 额外参数(如止盈止损) )
你之前把amount放在了type的位置,完全打乱了参数顺序。
2. 修正代码(含订单信息获取的优化)
原代码中获取订单ID和数量的循环会覆盖变量,最后只保留最后一个订单的信息,这里优化为取第一个挂单(多订单场景需额外判断),同时修正edit_order的参数顺序:
#-----------------------Get Target Order Info------------------------- orders = exchange.fetchOpenOrders('LINKUSDT') # 取第一个挂单,若有多个订单需添加筛选逻辑 if orders: target_order = orders[0] orderId = target_order['id'] qty = float(target_order['amount']) print(f"待修改订单ID: {orderId}, 数量: {qty}") else: print("未找到任何挂单") exit() #------------------------------------------------------------ symbol = 'LINKUSDT' order_type = 'limit' side = 'sell' amount = qty price = 15.000 # 注意:部分交易所要求修改订单时价格需与原订单一致,需参考交易所规则 stop_loss = 15.100 take_profit = 14.920 # 按正确参数顺序调用edit_order exchange.edit_order( orderId, symbol, order_type, side, amount, price, {'stopLossPrice': stop_loss, 'takeProfitPrice': take_profit} )
3. 额外注意事项
- 部分交易所不支持通过
edit_order修改止盈止损,如果修正后仍报错,需确认对应交易所API是否支持该操作,或改用单独的止盈止损订单创建接口。 - 修改订单时,价格
price的规则因交易所而异,部分平台要求必须与原订单价格一致,需提前查阅交易所文档。
内容的提问来源于stack exchange,提问作者Altn
相关产品推荐
相关产品推荐

