From 85e1673c4683f4699106afe79405877903ce4eb5 Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Tue, 02 Jun 2026 11:20:14 +0800
Subject: [PATCH] fix(okx): 修复账户余额获取和API请求处理问题

---
 src/main/java/com/xcong/excoin/modules/okxNewPrice/OkxGridTradeService.java |   60 +++++++++++++++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 53 insertions(+), 7 deletions(-)

diff --git a/src/main/java/com/xcong/excoin/modules/okxNewPrice/OkxGridTradeService.java b/src/main/java/com/xcong/excoin/modules/okxNewPrice/OkxGridTradeService.java
index 1a7cb5c..7b700d8 100644
--- a/src/main/java/com/xcong/excoin/modules/okxNewPrice/OkxGridTradeService.java
+++ b/src/main/java/com/xcong/excoin/modules/okxNewPrice/OkxGridTradeService.java
@@ -104,18 +104,27 @@
      */
     public void init() {
         try {
-            // 1. 查询账户获取初始本金
+            // 1. 查询账户获取初始本金(仅取 USDT 合约账户余额)
             String balanceResp = executor.getBalance();
             if (balanceResp != null) {
                 JSONObject json = JSON.parseObject(balanceResp);
                 if ("0".equals(json.getString("code"))) {
                     JSONArray data = json.getJSONArray("data");
                     if (data != null && !data.isEmpty()) {
-                        JSONObject detail = data.getJSONObject(0);
-                        String totalEq = detail.getString("totalEq");
-                        if (totalEq != null) {
-                            this.initialPrincipal = new BigDecimal(totalEq);
-                            log.info("[OKX] 初始本金: {} USDT", initialPrincipal);
+                        JSONObject accountData = data.getJSONObject(0);
+                        JSONArray details = accountData.getJSONArray("details");
+                        if (details != null) {
+                            for (int i = 0; i < details.size(); i++) {
+                                JSONObject detail = details.getJSONObject(i);
+                                if ("USDT".equals(detail.getString("ccy"))) {
+                                    String eq = detail.getString("eq");
+                                    if (eq != null) {
+                                        this.initialPrincipal = new BigDecimal(eq);
+                                        log.info("[OKX] 初始本金(USDT合约): {} USDT", initialPrincipal);
+                                    }
+                                    break;
+                                }
+                            }
                         }
                     }
                 }
@@ -190,7 +199,44 @@
         longPriceQueue.clear();
         currentLongOrderIds.clear();
         currentShortOrderIds.clear();
-        log.info("[OKX] 网格策略已启动");
+
+        // 每次重启重新获取当前本金,确保盈亏对比基准正确
+        refreshInitialPrincipal();
+
+        log.info("[OKX] 网格策略已启动, 当前本金: {} USDT", initialPrincipal);
+    }
+
+    /**
+     * 重新获取当前账户权益作为初始本金。
+     */
+    private void refreshInitialPrincipal() {
+        try {
+            String balanceResp = executor.getBalance();
+            if (balanceResp != null) {
+                JSONObject json = JSON.parseObject(balanceResp);
+                if ("0".equals(json.getString("code"))) {
+                    JSONArray data = json.getJSONArray("data");
+                    if (data != null && !data.isEmpty()) {
+                        JSONObject accountData = data.getJSONObject(0);
+                        JSONArray details = accountData.getJSONArray("details");
+                        if (details != null) {
+                            for (int i = 0; i < details.size(); i++) {
+                                JSONObject detail = details.getJSONObject(i);
+                                if ("USDT".equals(detail.getString("ccy"))) {
+                                    String eq = detail.getString("eq");
+                                    if (eq != null) {
+                                        this.initialPrincipal = new BigDecimal(eq);
+                                    }
+                                    break;
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        } catch (Exception e) {
+            log.warn("[OKX] 获取初始化本金失败,使用旧值: {}", initialPrincipal);
+        }
     }
 
     public void stopGrid() {

--
Gitblit v1.9.1