edit | blame | history | raw

CoreTechnicalStrategy 使用指南

1. 概述

CoreTechnicalStrategy 是一个综合技术指标策略类,整合了以下核心技术指标:
- 三重EMA交叉系统(9/21/55周期)
- 波动率自适应布林带
- MACD能量柱分级策略

2. 类结构

2.1 AdvancedMA 类

用于计算三重EMA交叉系统的指标。

主要方法:
- calculateTripleEMA(List<BigDecimal> prices): 计算9EMA、21EMA、55EMA
- isBullish排列(): 判断是否多头排列(9EMA>21EMA>55EMA)
- isBearish排列(): 判断是否空头排列(9EMA<21EMA<55EMA)
- calculate粘合度(): 计算三线粘合度
- is震荡行情(): 判断是否处于震荡行情(粘合度<2%)

2.2 CoreTechnicalStrategy 类

综合所有技术指标生成交易信号的策略类。

主要方法:
- initialize(): 初始化策略
- updatePrices(List<BigDecimal> prices): 更新价格数据
- getSignal(String accountName, String markPx, String posSide): 获取交易信号

3. 使用步骤

3.1 初始化策略

// 创建策略实例
CoreTechnicalStrategy strategy = new CoreTechnicalStrategy();

// 初始化策略
strategy.initialize();

3.2 更新价格数据

// 准备价格数据列表
List<BigDecimal> prices = new ArrayList<>();
prices.add(new BigDecimal(30000));
prices.add(new BigDecimal(30500));
prices.add(new BigDecimal(31000));
// 添加更多价格数据...

// 更新价格数据
strategy.updatePrices(prices);

3.3 获取交易信号

// 调用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. 示例代码

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

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类中修改以下常量来调整策略参数:

// 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方法来自定义信号生成逻辑:

@Override
protected TradeSignal analyzeCoreSignal(BigDecimal currentPrice) {
    // 自定义信号逻辑
    // ...
}

10. 整合到现有系统

要将CoreTechnicalStrategy整合到现有系统中,只需将其替换或补充现有的策略类即可:

// 在OkxWebSocketClientManager或其他适当位置
CoreTechnicalStrategy coreStrategy = new CoreTechnicalStrategy();
coreStrategy.initialize();

// 在价格更新时
coreStrategy.updatePrices(priceList);

// 在需要交易信号时
TradeRequestParam signal = coreStrategy.getSignal(accountName, markPx, posSide);