b1ad6f02d2
- 持久化: 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>
2.4 KiB
2.4 KiB
Polymarket Data API 游标分页验证
回测拉取 Leader 历史交易改用 start 游标分页(不再使用 offset),避免 offset 过大(如 3100+)时 API 报错。
规则
limit固定为 500(快速验证可用 50)。- 首次请求:
start= 回测开始时间(秒),end= 回测结束时间(秒)。 - 若本批返回 500 条:取本批中最大 timestamp,下一页
start = max_timestamp(不加 1:同一秒可能有多笔订单,会漏单)。 - 若本批 不足 500 条:视为最后一页,不再请求。
- 下一页会与上一页在「最大 timestamp」这一秒重叠,必须按 tradeId(transactionHash)去重。
快速验证(limit=50)
# 环境变量(替换为实际值)
USER="0x1979ae6b7e6534de9c4539d0c205e582ca637c9d"
START=1769961432
END=1770566207
LIMIT=50
# 第 1 页(游标分页不传 offset)
curl -s "https://data-api.polymarket.com/activity?user=${USER}&limit=${LIMIT}&type=TRADE&start=${START}&end=${END}&sortBy=TIMESTAMP&sortDirection=ASC" | jq 'length'
# 若输出 50,则取本批最大 timestamp 作为下一页 start(不加 1,同一秒可能多笔)
curl -s "https://data-api.polymarket.com/activity?user=${USER}&limit=${LIMIT}&type=TRADE&start=${START}&end=${END}&sortBy=TIMESTAMP&sortDirection=ASC" | jq 'max_by(.timestamp) | .timestamp'
# 假设得到 1770000000,则下一页 start=1770000000(与上一批重叠,需按 tradeId 去重)
# 第 2 页(游标分页,不使用 offset)
NEXT_START=1770000000
curl -s "https://data-api.polymarket.com/activity?user=${USER}&limit=${LIMIT}&type=TRADE&start=${NEXT_START}&end=${END}&sortBy=TIMESTAMP&sortDirection=ASC" | jq 'length'
# 若输出 < 50,则为最后一页
单条命令示例(第 1 页,limit=50)
curl -s "https://data-api.polymarket.com/activity?user=0x1979ae6b7e6534de9c4539d0c205e582ca637c9d&limit=50&type=TRADE&start=1769961432&end=1770566207&sortBy=TIMESTAMP&sortDirection=ASC"
注意:不要传 offset,下一页 start = 上一批最大 timestamp(不加 1),同一秒多笔订单不丢,重叠记录按 tradeId 去重。
代码位置
- 拉取批次:
BacktestDataService.getLeaderHistoricalTradesBatch(),返回LeaderTradesBatchResult(trades, nextCursorSeconds)。 - 执行循环:
BacktestExecutionService.executeBacktest(),按cursorSeconds循环,并用seenTradeIds去重。