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;
|
}
|
}
|