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 prices = generateSampleFifteenMinuteData(100); // 生成对应的高、低、收盘价数据 List high = generateHighPrices(prices); List low = generateLowPrices(prices); List close = new ArrayList<>(prices); // 使用价格作为收盘价 // 生成成交量数据 List volume = generateVolumeData(prices.size()); // 获取最新价格 BigDecimal currentPrice = prices.get(prices.size() - 1); // 生成多周期价格数据(5分钟、1小时、4小时) List fiveMinPrices = generateSampleFifteenMinuteData(100); List oneHourPrices = generateSampleFifteenMinuteData(100); List 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 generateSampleFifteenMinuteData(int size) { List 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 generateHighPrices(List prices) { List 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 generateLowPrices(List prices) { List 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 generateVolumeData(int size) { List 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; } }