Administrator
2025-12-29 2cb4335ce706ccb451ccc7edb92fd89b5ad427e2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
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() : "无交易指令");
 
        }
    }
}