/**
|
* 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<BigDecimal> 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<BigDecimal> 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<BigDecimal> 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<BigDecimal> 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<BigDecimal> 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;
|
}
|
}
|
}
|
}
|