Administrator
8 days ago 212e20fa6e9d0cc69d7f70339ecd47d4ec286533
feat(okxNewPrice): 优化MACD策略交易判断逻辑

- 在金叉判断中增加DIF和DEA都大于0的条件
- 在死叉判断中增加DIF和DEA都小于0的条件
- 临时注释掉15分钟K线数据获取和一致性检查逻辑
- 优化交易订单生成的条件判断流程
2 files modified
40 ■■■■■ 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/indicator/macdAndMatrategy/MacdMaStrategy.java 12 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/okxNewPrice/OkxKlineWebSocketClient.java
@@ -350,21 +350,21 @@
                        return;
                    }
                    List<Kline> kline15MinuteData = getKlineDataByInstIdAndBar(instId, "15m");
                    List<BigDecimal> historicalPrices15M = kline15MinuteData.stream()
                            .map(Kline::getC)
                            .collect(Collectors.toList());
                    // 使用策略分析最新价格数据
                    MacdMaStrategy.TradingOrder tradingOrderOpen15M = strategy.generateTradingOrder(historicalPrices15M,MacdMaStrategy.OperationType.open.name());
                    if (tradingOrderOpen15M == null ){
                        return;
                    }
//                    List<Kline> kline15MinuteData = getKlineDataByInstIdAndBar(instId, "15m");
//                    List<BigDecimal> historicalPrices15M = kline15MinuteData.stream()
//                            .map(Kline::getC)
//                            .collect(Collectors.toList());
//                    // 使用策略分析最新价格数据
//                    MacdMaStrategy.TradingOrder tradingOrderOpen15M = strategy.generateTradingOrder(historicalPrices15M,MacdMaStrategy.OperationType.open.name());
//                    if (tradingOrderOpen15M == null ){
//                        return;
//                    }
//
//                    if (!tradingOrderOpen1M.getPosSide().equals(tradingOrderOpen15M.getPosSide())){
//                        return;
//                    }
                    if (!tradingOrderOpen1M.getPosSide().equals(tradingOrderOpen15M.getPosSide())){
                        return;
                    }
                    log.info("1分钟和15分钟K线方向一致,开始执行交易操作!");
//                    log.info("1分钟和15分钟K线方向一致,开始执行交易操作!");
                    Collection<OkxQuantWebSocketClient> allClients = clientManager.getAllClients();
src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/MacdMaStrategy.java
@@ -346,14 +346,16 @@
        // 金叉判断:DIF从下往上穿过DEA
        boolean isGoldenCross = prevPrev.getDif().compareTo(prevPrev.getDea()) <= 0 && 
                              previous.getDif().compareTo(previous.getDea()) > 0;
        boolean isUp = latest.getDif().compareTo(BigDecimal.ZERO) > 0 && latest.getDea().compareTo(BigDecimal.ZERO) > 0;
        
        // 柱状线扩张判断:连续正值且绝对值增大
        boolean isExpanding = latest.getMacdHist().compareTo(BigDecimal.ZERO) > 0 &&
        boolean isExpanding = latest.getMacdHist().compareTo(BigDecimal.ZERO) > 0 &&
                            previous.getMacdHist().compareTo(BigDecimal.ZERO) > 0 &&
                            previous.getMacdHist().abs().compareTo(latest.getMacdHist().abs()) < 0;
        
        // 金叉或柱状线扩张任一满足即可
        return isGoldenCross && isExpanding;
        return isGoldenCross && isExpanding && isUp;
    }
    
    /**
@@ -401,13 +403,15 @@
        boolean isDeathCross = prevPrev.getDif().compareTo(prevPrev.getDea()) >= 0 && 
                             previous.getDif().compareTo(previous.getDea()) < 0;
        
        boolean isDown  = latest.getDif().compareTo(BigDecimal.ZERO) < 0 && latest.getDea().compareTo(BigDecimal.ZERO) < 0;
        // 柱状线收缩判断:连续负值且绝对值减小
        boolean isContracting = latest.getMacdHist().compareTo(BigDecimal.ZERO) < 0 &&
        boolean isContracting = latest.getMacdHist().compareTo(BigDecimal.ZERO) < 0 &&
                              previous.getMacdHist().compareTo(BigDecimal.ZERO) < 0 &&
                              previous.getMacdHist().abs().compareTo(latest.getMacdHist().abs()) > 0;
        
        // 死叉或柱状线收缩任一满足即可
        return isDeathCross && isContracting;
        return isDeathCross && isContracting && isDown;
    }
    
    /**