From 2911432f3d146791edda5e911909d2360953842b Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Tue, 23 Dec 2025 18:05:58 +0800
Subject: [PATCH] feat(indicator): 优化交易策略并调整日志级别
---
src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/TradingStrategy.java | 98 ++++++++++++++++++++++++++++++++++++++++++-------
1 files changed, 84 insertions(+), 14 deletions(-)
diff --git a/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/TradingStrategy.java b/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/TradingStrategy.java
index 0605d0f..5c9a04d 100644
--- a/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/TradingStrategy.java
+++ b/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/TradingStrategy.java
@@ -109,43 +109,43 @@
// 计算所有指标
calculateIndicators(prices, high, low, close);
- // 检查是否为震荡市场,如果是,则无信号
+ // 检查是否为震荡市场,如果是,则执行区间交易策略
if (isRangeMarket()) {
- log.debug("当前市场为震荡行情,不产生信号");
- return SignalType.NONE;
+ log.info("当前市场为震荡行情,执行区间交易策略");
+ return generateRangeTradingSignal(currentPrice, volume, hasLongPosition, hasShortPosition);
}
// 黑天鹅事件过滤
if (blackSwanFilter(fundingRate, hasLargeTransfer, hasUpcomingEvent)) {
- log.debug("黑天鹅事件过滤触发,不产生信号");
+ log.info("黑天鹅事件过滤触发,不产生信号");
return SignalType.NONE;
}
// 开多信号
if (shouldOpenLong(currentPrice, prices, volume, fiveMinPrices, oneHourPrices, fourHourPrices) && !hasLongPosition && !hasShortPosition) {
- log.debug("生成买入信号");
+ log.info("生成买入信号");
return SignalType.BUY;
}
// 开空信号
if (shouldOpenShort(currentPrice, volume, fiveMinPrices, oneHourPrices, fourHourPrices) && !hasLongPosition && !hasShortPosition) {
- log.debug("生成卖出信号");
+ log.info("生成卖出信号");
return SignalType.SELL;
}
// 平多信号
if (shouldCloseLong(currentPrice, volume, fiveMinPrices, oneHourPrices, fourHourPrices) && hasLongPosition) {
- log.debug("生成平多信号");
+ log.info("生成平多信号");
return SignalType.CLOSE_BUY;
}
// 平空信号
if (shouldCloseShort(currentPrice, volume, fiveMinPrices, oneHourPrices, fourHourPrices) && hasShortPosition) {
- log.debug("生成平空信号");
+ log.info("生成平空信号");
return SignalType.CLOSE_SELL;
}
- log.debug("未生成信号");
+ log.info("未生成信号");
return SignalType.NONE;
}
@@ -257,6 +257,7 @@
/**
* 成交量验证辅助方法
+ * 增强版:当前成交量需大于20周期均量的1.2倍,以过滤无量反弹/回调的假信号
* @param volume 成交量列表
* @return 是否通过成交量验证
*/
@@ -269,8 +270,8 @@
BigDecimal volumeMA = calculateMA(volume, config.getVolumeMaPeriod());
BigDecimal currentVolume = volume.get(volume.size() - 1);
- // 成交量需要大于均线
- return currentVolume.compareTo(volumeMA) > 0;
+ // 增强验证:成交量需要大于1.2倍均线
+ return currentVolume.compareTo(volumeMA.multiply(new BigDecimal("1.2"))) > 0;
}
/**
@@ -327,7 +328,7 @@
// 使用动态参数计算指标
if (config.isEnableDynamicParams()) {
- log.debug("使用动态参数计算指标,波动率: {}", volatility);
+ log.info("使用动态参数计算指标,波动率: {}", volatility);
ma.calculate(prices, volatility);
macd.calculate(prices, volatility);
} else {
@@ -355,6 +356,8 @@
return isMaConverged && isRsiNeutral && isBollNarrow;
}
+
+
/**
* 根据15分钟时间框架指标确定市场方向(做多/做空/震荡)
@@ -547,6 +550,71 @@
}
/**
+ * 生成区间交易信号
+ * 在震荡行情下,使用BOLL通道作为区间边界,结合KDJ指标生成交易信号
+ * @param currentPrice 当前价格
+ * @param volume 成交量列表
+ * @param hasLongPosition 是否当前持有做多仓位
+ * @param hasShortPosition 是否当前持有做空仓位
+ * @return 交易信号
+ */
+ private SignalType generateRangeTradingSignal(BigDecimal currentPrice, List<BigDecimal> volume,
+ boolean hasLongPosition, boolean hasShortPosition) {
+ // 区间交易策略逻辑:
+ // 1. 价格触及BOLL下轨且KDJ超卖 → 买入信号
+ // 2. 价格触及BOLL上轨且KDJ超买 → 卖出信号
+ // 3. 价格回归BOLL中轨 → 平仓信号
+
+ // 价格触及BOLL下轨
+ boolean isPriceNearBollLower = currentPrice.compareTo(boll.getLower()) >= 0 &&
+ currentPrice.compareTo(boll.getLower().multiply(new BigDecimal("1.005"))) <= 0;
+
+ // 价格触及BOLL上轨
+ boolean isPriceNearBollUpper = currentPrice.compareTo(boll.getUpper()) <= 0 &&
+ currentPrice.compareTo(boll.getUpper().multiply(new BigDecimal("0.995"))) >= 0;
+
+ // 价格回归BOLL中轨附近
+ boolean isPriceNearBollMid = currentPrice.compareTo(boll.getMid().multiply(new BigDecimal("0.998"))) >= 0 &&
+ currentPrice.compareTo(boll.getMid().multiply(new BigDecimal("1.002"))) <= 0;
+
+ // KDJ超卖(使用调整后的阈值)
+ boolean isKdjOversold = kdj.getJ().compareTo(new BigDecimal(15)) < 0;
+
+ // KDJ超买(使用调整后的阈值)
+ boolean isKdjOverbought = kdj.getJ().compareTo(new BigDecimal(85)) > 0;
+
+ // 成交量验证(当前成交量大于20周期均值的1.2倍)
+ boolean isVolumeValid = volumeConfirm(volume) &&
+ volume.get(volume.size() - 1).compareTo(calculateMA(volume, config.getVolumeMaPeriod()).multiply(new BigDecimal("1.2"))) > 0;
+
+ // 开多逻辑:价格触及BOLL下轨且KDJ超卖且有成交量支持
+ if (isPriceNearBollLower && isKdjOversold && isVolumeValid && !hasLongPosition && !hasShortPosition) {
+ log.info("区间交易:价格触及BOLL下轨({}), KDJ-J值({})超卖,生成买入信号", boll.getLower(), kdj.getJ());
+ return SignalType.BUY;
+ }
+
+ // 开空逻辑:价格触及BOLL上轨且KDJ超买且有成交量支持
+ if (isPriceNearBollUpper && isKdjOverbought && isVolumeValid && !hasLongPosition && !hasShortPosition) {
+ log.info("区间交易:价格触及BOLL上轨({}), KDJ-J值({})超买,生成卖出信号", boll.getUpper(), kdj.getJ());
+ return SignalType.SELL;
+ }
+
+ // 平多逻辑:价格回归BOLL中轨
+ if (isPriceNearBollMid && hasLongPosition) {
+ log.info("区间交易:价格回归BOLL中轨({}),生成平多信号", boll.getMid());
+ return SignalType.CLOSE_BUY;
+ }
+
+ // 平空逻辑:价格回归BOLL中轨
+ if (isPriceNearBollMid && hasShortPosition) {
+ log.info("区间交易:价格回归BOLL中轨({}),生成平空信号", boll.getMid());
+ return SignalType.CLOSE_SELL;
+ }
+
+ return SignalType.NONE;
+ }
+
+ /**
* 计算动态杠杆倍数
* 杠杆倍数 = 基础杠杆 * (波动率阈值/当前波动率)
* @param high 最高价列表
@@ -572,7 +640,7 @@
// 限制杠杆范围在1x-10x之间
leverage = leverage.min(new BigDecimal(10)).max(BigDecimal.ONE);
- log.debug("动态杠杆计算 - 基础杠杆: {}, 波动率阈值: {}, 当前波动率: {}, 计算杠杆: {}",
+ log.info("动态杠杆计算 - 基础杠杆: {}, 波动率阈值: {}, 当前波动率: {}, 计算杠杆: {}",
config.getBaseLeverage(), volatilityThreshold, currentVolatility, leverage);
return leverage;
@@ -685,6 +753,8 @@
return direction == Direction.LONG ? ma.getEma20() : ma.getEma20();
}
+
+
/**
* 黑天鹅事件过滤
* 规避重大事件前后30分钟、链上大额转账、异常资金费率
@@ -708,7 +778,7 @@
boolean shouldAvoid = isAbnormalFundingRate || hasLargeTransfer || hasUpcomingEvent;
if (shouldAvoid) {
- log.debug("黑天鹅事件过滤触发 - 资金费率异常: {}, 大额转账: {}, 即将发生重大事件: {}",
+ log.info("黑天鹅事件过滤触发 - 资金费率异常: {}, 大额转账: {}, 即将发生重大事件: {}",
isAbnormalFundingRate, hasLargeTransfer, hasUpcomingEvent);
}
--
Gitblit v1.9.1