 WrBugandCursor
|
8600449f69
|
fix(copytrading): 赎回后按 copyTrading 分别生成自动卖出记录
Co-authored-by: Cursor <cursoragent@cursor.com>
|
2026-02-09 02:38:47 +08:00 |
|
 WrBugandCursor
|
3d47bd50d9
|
chore(backtest): 移除回测轮询服务的冗余日志
Co-authored-by: Cursor <cursoragent@cursor.com>
|
2026-02-09 02:31:26 +08:00 |
|
 WrBugandCursor
|
20df471683
|
feat: 回测任务添加最大仓位参数支持
参考跟单配置的实现,为回测任务添加最大仓位金额限制功能。
后端改动:
- 添加数据库迁移文件 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>
|
2026-02-09 02:25:24 +08:00 |
|
 WrBugandCursor
|
5487c7c862
|
feat(leader): Leader 管理展示跟单/回测数量并支持跳转筛选
- 后端:LeaderDto 增加 backtestCount,LeaderService 统计回测数并返回
- Leader 列表:展示跟单数、回测数,点击跳转跟单配置/回测页并带 leaderId 筛选
- 跟单配置页:从 URL 读取 leaderId 并应用筛选,Leader 下拉改用 LeaderSelect
- 回测页:支持 Leader 筛选,页面加载时请求 Leader 列表,筛选与详情统一显示规则
- LeaderSelect:支持 style,回测/跟单筛选统一使用
- 多语言:补充 leaderList 相关 key
- 移动端:Leader 管理卡片内按钮增加内边距 padding 8px 16px
Co-authored-by: Cursor <cursoragent@cursor.com>
|
2026-02-09 02:03:17 +08:00 |
|
 WrBugandCursor
|
c1829fe21b
|
feat(backtest): 结算显示市场名称,列表非终态任务 3s 轮询进度
- 结算记录: WIN/LOSE/UNKNOWN/CLOSED 通过 marketService.getMarket 写入 marketTitle
- 回测列表: 存在 PENDING/RUNNING 时每 3 秒静默刷新列表更新进度,全部终态后停止轮询
Co-authored-by: Cursor <cursoragent@cursor.com>
|
2026-02-09 01:12:31 +08:00 |
|
 WrBugandCursor
|
b1ad6f02d2
|
feat(backtest): 回测结算持久化、按配置重新测试、执行时以当前时间为窗口基准
- 持久化: BUY/SELL 与 SETTLEMENT(WIN/LOSE/UNKNOWN/CLOSED) 均写入 backtest_trade
- 重新测试: 已完成任务支持「按当前配置重新测试」,新任务名称可编辑,后端 POST /tasks/rerun + 前端按钮与确认弹窗
- 回测窗口: 首次执行以当前时间为终点、startTime = endTime - backtestDays(局部变量,不修改实体)
- 新增错误码 BACKTEST_TASK_NOT_COMPLETED、SERVER_BACKTEST_RERUN_FAILED 及多语言
Co-authored-by: Cursor <cursoragent@cursor.com>
|
2026-02-09 01:08:40 +08:00 |
|
WrBug
|
9d01c120e5
|
fix: 修复回测任务恢复逻辑和分页问题
- 修复新建任务被误判为恢复任务的问题:将 lastProcessedTradeIndex 默认值从 0 改为 null
- 修复页码计算错误:统一页码从 0 开始,确保新任务的 offset 为 0
- 修复恢复任务时跳过已处理条目的逻辑
- 添加数据库迁移文件 V30,将现有新任务的索引值改为 NULL
|
2026-01-31 21:45:02 +08:00 |
|
WrBug
|
ec8cfeac77
|
fix: 修复回测分页起始位置错误
- 修复新回测任务从第1页开始,导致 offset=100
- 应该从第0页开始,offset=0
- 修复后不会跳过前100条交易数据
Bug原因:
- BacktestExecutionService startPage 初始化为 1
- offset = page * size = 1 * 100 = 100
- 导致跳过前100条交易
|
2026-01-31 21:25:56 +08:00 |
|
WrBug
|
55da551971
|
fix: 修复回测统计计算空列表异常
- 修复 calculateStatistics 在 trades 为空时的 IndexOutOfBoundsException
- 添加空列表检查,避免访问 trades[0]
- 确保回测任务即使没有交易记录也能正常完成
|
2026-01-31 21:10:10 +08:00 |
|
WrBug
|
88cae4018a
|
fix: 修复 V29 migration SQL 语法兼容性
- 移除 DROP COLUMN IF EXISTS(仅 MySQL 8.0.29+ 支持)
- 使用标准 DROP COLUMN 语法(MySQL 5.7+ 兼容)
- 添加 Flyway 清理脚本
|
2026-01-31 20:51:26 +08:00 |
|
WrBug
|
96fbc3f720
|
feat: 回测系统优化 - 清理字段、移动端适配、缓存优化
## 主要改动
### 1. 回测字段清理
- 删除 BacktestCreate.tsx(未使用,创建使用 modal)
- 移除不适用于回测的字段:
- priceTolerance, delaySeconds(回测使用历史数据)
- minOrderDepth, maxSpread(无历史订单簿数据)
- minPrice, maxPrice, maxPositionValue(回测中无实际意义)
- maxMarketEndDate(意义不大)
- 更新相关 Entity、DTO、Service
- 添加数据库 migration(V29)
### 2. 移动端响应式适配
- BacktestList:筛选器、表格、Modal、表单响应式布局
- BacktestDetail:详情卡片、统计信息、按钮响应式
- 使用 useMediaQuery hook,断点 768px
- 支持手机、平板、桌面多种设备
### 3. 已结算市场缓存优化
- MarketPriceService 添加 Caffeine 缓存
- 缓存已结算市场价格,避免重复 RPC 调用
- 预计 RPC 请求减少 ~78.6%,性能提升显著
- 添加缓存统计和管理方法
### 4. UI 修复
- 修复 BacktestDetail 停止按钮文本
- 更新多语言翻译(supportSell → 跟单卖出)
## 性能收益
- 回测场景 RPC 调用减少 78.6%
- 回测执行时间预计减少 11秒(14秒 → 3秒)
- 移动端用户体验显著提升
|
2026-01-31 20:45:40 +08:00 |
|
WrBug
|
cdd02e9f3d
|
feat: 实现回测功能
## 功能概述
实现完整的回测功能,支持基于历史数据模拟跟单策略的执行效果。
## 后端实现
- 数据库:新增 backtest_task 和 backtest_trade 表(V27迁移脚本)
- 实体类:BacktestTask、BacktestTrade
- Repository:BacktestTaskRepository、BacktestTradeRepository
- Service:
- BacktestService:回测任务管理(CRUD)
- BacktestDataService:从 Polymarket Data API 获取历史交易数据
- BacktestExecutionService:回测算法核心实现
- BacktestPollingService:定时轮询执行回测任务
- Controller:BacktestController(6个API接口)
- DTO:BacktestDto、TradeData
- 错误码:新增回测相关错误码和国际化消息
## 前端实现
- 页面组件:
- BacktestList:回测任务列表
- BacktestCreate:创建回测任务
- BacktestDetail:回测详情(含图表)
- BacktestChart:资金曲线图表(使用 ECharts)
- 类型定义:backtest.ts
- API 服务:集成所有回测接口
- 国际化:支持中英文
## 核心特性
- 回测天数限制:1-15 天
- 数据获取:直接从 Polymarket Data API 获取历史交易(不使用缓存表)
- 任务执行:同一时刻只执行一个任务,按创建时间顺序执行最早创建的任务
- 回测算法:完整实现市场结算、卖出匹配、价格容忍度、每日订单限制等规则
- 实时进度:支持任务进度更新和实时轮询
## 文档更新
- BACKTEST_PRD.md:产品需求文档
- BACKTEST_TECHNICAL_DESIGN.md:技术设计文档
- BACKTEST_REVIEW_CHECKLIST.md:设计评审检查清单
## 其他修改
- 移除 max_position_count 配置(V26迁移脚本)
- 移除 BacktestSyncService(不再需要实时同步)
- 修复前后端编译错误
|
2026-01-31 07:27:36 +08:00 |
|
WrBug
|
e8fd1b503b
|
移除跟单最大仓位数量(maxPositionCount)配置
- 数据库:创建迁移文件 V26 删除 max_position_count 字段
- 后端:移除实体类、DTO、服务中的 maxPositionCount 相关代码
- 后端:移除 FilterResult 中的 FAILED_MAX_POSITION_COUNT 状态
- 后端:移除 CopyTradingFilterService 中的最大仓位数量检查逻辑
- 前端:移除类型定义、表单字段和国际化翻译
- 前端:移除过滤订单列表中的 MAX_POSITION_COUNT 类型
- 前端:修复编译错误(Spin 导入、Table fixed 类型、size 类型)
|
2026-01-31 00:24:25 +08:00 |
|
WrBug
|
0bdc0c74d1
|
feat: Leader列表优化
- 后端过滤价值为0的仓位
- 持仓列表显示市场名称而非ID
- 列表移除分类和创建时间列
- 文案'跟单关系数'改为'跟单数'
- 持仓DTO添加title字段
|
2026-01-30 22:03:50 +08:00 |
|
WrBug
|
42472f6b03
|
fix: 修复买入订单金额精度问题
- 修复市场买入订单 makerAmount 和 takerAmount 的精度限制
- makerAmount (USDC) 限制为最多 2 位小数
- takerAmount (shares) 限制为最多 4 位小数
- 符合 Polymarket API 的要求,解决 'invalid amounts' 错误
|
2026-01-29 03:45:17 +08:00 |
|
WrBug
|
7e87965418
|
fix: 修复订单状态检查中缓存清除导致计时重置的问题
- 修复订单详情为 null 时缓存清除时机问题,避免计时被重置导致订单无法删除
- 统一部分卖出和未成交订单的删除逻辑,都使用60秒重试窗口(之前部分卖出订单等待1小时)
- 删除未使用的常量 PARTIAL_SOLD_CLEANUP_WINDOW_MS
- 优化日志输出,区分部分卖出和未成交订单的日志信息
修复问题:
- 订单超过60秒不会删除的问题
- 部分卖出订单等待时间过长的问题
|
2026-01-28 15:28:36 +08:00 |
|
WrBug
|
e115d459f7
|
refactor: 优化过滤原因文案的数值显示格式
优化内容:
1. 新增 DateUtils.formatDuration() 函数:将毫秒转换为可读格式(X天X小时X分钟)
2. 优化市场截止时间过滤原因:使用格式化后的时间显示,避免显示过长的毫秒数
3. 优化所有过滤原因中的 BigDecimal 数值显示:
- 价格区间检查:去除尾随零
- 价差检查:去除尾随零
- 订单深度检查:去除尾随零
- 仓位金额检查:去除尾随零
优化效果:
- 时间显示:1009163461ms (280小时) -> 11天16小时26分钟
- 数值显示:0.50000000000000000000 -> 0.5
影响范围:
- DateUtils.kt
- CopyTradingFilterService.kt
|
2026-01-28 15:16:12 +08:00 |
|
WrBug
|
dd39e59304
|
fix: 修复禁用RPC节点后仍被使用的问题
问题描述:
- 用户在前端禁用节点后,系统仍然使用禁用的节点
- 原因:RetrofitFactory 的 rpcApiCache 未被清理,导致禁用的节点 URL 继续在拦截器中被使用
修复内容:
1. updateNode 方法:添加禁用节点时清理缓存的逻辑
2. deleteNode 方法:添加删除节点时清理缓存的逻辑
3. getAvailableNode 方法:优化逻辑,确保始终返回可用节点
- 没有启用节点时返回默认节点
- 所有节点不可用时返回默认节点
- 异常时返回默认节点作为兜底
4. 新增 createDefaultNodeConfig 辅助方法:创建默认节点配置
5. 简化 getHttpUrl 和 getWsUrl 方法:移除冗余逻辑
影响范围:
- RpcNodeService.kt
|
2026-01-28 15:13:07 +08:00 |
|
WrBug
|
2b20f4b2e2
|
fix: 修复订单金额计算和价格范围验证问题
修复了两个关键问题:
1. 订单金额精度错误
- 原因:总是强制将金额舍入到 4 位小数,导致精度丢失
- 问题案例:25.09488 被错误地舍入为 25.0948
- 修复:只在小数位数超过 roundConfig.amount 时才进行舍入,采用与 clob-client 一致的条件舍入逻辑
2. 价格超出范围错误
- 原因:价格 0.999 舍入到 2 位小数后变成 1.00,违反了 price < 1 的限制
- 修复:在舍入后验证价格范围,超出时自动调整到最接近的有效值 (0.01-0.99)
主要变更:
- 对价格进行 roundNormal 舍入(参考 clob-client)
- 实现条件舍入逻辑:先 roundUp(amount + 4),必要时再 roundDown(amount)
- 添加价格范围验证 (MIN_PRICE=0.01, MAX_PRICE=0.99)
- 添加 decimalPlaces() 辅助函数
- 修改 roundNormal/roundDown/roundUp 函数,只有必要时才舍入
参考:clob-client/src/order-builder/helpers.ts 的 getOrderRawAmounts 函数
|
2026-01-23 12:54:48 +08:00 |
|
WrBug
|
266c6d595d
|
fix: 强制添加 gradle-wrapper.jar 到版本控制
- gradle-wrapper.jar 是 Gradle Wrapper 必需的文件
- 必须提交到仓库才能在其他环境中使用
- 修复 GitHub Actions 构建错误
|
2026-01-21 03:47:01 +08:00 |
|
WrBug
|
26dd3bb387
|
feat: 实现系统动态更新功能和 Release 创建脚本
主要变更:
1. 动态更新功能
- 新增 Python 更新服务 (docker/update-service.py)
- 添加系统更新前端页面 (frontend/src/pages/SystemUpdate.tsx)
- 配置 Nginx 代理更新服务 API
- 更新 Docker 启动脚本支持多进程管理
- 修复权限验证接口 (AuthController.verify)
2. Release 创建脚本
- 新增 create-release.sh 脚本支持快速创建 GitHub Release
- 支持自动拼接 -beta 后缀(pre-release)
- 支持无交互模式(--yes 参数)
- 添加详细的使用文档
3. GitHub Actions 增强
- 添加更新包构建和上传流程
- 支持 Pre-release 检测和过滤
4. 文档完善
- 添加动态更新技术方案文档
- 添加 Docker 版本号确定流程文档
- 添加 Release 脚本使用说明
|
2026-01-21 03:34:16 +08:00 |
|
WrBug
|
db8471bb16
|
fix: 统一卖出订单和买入订单的市场分组排序规则
- 修改卖出订单的市场分组排序逻辑
- 按照该市场最近的卖出订单时间倒序排序(与买入订单保持一致)
- 替换原有的按订单数量倒序排序规则
- 优化分组显示的用户体验,便于快速定位活跃市场
|
2026-01-20 11:38:41 +08:00 |
|
WrBug
|
0dc6f5894f
|
refactor: 优化最大仓位价值检查逻辑,按市场+方向分别限制
- 修改 maxPositionValue 检查逻辑,从按市场累计改为按市场+方向(outcomeIndex)分别计算
- 新增 Repository 方法 sumCurrentPositionValueByMarketAndOutcomeIndex 支持按方向统计
- 移除未使用的 sumCurrentPositionValueByMarket 和 existsByCopyTradingIdAndMarketIdAndRemainingQuantityGreaterThan 方法
- 更新 checkPositionLimits 方法,增加 outcomeIndex 参数
- 更新 checkFilters 方法,传递 outcomeIndex 参数
- 更新日志和注释,明确说明按市场+方向检查仓位
说明:同一市场的 YES 和 NO 方向现在分别受 maxPositionValue 限制,不再累加计算
|
2026-01-20 11:15:38 +08:00 |
|
WrBug
|
c9769aa17a
|
fix: 修复比例模式计算数量错误
- 移除 copyRatio 多余的除以 100 操作
- copyRatio 字段存储的是倍数值(如 1.3 表示 130%),不需要再转换
- 影响:买入数量计算、固定金额模式卖出数量计算
- 修复示例:配置 130% 后,Leader 买入 6.25 份,跟单数量应为 8.125 而不是 0.08125
|
2026-01-20 10:45:03 +08:00 |
|
WrBug
|
07b4d654b4
|
清理 MarketPollingService 调试日志
- 删除多余的 debug 日志输出
|
2026-01-19 12:50:34 +08:00 |
|
WrBug
|
d768da72c6
|
清理 MarketPollingService 中多余的 debug 日志
|
2026-01-19 12:48:18 +08:00 |
|
WrBug
|
7385efff1a
|
优化订单详情为null时的处理逻辑
- 当订单详情为null且已发送通知超过60秒时,将订单状态改为fully_matched而不是删除
- 避免已经通过订单详情更正并发送通知的订单被意外删除
- fully_matched状态的订单不会被包含在待查询列表中,自动跳过查询
|
2026-01-19 12:47:03 +08:00 |
|
WrBug
|
3e2e97e572
|
fix: 修复 CopyOrderTrackingService 和 CopyTradingService 的 @Transactional 自调用问题
1. CopyOrderTrackingService 修复
- 实现 ApplicationContextAware 接口
- 添加 getSelf() 方法获取代理对象
- 在 processTrade() 中通过代理调用 processBuyTrade() 和 processSellTrade()
- 确保两个子方法的 @Transactional 生效
2. CopyTradingService 修复
- 实现 ApplicationContextAware 接口
- 添加 getSelf() 方法获取代理对象
- 在 updateCopyTradingStatus() 中通过代理调用 updateCopyTrading()
- 确保内部调用的 @Transactional 生效
修改的文件:
- CopyOrderTrackingService.kt
- CopyTradingService.kt
|
2026-01-16 10:28:39 +08:00 |
|
WrBug
|
deea59fdbf
|
fix: 修复 OrderStatusUpdateService 的事务和并发问题
1. 解决 @Transactional 自调用问题
- 实现 ApplicationContextAware 接口
- 通过代理对象调用 @Transactional 方法,确保事务生效
2. 防止定时任务并发执行
- 添加 updateJob 跟踪上一次任务状态
- 如果上一次任务还在执行,跳过本次执行
- 避免多个更新任务同时运行导致的数据竞争
修改的方法:
- updateOrderStatus(): 添加并发控制
- cleanupDeletedAccountOrders(): 通过代理对象调用
- checkAndDeleteUnfilledOrders(): 通过代理对象调用
- updatePendingSellOrderPrices(): 通过代理对象调用
- updatePendingBuyOrders(): 通过代理对象调用
|
2026-01-15 15:21:29 +08:00 |
|
WrBug
|
b90f86b081
|
fix: 修复 @Transactional 方法的可见性问题
将 OrderStatusUpdateService 中 4 个使用 @Transactional 的方法从 private 改为 public,
确保 Spring 能够正确代理这些方法。
修改的方法:
- cleanupDeletedAccountOrders()
- checkAndDeleteUnfilledOrders()
- updatePendingSellOrderPrices()
- updatePendingBuyOrders()
参考 UserService.kt 的实现模式,@Transactional 方法必须是 public 的。
|
2026-01-15 15:05:53 +08:00 |
|
WrBug
|
f6f5866118
|
refactor: 清理 PositionPollingService 代码
- 移除多余的空行
- 移除调试日志
|
2026-01-15 04:35:11 +08:00 |
|
WrBug
|
b1e69135b8
|
feat: 添加跟单订单来源字段
- 在 CopyOrderTracking 实体添加 source 字段,记录订单来源
- 支持 activity-ws(Polymarket WebSocket)和 onchain-ws(OnChain WebSocket)两种来源
- 更新 processBuyTrade 方法,接收并保存 source 参数
- 更新 OrderStatusUpdateService,保留原始 source 信息
- 添加数据库迁移脚本 V25
- 统一 CopyTradingWebSocketService 使用 activity-ws 作为来源
|
2026-01-15 04:33:55 +08:00 |
|
WrBug
|
0c7f34a28a
|
fix: 添加事务注解修复删除操作异常
- 在 cleanupExpiredProcessedTrades 方法上添加 @Transactional 注解
- 修复 TransactionRequiredException 异常
- 删除操作必须在事务中执行
|
2026-01-15 04:19:46 +08:00 |
|
WrBug
|
c53fcde5d7
|
feat: 添加已处理交易记录定时清理服务
- 创建 ProcessedTradeCleanupService 定时清理过期的去重记录
- 保留时间设置为10分钟(重复订单通常10秒后就不会出现)
- 清理间隔为10分钟,避免数据库空间浪费
- 记录清理日志,便于监控和调试
|
2026-01-15 04:17:54 +08:00 |
|
WrBug
|
81a620af12
|
feat(activity-ws): 同时监听 trades 和 orders_matched,添加 txHash 去重
- 订阅消息同时包含 trades 和 orders_matched 两种类型
- 添加 processedTxHashes Cache (LRU 100 条,10 分钟过期)
- 防止同一交易被重复处理
- 新增 duplicateTxHashMessages 统计指标
- 更新日志信息,明确标注监听范围
|
2026-01-15 04:13:27 +08:00 |
|
WrBug
|
5f44a0ca20
|
优化订单状态更新和统计服务
1. 订单详情为 null 且已部分卖出的订单超时清理
- 新增 PARTIAL_SOLD_CLEANUP_WINDOW_MS 常量(1小时)
- 超过1小时无法获取详情的已部分卖出订单自动清理
- 避免无效订单长期占用数据库空间
2. 优化买入订单分组排序逻辑
- 按最近买入订单时间排序,提升用户体验
- 修复日志中的错误描述(卖出订单列表)
3. 代码格式化优化
|
2026-01-15 02:28:11 +08:00 |
|
WrBug
|
5d2cf945f3
|
fix: 修复 AccountOnChainMonitorService 中 JsonNull 导致的崩溃
- 增加 receiptRpcResponse.result.isJsonNull 检查
- 防止在链上查询返回 JsonNull 时调用 asJsonObject() 抛出 IllegalStateException
- 优化空值处理逻辑,确保程序安全退出
|
2026-01-15 02:10:49 +08:00 |
|
WrBug
|
227a38fa89
|
Merge branch 'main' into dev
|
2026-01-14 15:00:41 +08:00 |
|
WrBug
|
abcc004606
|
fix: 添加订单查询失败的兜底逻辑,避免因网络异常误删订单
- 新增 orderNullDetectionTime 缓存,记录订单详情首次检测为 null 的时间戳
- 订单详情为 null 时,首次检测不删除,等待 1 分钟重试窗口
- 超过重试窗口仍为 null 才删除订单
- 订单详情正常或已部分卖出时清除缓存
- 避免 ResponseLoggingInterceptor 导致的响应体被消费问题
修改文件:
- OrderStatusUpdateService.kt
相关 issue: 订单 0xd245a852... 因响应体为 null 被误删
|
2026-01-14 14:55:05 +08:00 |
|
WrBug
|
64391503c2
|
fix: 修复最大仓位金额未生效和交易receipt解析问题
1. 修复 CopyTradingFilterService 中最大仓位金额(maxPositionValue)未生效的问题
- 当只配置了最大仓位金额但未配置 maxSpread 或 minOrderDepth 时,
仓位检查被跳过导致过滤失效
- 将仓位检查移到 needOrderbook 判断之前,确保始终执行仓位检查
2. 修复 OnChainWsService 中交易 receipt 为 JsonNull 时的空指针问题
- 添加 JsonNull 检查,防止解析失败时出现异常
|
2026-01-14 05:04:31 +08:00 |
|
WrBug
|
92b75d1926
|
refactor: 将 Polymarket API URL 配置改为代码常量
- 创建 PolymarketConstants 常量类,集中管理所有 Polymarket API URL
- 更新所有服务类,将配置注入改为使用常量:
* ApiHealthCheckService: 移除配置注入,使用常量
* RetrofitFactory: 移除 CLOB 和 Gamma API URL 配置注入
* RelayClientService: 移除 Builder Relayer URL 配置注入
* BlockchainService: 移除 Data API URL 配置注入
* PolymarketApiKeyService: 移除 CLOB API URL 配置注入
* RetrofitConfig: 移除 CLOB API URL 配置注入
* OrderPushService: 移除 RTDS WebSocket URL 配置注入
* PolymarketActivityWsService: 移除 Activity WebSocket URL 配置注入
* CopyTradingWebSocketService: 移除 User WebSocket URL 配置注入
* PolymarketWebSocketHandler: 移除 RTDS WebSocket URL 配置注入
* UnifiedOnChainWsService: 添加连接状态查询方法
- 从 application.properties 移除相关配置项,添加说明注释
- 完善 API 健康检查,添加缺失的检测项:
* Polymarket Activity WebSocket
* 链上 WebSocket
- 更新相关文档说明
|
2026-01-13 16:07:19 +08:00 |
|
WrBug
|
e072d0c894
|
feat: 添加 Activity WebSocket 消息超时检测和自动重连机制
- 添加 lastActivityTime 变量记录最后一次收到 activity 消息的时间
- 实现 startActivityTimeoutCheck() 方法,每30秒检查一次消息接收情况
- 如果超过30秒未收到 activity 消息,自动触发 WebSocket 重连
- 在订阅成功后自动启动超时检测任务
- 在 stop() 方法中正确清理检测任务资源
|
2026-01-13 16:04:20 +08:00 |
|
WrBug
|
3a78a84610
|
fix: 修复 v1.1.10 版本下单成功不发送通知的问题
- 移除 OrderStatusUpdateService 中错误的双重检查逻辑
- 修复买入订单和卖出订单通知逻辑
- 确保在标记为已发送后立即发送通知
- 问题:保存 notificationSent=true 后立即查询检查,导致通知永远被跳过
- 修复:改为标记后直接发送通知,利用数据库状态防止并发重复
|
2026-01-13 03:38:05 +08:00 |
|
WrBug
|
9c303e0a82
|
feat: 添加推送已过滤订单功能并修复相关问题
- 新增推送已过滤订单功能(pushFilteredOrders),默认关闭
- 数据库迁移:添加 pushFilteredOrders 字段到模板表和跟单配置表
- 后端:在实体、DTO、Service 中添加 pushFilteredOrders 字段支持
- 前端:在模板新增、编辑、推送页面和跟单配置新增、编辑页面添加开关
- 多语言:添加中文、繁体中文、英文翻译
- 通知逻辑:发送过滤订单通知时检查 pushFilteredOrders 字段
- 修复新建跟单配置时 pushFilteredOrders 字段未生效的问题
- 修复手动输入模式下 pushFilteredOrders 被硬编码为 false 的问题
- 修复从模板填充表单时未加载 pushFilteredOrders 的问题
- 添加 CopyTradingTemplate 接口的 pushFilteredOrders 字段定义
- 修复新建和编辑页面的截止时间输入框交互问题
- 修复删除后失去焦点自动填充1的问题
- 优化 onChange 和 onBlur 处理逻辑,支持清空操作
|
2026-01-12 14:29:12 +08:00 |
|
WrBug
|
cb8e46919f
|
fix: 修复跟单配置更新时清空可选字段无法保存的问题
- 修复价格区间(minPrice/maxPrice)清空后无法保存的问题
- 修复最大仓位数量(maxPositionCount)清空后无法保存的问题
- 修复市场截止时间(maxMarketEndDate)清空后无法保存的问题
- 修复其他可选字段(minOrderDepth/maxSpread/maxPositionValue)清空后无法保存的问题
- 修复截止时间输入框删除后失去焦点自动填充1的问题
前端:清空字段时传空字符串或-1标记,让后端识别为清空操作
后端:处理空字符串和-1标记,正确设置为null以清空字段
|
2026-01-12 13:31:27 +08:00 |
|
WrBug
|
279806da2b
|
feat: 优化订单列表筛选功能,支持按市场标题搜索并改进分组体验
- 后端:MarketGroupedOrdersRequest 添加 marketId 和 marketTitle 字段
- 后端:买入/卖出订单分组接口支持市场 ID 模糊匹配和市场标题关键字筛选
- 前端:BuyOrdersTab 添加市场标题筛选,移除方向筛选,记录用户分组偏好
- 前端:SellOrdersTab 添加市场标题筛选,将方向筛选改为状态筛选,移除方向列
- 前端:MatchedOrdersTab 添加市场标题筛选和市场列显示
- 前端:所有搜索输入框添加 0.5 秒防抖优化
- 前端:分组偏好保存到 localStorage 以便跨会话持久化
|
2026-01-12 10:01:20 +08:00 |
|
WrBug
|
90fa487d1b
|
refactor: 移除未实现盈亏计算以优化跟单关系统计性能
- 移除未实现盈亏和持仓价值的计算
- 总盈亏现在仅包含已实现盈亏
- 删除不再使用的 getCurrentMarketPrice、getActualPositions、calculateUnrealizedPnl、calculatePositionValue 方法
- 简化盈亏百分比计算,仅基于已实现盈亏
- 移除不必要的依赖注入(accountService、blockchainService、retrofitFactory)
- 性能提升:从 1+N 次网络请求减少到 0 次
|
2026-01-11 14:53:28 +08:00 |
|
WrBug
|
b58bb267a1
|
feat: 添加 Docker 容器时区配置,支持通过 .env 自定义
|
2026-01-11 14:36:49 +08:00 |
|
WrBug
|
6af76c4d80
|
fix: 修复订单通知重复发送和时间显示问题
1. 修复并发导致的重复通知问题
- 在 OrderStatusUpdateService 中实现双重检查机制
- 先保存订单标记为已发送,再重新查询数据库检查
- 防止定时任务并发时重复发送同一订单的通知
- 同时修复买入订单和卖出订单的通知逻辑
2. Telegram 通知时间改为订单创建时间
- TelegramNotificationService.sendOrderSuccessNotification 添加 orderTime 参数
- 使用订单的 createdAt 时间戳作为通知显示时间
- 而不是使用当前通知发送时间
- 更准确反映订单的实际创建时间
修改文件:
- OrderStatusUpdateService.kt: 实现双重检查机制,防止并发重复通知
- TelegramNotificationService.kt: 添加 orderTime 参数支持订单时间显示
- AccountService.kt: 手动创建订单时传递订单创建时间
|
2026-01-11 14:33:30 +08:00 |
|
WrBug
|
6ad40242b3
|
fix: 优化自动卖出订单筛选逻辑,避免刚创建的订单被误判
问题:在仓位检查时,刚创建的订单可能因仓位更新延迟被误判为已卖出
修改:
1. Repository 层面新增 findUnmatchedBuyOrdersByOutcomeIndexOlderThan 方法
- 在 SQL 层直接过滤创建时间超过阈值的订单
- 提高查询效率,减少数据传输
2. PositionCheckService 两个场景都使用 SQL 过滤
- 场景1:仓位不存在时,延迟检测使用 SQL 过滤
- 场景2:仓位部分存在时,FIFO 匹配使用 SQL 过滤
- 统一使用 2 分钟阈值保护刚创建的订单
优化效果:
- SQL 层面直接过滤,减少数据传输
- 代码更简洁,逻辑更清晰
- 刚创建的订单(< 2 分钟)不会被误判为已卖出
- 日志更详细,便于排查问题
|
2026-01-10 03:39:06 +08:00 |
|