其他
在 Polymarket 15 分钟涨跌预测市场上用…
适用于监控 Polymarket 15 分钟 BTC/ETH/SOL/XRP Up/Down 市场订单簿,检测价格急跌后执行 dump-and-hedge 套利并记录 P&L 的场景。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 35/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 38/100 ×0.15
适用场景
在 Polymarket 15 分钟涨跌特定
解决思路
- 克隆仓库并安装构建:执行 `git clone https://github.com/infraform/polymarket-arbitrage-bot.git`,`cd polymarket-arbitrage-bot`,`npm install`,`npm run build`,`cp .env.example .env`。
- 运行编译后的 bot:执行 `npm start`,默认 simulation。
- 显式模拟运行:执行 `npm run sim`,不发送真实订单。
- 生产真实交易:执行 `npm run prod`,或设置 `PRODUCTION=true` 后执行 `npm start`。
- 开发直跑 TypeScript:执行 `npm run dev`,通过 ts-node 运行。
- 编译 TypeScript 到 `dist/`:执行 `npm run build`。
- 生产前始终先执行 `npm run sim` 测试。
- 按 `src/main.ts` 组织入口:加载配置、发现市场、串联依赖。
- 按 `src/config.ts` 加载并校验 `.env` 为类型化配置。
- 按 `src/api.ts` 实现 Gamma + CLOB API 客户端,处理 markets、orderbook、orders、redemption。
- 按 `src/monitor.ts` 轮询 orderbook snapshot,并驱动策略回调。
- 按 `src/dumpHedgeTrader.ts` 实现 dump 检测、leg1/leg2、stop-loss、P&L 跟踪。
- 按 `src/models.ts` 定义共享类型 Market、OrderBook、TokenPrice 等。
- 按 `src/logger.ts` 追加 `history.toml` 日志并输出到 stderr。
- 从 `.env.example` 创建 `.env`。
- 配置钱包与认证:`PRIVATE_KEY`、`PROXY_WALLET_ADDRESS`、`SIGNATURE_TYPE`(0=EOA,1=Proxy,2=GnosisSafe)。
- 可选显式 CLOB API 凭证:`API_KEY`、`API_SECRET`、`API_PASSPHRASE`;不设置则从 signer 自动派生。
- 配置 API 端点:`GAMMA_API_URL=https://gamma-api.polymarket.com`,`CLOB_API_URL=https://clob.polymarket.com`。
- 配置市场:`MARKETS=btc`,逗号分隔支持 `btc,eth,sol,xrp`。
- 配置轮询:`CHECK_INTERVAL_MS=1000`,`MARKET_CLOSURE_CHECK_INTERVAL_SECONDS=20`。
- 配置策略参数:`DUMP_HEDGE_SHARES=10`,每条腿的 shares。
- 配置策略参数:`DUMP_HEDGE_SUM_TARGET=0.95`,当 leg1 + opposite_ask <= 此值时对冲。
- 配置策略参数:`DUMP_HEDGE_MOVE_THRESHOLD=0.15`,15% 下跌触发 dump 检测。
- 配置策略参数:`DUMP_HEDGE_WINDOW_MINUTES=2`,周期开始后的观察窗口。
- 配置策略参数:`DUMP_HEDGE_STOP_LOSS_MAX_WAIT_MINUTES=5`。
- 配置策略参数:`DUMP_HEDGE_STOP_LOSS_PERCENTAGE=0.2`。
- 配置模式:`PRODUCTION=false`,true 表示真实交易。
- 定义 `Market` 类型:conditionId、questionId、tokens [upToken,downToken]、startTime、endTime、asset。
- 定义 `Token` 类型:tokenId、outcome 为 Up 或 Down。
- 定义 `OrderBook` 类型:tokenId、outcome、bids、asks、bestBid、bestAsk。
- 定义 `TokenPrice` 类型:tokenId、outcome、bestBid、bestAsk、timestamp。
- 定义 `MarketSnapshot` 类型:upPrice、downPrice、timeRemainingSeconds、periodStart。
- Discovery:用 Gamma API 为每个资产找当前 15m 市场 slug。
- Monitor:每 `CHECK_INTERVAL_MS` 轮询 CLOB orderbooks。
- Watch:在第一个 `DUMP_HEDGE_WINDOW_MINUTES` 内检测 ask 是否下跌 >= `MOVE_THRESHOLD`。
- Leg 1:按当前 ask 买入 `DUMP_HEDGE_SHARES` 的下跌侧。
- Wait:观察 `leg1_entry + opposite_ask <= DUMP_HEDGE_SUM_TARGET`。
- Leg 2:买入 `DUMP_HEDGE_SHARES` 的相反 outcome 进行对冲。
- Stop-loss:如果 `STOP_LOSS_MAX_WAIT_MINUTES` 内未触发对冲,仍然对冲。
- Rollover:新的 15m 周期发现新市场并重置状态。
- Closure:赎回获胜 token(生产模式),记录 P&L。
- 实现 `loadConfig`:引入 `dotenv`,调用 `dotenv.config()`,解析环境变量为 `BotConfig`,为每项设置默认值。
- 实现 `findCurrentMarket`:`now = Math.floor(Date.now()/1000)`,`periodStart = now - (now % (15*60))`,`slug = ${asset}-updown-15m-${periodStart}`,GET `${gammaApiUrl}/markets` 参数 `{slug}`,无结果返回 null,否则返回 `markets[0]`。
- 实现 `getOrderBook`:GET `${clobApiUrl}/book` 参数 `{token_id: tokenId}`;`bestBid = bids 价格最大值,若无则 0`;`bestAsk = asks 价格最小值,若无则 1`;返回 OrderBook。
- 实现 `detectDump`:只在 `periodStart` 到 `periodStart + dumpHedgeWindowMinutes*60` 内检测;过滤 priceHistory 时间戳 >= periodStart;至少 2 条;比较最早价格与当前 bestAsk;计算 `(earliest.bestAsk - current.bestAsk)/earliest.bestAsk`;Up 或 Down 中任一侧下跌 >= `dumpHedgeMoveThreshold` 就返回该侧,否则 null。
- 实现 `shouldHedge`:仅当 phase 为 `leg1_placed` 且有 `leg1EntryPrice`;取相反 outcome 的 bestAsk 作为 `oppositeAsk`;计算 `combinedCost = leg1EntryPrice + oppositeAsk`;若 <= `dumpHedgeSumTarget` 返回 true。
- 实现 `shouldStopLoss`:仅当 phase 为 `leg1_placed` 且有 `leg1PlacedAt`;计算等待分钟 `(Date.now()/1000 - leg1PlacedAt)/60`;若 >= `stopLossMaxWaitMinutes` 返回 true。
- 实现 `placeOrder`:参数 tokenId、price(0.0-1.0)、size、side(BUY/SELL);非 production 打印 `[SIM]` 并返回 `sim-order-${Date.now()}`;生产时构造 order `{token_id, price: price.toFixed(4), size, side, type: 'GTC'}`;生成 timestamp 并用 `signClobOrder` 签名;POST `${clobApiUrl}/order`,带 `POLY_ADDRESS`、`POLY_SIGNATURE`、`POLY_TIMESTAMP`、`POLY_API_KEY` 头;返回 `orderId` 或 null。
- 实现 `startMonitor`:从 `market.tokens` 取 up/down token;poll 时并行 `getOrderBook` 两个 token;构造 `MarketSnapshot`(upPrice、downPrice、timeRemainingSeconds=market.endTime-now、periodStart=market.startTime);调用 `onSnapshot(snapshot)`;`setInterval(poll, config.checkIntervalMs)` 并立即首次 poll;市场结束后 `clearInterval`。
- 实现 `logTrade`:向 `history.toml` 追加 TOML `[[trade]]` 记录,字段 timestamp、asset、action、outcome、price、shares、simulation、可选 pnl;stderr 输出 `[LOG] action outcome @ price (sim=...)`。
- 实现 `main`:`loadConfig()`;打印模式和市场;为每个 `config.markets` 启动异步循环;`findCurrentMarket` 失败时 `sleep(30_000)` 重试;找到后创建 `DumpHedgeTrader(asset, market, config)`;`startMonitor` 驱动;市场结束调用 `trader.onClose()`;`sleep(5_000)` 后发现下一市场;用 `Promise.all(tasks)` 运行多资产。
- 多资产配置示例:`MARKETS=btc,eth`;更激进 dump:`DUMP_HEDGE_MOVE_THRESHOLD=0.10`、`DUMP_HEDGE_WINDOW_MINUTES=3`;更紧利润:`DUMP_HEDGE_SUM_TARGET=0.93`。
- 波动市场调参:`DUMP_HEDGE_SHARES=25`;`DUMP_HEDGE_MOVE_THRESHOLD=0.10`;`DUMP_HEDGE_WINDOW_MINUTES=4`;`DUMP_HEDGE_STOP_LOSS_MAX_WAIT_MINUTES=8`。
- 从模拟切生产:先 `npm run sim` 验证;检查 `history.toml` 预期交易模式;确保钱包有 USDC + POL 作为 gas;执行 `PRODUCTION=true npm start` 或 `npm run prod`。
- 使用 EOA 钱包:设置 `PRIVATE_KEY=0x...`、`SIGNATURE_TYPE=0`,不设置 `PROXY_WALLET_ADDRESS`。
- 使用 GnosisSafe 代理(Polymarket 默认):设置 `PRIVATE_KEY=0x...`(signer 私钥)、`PROXY_WALLET_ADDRESS=0x...`(Polymarket profile 地址)、`SIGNATURE_TYPE=2`。
- 计算利润机制:每对已结算收入 1.00;成本为 leg1 + leg2;组合成本 <= `SUM_TARGET`;每 share 利润 = 1 - 组合成本(费用前)。
- 处理最坏止损对冲:若止损触发,组合成本可能超过 0.95,损失受 `STOP_LOSS_PERCENTAGE` 限制(如 0.2 = leg1 size 的 20%)。
- 排障 No markets found:检查 `GAMMA_API_URL` 连通性;确认资产名为小写。
- 排障 Orders fail in production:验证 `PRIVATE_KEY`、`PROXY_WALLET_ADDRESS`、`SIGNATURE_TYPE`。
- 排障 Redemption fails:给钱包在 Polygon 主网充值 POL/MATIC gas。
- 排障 No dumps detected:降低 `DUMP_HEDGE_MOVE_THRESHOLD`(如 0.10)或延长窗口。
- 排障 Strategy never hedges:提高 `DUMP_HEDGE_SUM_TARGET`(如 0.97)。
- 排障 Frequent stop-loss triggers:增加 `STOP_LOSS_MAX_WAIT_MINUTES`。
- 调试模拟日志:运行 `npm run sim 2>&1 | tee debug.log`;用 `grep "action" history.toml` 查看交易;用 `grep "pnl" history.toml` 查看 P&L。
- 安全:确保 `.env` 在 `.gitignore`,绝不提交。
- 安全:使用专用钱包且只放有限 USDC,不要用主钱包。
- 安全:上生产前始终先 `npm run sim` 并审查 `history.toml`。
- 安全:若 `PRIVATE_KEY` 可能暴露,立即轮换。
- 安全:优先使用从 signer 派生的 API key,而非显式 `API_KEY`/`API_SECRET`。
适用边界 · 注意事项
- 不适用于非 Polymarket 的预测市场,或没有 Gamma API、CLOB 订单簿、15 分钟 Up/Down 市场的标的。
- 不适用于未准备专用钱包、USDC 资金和 Polygon POL gas,或不能接受真实交易亏损与止损风险的场景。
- 不适用于完全不了解 dump-and-hedge 策略参数、且不先运行模拟验证就上生产的场景。