package com.xcong.excoin.modules.okxApi.wsHandler.handler;
|
|
import com.alibaba.fastjson.JSONArray;
|
import com.alibaba.fastjson.JSONObject;
|
import com.xcong.excoin.modules.okxApi.wsHandler.OkxChannelHandler;
|
import lombok.extern.slf4j.Slf4j;
|
import org.java_websocket.client.WebSocketClient;
|
|
/**
|
* OKX 账户频道处理器(account)。
|
*
|
* <h3>数据用途</h3>
|
* 监控账户余额和保证金信息。用于保证金安全阀检查。
|
*
|
* <h3>推送字段</h3>
|
* ccy, availBal, cashBal, eq, upl, imr, ordFroz
|
*
|
* <h3>注意</h3>
|
* 当前版本仅做日志输出,后续可扩展保证金安全阀功能。
|
*
|
* @author Administrator
|
*/
|
@Slf4j
|
public class OkxAccountChannelHandler implements OkxChannelHandler {
|
|
private static final String CHANNEL_NAME = "account";
|
private static final String CHANNEL = "account";
|
|
public OkxAccountChannelHandler() {
|
}
|
|
@Override
|
public String getChannelName() {
|
return CHANNEL_NAME;
|
}
|
|
@Override
|
public void subscribe(WebSocketClient ws) {
|
JSONObject msg = new JSONObject();
|
msg.put("op", "subscribe");
|
JSONArray args = new JSONArray();
|
JSONObject arg = new JSONObject();
|
arg.put("channel", CHANNEL);
|
args.add(arg);
|
msg.put("args", args);
|
ws.send(msg.toJSONString());
|
log.info("[{}] 订阅成功", CHANNEL_NAME);
|
}
|
|
@Override
|
public void unsubscribe(WebSocketClient ws) {
|
JSONObject msg = new JSONObject();
|
msg.put("op", "unsubscribe");
|
JSONArray args = new JSONArray();
|
JSONObject arg = new JSONObject();
|
arg.put("channel", CHANNEL);
|
args.add(arg);
|
msg.put("args", args);
|
ws.send(msg.toJSONString());
|
log.info("[{}] 取消订阅成功", CHANNEL_NAME);
|
}
|
|
@Override
|
public boolean handleMessage(JSONObject response) {
|
JSONObject argObj = response.getJSONObject("arg");
|
if (argObj == null) {
|
return false;
|
}
|
String channel = argObj.getString("channel");
|
if (!CHANNEL.equals(channel)) {
|
return false;
|
}
|
try {
|
JSONArray dataArray = response.getJSONArray("data");
|
if (dataArray == null || dataArray.isEmpty()) {
|
return true;
|
}
|
for (int i = 0; i < dataArray.size(); i++) {
|
JSONObject acct = dataArray.getJSONObject(i);
|
log.info("[{}] 账户更新, 可用余额:{}, 现金余额:{}, 权益:{}, 未实现盈亏:{}, 保证金:{}",
|
CHANNEL_NAME,
|
acct.get("availBal"), acct.get("cashBal"),
|
acct.get("eq"), acct.get("upl"), acct.get("imr"));
|
}
|
} catch (Exception e) {
|
log.error("[{}] 处理数据失败", CHANNEL_NAME, e);
|
}
|
return true;
|
}
|
}
|