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 |
|
WrBug
|
19508dcd19
|
feat: 实现 Polymarket Activity WebSocket 双重监听方案
主要功能:
- 新增 PolymarketActivityWsService:通过 Activity WebSocket 实时监听 Leader 交易(延迟 < 100ms)
- 实现双重监听机制:Activity WS(低延迟)+ On-Chain WS(高可靠性)
- 支持动态添加/移除 Leader 监听
- 地址筛选忽略大小写
修复和改进:
- 修复订阅消息格式:使用 'action' 而不是 'type'(与 @polymarket/real-time-data-client 保持一致)
- 修复 PING 消息格式:使用小写 'ping'(与官方客户端保持一致)
- 添加 outcomeIndex 字段支持:优先使用消息中的 outcomeIndex,fallback 到从 outcome 解析
- 添加 connection_id 字段到 DTO
- 改进日志记录:增加 INFO 级别日志以便调试
代码重构:
- JsonUtils 重构:将 fromJson 和 toJson 改为扩展方法
- 更新后端开发规范:JSON 解析和 Data Class 规范
前端修复:
- 修复 InputNumber parser 类型错误:返回 number 而不是 string
文档:
- 添加双重监听方案文档
- 添加 Polymarket Activity WebSocket API 格式文档
|
2026-01-09 10:41:15 +08:00 |
|
WrBug
|
a16b6fce54
|
feat: 支持同一用户创建多个相同 leader 的跟单配置
- 删除 copy_trading 表的唯一约束 uk_account_leader
- 移除实体类 CopyTrading 的唯一约束注解
- 移除创建跟单时的重复检查逻辑
- 修改 Repository 方法 findByAccountIdAndLeaderId 返回列表而非单个对象
- 更新查询逻辑以支持返回多个跟单配置
现在允许同一用户对同一个 leader 创建多个不同配置的跟单关系。
|
2026-01-09 08:56:14 +08:00 |
|
WrBug
|
0327eaffe3
|
feat: 添加市场截止时间筛选功能
后端:
- 为 copy_trading 表添加 max_market_end_date 字段(毫秒时间戳)
- 为 markets 表添加 end_date 字段,迁移时清空已有数据
- 实现市场截止时间过滤逻辑(仅跟单截止时间小于设置时间的订单)
- 更新 CopyTradingService 支持 maxMarketEndDate 的创建和更新
- 更新 FilterResult 添加 FAILED_MARKET_END_DATE 状态
- 更新 CopyOrderTrackingService 传递 marketEndDate 参数
前端:
- 添加市场截止时间筛选 UI(支持小时和天两种单位)
- 输入限制:仅支持整数输入(precision=0)
- 更新 AddModal 和 EditModal 支持市场截止时间配置
- 更新过滤类型显示映射(MARKET_END_DATE)
- 添加多语言支持(中文、英文、繁体中文)
数据库迁移:
- V22: 合并添加 max_market_end_date 和 end_date 字段
- 迁移时清空 markets 表数据,确保所有数据都包含 end_date
|
2026-01-09 08:35:05 +08:00 |
|
WrBug
|
b13aef944c
|
refactor: 统一使用 MarketService 并改用 LRU 缓存
主要改进:
1. 将 MarketService 缓存从 ConcurrentHashMap 改为 Caffeine LRU 缓存
- 最多缓存 200 条市场记录
- 自动淘汰最近最少使用的记录
- 提高缓存命中率和性能
2. 添加 Caffeine 依赖 (com.github.ben-manes.caffeine:caffeine:3.1.8)
3. 重构以下服务,统一使用 MarketService 获取市场信息:
- OrderPushService: 删除 fetchMarketInfo() 方法,直接使用 MarketService
- CopyOrderTrackingService: 移除直接调用 Gamma API 的代码
- AccountService: 订单通知中使用 MarketService
- OrderStatusUpdateService: 买入/卖出订单通知使用 MarketService
优势:
- 减少重复的 API 调用,利用三级缓存(内存 → 数据库 → API)
- 提高代码一致性和可维护性
- 统一市场数据获取逻辑,便于后续扩展
|
2026-01-08 18:33:49 +08:00 |
|
WrBug
|
9ed5190bfe
|
feat: 添加关键字过滤功能并优化市场 slug 处理
主要变更:
1. 关键字过滤功能
- 添加关键字过滤模式(白名单/黑名单/禁用)
- 支持关键字列表配置(JSON 存储)
- 实现关键字匹配逻辑(不区分大小写)
- 数据库迁移:V20__add_keyword_filter.sql
2. 市场 slug 优化
- 区分显示用 slug 和跳转用 eventSlug
- 添加 event_slug 字段到 markets 表(V21__add_event_slug_to_markets.sql)
- 从 events[0].slug 获取跳转用的 slug 并存入数据库
- 减少 API 请求,提高性能
3. UI 优化
- 将创建/编辑跟单配置改为 Modal 方式
- 删除独立的 CopyTradingAdd 和 CopyTradingEdit 页面
- 更新前端跳转逻辑,优先使用 eventSlug
4. API 响应优化
- 更新 MarketResponse 添加 events 字段
- 统一从 events[0].slug 获取跳转用的 slug
- 更新所有相关服务使用新的 slug 获取逻辑
|
2026-01-08 17:47:00 +08:00 |
|
WrBug
|
3d5a923caf
|
feat: 订单列表按市场分组功能重构
- 后端实现按市场分组的订单列表接口
- 添加 MarketGroupedOrdersRequest、MarketOrderStats、MarketOrderGroup、MarketGroupedOrdersResponse DTO
- 实现 getBuyOrderListGroupedByMarket 和 getSellOrderListGroupedByMarket 方法
- 添加 POST /api/copy-trading/orders/grouped-by-market 接口
- 支持分页和统计信息(订单数、总金额、盈亏、成交状态等)
- 前端重构:移除前端分组逻辑,改为调用后端分组接口
- BuyOrdersTab 和 SellOrdersTab 使用后端分组接口
- 移除前端 useMemo 分组计算逻辑
- 添加分组数据状态管理和分页支持
- 分组默认折叠状态
- 移除桌面端自动展开逻辑
- 所有设备默认折叠,用户手动展开
- 修复 moneyline URL 逻辑
- getPolymarketUrl 函数添加 isMoneyline 参数
- 暂时不自动跳转到 moneyline 页面(需要后端提供标识)
- 多语言支持
- 添加 markets 翻译键(中文、繁体中文、英文)
|
2026-01-08 13:19:52 +08:00 |
|