From 2968d8cf5bf5437728467e010e6f3292f495a9ed Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Sun, 04 Jan 2026 15:34:51 +0800
Subject: [PATCH] refactor(indicator): 移除MACD策略中的波动率计算和过滤逻辑

---
 src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/IndicatorUtils.java |  154 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 154 insertions(+), 0 deletions(-)

diff --git a/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/IndicatorUtils.java b/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/IndicatorUtils.java
new file mode 100644
index 0000000..a3cbec7
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/IndicatorUtils.java
@@ -0,0 +1,154 @@
+/**
+ * 指标计算工具类
+ * 封装MACD策略中常用的通用功能,如高低点查找等
+ */
+package com.xcong.excoin.modules.okxNewPrice.indicator.macdAndMatrategy;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 指标计算工具类,提供MACD策略中常用的通用功能
+ */
+public class IndicatorUtils {
+
+    /**
+     * 找到最近的价格高点索引
+     *
+     * @param prices 价格列表
+     * @param startIdx 起始索引
+     * @return 最近的价格高点索引
+     */
+    public static int findRecentHighIndex(List<BigDecimal> prices, int startIdx) {
+        if (prices == null || startIdx < 0 || startIdx >= prices.size()) {
+            return -1;
+        }
+        
+        int highIdx = startIdx;
+        BigDecimal highPrice = prices.get(startIdx);
+        
+        for (int i = startIdx + 1; i < prices.size(); i++) {
+            BigDecimal currentPrice = prices.get(i);
+            if (currentPrice.compareTo(highPrice) > 0) {
+                highPrice = currentPrice;
+                highIdx = i;
+            }
+        }
+        
+        return highIdx;
+    }
+
+    /**
+     * 找到最近的价格低点索引
+     *
+     * @param prices 价格列表
+     * @param startIdx 起始索引
+     * @return 最近的价格低点索引
+     */
+    public static int findRecentLowIndex(List<BigDecimal> prices, int startIdx) {
+        if (prices == null || startIdx < 0 || startIdx >= prices.size()) {
+            return -1;
+        }
+        
+        int lowIdx = startIdx;
+        BigDecimal lowPrice = prices.get(startIdx);
+        
+        for (int i = startIdx + 1; i < prices.size(); i++) {
+            BigDecimal currentPrice = prices.get(i);
+            if (currentPrice.compareTo(lowPrice) < 0) {
+                lowPrice = currentPrice;
+                lowIdx = i;
+            }
+        }
+        
+        return lowIdx;
+    }
+
+    /**
+     * 找到最近价格高点之前的价格高点索引
+     *
+     * @param prices 价格列表
+     * @param startIdx 起始索引
+     * @param recentHighIdx 最近的价格高点索引
+     * @return 之前的价格高点索引
+     */
+    public static int findPreviousHighIndex(List<BigDecimal> prices, int startIdx, int recentHighIdx) {
+        if (prices == null || startIdx < 0 || recentHighIdx <= startIdx || recentHighIdx >= prices.size()) {
+            return -1;
+        }
+        
+        int highIdx = startIdx;
+        BigDecimal highPrice = prices.get(startIdx);
+        
+        for (int i = startIdx + 1; i < recentHighIdx; i++) {
+            BigDecimal currentPrice = prices.get(i);
+            if (currentPrice.compareTo(highPrice) > 0) {
+                highPrice = currentPrice;
+                highIdx = i;
+            }
+        }
+        
+        return highIdx;
+    }
+
+    /**
+     * 找到最近价格低点之前的价格低点索引
+     *
+     * @param prices 价格列表
+     * @param startIdx 起始索引
+     * @param recentLowIdx 最近的价格低点索引
+     * @return 之前的价格低点索引
+     */
+    public static int findPreviousLowIndex(List<BigDecimal> prices, int startIdx, int recentLowIdx) {
+        if (prices == null || startIdx < 0 || recentLowIdx <= startIdx || recentLowIdx >= prices.size()) {
+            return -1;
+        }
+        
+        int lowIdx = startIdx;
+        BigDecimal lowPrice = prices.get(startIdx);
+        
+        for (int i = startIdx + 1; i < recentLowIdx; i++) {
+            BigDecimal currentPrice = prices.get(i);
+            if (currentPrice.compareTo(lowPrice) < 0) {
+                lowPrice = currentPrice;
+                lowIdx = i;
+            }
+        }
+        
+        return lowIdx;
+    }
+
+    /**
+     * 寻找最近的价格高点(带有回调确认)
+     *
+     * @param prices 价格列表
+     * @param startIndex 起始索引
+     * @param endIndex 结束索引
+     * @return 符合条件的价格高点索引,未找到则返回-1
+     */
+    public static int findRecentHighWithRetrace(List<BigDecimal> prices, int startIndex, int endIndex) {
+        if (prices == null || startIndex < 0 || endIndex >= prices.size() || startIndex >= endIndex) {
+            return -1;
+        }
+
+        int highIndex = -1;
+        BigDecimal highPrice = BigDecimal.ZERO;
+
+        // 从右向左搜索,找到第一个有效高点
+        for (int i = endIndex; i >= startIndex; i--) {
+            if (prices.get(i).compareTo(highPrice) > 0) {
+                highPrice = prices.get(i);
+                highIndex = i;
+            }
+
+            // 检查高点后是否有回调
+            if (highIndex != -1 && i < endIndex) {
+                if (prices.get(i + 1).compareTo(highPrice) < 0) {
+                    return highIndex; // 找到确认回调的高点
+                }
+            }
+        }
+
+        return highIndex;
+    }
+}
\ No newline at end of file

--
Gitblit v1.9.1