# CoreTechnicalStrategy 使用指南 ## 1. 概述 CoreTechnicalStrategy 是一个综合技术指标策略类,整合了以下核心技术指标: - 三重EMA交叉系统(9/21/55周期) - 波动率自适应布林带 - MACD能量柱分级策略 ## 2. 类结构 ### 2.1 AdvancedMA 类 用于计算三重EMA交叉系统的指标。 **主要方法:** - `calculateTripleEMA(List prices)`: 计算9EMA、21EMA、55EMA - `isBullish排列()`: 判断是否多头排列(9EMA>21EMA>55EMA) - `isBearish排列()`: 判断是否空头排列(9EMA<21EMA<55EMA) - `calculate粘合度()`: 计算三线粘合度 - `is震荡行情()`: 判断是否处于震荡行情(粘合度<2%) ### 2.2 CoreTechnicalStrategy 类 综合所有技术指标生成交易信号的策略类。 **主要方法:** - `initialize()`: 初始化策略 - `updatePrices(List prices)`: 更新价格数据 - `getSignal(String accountName, String markPx, String posSide)`: 获取交易信号 ## 3. 使用步骤 ### 3.1 初始化策略 ```java // 创建策略实例 CoreTechnicalStrategy strategy = new CoreTechnicalStrategy(); // 初始化策略 strategy.initialize(); ``` ### 3.2 更新价格数据 ```java // 准备价格数据列表 List prices = new ArrayList<>(); prices.add(new BigDecimal(30000)); prices.add(new BigDecimal(30500)); prices.add(new BigDecimal(31000)); // 添加更多价格数据... // 更新价格数据 strategy.updatePrices(prices); ``` ### 3.3 获取交易信号 ```java // 调用getSignal方法获取交易信号 TradeRequestParam param = strategy.getSignal( "account1", // 账户名称 "31500", // 当前标记价格 "long" // 当前仓位方向("long"或"short") ); // 获取交易方向 String side = param.getSide(); // "buy"或"sell" String tradeType = param.getTradeType(); // "yes"或"no" ``` ## 4. 参数说明 ### 4.1 getSignal 方法参数 | 参数名 | 类型 | 说明 | 示例 | |-------|------|------|------| | accountName | String | 账户名称,用于日志记录和配置获取 | "account1", "myAccount" | | markPx | String | 当前标记价格,作为交易决策的基础价格 | "31500", "32000.5" | | posSide | String | 当前仓位方向,决定多空信号的生成逻辑 | "long"(多头), "short"(空头) | ### 4.2 返回值 TradeRequestParam 说明 | 属性名 | 类型 | 说明 | |-------|------|------| | accountName | String | 账户名称 | | markPx | String | 当前标记价格 | | posSide | String | 仓位方向 | | side | String | 交易方向:"buy"(买入/做多)或"sell"(卖出/做空) | | tradeType | String | 交易类型:"yes"(执行交易)或"no"(不执行交易) | | instId | String | 交易对ID | | tdMode | String | 交易模式 | | ordType | String | 订单类型 | ## 5. 核心指标逻辑 ### 5.1 三重EMA交叉系统 - **多头条件**:9EMA > 21EMA > 55EMA - **空头条件**:9EMA < 21EMA < 55EMA - **震荡过滤**:三线粘合度 < 2% 时暂停交易 ### 5.2 波动率自适应布林带 - **动态通道宽度**:标准差倍数根据ATR调整 - **做空信号**:突破上轨 + 成交量放大3倍 - **做多信号**:触及下轨 + 期货资金费率转正 ### 5.3 MACD能量柱分级策略 - **能量柱面积**:累计过去5根柱体积分 - **多头入场**:当前柱体 > 0 且面积增速 > 前周期20% - **空头反转**:柱体顶背离 + RSI > 70区域死叉 ## 6. 示例代码 ```java public class StrategyExample { public static void main(String[] args) { // 初始化策略 CoreTechnicalStrategy strategy = new CoreTechnicalStrategy(); strategy.initialize(); // 准备历史价格数据 List 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()); } } ``` ## 7. 注意事项 1. **价格数据长度**:建议至少提供55个以上的价格数据点,以确保所有指标都能正确计算 2. **初始化顺序**:必须先调用`initialize()`方法,再调用`updatePrices()`和`getSignal()` 3. **仓位方向**:传入的`posSide`参数会影响信号生成逻辑,请确保传入正确的当前仓位方向 4. **日志记录**:策略会输出详细的日志信息,可通过日志级别控制输出内容 5. **震荡过滤**:当处于震荡行情时,`tradeType`会返回"no",建议暂停交易 ## 8. 错误处理 策略内部包含完善的错误处理机制: - 价格数据为空或无效时,会返回`NO_SIGNAL` - 计算过程中发生异常时,会捕获并记录日志,返回`NO_SIGNAL` - 冷静期内会返回`tradeType="no"` - 震荡行情会返回`tradeType="no"` ## 9. 扩展与定制 ### 9.1 修改指标参数 可以在`CoreTechnicalStrategy`类中修改以下常量来调整策略参数: ```java // 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); ``` ### 9.2 自定义信号逻辑 可以重写`analyzeCoreSignal`方法来自定义信号生成逻辑: ```java @Override protected TradeSignal analyzeCoreSignal(BigDecimal currentPrice) { // 自定义信号逻辑 // ... } ``` ## 10. 整合到现有系统 要将CoreTechnicalStrategy整合到现有系统中,只需将其替换或补充现有的策略类即可: ```java // 在OkxWebSocketClientManager或其他适当位置 CoreTechnicalStrategy coreStrategy = new CoreTechnicalStrategy(); coreStrategy.initialize(); // 在价格更新时 coreStrategy.updatePrices(priceList); // 在需要交易信号时 TradeRequestParam signal = coreStrategy.getSignal(accountName, markPx, posSide); ```