Administrator
6 days ago f139af8e6313a1ca9cd1cc02477be32e78d206cb
feat(okxNewPrice): 添加账户盈亏监控和自动止损功能

- 引入 WsMapBuild 工具类用于安全解析账户数据
- 实现实际盈亏金额计算和预期亏损金额计算
- 添加预期抗仓金额计算逻辑
- 实现账户冷静止损机制,当实际亏损超过预期时自动触发
- 添加账户紧张扛仓判断逻辑
- 集成自动交易参数设置和订单执行功能
1 files modified
28 ■■■■■ changed files
src/main/java/com/xcong/excoin/modules/okxNewPrice/OkxKlineWebSocketClient.java 28 ●●●●● patch | view | raw | blame | history
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;
@@ -411,6 +412,33 @@
            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);
    }