From f139af8e6313a1ca9cd1cc02477be32e78d206cb Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Tue, 06 Jan 2026 15:21:07 +0800
Subject: [PATCH] feat(okxNewPrice): 添加账户盈亏监控和自动止损功能
---
src/main/java/com/xcong/excoin/modules/okxNewPrice/OkxKlineWebSocketClient.java | 37 +++++++++++++++++++++++++++++++++++--
1 files changed, 35 insertions(+), 2 deletions(-)
diff --git a/src/main/java/com/xcong/excoin/modules/okxNewPrice/OkxKlineWebSocketClient.java b/src/main/java/com/xcong/excoin/modules/okxNewPrice/OkxKlineWebSocketClient.java
index e0802f7..8498bd6 100644
--- a/src/main/java/com/xcong/excoin/modules/okxNewPrice/OkxKlineWebSocketClient.java
+++ b/src/main/java/com/xcong/excoin/modules/okxNewPrice/OkxKlineWebSocketClient.java
@@ -22,6 +22,7 @@
import com.xcong.excoin.modules.okxNewPrice.okxpi.config.ExchangeInfoEnum;
import com.xcong.excoin.modules.okxNewPrice.okxpi.config.ExchangeLoginService;
import com.xcong.excoin.modules.okxNewPrice.utils.SSLConfig;
+import com.xcong.excoin.modules.okxNewPrice.utils.WsMapBuild;
import com.xcong.excoin.modules.okxNewPrice.utils.WsParamBuild;
import com.xcong.excoin.utils.RedisUtils;
import lombok.extern.slf4j.Slf4j;
@@ -344,7 +345,6 @@
*/
String confirm = data.getString(8);
if ("1".equals(confirm)){
- log.info("{}开仓{}:{}",time,closePx,instId);
//调用策略
// 创建策略实例
MacdEmaStrategy strategy = new MacdEmaStrategy();
@@ -372,10 +372,12 @@
String accountName = client.getAccountName();
if (accountName != null) {
if (ObjectUtil.isNotEmpty(tradingOrderOpenOpen)){
+ log.info("{}开仓{}:{}",instId,tradingOrderOpenOpen.getPosSide(),tradingOrderOpenOpen.getSide());
doOpen(client.getWebSocketClient(),accountName, tradingOrderOpenOpen, closePx);
}
if (ObjectUtil.isNotEmpty(tradingOrderOpenClose)){
- doOpen(client.getWebSocketClient(),accountName, tradingOrderOpenClose, closePx);
+ log.info("{}平仓{}:{}",instId,tradingOrderOpenClose.getPosSide(),tradingOrderOpenClose.getSide());
+ doclose(client.getWebSocketClient(),accountName, tradingOrderOpenClose, closePx);
}
}
}
@@ -405,7 +407,38 @@
String positionAccountName = PositionsWs.initAccountName(accountName, posSide);
BigDecimal pos = PositionsWs.getAccountMap(positionAccountName).get("pos");
+ if (BigDecimal.ZERO.compareTo( pos) >= 0) {
+ log.error("历史网格止损方向没有持仓");
+ tradeRequestParam.setTradeType(OrderParamEnums.TRADE_NO.getValue());
+ }
tradeRequestParam.setSz(String.valueOf(pos));
+
+ BigDecimal cashBal = WsMapBuild.parseBigDecimalSafe(AccountWs.getAccountMap(accountName).get("cashBal"));
+ BigDecimal realKuiSunAmount = PositionsWs.getAccountMap(positionAccountName).get("upl");
+ log.info("实际盈亏金额: {}", realKuiSunAmount);
+ String zhiSunPercent = InstrumentsWs.getAccountMap(accountName).get(CoinEnums.ZHI_SUN.name());
+ BigDecimal zhiSunAmount = cashBal.multiply(new BigDecimal(zhiSunPercent));
+ log.info("预期亏损金额: {}", zhiSunAmount);
+ String kangYaPercent = InstrumentsWs.getAccountMap(accountName).get(CoinEnums.KANG_CANG.name());
+ BigDecimal kangYaAmount = cashBal.multiply(new BigDecimal(kangYaPercent));
+ log.info("预期抗仓金额: {}", kangYaAmount);
+
+ if (realKuiSunAmount.compareTo(BigDecimal.ZERO) < 0){
+ realKuiSunAmount = realKuiSunAmount.multiply(new BigDecimal("-1"));
+ // 账户预期亏损金额比这个还小时,立即止损
+ if (realKuiSunAmount.compareTo(zhiSunAmount) > 0){
+ log.error("账户冷静止损......");
+ WsMapBuild.saveStringToMap(InstrumentsWs.getAccountMap(accountName), CoinEnums.OUT.name(), OrderParamEnums.OUT_YES.getValue());
+ tradeRequestParam.setTradeType(OrderParamEnums.TRADE_YES.getValue());
+ }
+ // 判断抗压
+ if (realKuiSunAmount.compareTo(kangYaAmount) > 0 && realKuiSunAmount.compareTo(zhiSunAmount) <= 0){
+ log.error("账户紧张扛仓......");
+ tradeRequestParam.setTradeType(OrderParamEnums.TRADE_NO.getValue());
+ }
+ }
+
+
TradeOrderWs.orderZhiYingZhiSunEventNoState(webSocketClient, tradeRequestParam);
}
--
Gitblit v1.9.1