Administrator
2025-12-12 c49fb826133d2e853e5d9a2558166ae223ff6fcc
fix(okxNewPrice): 修复保证金和盈亏计算逻辑

- 修改日志描述从"实际亏损金额"为"未实现盈亏"
- 使用ObjectUtil判断imr值是否为空,避免空指针异常
- 修复totalOrderUsdt获取方式,确保正确读取映射值
- 添加空值检查防止因为空值导致的程序错误
- 优化代码健壮性,提高系统稳定性
1 files modified
7 ■■■■■ changed files
src/main/java/com/xcong/excoin/modules/okxNewPrice/celue/CaoZuoServiceImpl.java 7 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/okxNewPrice/celue/CaoZuoServiceImpl.java
@@ -1,5 +1,6 @@
package com.xcong.excoin.modules.okxNewPrice.celue;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.xcong.excoin.modules.okxNewPrice.okxWs.*;
import com.xcong.excoin.modules.okxNewPrice.okxWs.enums.CoinEnums;
@@ -80,7 +81,7 @@
         */
        // 实际亏损金额
        BigDecimal realKuiSunAmount = WsMapBuild.parseBigDecimalSafe(AccountWs.ACCOUNTWSMAP.get("upl"));
        log.info("实际亏损金额: {}", realKuiSunAmount);
        log.info("未实现盈亏: {}", realKuiSunAmount);
        String zhiSunPercent = InstrumentsWs.INSTRUMENTSWSMAP.get(CoinEnums.ZHI_SUN.name());
        BigDecimal zhiSunAmount = cashBal.multiply(new BigDecimal(zhiSunPercent));
        log.info("预期亏损金额: {}", zhiSunAmount);
@@ -104,14 +105,14 @@
            }
        }
        BigDecimal ordFrozImr = PositionsWs.POSITIONSWSMAP.get("imr");
        BigDecimal ordFrozImr = ObjectUtil.isEmpty(PositionsWs.POSITIONSWSMAP.get("imr")) ? BigDecimal.ZERO : PositionsWs.POSITIONSWSMAP.get("imr");
        if (BigDecimal.ZERO.compareTo( ordFrozImr) >= 0) {
            log.error("占用保证金为零,进行初始化订单");
            WsMapBuild.saveStringToMap(InstrumentsWs.INSTRUMENTSWSMAP, CoinEnums.STATE.name(), OrderParamEnums.STATE_4.getValue());
            return OrderParamEnums.INIT.getValue();
        }
        // 判断是否保证金超标
        BigDecimal totalOrderUsdt = WsMapBuild.parseBigDecimalSafe(CoinEnums.TOTAL_ORDER_USDT.name());
        BigDecimal totalOrderUsdt = WsMapBuild.parseBigDecimalSafe(InstrumentsWs.INSTRUMENTSWSMAP.get(CoinEnums.TOTAL_ORDER_USDT.name()));
        if (ordFrozImr.compareTo(totalOrderUsdt) >= 0){
            log.error("已满仓......");
            return OrderParamEnums.HOLDING.getValue();