/** * MACD和MA组合交易策略测试类 * 用于验证策略在不同市场条件下的表现 */ package com.xcong.excoin.modules.okxNewPrice.indicator.macdAndMatrategy; import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; /** * 策略测试类,提供多种测试场景验证策略功能 */ public class MacdMaStrategyTest { public static void main(String[] args) { // 测试场景1:简单上涨趋势 testSimpleUptrend(); // 测试场景2:简单下跌趋势 testSimpleDowntrend(); // 测试场景3:震荡市场 testSidewaysMarket(); // 测试场景4:波动率过滤 testVolatilityFilter(); } /** * 测试简单上涨趋势场景 */ private static void testSimpleUptrend() { System.out.println("\n===== 测试场景1:简单上涨趋势 ====="); MacdMaStrategy strategy = new MacdMaStrategy(); List prices = new ArrayList<>(); // 生成初始价格数据 for (int i = 0; i < 50; i++) { prices.add(new BigDecimal("100.00").add(new BigDecimal(i))); } // 模拟上涨趋势 for (int i = 0; i < 50; i++) { BigDecimal newPrice = new BigDecimal("125.00").add(new BigDecimal(i)); prices.add(newPrice); MacdMaStrategy.TradingOrder order = strategy.generateTradingOrder(prices); System.out.printf("价格: %.2f, 当前持仓: %s, 交易指令: %s\n", newPrice.doubleValue(), strategy.getCurrentPosition().name(), order != null ? order.toString() : "无交易指令"); } } /** * 测试简单下跌趋势场景 */ private static void testSimpleDowntrend() { System.out.println("\n===== 测试场景2:简单下跌趋势 ====="); MacdMaStrategy strategy = new MacdMaStrategy(); List prices = new ArrayList<>(); // 生成初始价格数据 for (int i = 0; i < 50; i++) { prices.add(new BigDecimal("150.00").subtract(new BigDecimal(i))); } // 模拟下跌趋势 for (int i = 0; i < 30; i++) { BigDecimal newPrice = new BigDecimal("125.00").subtract(new BigDecimal(i )); prices.add(newPrice); MacdMaStrategy.TradingOrder order = strategy.generateTradingOrder(prices); System.out.printf("价格: %.2f, 当前持仓: %s, 交易指令: %s\n", newPrice.doubleValue(), strategy.getCurrentPosition().name(), order != null ? order.toString() : "无交易指令"); } } /** * 测试震荡市场场景 */ private static void testSidewaysMarket() { System.out.println("\n===== 测试场景3:震荡市场 ====="); MacdMaStrategy strategy = new MacdMaStrategy(); List prices = new ArrayList<>(); // 生成初始价格数据 for (int i = 0; i < 50; i++) { prices.add(new BigDecimal("120.00")); } // 模拟震荡市场 for (int i = 0; i < 30; i++) { // 生成上下波动的价格 double price = 120.0 + Math.sin(i * 0.5) * 5.0; BigDecimal newPrice = new BigDecimal(price).setScale(2, BigDecimal.ROUND_HALF_UP); prices.add(newPrice); MacdMaStrategy.TradingOrder order = strategy.generateTradingOrder(prices); System.out.printf("价格: %.2f, 当前持仓: %s, 交易指令: %s\n", newPrice.doubleValue(), strategy.getCurrentPosition().name(), order != null ? order.toString() : "无交易指令"); } } /** * 测试波动率过滤功能 */ private static void testVolatilityFilter() { System.out.println("\n===== 测试场景4:波动率过滤 ====="); MacdMaStrategy strategy = new MacdMaStrategy(); List prices = new ArrayList<>(); // 生成初始价格数据 for (int i = 0; i < 50; i++) { prices.add(new BigDecimal("100.00")); } // 模拟低波动率市场 System.out.println("\n--- 低波动率市场测试 ---"); for (int i = 0; i < 10; i++) { BigDecimal newPrice = new BigDecimal("100.00").add(new BigDecimal(i * 0.1)); prices.add(newPrice); MacdMaStrategy.TradingOrder order = strategy.generateTradingOrder(prices); System.out.printf("价格: %.2f, 当前持仓: %s, 交易指令: %s\n", newPrice.doubleValue(), strategy.getCurrentPosition().name(), order != null ? order.toString() : "无交易指令"); } // 模拟高波动率市场 System.out.println("\n--- 高波动率市场测试 ---"); for (int i = 0; i < 10; i++) { double price = 100.0 + Math.random() * 10.0; BigDecimal newPrice = new BigDecimal(price).setScale(2, BigDecimal.ROUND_HALF_UP); prices.add(newPrice); MacdMaStrategy.TradingOrder order = strategy.generateTradingOrder(prices); System.out.printf("价格: %.2f, 当前持仓: %s, 交易指令: %s\n", newPrice.doubleValue(), strategy.getCurrentPosition().name(), order != null ? order.toString() : "无交易指令"); } } /** * 测试止损和止盈功能 */ private static void testStopLossAndTakeProfit() { System.out.println("\n===== 测试场景5:止损和止盈 ====="); // 创建策略实例,设置1%止损和2%止盈 MacdMaStrategy strategy = new MacdMaStrategy(12, 26, 9, 20, new BigDecimal("0.01"), new BigDecimal("0.02")); List prices = new ArrayList<>(); // 生成初始价格数据 for (int i = 0; i < 50; i++) { prices.add(new BigDecimal("100.00").add(new BigDecimal(i * 0.5))); } // 开多仓 strategy.generateTradingOrder(prices); System.out.printf("开仓价格: %.2f, 止损价格: %.2f, 止盈价格: %.2f\n", strategy.getEntryPrice().doubleValue(), strategy.getEntryPrice().multiply(new BigDecimal("0.99")).doubleValue(), strategy.getEntryPrice().multiply(new BigDecimal("1.02")).doubleValue()); // 测试止损触发 System.out.println("\n--- 测试止损触发 ---"); for (int i = 0; i < 5; i++) { BigDecimal newPrice = strategy.getEntryPrice().subtract(new BigDecimal(i * 0.5)); prices.add(newPrice); MacdMaStrategy.TradingOrder order = strategy.generateTradingOrder(prices); System.out.printf("价格: %.2f, 当前持仓: %s, 交易指令: %s\n", newPrice.doubleValue(), strategy.getCurrentPosition().name(), order != null ? order.toString() : "无交易指令"); if (strategy.getCurrentPosition() == MacdMaStrategy.PositionType.NONE) { break; } } } }