如何通过KuCoin API查询判断订单是否已成交
KuCoin API 订单成交状态判定方案
现有代码问题
- GET请求传参方式错误:KuCoin GET类型接口不接收JSON格式请求体,当前代码将参数序列化后传入
data参数,接口无法识别传入的orderId等条件,实际返回的是全量空成交列表,和你拿到的totalNum:0、items:[]结果匹配。 - 签名逻辑错误:GET请求签名时,待拼接的参数字段是按key排序后URL编码的查询字符串,不是JSON序列化后的字符串,当前签名拼接规则不符合官方规范。
- 冗余传参:按orderId查询成交记录时,不需要额外传side、symbol、type字段,多余字段如果和订单实际属性不匹配,会直接导致查询结果为空。
订单成交判定标准
优先使用单个订单详情接口(GET /api/v1/orders/{orderId})判定,结果最直接:
- 返回结果
code=200000时,读取data.status字段:status = "done",且dealSize等于下单总数量、dealFunds>0:订单完全成交status = "done",但dealSize小于下单总数量、dealSize>0:订单部分成交后被撤销status = "open":订单正在挂单,未成交status = "cancel":订单已全部撤销,无成交
如果使用成交记录接口(/api/v1/fills)判定:
- 返回结果
data.totalNum = 0:对应订单无任何成交记录 - 返回结果
data.totalNum > 0:累加所有items中的size值,等于下单总数量即为完全成交,大于0小于下单量即为部分成交
修复后参考代码
import time import hmac import hashlib import base64 import requests from urllib.parse import urlencode # 替换为自身账号密钥信息 api_key = "YOUR_API_KEY" api_secret = "YOUR_API_SECRET" api_passphrase = "YOUR_API_PASSPHRASE" target_order_id = "待查询的订单ID" order_submit_size = 0.1 # 替换为下单时提交的总数量,用于成交校验 # 推荐:查询订单详情直接判定状态 def get_order_status(order_id, submit_size): timestamp = int(time.time() * 1000) method = "GET" path = f"/api/v1/orders/{order_id}" sign_content = str(timestamp) + method + path sign = base64.b64encode(hmac.new(api_secret.encode('utf-8'), sign_content.encode('utf-8'), hashlib.sha256).digest()) pass_sign = base64.b64encode(hmac.new(api_secret.encode('utf-8'), api_passphrase.encode('utf-8'), hashlib.sha256).digest()) headers = { "KC-API-SIGN": sign, "KC-API-TIMESTAMP": str(timestamp), "KC-API-KEY": api_key, "KC-API-PASSPHRASE": pass_sign, "KC-API-KEY-VERSION": "2" } resp = requests.get(f"https://api.kucoin.com{path}", headers=headers) res = resp.json() if res.get("code") != "200000": print(f"查询失败: {res.get('msg')}") return order_data = res.get("data", {}) deal_size = float(order_data.get("dealSize", 0)) status = order_data.get("status") if status == "done" and abs(deal_size - submit_size) < 1e-8: print("订单完全成交,成交金额:", order_data.get("dealFunds")) return "full_filled" elif status == "done" and deal_size > 0: print(f"订单部分成交后撤销,已成交数量:{deal_size}") return "partial_canceled" elif status == "open": print("订单挂单中,未成交") return "open" elif status == "cancel": print("订单已撤销,无成交") return "canceled" # 备选:通过成交记录接口判定 def get_order_fills(order_id, submit_size): timestamp = int(time.time() * 1000) method = "GET" path = "/api/v1/fills" params = {"orderId": order_id} # 参数排序后拼接query串用于签名 query_str = urlencode(sorted(params.items())) sign_content = str(timestamp) + method + path + "?" + query_str sign = base64.b64encode(hmac.new(api_secret.encode('utf-8'), sign_content.encode('utf-8'), hashlib.sha256).digest()) pass_sign = base64.b64encode(hmac.new(api_secret.encode('utf-8'), api_passphrase.encode('utf-8'), hashlib.sha256).digest()) headers = { "KC-API-SIGN": sign, "KC-API-TIMESTAMP": str(timestamp), "KC-API-KEY": api_key, "KC-API-PASSPHRASE": pass_sign, "KC-API-KEY-VERSION": "2" } resp = requests.get(f"https://api.kucoin.com{path}", headers=headers, params=params) res = resp.json() if res.get("code") != "200000": print(f"查询失败: {res.get('msg')}") return fill_data = res.get("data", {}) if fill_data.get("totalNum", 0) == 0: print("订单无成交记录") return "no_fill" total_deal = 0.0 for fill in fill_data.get("items", []): total_deal += float(fill.get("size", 0)) if abs(total_deal - submit_size) < 1e-8: print("订单完全成交") return "full_filled" else: print(f"订单部分成交,已成交数量:{total_deal}") return "partial_filled" # 调用示例 # get_order_status(target_order_id, order_submit_size)
注意:请求时间戳和KuCoin服务器时间差不能超过5秒,否则会返回签名错误,可提前调用
/api/v1/timestamp接口获取服务器时间做本地校准。
内容的提问来源于stack exchange,提问作者DeziLuv
相关产品推荐
相关产品推荐

