Administrator
2025-12-12 c2f00df968d64e6f3b526cffd434c57b4c163f67
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
package com.xcong.excoin.modules.okxNewPrice.okxWs;
 
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.xcong.excoin.modules.okxNewPrice.okxpi.MallUtils;
import com.xcong.excoin.modules.okxNewPrice.utils.WsParamBuild;
import lombok.extern.slf4j.Slf4j;
import org.java_websocket.client.WebSocketClient;
 
/**
 * @author Administrator
 */
@Slf4j
public class BalanceAndPositionWs {
 
    public static final String CHANNEL_NAME = "balance_and_position";
    private static final String LOG_PREFIX = "账户余额和持仓频道";
 
    public static void subscribeBalanceAndPositionChannel(WebSocketClient webSocketClient, String option) {
        try {
            JSONArray argsArray = new JSONArray();
            JSONObject args = new JSONObject();
            args.put("channel", CHANNEL_NAME);
            argsArray.add(args);
 
            String connId = MallUtils.getOrderNum("bap");
            JSONObject jsonObject = WsParamBuild.buildJsonObject(connId, option, argsArray);
            webSocketClient.send(jsonObject.toJSONString());
            log.info("账户余额和持仓频道订阅成功: {}", LOG_PREFIX, option);
        } catch (Exception e) {
            log.error("账户余额和持仓频道订阅构建失败", LOG_PREFIX, e);
        }
    }
 
    public static void handleEvent(JSONObject response) {
 
        log.info("开始执行BalanceAndPositionWs......");
        try {
            JSONArray dataArray = response.getJSONArray("data");
            if (dataArray == null || dataArray.isEmpty()) {
                log.warn("{}数据为空", LOG_PREFIX);
                return;
            }
 
            JSONObject firstData = dataArray.getJSONObject(0);
            processBalData(firstData);
            processPosData(firstData);
        } catch (Exception e) {
            log.error("{}推送数据处理失败", LOG_PREFIX, e);
        }
    }
 
    private static void processBalData(JSONObject dataObject) {
        JSONArray balDataArray = dataObject.getJSONArray("balData");
        if (balDataArray == null || balDataArray.isEmpty()) {
            return;
        }
 
        for (int i = 0; i < balDataArray.size(); i++) {
            JSONObject balData = balDataArray.getJSONObject(i);
            if (!balData.containsKey("ccy") || !balData.containsKey("cashBal") || !balData.containsKey("uTime")) {
                continue;
            }
 
            String ccy = balData.getString("ccy");
            String cashBal = balData.getString("cashBal");
            String uTime = balData.getString("uTime");
 
            log.info("币种: {}, 余额: {}, 更新时间: {}", ccy, cashBal, uTime);
        }
    }
 
    private static void processPosData(JSONObject dataObject) {
        JSONArray posDataArray = dataObject.getJSONArray("posData");
        if (posDataArray == null || posDataArray.isEmpty()) {
            return;
        }
 
        for (int i = 0; i < posDataArray.size(); i++) {
            JSONObject posData = posDataArray.getJSONObject(i);
            if (!posData.containsKey("posId") || !posData.containsKey("instId")
                    || !posData.containsKey("instType") || !posData.containsKey("posSide")
                    || !posData.containsKey("pos") || !posData.containsKey("avgPx")
                    || !posData.containsKey("ccy")) {
                continue;
            }
 
            String posId = posData.getString("posId");
            String instId = posData.getString("instId");
            String instType = posData.getString("instType");
            String posSide = posData.getString("posSide");
            String pos = posData.getString("pos");
            String avgPx = posData.getString("avgPx");
            String ccy = posData.getString("ccy");
 
            log.info("持仓ID: {}, 产品ID: {}, 类型: {}, 方向: {}, 数量: {}, 平均价: {}, 币种: {}",
                    posId, instId, instType, posSide, pos, avgPx, ccy);
        }
    }
}