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