From 1e792f025712da88d5f53e7ef22462301d6cf071 Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Wed, 13 May 2026 17:22:06 +0800
Subject: [PATCH] refactor(okxNewPrice): 账户配置

---
 src/main/java/com/xcong/excoin/modules/okxApi/OkxKlineWebSocketClient.java                    |    9 +++++++++
 src/main/java/com/xcong/excoin/modules/okxApi/wsHandler/handler/OkxAccountChannelHandler.java |   16 +++++++++++++---
 src/main/java/com/xcong/excoin/modules/okxApi/OkxWebSocketClientManager.java                  |   21 ++++++++++++++-------
 3 files changed, 36 insertions(+), 10 deletions(-)

diff --git a/src/main/java/com/xcong/excoin/modules/okxApi/OkxKlineWebSocketClient.java b/src/main/java/com/xcong/excoin/modules/okxApi/OkxKlineWebSocketClient.java
index 014d2f5..b043658 100644
--- a/src/main/java/com/xcong/excoin/modules/okxApi/OkxKlineWebSocketClient.java
+++ b/src/main/java/com/xcong/excoin/modules/okxApi/OkxKlineWebSocketClient.java
@@ -66,8 +66,14 @@
 
     private final List<OkxChannelHandler> channelHandlers = new ArrayList<>();
 
+    private volatile Runnable onLoginSuccess;
+
     public WebSocketClient getWebSocketClient() {
         return webSocketClient;
+    }
+
+    public void setOnLoginSuccess(Runnable onLoginSuccess) {
+        this.onLoginSuccess = onLoginSuccess;
     }
 
     private final ExecutorService sharedExecutor = Executors.newCachedThreadPool(r -> {
@@ -249,6 +255,9 @@
                         handler.subscribe(webSocketClient);
                     }
                     sendPing();
+                    if (onLoginSuccess != null) {
+                        onLoginSuccess.run();
+                    }
                 } else {
                     log.error("[WS] WebSocket登录失败, code:{}, msg:{}", code, response.getString("msg"));
                 }
diff --git a/src/main/java/com/xcong/excoin/modules/okxApi/OkxWebSocketClientManager.java b/src/main/java/com/xcong/excoin/modules/okxApi/OkxWebSocketClientManager.java
index 56ef6d1..510fb0c 100644
--- a/src/main/java/com/xcong/excoin/modules/okxApi/OkxWebSocketClientManager.java
+++ b/src/main/java/com/xcong/excoin/modules/okxApi/OkxWebSocketClientManager.java
@@ -48,11 +48,6 @@
             gridTradeService = new OkxGridTradeService(config, accountName);
             gridTradeService.startGrid();
 
-            wsKlineClient = new OkxKlineWebSocketClient(config.getWsKlineUrl());
-            wsKlineClient.addChannelHandler(new OkxCandlestickChannelHandler(config.getContract(), gridTradeService));
-            wsKlineClient.init();
-            log.info("[管理器] K线WS已连接, 已注册K线频道处理器");
-
             wsPrivateClient = new OkxKlineWebSocketClient(
                     config.getWsPrivateUrl(),
                     config.getApiKey(),
@@ -61,10 +56,22 @@
             wsPrivateClient.addChannelHandler(new OkxPositionsChannelHandler(config.getContract(), gridTradeService));
             wsPrivateClient.addChannelHandler(new OkxAccountChannelHandler());
             wsPrivateClient.addChannelHandler(new OkxOrderInfoChannelHandler(config.getContract(), gridTradeService, config));
-            wsPrivateClient.init();
-            log.info("[管理器] 私有WS已连接, 已注册 3 个频道处理器");
 
+            wsPrivateClient.setOnLoginSuccess(() -> {
+                log.info("[管理器] 私有WS登录完成,启动K线订阅");
+                try {
+                    wsKlineClient = new OkxKlineWebSocketClient(config.getWsKlineUrl());
+                    wsKlineClient.addChannelHandler(new OkxCandlestickChannelHandler(config.getContract(), gridTradeService));
+                    wsKlineClient.init();
+                    log.info("[管理器] K线WS已连接, 已注册K线频道处理器");
+                } catch (Exception e) {
+                    log.error("[管理器] K线WS初始化失败", e);
+                }
+            });
+
+            wsPrivateClient.init();
             gridTradeService.setWebSocketClient(wsPrivateClient.getWebSocketClient());
+            log.info("[管理器] 私有WS已连接, 等待登录完成...");
 
         } catch (Exception e) {
             log.error("[管理器] 初始化失败", e);
diff --git a/src/main/java/com/xcong/excoin/modules/okxApi/wsHandler/handler/OkxAccountChannelHandler.java b/src/main/java/com/xcong/excoin/modules/okxApi/wsHandler/handler/OkxAccountChannelHandler.java
index af0c07e..285394c 100644
--- a/src/main/java/com/xcong/excoin/modules/okxApi/wsHandler/handler/OkxAccountChannelHandler.java
+++ b/src/main/java/com/xcong/excoin/modules/okxApi/wsHandler/handler/OkxAccountChannelHandler.java
@@ -77,10 +77,20 @@
             }
             for (int i = 0; i < dataArray.size(); i++) {
                 JSONObject acct = dataArray.getJSONObject(i);
-                log.info("[{}] 账户更新, 可用余额:{}, 现金余额:{}, 权益:{}, 未实现盈亏:{}, 保证金:{}",
+                log.info("[{}] 账户更新, 总权益:{}, 未实现盈亏:{}, 保证金:{}",
                         CHANNEL_NAME,
-                        acct.get("availBal"), acct.get("cashBal"),
-                        acct.get("eq"), acct.get("upl"), acct.get("imr"));
+                        acct.get("totalEq"), acct.get("upl"), acct.get("imr"));
+
+                JSONArray details = acct.getJSONArray("details");
+                if (details != null) {
+                    for (int j = 0; j < details.size(); j++) {
+                        JSONObject detail = details.getJSONObject(j);
+                        log.info("[{}] 币种:{}, 可用余额:{}, 现金余额:{}, 权益:{}",
+                                CHANNEL_NAME,
+                                detail.get("ccy"), detail.get("availBal"),
+                                detail.get("cashBal"), detail.get("eq"));
+                    }
+                }
             }
         } catch (Exception e) {
             log.error("[{}] 处理数据失败", CHANNEL_NAME, e);

--
Gitblit v1.9.1