20df471683
参考跟单配置的实现,为回测任务添加最大仓位金额限制功能。 后端改动: - 添加数据库迁移文件 V31__add_backtest_max_position_value.sql - BacktestTask 实体添加 maxPositionValue 字段(BigDecimal?,NULL表示不启用) - BacktestCreateRequest 添加 maxPositionValue 字段 - BacktestConfigDto 添加 maxPositionValue 字段 - BacktestService 处理 maxPositionValue 的创建、详情和复制 - BacktestExecutionService.taskToCopyTrading 映射 maxPositionValue 参数 - BacktestExecutionService.executeBacktest 在买入逻辑中添加仓位检查 * 检查条件:当前仓位 + 买入金额 <= 最大仓位 * 仓位价值计算:quantity * avgPrice * 超过限制时跳过该笔买入并记录详细日志 * 按市场+方向(marketId + outcomeIndex)分别检查 前端改动: - BacktestList 表单添加最大仓位金额输入框(可选字段) - 创建回测任务时包含 maxPositionValue - 回测任务详情中显示 maxPositionValue(仅在配置了时显示) - 默认最大每日订单数从 50 改为 100 - 多语言翻译新增: * backtest.maxPositionValue: 最大仓位金额 / 最大倉位金額 / Max Position Value * maxPositionValuePlaceholder: 留空表示不启用最大仓位限制 功能特点: - 可选参数:留空或为 null 时表示不启用该限制,保持向后兼容 - 单市场单方向限制:按 marketId 和 outcomeIndex 分别计算和限制 - 精确计算:使用 BigDecimal 进行数值比较 - 详细日志:超过限制时记录当前仓位、买入金额、总计等详细信息 Co-authored-by: Cursor <cursoragent@cursor.com>
Polymarket Bot Backend
Polymarket 预测市场机器人后端服务
功能特性
- ✅ 封装 Polymarket CLOB API(订单操作、市场数据、交易数据)
- ✅ 封装 Polymarket Gamma API(市场、事件、系列查询)
- ✅ WebSocket 转发服务(转发前端 WebSocket 连接到 Polymarket RTDS)
- ✅ 统一 API 响应格式
- ✅ 分类验证(仅支持 sports 和 crypto)
- ✅ 工具类支持(安全转换、数学运算、HTTP 客户端等)
技术栈
- Spring Boot 3.2.0
- Kotlin 1.9.20
- Retrofit 2.9.0
- OkHttp 4.12.0
- Java-WebSocket 1.5.4
- MySQL 8.2.0
- Flyway(数据库迁移)
项目结构
backend/
├── src/
│ ├── main/
│ │ ├── kotlin/com/wrbug/polymarketbot/
│ │ │ ├── api/ # API 接口定义
│ │ │ ├── config/ # 配置类
│ │ │ ├── controller/ # 控制器
│ │ │ ├── dto/ # 数据传输对象
│ │ │ ├── service/ # 服务层
│ │ │ ├── util/ # 工具类
│ │ │ └── websocket/ # WebSocket 处理
│ │ └── resources/
│ │ ├── application.properties
│ │ └── db/migration/ # Flyway 迁移脚本
│ └── test/
└── build.gradle.kts
配置说明
环境变量
DB_USERNAME: 数据库用户名(默认: root)DB_PASSWORD: 数据库密码(默认: password)SERVER_PORT: 服务器端口(默认: 8000)CRYPTO_SECRET_KEY: 加密密钥(用于加密存储私钥和 API Key,建议设置)
application.properties
主要配置项:
- 数据库连接配置
- Polymarket API 地址配置
- WebSocket 地址配置
API 接口
市场相关
POST /api/markets/list- 获取市场列表POST /api/markets/detail- 获取市场详情POST /api/markets/search- 搜索市场POST /api/markets/sports- 获取体育市场POST /api/markets/crypto- 获取加密货币市场
WebSocket
WS /ws/polymarket- WebSocket 连接端点(转发到 Polymarket RTDS)
响应格式
所有接口统一返回以下格式:
{
"code": 0,
"data": {},
"msg": ""
}
code: 0 表示成功,非 0 表示失败data: 响应数据msg: 响应消息
错误码
0: 成功1001-1999: 参数错误2001-2999: 认证/权限错误3001-3999: 资源不存在4001-4999: 业务逻辑错误5001-5999: 服务器内部错误
运行
# 构建项目
./gradlew build
# 运行应用
./gradlew bootRun
注意事项
- 仅支持 Polymarket 平台
- 仅支持
sports和crypto两个分类 - WebSocket 转发需要配置正确的 Polymarket RTDS 地址
- 生产环境需要配置正确的 CORS 策略