From 6f574e424527acd732ec72ddd56dd028dad339d3 Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Wed, 24 Jun 2026 15:35:06 +0800
Subject: [PATCH] fix(okx): 修复条件订单频道订阅使用正确的instFamily参数
---
src/main/java/com/xcong/excoin/modules/okxApi/wsHandler/handler/OrderAlgoOkxChannelHandler.java | 28 ++++++++++++++++------------
1 files changed, 16 insertions(+), 12 deletions(-)
diff --git a/src/main/java/com/xcong/excoin/modules/okxApi/wsHandler/handler/OrderAlgoOkxChannelHandler.java b/src/main/java/com/xcong/excoin/modules/okxApi/wsHandler/handler/OrderAlgoOkxChannelHandler.java
index 7247d98..4fff35f 100644
--- a/src/main/java/com/xcong/excoin/modules/okxApi/wsHandler/handler/OrderAlgoOkxChannelHandler.java
+++ b/src/main/java/com/xcong/excoin/modules/okxApi/wsHandler/handler/OrderAlgoOkxChannelHandler.java
@@ -16,9 +16,9 @@
* 获得 algoId、状态、订单类型等信息。相当于 Gate 的 {@code futures.autoorders} 频道。
*
* <h3>订阅格式</h3>
- * 私有频道,需要先登录认证。订阅时需要指定 instType 和 instId:
+ * 私有频道,需要先登录认证。orders-algo 频道不支持 instId,需使用 instFamily:
* <pre>
- * {"op":"subscribe","args":[{"channel":"orders-algo","instType":"SWAP","instId":"ETH-USDT-SWAP"}]}
+ * {"op":"subscribe","args":[{"channel":"orders-algo","instType":"SWAP","instFamily":"ETH-USDT"}]}
* </pre>
*
* <h3>数据推送格式(条件单触发/成交)</h3>
@@ -65,6 +65,9 @@
/** OKX 配置 */
private final OkxConfig config;
+ /** 交易品种族(如 "ETH-USDT",从合约名 ETH-USDT-SWAP 派生) */
+ private final String instFamily;
+
/**
* 构造条件订单频道处理器。
*
@@ -77,10 +80,14 @@
config.getContract(),
gridTradeService);
this.config = config;
+ // orders-algo 频道不支持 instId,需用 instFamily:"ETH-USDT-SWAP" → "ETH-USDT"
+ String contract = config.getContract();
+ int lastDash = contract.lastIndexOf('-');
+ this.instFamily = lastDash > 0 ? contract.substring(0, lastDash) : contract;
}
/**
- * 发送订阅请求,需指定 instType 和 instId。
+ * 发送订阅请求,使用 instFamily 而非 instId。
*
* @param ws 私有频道 WebSocket 客户端
*/
@@ -92,11 +99,11 @@
JSONObject arg = new JSONObject();
arg.put("channel", CHANNEL_NAME);
arg.put("instType", "SWAP");
- arg.put("instId", getInstId());
+ arg.put("instFamily", instFamily); // orders-algo 频道用 instFamily,不能用 instId
args.add(arg);
msg.put("args", args);
ws.send(msg.toJSONString());
- log.info("[OKX-WS] 订阅条件订单频道, instId: {}", getInstId());
+ log.info("[OKX-WS] 订阅条件订单频道, instFamily: {}", instFamily);
}
/**
@@ -112,11 +119,11 @@
JSONObject arg = new JSONObject();
arg.put("channel", CHANNEL_NAME);
arg.put("instType", "SWAP");
- arg.put("instId", getInstId());
+ arg.put("instFamily", instFamily);
args.add(arg);
msg.put("args", args);
ws.send(msg.toJSONString());
- log.info("[OKX-WS] 取消订阅条件订单频道, instId: {}", getInstId());
+ log.info("[OKX-WS] 取消订阅条件订单频道, instFamily: {}", instFamily);
}
/**
@@ -150,12 +157,9 @@
for (int i = 0; i < dataArray.size(); i++) {
JSONObject orderData = dataArray.getJSONObject(i);
- // 按 instId 过滤
+ // 按合约名称精确过滤(instFamily 已做粗筛,这里精筛)
String dataInstId = orderData.getString("instId");
- String instId = arg.getString("instId");
- if (instId != null && dataInstId != null
- && !instId.equals(dataInstId)
- && !dataInstId.startsWith(contract)) {
+ if (dataInstId == null || !contract.equals(dataInstId)) {
continue;
}
--
Gitblit v1.9.1