Administrator
2025-12-10 a80451b53728e62db65bafe7c4e7a43b5e3259cd
feat(okxNewPrice): 新增止损冷静机制并优化订单状态控制

- 在 CaoZuoServiceImpl 中新增对止损状态的检查,防止重复下单
- 增加 instrumentsOutKey 标识交易是否处于冷静期
- 当持仓盈亏超过保证金时,设置 out 状态为“冷静中”
- 初始化时将 out 状态设为“操作中”
- 修复 OrderInfoWs 中状态更新逻辑,确保状态正确重置
- 新增 OrderParamEnums 枚举值用于标识冷静状态
- TradeOrderWs 中增加对空方向参数的校验保护
5 files modified
19 ■■■■ changed files
src/main/java/com/xcong/excoin/modules/okxNewPrice/celue/CaoZuoServiceImpl.java 9 ●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/InstrumentsWs.java 1 ●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/OrderInfoWs.java 2 ●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/TradeOrderWs.java 4 ●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/enums/OrderParamEnums.java 3 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/okxNewPrice/celue/CaoZuoServiceImpl.java
@@ -37,6 +37,7 @@
    // 构造Redis键名
    final String coinCode = CoinEnums.HE_YUE.getCode();
    final String instrumentsStateKey = InstrumentsWs.INSTRUMENTSWS_CHANNEL + ":" + coinCode + ":state";
    final String instrumentsOutKey = InstrumentsWs.INSTRUMENTSWS_CHANNEL+":" + coinCode+":out";
    final String positionsMarkPxKey = PositionsWs.POSITIONSWS_CHANNEL + ":" + coinCode + ":markPx";
    final String positionsAvgPxKey = PositionsWs.POSITIONSWS_CHANNEL + ":" + coinCode + ":avgPx";
    final String positionsOrderPriceKey = PositionsWs.POSITIONSWS_CHANNEL + ":" + coinCode + ":orderPrice";
@@ -54,6 +55,11 @@
    @Override
    public String caoZuo() {
        log.info("开始执行操作CaoZuoServiceImpl......");
        String outStr = (String) redisUtils.get(instrumentsOutKey);
        if (OrderParamEnums.OUT_YES.getValue().equals(outStr)){
            log.error("止损过了......冷静一下,等待下次入场......");
            return null;
        }
        // 获取合约执行操作状态
        String state = (String) redisUtils.get(instrumentsStateKey);
@@ -62,7 +68,8 @@
            return OrderParamEnums.ORDERING.getValue();
        }
        if (OrderParamEnums.STATE_3.getValue().equals(state)){
            log.error("持仓盈亏超过下单总保证金,止损冷静一天......");
            log.error("持仓盈亏超过下单总保证金,冷静止损......");
            redisUtils.set(instrumentsOutKey, OrderParamEnums.OUT_YES.getValue(), 0);
            return OrderParamEnums.OUT.getValue();
        }
        if (OrderParamEnums.STATE_2.getValue().equals(state)){
src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/InstrumentsWs.java
@@ -24,6 +24,7 @@
                            && redisUtils.set(INSTRUMENTSWS_CHANNEL+":" + CoinEnums.HE_YUE.getCode()+":minSz", "2", 0)
                            && redisUtils.set(INSTRUMENTSWS_CHANNEL+":" + CoinEnums.HE_YUE.getCode()+":instIdCode", CoinEnums.HE_YUE.getCode(), 0)
                            && redisUtils.set(INSTRUMENTSWS_CHANNEL+":" + CoinEnums.HE_YUE.getCode()+":state", OrderParamEnums.STATE_0.getValue(), 0)
                            && redisUtils.set(INSTRUMENTSWS_CHANNEL+":" + CoinEnums.HE_YUE.getCode()+":out", OrderParamEnums.OUT_NO.getValue(), 0)
                    ;
            if (!setResult) {
                log.warn("Redis set operation failed for key: account:{}", CoinEnums.HE_YUE.getCode());
src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/OrderInfoWs.java
@@ -88,7 +88,7 @@
                                && StrUtil.isNotBlank(stateStr)
                                && state.equals(stateStr)
                ){
                    redisUtils.set(InstrumentsWs.INSTRUMENTSWS_CHANNEL + ":" + CoinEnums.HE_YUE.getCode() + ":state", OrderParamEnums.STATE_1.getValue(), 0);
                    redisUtils.set(InstrumentsWs.INSTRUMENTSWS_CHANNEL + ":" + CoinEnums.HE_YUE.getCode() + ":state", OrderParamEnums.STATE_0.getValue(), 0);
                }
            }
        } catch (Exception e) {
src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/TradeOrderWs.java
@@ -24,6 +24,10 @@
    public static void orderEvent(WebSocketClient webSocketClient, RedisUtils redisUtils, String side) {
        log.info("开始执行TradeOrderWs......");
        if (StrUtil.isBlank( side)){
            log.warn("止损了,下次再战...");
            return;
        }
        String buyCnt = null;
        String ctval = getRedisValue(redisUtils, InstrumentsWs.INSTRUMENTSWS_CHANNEL, ":ctVal");
src/main/java/com/xcong/excoin/modules/okxNewPrice/okxWs/enums/OrderParamEnums.java
@@ -9,6 +9,9 @@
@Getter
public enum OrderParamEnums {
    OUT_NO("操作中", "操作中"),
    OUT_YES("冷静中", "冷静中"),
    ORDERING("操作下单中", "ORDERING"),
    OUT("止损", "out"),
    INIT("初始化", "init"),