Administrator
7 days ago 0dac65efdc9533dd12317993e85d6babaa0a26a9
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
package com.xcong.excoin.modules.okxNewPrice.indicator;
 
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
 
/**
 * 15分钟交易策略示例
 * 演示如何使用交易策略与15分钟时间框架数据
 * 展示如何获取方向信号和交易信号
 */
public class FifteenMinuteTradingExample {
 
    public static void main(String[] args) {
        // 创建交易策略
        TradingStrategy tradingStrategy = new TradingStrategy();
 
        // 生成100个15分钟价格数据点
        List<BigDecimal> prices = generateSampleFifteenMinuteData(100);
        
        // 生成对应的高、低、收盘价数据
        List<BigDecimal> high = generateHighPrices(prices);
        List<BigDecimal> low = generateLowPrices(prices);
        List<BigDecimal> close = new ArrayList<>(prices); // 使用价格作为收盘价
        
        // 生成成交量数据
        List<BigDecimal> volume = generateVolumeData(prices.size());
 
        // 获取最新价格
        BigDecimal currentPrice = prices.get(prices.size() - 1);
        
        // 生成多周期价格数据(5分钟、1小时、4小时)
        List<BigDecimal> fiveMinPrices = generateSampleFifteenMinuteData(100);
        List<BigDecimal> oneHourPrices = generateSampleFifteenMinuteData(100);
        List<BigDecimal> fourHourPrices = generateSampleFifteenMinuteData(100);
        
        // 其他参数
        BigDecimal fundingRate = new BigDecimal("0.001"); // 正常资金费率
        boolean hasLargeTransfer = false; // 无大额转账
        boolean hasUpcomingEvent = false; // 无即将到来的重大事件
 
        // 确定市场方向
        TradingStrategy.Direction direction = tradingStrategy.getDirection(prices, high, low, close, currentPrice);
        System.out.println("市场方向(15分钟): " + direction);
 
        // 检查当前持仓状态
        boolean hasLongPosition = false;  // 示例:无当前做多持仓
        boolean hasShortPosition = false; // 示例:无当前做空持仓
 
        // 生成交易信号(开仓/平仓)
        TradingStrategy.SignalType signal = tradingStrategy.generateSignal(prices, high, low, close, volume, currentPrice, 
                                                                          hasLongPosition, hasShortPosition, 
                                                                          fiveMinPrices, oneHourPrices, fourHourPrices,
                                                                          fundingRate, hasLargeTransfer, hasUpcomingEvent);
        System.out.println("交易信号(15分钟): " + signal);
 
        // 显示指标状态用于分析
        System.out.println("\n指标状态:");
        System.out.println(tradingStrategy.getIndicatorStatus());
 
        // 计算动态杠杆
        BigDecimal dynamicLeverage = tradingStrategy.calculateDynamicLeverage(high, low, close);
        System.out.println("\n动态杠杆倍数: " + dynamicLeverage);
 
        // 基于信号模拟持仓变化
        if (signal == TradingStrategy.SignalType.BUY) {
            System.out.println("\n=== 执行开多操作 ===");
            hasLongPosition = true;
            
            // 演示三段式止盈策略
            BigDecimal entryPrice = currentPrice;
            BigDecimal positionSize = new BigDecimal(100);
            TradingStrategy.ProfitTakingResult profitTakingResult = 
                tradingStrategy.calculateThreeStepProfitTaking(entryPrice, currentPrice, direction, positionSize);
            System.out.println("三段式止盈信号: " + profitTakingResult.getSignal());
            System.out.println("应平仓仓位大小: " + profitTakingResult.getClosePositionSize());
        } else if (signal == TradingStrategy.SignalType.SELL) {
            System.out.println("\n=== 执行开空操作 ===");
            hasShortPosition = true;
            
            // 演示三段式止盈策略
            BigDecimal entryPrice = currentPrice;
            BigDecimal positionSize = new BigDecimal(100);
            TradingStrategy.ProfitTakingResult profitTakingResult = 
                tradingStrategy.calculateThreeStepProfitTaking(entryPrice, currentPrice, direction, positionSize);
            System.out.println("三段式止盈信号: " + profitTakingResult.getSignal());
            System.out.println("应平仓仓位大小: " + profitTakingResult.getClosePositionSize());
        } else if (signal == TradingStrategy.SignalType.CLOSE_BUY) {
            System.out.println("\n=== 执行平多操作 ===");
            hasLongPosition = false;
        } else if (signal == TradingStrategy.SignalType.CLOSE_SELL) {
            System.out.println("\n=== 执行平空操作 ===");
            hasShortPosition = false;
        } else {
            System.out.println("\n无需交易操作。");
        }
 
        // 现有做多持仓的模拟示例
        System.out.println("\n=== 现有做多持仓的模拟 ===");
        hasLongPosition = true;
        hasShortPosition = false;
        signal = tradingStrategy.generateSignal(prices, high, low, close, volume, currentPrice, 
                                               hasLongPosition, hasShortPosition, 
                                               fiveMinPrices, oneHourPrices, fourHourPrices,
                                               fundingRate, hasLargeTransfer, hasUpcomingEvent);
        System.out.println("有做多持仓时的交易信号: " + signal);
 
        // 现有做空持仓的模拟示例
        System.out.println("\n=== 现有做空持仓的模拟 ===");
        hasLongPosition = false;
        hasShortPosition = true;
        signal = tradingStrategy.generateSignal(prices, high, low, close, volume, currentPrice, 
                                               hasLongPosition, hasShortPosition, 
                                               fiveMinPrices, oneHourPrices, fourHourPrices,
                                               fundingRate, hasLargeTransfer, hasUpcomingEvent);
        System.out.println("有做空持仓时的交易信号: " + signal);
        
        // 模拟盈利场景演示三段式止盈
        System.out.println("\n=== 三段式止盈盈利场景演示 ===");
        BigDecimal entryPrice = new BigDecimal(2500.0);
        BigDecimal currentPriceProfit = new BigDecimal(2700.0); // 模拟盈利价格
        BigDecimal positionSize = new BigDecimal(100);
        TradingStrategy.ProfitTakingResult profitTakingResult = 
            tradingStrategy.calculateThreeStepProfitTaking(entryPrice, currentPriceProfit, TradingStrategy.Direction.LONG, positionSize);
        System.out.println("入场价格: " + entryPrice);
        System.out.println("当前价格: " + currentPriceProfit);
        System.out.println("三段式止盈信号: " + profitTakingResult.getSignal());
        System.out.println("应平仓仓位大小: " + profitTakingResult.getClosePositionSize());
    }
 
    /**
     * 生成具有真实波动的15分钟价格数据
     * @param size 要生成的数据点数量
     * @return 价格数据列表
     */
    private static List<BigDecimal> generateSampleFifteenMinuteData(int size) {
        List<BigDecimal> prices = new ArrayList<>();
        Random random = new Random();
 
        // 以基础价格开始(ETH示例价格)
        BigDecimal basePrice = new BigDecimal(2500.0);
        prices.add(basePrice);
 
        // 生成具有真实波动的后续价格
        for (int i = 1; i < size; i++) {
            // 创建价格趋势(轻微上升偏向)
            BigDecimal trend = new BigDecimal(0.1).multiply(new BigDecimal(i));
            // 添加随机波动(每个周期±2%)
            BigDecimal volatility = new BigDecimal(random.nextDouble() * 0.04 - 0.02);
            // 计算新价格
            BigDecimal newPrice = basePrice.add(trend).multiply(BigDecimal.ONE.add(volatility));
            // 四舍五入到2位小数
            newPrice = newPrice.setScale(2, BigDecimal.ROUND_HALF_UP);
            prices.add(newPrice);
        }
 
        return prices;
    }
    
    /**
     * 生成最高价数据
     * @param prices 价格数据
     * @return 最高价数据列表
     */
    private static List<BigDecimal> generateHighPrices(List<BigDecimal> prices) {
        List<BigDecimal> high = new ArrayList<>();
        Random random = new Random();
        
        for (BigDecimal price : prices) {
            // 最高价比当前价格高0-2%
            BigDecimal highPrice = price.multiply(BigDecimal.ONE.add(new BigDecimal(random.nextDouble() * 0.02)));
            high.add(highPrice.setScale(2, BigDecimal.ROUND_HALF_UP));
        }
        
        return high;
    }
    
    /**
     * 生成最低价数据
     * @param prices 价格数据
     * @return 最低价数据列表
     */
    private static List<BigDecimal> generateLowPrices(List<BigDecimal> prices) {
        List<BigDecimal> low = new ArrayList<>();
        Random random = new Random();
        
        for (BigDecimal price : prices) {
            // 最低价比当前价格低0-2%
            BigDecimal lowPrice = price.multiply(BigDecimal.ONE.subtract(new BigDecimal(random.nextDouble() * 0.02)));
            low.add(lowPrice.setScale(2, BigDecimal.ROUND_HALF_UP));
        }
        
        return low;
    }
    
    /**
     * 生成成交量数据
     * @param size 数据点数量
     * @return 成交量数据列表
     */
    private static List<BigDecimal> generateVolumeData(int size) {
        List<BigDecimal> volume = new ArrayList<>();
        Random random = new Random();
        
        for (int i = 0; i < size; i++) {
            // 生成1000-10000之间的随机成交量
            BigDecimal vol = new BigDecimal(random.nextInt(9001) + 1000);
            volume.add(vol);
        }
        
        return volume;
    }
}