如何用Python通过Kucoin API创建OCO订单?现有方案遇问题求助
Kucoin API实现OCO订单的解决方案
问题分析
你手动创建的两个独立止损/止盈订单会因为资产锁定导致冲突:当其中一个触发转为限价单后,资产被锁定,另一个订单触发时会因资产不足被取消,无法实现OCO“成交其一则取消另一”的核心逻辑。
官方解决方案:使用订单组(Order Group)
Kucoin提供了**订单组(Order Group)**功能来实现OCO逻辑,通过将两个订单绑定到同一组,系统会自动处理互斥触发:任一订单成交(或部分成交)后,组内剩余订单会被自动取消。
代码实现
如果你的Kucoin Python SDK支持create_order_group方法(需确认SDK版本,建议使用最新版),可以直接调用:
# 构造止损订单参数 sl_order_params = { "symbol": coin, "type": "limit", "side": "sell", "amount": AvailableAmount, "price": StopLossTrigger, "stopPrice": StopLoss, "stop": "loss" } # 构造止盈订单参数 tp_order_params = { "symbol": coin, "type": "limit", "side": "sell", "amount": AvailableAmount, "price": TakeProfitTrigger, "stopPrice": TakeProfit, "stop": "entry" } # 创建OCO订单组 try: order_group_response = KucoinCC.create_order_group( orders=[sl_order_params, tp_order_params], type="oco" ) group_id = order_group_response['groupId'] print(f"OCO订单组创建成功,组ID:{group_id}") except Exception as e: print(f"创建订单组失败:{str(e)}")
如果SDK未封装该方法,可以直接调用API端点:
import json # 构造请求数据 payload = { "orders": [sl_order_params, tp_order_params], "type": "oco" } # 发送POST请求创建订单组 response = KucoinCC._request( method='POST', path='/api/v1/order-group', data=json.dumps(payload) ) order_group_data = response.json()
注意事项
- 订单组内的两个订单必须满足:同交易对、同方向(均为卖单/买单)、同数量,否则无法创建组。
- 订单组创建后,系统会自动维护互斥逻辑,无需手动干预订单状态。
替代方案:手动监听订单状态并取消
如果订单组功能不可用,可以通过监听订单状态,主动取消未触发的订单:
轮询实现(简单但有延迟)
import time import threading def monitor_oco_orders(sl_order_id, tp_order_id): while True: # 查询两个订单的状态 sl_order = KucoinCC.get_order(sl_order_id) tp_order = KucoinCC.get_order(tp_order_id) sl_status = sl_order.get('status') tp_status = tp_order.get('status') # 止盈订单已成交/部分成交,取消止损订单 if tp_status in ['filled', 'partiallyFilled']: KucoinCC.cancel_order(sl_order_id) print(f"止盈订单已成交,取消止损订单:{sl_order_id}") break # 止损订单已成交/部分成交,取消止盈订单 if sl_status in ['filled', 'partiallyFilled']: KucoinCC.cancel_order(tp_order_id) print(f"止损订单已成交,取消止盈订单:{tp_order_id}") break # 任一订单已取消,终止监听 if sl_status == 'canceled' or tp_status == 'canceled': print("其中一个订单已取消,终止监听") break time.sleep(3) # 每3秒轮询一次 # 启动监听线程,避免阻塞主程序 threading.Thread( target=monitor_oco_orders, args=(OrderIDSL, OrderIDTP), daemon=True ).start()
推荐:Websocket监听(低延迟)
通过订阅Kucoin的Websocket订单状态推送,可以实时获取订单状态变化,及时取消对应订单:
from kucoin.client import WsClient def handle_order_update(message): order_data = message['data'] order_id = order_data['id'] status = order_data['status'] # 判断是否是目标订单,且状态为成交/部分成交 if order_id == OrderIDSL and status in ['filled', 'partiallyFilled']: KucoinCC.cancel_order(OrderIDTP) print(f"止损订单已成交,取消止盈订单:{OrderIDTP}") elif order_id == OrderIDTP and status in ['filled', 'partiallyFilled']: KucoinCC.cancel_order(OrderIDSL) print(f"止盈订单已成交,取消止损订单:{OrderIDSL}") # 初始化Websocket客户端,订阅订单更新 ws_client = WsClient( key='your_api_key', secret='your_api_secret', passphrase='your_passphrase', is_sandbox=False ) ws_client.subscribe('/market/order:your_order_ids', handle_order_update) ws_client.run()
内容的提问来源于stack exchange,提问作者amj glazing
相关产品推荐
相关产品推荐

