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