本项目是一个基于Java Spring Boot开发的智能加密货币交易策略回测系统,集成了AI策略生成、历史数据回测和性能分析功能。系统支持通过自然语言描述自动生成交易策略,并对历史K线数据进行策略回测,提供详细的回测分析结果。
- 智能策略创建:基于DeepSeek API,通过自然语言描述自动生成Ta4j交易策略
- 动态编译加载:使用Janino编译器实时编译策略代码并动态加载
- 策略管理:支持策略的创建、更新、删除和查询
- 热更新:无需重启服务即可加载新策略
- 历史数据获取:从OKX交易所API获取历史K线数据
- 多策略支持:支持SMA、布林带、RSI、成交量突破等多种技术指标策略
- 性能分析:计算总收益率、夏普比率、胜率、最大回撤等关键指标
- 详细记录:保存完整的交易记录和回测汇总信息
- 数据存储:MySQL数据库存储策略信息、回测结果和交易记录
- 缓存优化:Redis缓存提升数据访问性能
- API接口:完整的RESTful API接口支持
- 后端框架:Spring Boot 2.7.8
- 编程语言:Java 8
- 数据库:MySQL 8.0 + Redis 6.0+
- 技术分析:Ta4j 0.14 技术分析库
- AI集成:DeepSeek API
- 动态编译:Janino 编译器
- HTTP客户端:OkHttp3 4.9.3
- WebSocket:实时数据获取
- 容器化:Docker + Docker Compose
| 字段名 | 类型 | 描述 |
|---|---|---|
| id | BIGINT | 主键ID |
| backtest_id | BIGINT | 回测ID |
| index | INT | 交易索引号 |
| type | VARCHAR(10) | 交易类型(BUY/SELL) |
| entry_time | DATETIME | 入场时间 |
| entry_price | DECIMAL(20,8) | 入场价格 |
| entry_amount | DECIMAL(20,8) | 入场金额 |
| exit_time | DATETIME | 出场时间 |
| exit_price | DECIMAL(20,8) | 出场价格 |
| exit_amount | DECIMAL(20,8) | 出场金额 |
| profit | DECIMAL(20,8) | 交易利润 |
| profit_percentage | DECIMAL(10,4) | 交易利润百分比 |
| closed | BOOLEAN | 是否已平仓 |
| create_time | DATETIME | 创建时间 |
| update_time | DATETIME | 更新时间 |
| 字段名 | 类型 | 描述 |
|---|---|---|
| id | BIGINT | 主键ID |
| symbol | VARCHAR(20) | 交易对 |
| interval | VARCHAR(10) | K线周期 |
| strategy_type | VARCHAR(50) | 策略类型 |
| start_time | DATETIME | 回测开始时间 |
| end_time | DATETIME | 回测结束时间 |
| initial_amount | DECIMAL(20,8) | 初始资金 |
| final_amount | DECIMAL(20,8) | 最终资金 |
| total_profit | DECIMAL(20,8) | 总利润 |
| total_return | DECIMAL(10,4) | 总收益率 |
| win_rate | DECIMAL(10,4) | 胜率 |
| profit_factor | DECIMAL(10,4) | 盈亏比 |
| sharpe_ratio | DECIMAL(10,4) | 夏普比率 |
| max_drawdown | DECIMAL(10,4) | 最大回撤 |
| trade_count | INT | 交易次数 |
| parameters | TEXT | 策略参数(JSON格式) |
| status | VARCHAR(20) | 回测状态 |
| error_message | VARCHAR(500) | 错误信息 |
| create_time | DATETIME | 创建时间 |
| update_time | DATETIME | 更新时间 |
- URL:
/api/api/backtest/ta4j/generate-strategy - 方法: POST
- 请求体: 策略描述文本(String)
- 示例:
"基于RSI超买超卖策略,当RSI低于30时买入,高于70时卖出" - 返回: 生成的策略信息,包含策略ID、名称、分类、参数等
- URL:
/api/api/backtest/ta4j/update-strategy/{strategyId} - 方法: PUT
- 请求体: 新的策略描述文本
- 返回: 更新后的策略信息
- URL:
/api/api/backtest/ta4j/delete-strategy/{strategyId} - 方法: DELETE
- 返回: 删除结果
- URL:
/api/api/backtest/ta4j/strategies - 方法: GET
- 参数:
- page: 页码(默认0)
- size: 每页大小(默认10)
- 返回: 分页的策略列表
- URL:
/api/api/backtest/ta4j/run - 方法: GET
- 参数:
- symbol: 交易对(如"BTC-USDT")
- interval: K线周期(如"1h", "4h", "1d")
- strategyType: 策略类型或策略ID
- startTime: 回测开始时间(yyyy-MM-dd HH:mm:ss)
- endTime: 回测结束时间(yyyy-MM-dd HH:mm:ss)
- initialAmount: 初始资金
- strategyParams: 策略参数(可选)
- saveResult: 是否保存结果(true/false)
- 返回: 回测结果,包含交易记录和性能指标
- URL:
/api/v1/backtest/{backtestId}/trades - 方法: GET
- 参数:
- backtestId: 回测ID
- page: 页码
- size: 每页记录数
- 返回: 分页的交易记录列表
- URL:
/api/v1/backtest/{backtestId} - 方法: GET
- 参数:
- backtestId: 回测ID
- 返回: 回测汇总信息
- URL:
/api/v1/backtest/list - 方法: GET
- 参数:
- page: 页码
- size: 每页记录数
- symbol: 交易对(可选)
- strategyType: 策略类型(可选)
- 返回: 分页的回测记录列表
curl -X POST "http://localhost:8088/api/api/backtest/ta4j/generate-strategy" \
-H "Content-Type: application/json" \
-d '"基于RSI超买超卖策略,当RSI低于30时买入,高于70时卖出"'curl -X POST "http://localhost:8088/api/api/backtest/ta4j/generate-strategy" \
-H "Content-Type: application/json" \
-d '"基于成交量突破策略,当成交量超过20日平均成交量1.5倍时买入,低于0.8倍时卖出"'curl -X POST "http://localhost:8088/api/api/backtest/ta4j/generate-strategy" \
-H "Content-Type: application/json" \
-d '"双均线交叉策略,当短期均线上穿长期均线时买入,下穿时卖出"'curl "http://localhost:8088/api/api/backtest/ta4j/run?symbol=BTC-USDT&interval=1h&strategyType=AI_RSI_001&startTime=2023-01-01%2000:00:00&endTime=2023-01-31%2023:59:59&initialAmount=10000&saveResult=true"curl "http://localhost:8088/api/api/backtest/ta4j/run?symbol=BTC-USDT&interval=1h&strategyType=SMA&startTime=2023-01-01%2000:00:00&endTime=2023-01-31%2023:59:59&initialAmount=10000&strategyParams=5,20&saveResult=true"curl "http://localhost:8088/api/api/backtest/ta4j/run?symbol=ETH-USDT&interval=4h&strategyType=BOLLINGER&startTime=2023-01-01%2000:00:00&endTime=2023-01-31%2023:59:59&initialAmount=10000&strategyParams=20,2.0&saveResult=true"Invoke-RestMethod -Uri 'http://localhost:8088/api/api/backtest/ta4j/generate-strategy' -Method POST -Body '"基于MACD指标的交易策略,当MACD线上穿信号线时买入,下穿时卖出"' -ContentType 'application/json; charset=utf-8'Invoke-RestMethod -Uri 'http://localhost:8088/api/api/backtest/ta4j/run?symbol=BTC-USDT&interval=1h&strategyType=AI_MACD_001&startTime=2023-01-01%2000:00:00&endTime=2023-01-31%2023:59:59&initialAmount=10000&saveResult=true' -Method GET- JDK 8+
- Maven 3.6+
- MySQL 8.0+
- Redis 6.0+
- Docker & Docker Compose (可选)
CREATE DATABASE okx_trading CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;USE okx_trading;
ALTER TABLE strategy_info ADD COLUMN source_code TEXT COMMENT '策略源代码,存储lambda函数的序列化字符串';spring:
datasource:
url: jdbc:mysql://localhost:3306/okx_trading?useSSL=false&serverTimezone=UTC&characterEncoding=utf8
username: root
password: ${MYSQL_PASSWORD:Password123?}
driver-class-name: com.mysql.cj.jdbc.Driver
redis:
host: localhost
port: 6379
timeout: 2000ms
jpa:
hibernate:
ddl-auto: update
show-sql: false
properties:
hibernate:
dialect: org.hibernate.dialect.MySQL8Dialect
# OKX API配置
okx:
api:
key: ${OKX_API_KEY:your_api_key}
secret: ${OKX_API_SECRET:your_api_secret}
passphrase: ${OKX_API_PASSPHRASE:your_passphrase}
base-url: https://www.okx.com
# DeepSeek API配置
deepseek:
api:
key: ${DEEPSEEK_API_KEY:your_deepseek_api_key}
url: https://api.deepseek.com/v1/chat/completions
# 代理配置(适用于中国区域)
proxy:
host: ${PROXY_HOST:localhost}
port: ${PROXY_PORT:10809}
enabled: ${PROXY_ENABLED:false}
server:
port: 8088创建 .env 文件:
# 数据库配置
MYSQL_PASSWORD=your_mysql_password
# OKX API配置
OKX_API_KEY=your_okx_api_key
OKX_API_SECRET=your_okx_api_secret
OKX_API_PASSPHRASE=your_okx_passphrase
# DeepSeek API配置
DEEPSEEK_API_KEY=your_deepseek_api_key
# 代理配置
PROXY_HOST=localhost
PROXY_PORT=10809
PROXY_ENABLED=false# 克隆仓库
git clone https://github.com/ralph-wren/okx-trading.git
# 进入项目目录
cd okx-trading
# 编译打包
mvn clean package -DskipTests
# 运行应用
mvn spring-boot:run
# 或者运行jar包
java -jar target/okx-trading-0.0.1-SNAPSHOT.jar# 启动所有服务(包括MySQL和Redis)
docker-compose up -d
# 查看日志
docker-compose logs -f okx-trading
# 停止服务
docker-compose down# 构建镜像
docker build -t okx-trading .
# 运行容器
docker run -d -p 8088:8088 \
-e MYSQL_PASSWORD=your_password \
-e DEEPSEEK_API_KEY=your_api_key \
--name okx-trading okx-trading- 支持中文自然语言描述
- 自动生成符合Ta4j规范的策略代码
- 智能参数提取和默认值设置
- 策略分类和描述自动生成
- 基于Ta4j 0.14技术分析库
- 支持多种技术指标组合
- 详细的性能指标计算
- 完整的交易记录追踪
- 动态策略加载机制
- 热更新支持,无需重启
- 模块化设计,易于扩展
- RESTful API接口
okx-trading/
├── src/main/java/com/okx/trading/
│ ├── controller/ # REST API控制器
│ │ ├── BacktestController.java
│ │ └── Ta4jBacktestController.java
│ ├── service/ # 业务逻辑服务
│ │ ├── DeepSeekApiService.java # AI策略生成
│ │ ├── Ta4jBacktestService.java # 回测服务
│ │ └── StrategyFactory.java # 策略工厂
│ ├── entity/ # 数据库实体
│ │ ├── StrategyInfo.java
│ │ ├── BacktestSummary.java
│ │ └── BacktestTrade.java
│ ├── repository/ # 数据访问层
│ ├── config/ # 配置类
│ └── util/ # 工具类
├── src/main/resources/
│ ├── application.yml # 主配置文件
│ └── static/ # 静态资源
├── docker/ # Docker相关文件
├── logs/ # 日志目录
├── strategy_test_results/ # 测试结果
├── README_AI_STRATEGY.md # AI策略详细文档
├── README_BACKTEST.md # 回测功能详细文档
└── docker-compose.yml # Docker编排文件
- SMA: 简单移动平均线交叉策略
- BOLLINGER: 布林带策略
- RSI: 相对强弱指数策略
- MACD: 指数平滑移动平均线策略
- 趋势策略: 基于均线、趋势线的策略
- 震荡策略: 基于RSI、KDJ等震荡指标
- 突破策略: 基于成交量、价格突破
- 组合策略: 多指标组合的复合策略
系统计算以下关键性能指标:
- 总收益率: 策略的总体收益表现
- 年化收益率: 按年计算的收益率
- 夏普比率: 风险调整后的收益率
- 最大回撤: 策略的最大亏损幅度
- 胜率: 盈利交易占总交易的比例
- 盈亏比: 平均盈利与平均亏损的比值
- 交易次数: 策略执行的总交易次数
- 平均持仓时间: 每笔交易的平均持续时间
# 使用Docker Compose快速启动
docker-compose up -d
# 或使用Maven启动
mvn spring-boot:runcurl -X POST "http://localhost:8088/api/api/backtest/ta4j/generate-strategy" \
-H "Content-Type: application/json" \
-d '"当RSI指标低于30时买入,高于70时卖出的超买超卖策略"'curl "http://localhost:8088/api/api/backtest/ta4j/run?symbol=BTC-USDT&interval=1h&strategyType=AI_RSI_001&startTime=2023-01-01%2000:00:00&endTime=2023-01-31%2023:59:59&initialAmount=10000&saveResult=true"欢迎提交Issue和Pull Request来改进本项目!
- Fork 本仓库
- 创建特性分支 (
git checkout -b feature/AmazingFeature) - 提交更改 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 开启 Pull Request
- 遵循Java编码规范
- 添加必要的单元测试
- 更新相关文档
- 确保代码通过所有测试
本项目采用 MIT 许可证 - 查看 LICENSE 文件了解详情
- Ta4j - 优秀的技术分析库
- DeepSeek - 强大的AI代码生成能力
- Spring Boot - 优秀的Java框架
- OKX - 可靠的交易所API
⭐ 如果这个项目对你有帮助,请给个Star支持一下!