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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 22:35:19