Administrator
2025-12-12 40c1e96090de38634773f681bb858f17f89d498e
fix(okx): 调整账户与交易逻辑中的关键字段及判断条件

- 将账户信息中的 imr 字段替换为 upl 字段以获取全仓未实现盈亏
- 更新日志输出内容,显示正确的账户详情描述
- 修改实际亏损金额计算方式,从现金余额减可用余额改为直接读取 upl 值
- 调整止损判断逻辑,确保负值情况下的正确处理并设置状态为 STATE_4
- 更改占用保证金来源,由 AccountWs 转为 PositionsWs 获取 imr 数据
- 在多个操作节点添加状态更新逻辑,统一设置状态为 STATE_4
- 移除订单成交后重复的状态变更操作
- 优化订单状态过滤条件,去除对 ORDER_LIVE 状态的排除限制
4 files modified
25 ■■■■■ changed files
src/main/java/com/xcong/excoin/modules/okxNewPrice/celue/CaoZuoServiceImpl.java 12 ●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/AccountWs.java 10 ●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/OrderInfoWs.java 1 ●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/TradeOrderWs.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/okxNewPrice/celue/CaoZuoServiceImpl.java
@@ -79,7 +79,7 @@
         * 判断止损抗压
         */
        // 实际亏损金额
        BigDecimal realKuiSunAmount = cashBal.subtract(availBal);
        BigDecimal realKuiSunAmount = WsMapBuild.parseBigDecimalSafe(AccountWs.ACCOUNTWSMAP.get("upl"));
        log.info("实际亏损金额: {}", realKuiSunAmount);
        String zhiSunPercent = InstrumentsWs.INSTRUMENTSWSMAP.get(CoinEnums.ZHI_SUN.name());
        BigDecimal zhiSunAmount = cashBal.multiply(new BigDecimal(zhiSunPercent));
@@ -88,11 +88,13 @@
        BigDecimal  kangYaAmount = cashBal.multiply(new BigDecimal(kangYaPercent));
        log.info("预期抗仓金额: {}", kangYaAmount);
        if (realKuiSunAmount.compareTo(BigDecimal.ZERO) > 0){
        if (realKuiSunAmount.compareTo(BigDecimal.ZERO) < 0){
            realKuiSunAmount = realKuiSunAmount.multiply(new BigDecimal("-1"));
            // 账户预期亏损金额比这个还小时,立即止损
            if (realKuiSunAmount.compareTo(zhiSunAmount) > 0){
                log.error("账户冷静止损......");
                WsMapBuild.saveStringToMap(InstrumentsWs.INSTRUMENTSWSMAP, CoinEnums.OUT.name(),  OrderParamEnums.OUT_YES.getValue());
                WsMapBuild.saveStringToMap(InstrumentsWs.INSTRUMENTSWSMAP, CoinEnums.STATE.name(), OrderParamEnums.STATE_4.getValue());
                return OrderParamEnums.OUT.getValue();
            }
            // 判断抗压
@@ -102,9 +104,10 @@
            }
        }
        BigDecimal ordFrozImr = WsMapBuild.parseBigDecimalSafe(AccountWs.ACCOUNTWSMAP.get("imr"));
        BigDecimal ordFrozImr = 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();
        }
        // 判断是否保证金超标
@@ -141,6 +144,7 @@
                if (kaiCang != null && markPx.compareTo(kaiCang.getValue()) <= 0 && avgPx.compareTo(kaiCang.getValue()) >= 0) {
                    log.info("开始加仓...开仓队列价格大于当前价格{}>{}", kaiCang.getValue(), markPx);
                    WsMapBuild.saveStringToMap(OrderInfoWs.ORDERINFOWSMAP, "orderPrice",String.valueOf(kaiCang.getValue()));
                    WsMapBuild.saveStringToMap(InstrumentsWs.INSTRUMENTSWSMAP, CoinEnums.STATE.name(), OrderParamEnums.STATE_4.getValue());
                    return OrderParamEnums.BUY.getValue();
                } else {
                    log.info("未触发加仓......,等待");
@@ -169,6 +173,7 @@
                        BigDecimal realizedPnlValueZheng = realizedPnlValue.multiply(new BigDecimal("-1"));
                        if (uplValue.compareTo(realizedPnlValue) > 0 && uplValue.compareTo(imrValue.add(realizedPnlValueZheng))  >= 0) {
                            log.info("当前未实现盈亏:{}大于预计收益>{},赚钱咯", uplValue, imrValue);
                            WsMapBuild.saveStringToMap(InstrumentsWs.INSTRUMENTSWSMAP, CoinEnums.STATE.name(), OrderParamEnums.STATE_4.getValue());
                            return OrderParamEnums.SELL.getValue();
                        }else{
                            log.info("当前未实现盈亏:{}没有大于预计收益>{},钱在路上了", uplValue, imrValue);
@@ -177,6 +182,7 @@
                    }else {
                        if (uplValue.compareTo(imrValue)  >= 0) {
                            log.info("当前未实现盈亏:{}大于预计收益>{},赚钱咯", uplValue, imrValue);
                            WsMapBuild.saveStringToMap(InstrumentsWs.INSTRUMENTSWSMAP, CoinEnums.STATE.name(), OrderParamEnums.STATE_4.getValue());
                            return OrderParamEnums.SELL.getValue();
                        }else{
                            log.info("当前未实现盈亏:{}没有大于预计收益>{},钱在路上了", uplValue, imrValue);
src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/AccountWs.java
@@ -88,7 +88,7 @@
                        String availBalKey = "availBal";
                        String cashBalKey = "cashBal";
                        String eqKey = "eq";
                        String imrKey = "imr";
                        String uplKey = "upl";
                        String ccy = WsMapBuild.parseStringSafe( detail.getString(ccyKey));
                        WsMapBuild.saveStringToMap(ACCOUNTWSMAP, ccyKey, ccy);
@@ -102,8 +102,8 @@
                        String eq = WsMapBuild.parseStringSafe(detail.getString(eqKey));
                        WsMapBuild.saveStringToMap(ACCOUNTWSMAP, eqKey, eq);
                        String imr = WsMapBuild.parseStringSafe(detail.getString(imrKey));
                        WsMapBuild.saveStringToMap(ACCOUNTWSMAP, imrKey, imr);
                        String upl = WsMapBuild.parseStringSafe(detail.getString(uplKey));
                        WsMapBuild.saveStringToMap(ACCOUNTWSMAP, uplKey, upl);
                        BigDecimal cashBalDecimal = WsMapBuild.parseBigDecimalSafe(cashBal);
                        if (cashBalDecimal.compareTo(BigDecimal.ZERO) == 0) {
@@ -118,8 +118,8 @@
                        WsMapBuild.saveStringToMap(ACCOUNTWSMAP, CoinEnums.TOTAL_ORDER_USDT.name(), String.valueOf(totalOrderUsdt));
                        log.info(
                                "账户详情-币种: {}, 可用余额: {}, 现金余额: {}, 余额: {}, 占用保证金: {}, 下单总保证金: {}",
                                ccy, availBal, cashBal, eq, imr, totalOrderUsdt
                                "账户详情-币种: {}, 可用余额: {}, 现金余额: {}, 余额: {}, 全仓未实现盈亏: {}, 下单总保证金: {}",
                                ccy, availBal, cashBal, eq, upl, totalOrderUsdt
                        );
                    }
                } catch (Exception innerEx) {
src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/OrderInfoWs.java
@@ -93,7 +93,6 @@
                                && clOrdId.equals(clOrdIdStr)
                                && StrUtil.isNotBlank(stateStr)
                                && state.equals(stateStr)
                                && !CoinEnums.ORDER_LIVE.getCode().equals(state)
                ){
                    //记录成交均价
                    if (StrUtil.isBlank(ORDERINFOWSMAP.get("orderPrice"))){
src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/TradeOrderWs.java
@@ -83,8 +83,6 @@
            WsMapBuild.saveStringToMap(TRADEORDERWSMAP, "clOrdId", connId);
            WsMapBuild.saveStringToMap(TRADEORDERWSMAP, "state", CoinEnums.ORDER_FILLED.getCode());
            WsMapBuild.saveStringToMap(InstrumentsWs.INSTRUMENTSWSMAP, CoinEnums.STATE.name(), OrderParamEnums.STATE_4.getValue());
        } catch (Exception e) {
            log.error("下单构建失败", e);
        }