From 4884ebffeed775d63dbf7bb7d0ece8182f10c344 Mon Sep 17 00:00:00 2001
From: Administrator <15274802129@163.com>
Date: Fri, 26 Dec 2025 18:19:46 +0800
Subject: [PATCH] fix(okxNewPrice): 解决交易订单为空时的空指针异常
---
src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/MacdMaStrategyTest.java | 217 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 217 insertions(+), 0 deletions(-)
diff --git a/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/MacdMaStrategyTest.java b/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/MacdMaStrategyTest.java
new file mode 100644
index 0000000..a085307
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/okxNewPrice/indicator/macdAndMatrategy/MacdMaStrategyTest.java
@@ -0,0 +1,217 @@
+/**
+ * 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").subtract(new BigDecimal(i));
+// prices.add(newPrice);
+//
+// MacdMaStrategy.TradingOrder order = strategy.generateTradingOrder(prices);
+//
+// System.out.printf("价格: %.2f, 交易指令: %s\n",
+// newPrice.doubleValue(),
+// order != null ? order.toString() : "无交易指令");
+// }
+
+ // 模拟上涨趋势
+ 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\n",
+ newPrice.doubleValue(),
+ order != null ? order.toString() : "无交易指令");
+ }
+
+ // 模拟上涨趋势
+ for (int i = 0; i < 50; i++) {
+ BigDecimal newPrice = new BigDecimal("175.00").subtract(new BigDecimal(i));
+ prices.add(newPrice);
+
+ MacdMaStrategy.TradingOrder order = strategy.generateTradingOrder(prices);
+
+ System.out.printf("价格: %.2f, 交易指令: %s\n",
+ newPrice.doubleValue(),
+ 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\n",
+ newPrice.doubleValue(),
+ 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\n",
+ newPrice.doubleValue(),
+ 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\n",
+ newPrice.doubleValue(),
+ 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\n",
+ newPrice.doubleValue(),
+ 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\n",
+ newPrice.doubleValue(),
+ order != null ? order.toString() : "无交易指令");
+
+ }
+ }
+}
\ No newline at end of file
--
Gitblit v1.9.1