CoreTechnicalStrategy 是一个综合技术指标策略类,整合了以下核心技术指标:
- 三重EMA交叉系统(9/21/55周期)
- 波动率自适应布林带
- MACD能量柱分级策略
用于计算三重EMA交叉系统的指标。
主要方法:
- calculateTripleEMA(List<BigDecimal> prices): 计算9EMA、21EMA、55EMA
- isBullish排列(): 判断是否多头排列(9EMA>21EMA>55EMA)
- isBearish排列(): 判断是否空头排列(9EMA<21EMA<55EMA)
- calculate粘合度(): 计算三线粘合度
- is震荡行情(): 判断是否处于震荡行情(粘合度<2%)
综合所有技术指标生成交易信号的策略类。
主要方法:
- initialize(): 初始化策略
- updatePrices(List<BigDecimal> prices): 更新价格数据
- getSignal(String accountName, String markPx, String posSide): 获取交易信号
// 创建策略实例
CoreTechnicalStrategy strategy = new CoreTechnicalStrategy();
// 初始化策略
strategy.initialize();
// 准备价格数据列表
List<BigDecimal> prices = new ArrayList<>();
prices.add(new BigDecimal(30000));
prices.add(new BigDecimal(30500));
prices.add(new BigDecimal(31000));
// 添加更多价格数据...
// 更新价格数据
strategy.updatePrices(prices);
// 调用getSignal方法获取交易信号
TradeRequestParam param = strategy.getSignal(
"account1", // 账户名称
"31500", // 当前标记价格
"long" // 当前仓位方向("long"或"short")
);
// 获取交易方向
String side = param.getSide(); // "buy"或"sell"
String tradeType = param.getTradeType(); // "yes"或"no"
| 参数名 | 类型 | 说明 | 示例 |
|---|---|---|---|
| accountName | String | 账户名称,用于日志记录和配置获取 | "account1", "myAccount" |
| markPx | String | 当前标记价格,作为交易决策的基础价格 | "31500", "32000.5" |
| posSide | String | 当前仓位方向,决定多空信号的生成逻辑 | "long"(多头), "short"(空头) |
| 属性名 | 类型 | 说明 |
|---|---|---|
| accountName | String | 账户名称 |
| markPx | String | 当前标记价格 |
| posSide | String | 仓位方向 |
| side | String | 交易方向:"buy"(买入/做多)或"sell"(卖出/做空) |
| tradeType | String | 交易类型:"yes"(执行交易)或"no"(不执行交易) |
| instId | String | 交易对ID |
| tdMode | String | 交易模式 |
| ordType | String | 订单类型 |
public class StrategyExample {
public static void main(String[] args) {
// 初始化策略
CoreTechnicalStrategy strategy = new CoreTechnicalStrategy();
strategy.initialize();
// 准备历史价格数据
List<BigDecimal> historicalPrices = new ArrayList<>();
for (int i = 0; i < 100; i++) {
// 模拟价格数据
BigDecimal price = new BigDecimal(30000 + i * 100 + Math.random() * 500);
historicalPrices.add(price);
}
// 更新价格数据
strategy.updatePrices(historicalPrices);
// 获取当前价格
String currentPrice = "35000";
// 获取多头信号
TradeRequestParam longSignal = strategy.getSignal("myAccount", currentPrice, "long");
System.out.println("多头信号: " + longSignal.getSide() + ", 交易类型: " + longSignal.getTradeType());
// 获取空头信号
TradeRequestParam shortSignal = strategy.getSignal("myAccount", currentPrice, "short");
System.out.println("空头信号: " + shortSignal.getSide() + ", 交易类型: " + shortSignal.getTradeType());
}
}
initialize()方法,再调用updatePrices()和getSignal()posSide参数会影响信号生成逻辑,请确保传入正确的当前仓位方向tradeType会返回"no",建议暂停交易策略内部包含完善的错误处理机制:
- 价格数据为空或无效时,会返回NO_SIGNAL
- 计算过程中发生异常时,会捕获并记录日志,返回NO_SIGNAL
- 冷静期内会返回tradeType="no"
- 震荡行情会返回tradeType="no"
可以在CoreTechnicalStrategy类中修改以下常量来调整策略参数:
// MACD能量柱计算周期
private static final int MACD_HISTOGRAM_PERIOD = 5;
// 成交量放大倍数
private static final BigDecimal VOLUME_MULTIPLIER = new BigDecimal(3);
// 三线粘合度阈值(%)
private static final BigDecimal GLUE_THRESHOLD = new BigDecimal(2);
可以重写analyzeCoreSignal方法来自定义信号生成逻辑:
@Override
protected TradeSignal analyzeCoreSignal(BigDecimal currentPrice) {
// 自定义信号逻辑
// ...
}
要将CoreTechnicalStrategy整合到现有系统中,只需将其替换或补充现有的策略类即可:
// 在OkxWebSocketClientManager或其他适当位置
CoreTechnicalStrategy coreStrategy = new CoreTechnicalStrategy();
coreStrategy.initialize();
// 在价格更新时
coreStrategy.updatePrices(priceList);
// 在需要交易信号时
TradeRequestParam signal = coreStrategy.getSignal(accountName, markPx, posSide);