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/FifteenMinuteTradingExample.java |  214 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 214 insertions(+), 0 deletions(-)

diff --git a/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/FifteenMinuteTradingExample.java b/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/FifteenMinuteTradingExample.java
new file mode 100644
index 0000000..d98eccf
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/FifteenMinuteTradingExample.java
@@ -0,0 +1,214 @@
+package com.xcong.excoin.modules.okxNewPrice.indicator;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+/**
+ * 15分钟交易策略示例
+ * 演示如何使用交易策略与15分钟时间框架数据
+ * 展示如何获取方向信号和交易信号
+ */
+public class FifteenMinuteTradingExample {
+
+    public static void main(String[] args) {
+        // 创建交易策略
+        TradingStrategy tradingStrategy = new TradingStrategy();
+
+        // 生成100个15分钟价格数据点
+        List<BigDecimal> prices = generateSampleFifteenMinuteData(100);
+        
+        // 生成对应的高、低、收盘价数据
+        List<BigDecimal> high = generateHighPrices(prices);
+        List<BigDecimal> low = generateLowPrices(prices);
+        List<BigDecimal> close = new ArrayList<>(prices); // 使用价格作为收盘价
+        
+        // 生成成交量数据
+        List<BigDecimal> volume = generateVolumeData(prices.size());
+
+        // 获取最新价格
+        BigDecimal currentPrice = prices.get(prices.size() - 1);
+        
+        // 生成多周期价格数据(5分钟、1小时、4小时)
+        List<BigDecimal> fiveMinPrices = generateSampleFifteenMinuteData(100);
+        List<BigDecimal> oneHourPrices = generateSampleFifteenMinuteData(100);
+        List<BigDecimal> fourHourPrices = generateSampleFifteenMinuteData(100);
+        
+        // 其他参数
+        BigDecimal fundingRate = new BigDecimal("0.001"); // 正常资金费率
+        boolean hasLargeTransfer = false; // 无大额转账
+        boolean hasUpcomingEvent = false; // 无即将到来的重大事件
+
+        // 确定市场方向
+        TradingStrategy.Direction direction = tradingStrategy.getDirection(prices, high, low, close, currentPrice);
+        System.out.println("市场方向(15分钟): " + direction);
+
+        // 检查当前持仓状态
+        boolean hasLongPosition = false;  // 示例:无当前做多持仓
+        boolean hasShortPosition = false; // 示例:无当前做空持仓
+
+        // 生成交易信号(开仓/平仓)
+        TradingStrategy.SignalType signal = tradingStrategy.generateSignal(prices, high, low, close, volume, currentPrice, 
+                                                                          hasLongPosition, hasShortPosition, 
+                                                                          fiveMinPrices, oneHourPrices, fourHourPrices,
+                                                                          fundingRate, hasLargeTransfer, hasUpcomingEvent);
+        System.out.println("交易信号(15分钟): " + signal);
+
+        // 显示指标状态用于分析
+        System.out.println("\n指标状态:");
+        System.out.println(tradingStrategy.getIndicatorStatus());
+
+        // 计算动态杠杆
+        BigDecimal dynamicLeverage = tradingStrategy.calculateDynamicLeverage(high, low, close);
+        System.out.println("\n动态杠杆倍数: " + dynamicLeverage);
+
+        // 基于信号模拟持仓变化
+        if (signal == TradingStrategy.SignalType.BUY) {
+            System.out.println("\n=== 执行开多操作 ===");
+            hasLongPosition = true;
+            
+            // 演示三段式止盈策略
+            BigDecimal entryPrice = currentPrice;
+            BigDecimal positionSize = new BigDecimal(100);
+            TradingStrategy.ProfitTakingResult profitTakingResult = 
+                tradingStrategy.calculateThreeStepProfitTaking(entryPrice, currentPrice, direction, positionSize);
+            System.out.println("三段式止盈信号: " + profitTakingResult.getSignal());
+            System.out.println("应平仓仓位大小: " + profitTakingResult.getClosePositionSize());
+        } else if (signal == TradingStrategy.SignalType.SELL) {
+            System.out.println("\n=== 执行开空操作 ===");
+            hasShortPosition = true;
+            
+            // 演示三段式止盈策略
+            BigDecimal entryPrice = currentPrice;
+            BigDecimal positionSize = new BigDecimal(100);
+            TradingStrategy.ProfitTakingResult profitTakingResult = 
+                tradingStrategy.calculateThreeStepProfitTaking(entryPrice, currentPrice, direction, positionSize);
+            System.out.println("三段式止盈信号: " + profitTakingResult.getSignal());
+            System.out.println("应平仓仓位大小: " + profitTakingResult.getClosePositionSize());
+        } else if (signal == TradingStrategy.SignalType.CLOSE_BUY) {
+            System.out.println("\n=== 执行平多操作 ===");
+            hasLongPosition = false;
+        } else if (signal == TradingStrategy.SignalType.CLOSE_SELL) {
+            System.out.println("\n=== 执行平空操作 ===");
+            hasShortPosition = false;
+        } else {
+            System.out.println("\n无需交易操作。");
+        }
+
+        // 现有做多持仓的模拟示例
+        System.out.println("\n=== 现有做多持仓的模拟 ===");
+        hasLongPosition = true;
+        hasShortPosition = false;
+        signal = tradingStrategy.generateSignal(prices, high, low, close, volume, currentPrice, 
+                                               hasLongPosition, hasShortPosition, 
+                                               fiveMinPrices, oneHourPrices, fourHourPrices,
+                                               fundingRate, hasLargeTransfer, hasUpcomingEvent);
+        System.out.println("有做多持仓时的交易信号: " + signal);
+
+        // 现有做空持仓的模拟示例
+        System.out.println("\n=== 现有做空持仓的模拟 ===");
+        hasLongPosition = false;
+        hasShortPosition = true;
+        signal = tradingStrategy.generateSignal(prices, high, low, close, volume, currentPrice, 
+                                               hasLongPosition, hasShortPosition, 
+                                               fiveMinPrices, oneHourPrices, fourHourPrices,
+                                               fundingRate, hasLargeTransfer, hasUpcomingEvent);
+        System.out.println("有做空持仓时的交易信号: " + signal);
+        
+        // 模拟盈利场景演示三段式止盈
+        System.out.println("\n=== 三段式止盈盈利场景演示 ===");
+        BigDecimal entryPrice = new BigDecimal(2500.0);
+        BigDecimal currentPriceProfit = new BigDecimal(2700.0); // 模拟盈利价格
+        BigDecimal positionSize = new BigDecimal(100);
+        TradingStrategy.ProfitTakingResult profitTakingResult = 
+            tradingStrategy.calculateThreeStepProfitTaking(entryPrice, currentPriceProfit, TradingStrategy.Direction.LONG, positionSize);
+        System.out.println("入场价格: " + entryPrice);
+        System.out.println("当前价格: " + currentPriceProfit);
+        System.out.println("三段式止盈信号: " + profitTakingResult.getSignal());
+        System.out.println("应平仓仓位大小: " + profitTakingResult.getClosePositionSize());
+    }
+
+    /**
+     * 生成具有真实波动的15分钟价格数据
+     * @param size 要生成的数据点数量
+     * @return 价格数据列表
+     */
+    private static List<BigDecimal> generateSampleFifteenMinuteData(int size) {
+        List<BigDecimal> prices = new ArrayList<>();
+        Random random = new Random();
+
+        // 以基础价格开始(ETH示例价格)
+        BigDecimal basePrice = new BigDecimal(2500.0);
+        prices.add(basePrice);
+
+        // 生成具有真实波动的后续价格
+        for (int i = 1; i < size; i++) {
+            // 创建价格趋势(轻微上升偏向)
+            BigDecimal trend = new BigDecimal(0.1).multiply(new BigDecimal(i));
+            // 添加随机波动(每个周期±2%)
+            BigDecimal volatility = new BigDecimal(random.nextDouble() * 0.04 - 0.02);
+            // 计算新价格
+            BigDecimal newPrice = basePrice.add(trend).multiply(BigDecimal.ONE.add(volatility));
+            // 四舍五入到2位小数
+            newPrice = newPrice.setScale(2, BigDecimal.ROUND_HALF_UP);
+            prices.add(newPrice);
+        }
+
+        return prices;
+    }
+    
+    /**
+     * 生成最高价数据
+     * @param prices 价格数据
+     * @return 最高价数据列表
+     */
+    private static List<BigDecimal> generateHighPrices(List<BigDecimal> prices) {
+        List<BigDecimal> high = new ArrayList<>();
+        Random random = new Random();
+        
+        for (BigDecimal price : prices) {
+            // 最高价比当前价格高0-2%
+            BigDecimal highPrice = price.multiply(BigDecimal.ONE.add(new BigDecimal(random.nextDouble() * 0.02)));
+            high.add(highPrice.setScale(2, BigDecimal.ROUND_HALF_UP));
+        }
+        
+        return high;
+    }
+    
+    /**
+     * 生成最低价数据
+     * @param prices 价格数据
+     * @return 最低价数据列表
+     */
+    private static List<BigDecimal> generateLowPrices(List<BigDecimal> prices) {
+        List<BigDecimal> low = new ArrayList<>();
+        Random random = new Random();
+        
+        for (BigDecimal price : prices) {
+            // 最低价比当前价格低0-2%
+            BigDecimal lowPrice = price.multiply(BigDecimal.ONE.subtract(new BigDecimal(random.nextDouble() * 0.02)));
+            low.add(lowPrice.setScale(2, BigDecimal.ROUND_HALF_UP));
+        }
+        
+        return low;
+    }
+    
+    /**
+     * 生成成交量数据
+     * @param size 数据点数量
+     * @return 成交量数据列表
+     */
+    private static List<BigDecimal> generateVolumeData(int size) {
+        List<BigDecimal> volume = new ArrayList<>();
+        Random random = new Random();
+        
+        for (int i = 0; i < size; i++) {
+            // 生成1000-10000之间的随机成交量
+            BigDecimal vol = new BigDecimal(random.nextInt(9001) + 1000);
+            volume.add(vol);
+        }
+        
+        return volume;
+    }
+}

--
Gitblit v1.9.1