Python调用Bybit API取消订单报order not exists or too late to cancel问题咨询
问题根因
- 操作逻辑混淆:
Order_cancel接口的作用是撤销尚未撮合成功的挂单,你提交的是市价开仓单,提交后会立刻完成成交,原开仓订单在成交后就已失效,调用取消接口自然会返回订单不存在的错误。你要做的是对已经成交的仓位进行平仓,而不是取消已经成交的开仓订单。 - 参数拼写错误:开仓时传入的
time_in_force参数值GoodTillCencel拼写错误,正确拼写为GoodTillCancel,API识别到非法参数后自动将市价单的生效规则替换为默认的ImmediateOrCancel,不影响开仓成交但属于代码隐患。
修正方案
你需要调整平仓逻辑:开仓完成后先查询订单状态,确认订单完全成交后,提交反向市价单进行平仓即可,参考修正后代码:
import bybit import time client = bybit.bybit(test=False, api_key='key', api_secret='secret_key') print('logged in') info = client.Market.Market_symbolInfo(symbol='BTCUSD').result() btc_original = info[0]['result'][0]['last_price'] BTC_original = float(btc_original) print(BTC_original) # 开新仓 open_pos = client.Order.Order_new(side="Buy",symbol="BTCUSD",order_type="Market",qty=1, time_in_force='GoodTillCancel').result() print(open_pos) order_ID = open_pos[0]['result']['order_id'] # 等待订单成交,确认开仓成功 time.sleep(3) order_info = client.Order.Order_query(symbol="BTCUSD", order_id=order_ID).result() if order_info[0]['result']['order_status'] != 'Filled': print("订单未成交,先撤销未成交订单") client.Order.Order_cancel(symbol="BTCUSD", order_id=order_ID).result() exit() # 平仓:提交反向市价单 close_pos = client.Order.Order_new(side="Sell",symbol="BTCUSD",order_type="Market",qty=1, time_in_force='GoodTillCancel', reduce_only=True).result() print(close_pos) print('仓位已平仓')
补充说明:平仓时加上
reduce_only=True参数可以确保该订单只会减少你的持仓,不会意外开新的反向仓位,避免双向持仓的问题。
内容的提问来源于stack exchange,提问作者gasper_thebeast101
相关产品推荐
相关产品推荐

