其他
在 Polymarket 上用 Nothing Ever…
适用于想用异步 Python 机器人自动化交易 Polymarket 非体育独立 Yes/No 市场 NO 结果,同时默认安全纸面交易、需要时再开启实盘的用户。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 58/100 ×0.15
适用场景
在 Polymarket 上用 Noth特定
解决思路
- 让机器人扫描 Polymarket 的独立(非成组)Yes/No 市场。
- 让机器人过滤掉体育市场。
- 当 NO 价格低于 `max_no_price` 阈值时,买入 NO 仓位。
- 让机器人跟踪未平仓头寸,并将恢复状态持久化到数据库。
- 让机器人暴露 HTTP 实时 dashboard,显示 portfolio 和活动。
- 除非三个实盘环境变量都设置,否则使用 `PaperExchangeClient`。
- 克隆仓库:`git clone https://github.com/sterlingcrispin/nothing-ever-happens.git`
- 进入项目目录:`cd nothing-ever-happens`
- 安装依赖:`pip install -r requirements.txt`
- 复制配置模板:`cp config.example.json config.json`
- 复制环境变量模板:`cp .env.example .env`
- 编辑 `config.json` 的 `strategies.nothing_happens` 块,设置 `max_no_price`(例如 0.08)。
- 设置 `order_size_usdc`(例如 1.0)。
- 设置 `max_open_positions`(例如 50)。
- 设置 `scan_interval_seconds`(例如 60)。
- 设置 `min_liquidity_usdc`(例如 100)。
- 设置 `exclude_keywords`,例如包含 `sport`、`nfl`、`nba`、`mlb`、`nhl`、`soccer`、`tennis`。
- 使用其他配置文件运行:`CONFIG_PATH=/path/to/other_config.json python -m bot.main`。
- 在 `.env` 中设置安全标志 `BOT_MODE=paper`。
- 在 `.env` 中设置安全标志 `DRY_RUN=true`。
- 在 `.env` 中设置安全标志 `LIVE_TRADING_ENABLED=false`。
- 仅实盘模式需要设置 `PRIVATE_KEY`。
- 仅实盘模式需要设置 `FUNDER_ADDRESS`。
- 仅实盘模式需要设置 `DATABASE_URL`。
- 仅实盘模式需要设置 `POLYGON_RPC_URL`。
- 可选设置 `PORT=8080`。
- 可选设置 `DASHBOARD_PORT=8080`。
- 不要硬编码 secrets,始终使用环境变量引用。
- 本地纸面交易运行:`python -m bot.main`。
- 本地实盘运行:`BOT_MODE=live DRY_RUN=false LIVE_TRADING_ENABLED=true python -m bot.main`。
- Dashboard 会在设置了 `$PORT` 或 `$DASHBOARD_PORT` 时绑定到对应端口。
- 运行测试:`python -m pytest -q`。
- 检查实时数据库:`python scripts/db_stats.py`。
- 导出数据库表:`python scripts/export_db.py`,它使用 `DATABASE_URL` 或 Heroku app。
- 拉取钱包历史:`python scripts/wallet_history.py`。
- 解析 Heroku JSON 日志:`python scripts/parse_logs.py`。
- Heroku 一次性设置:`export HEROKU_APP_NAME=my-polymarket-bot`。
- 设置 Heroku 运行时标志:`heroku config:set BOT_MODE=live DRY_RUN=false LIVE_TRADING_ENABLED=true -a "$HEROKU_APP_NAME"`。
- 设置 Heroku secrets:`heroku config:set PRIVATE_KEY="$PRIVATE_KEY" FUNDER_ADDRESS="$FUNDER_ADDRESS" POLYGON_RPC_URL="$POLYGON_RPC_URL" DATABASE_URL="$DATABASE_URL" -a "$HEROKU_APP_NAME"`。
- 部署:`git push heroku main:main`。
- 扩展 dyno:`heroku ps:scale web=1 worker=0 -a "$HEROKU_APP_NAME"`。
- 不要运行 `worker` dyno。
- `worker` dyno 仅用于被意外启动时快速失败。
- 使用 `./alive.sh` 检查 app 是否存活。
- 使用 `./logs.sh` tail 日志。
- 使用 `./live_enabled.sh` 启用实盘交易。
- 使用 `./live_disabled.sh` 禁用实盘交易(回到纸面模式)。
- 使用 `./kill.sh` 停止 bot。
- 所有 helpers 使用 `$HEROKU_APP_NAME` 或接受 app 名作为参数,例如 `./logs.sh my-polymarket-bot`。
- 安全模型:默认使用 `PaperExchangeClient`,除非同时设置 `BOT_MODE=live`、`LIVE_TRADING_ENABLED=true`、`DRY_RUN=false`。
- 如果三个实盘标志任一缺失或错误,则使用纸面模式;这是有意设计,防止意外实盘。
- 实盘额外要求 `PRIVATE_KEY` 作为钱包私钥。
- 实盘额外要求 `FUNDER_ADDRESS`,签名类型 `1` 和 `2` 需要它。
- 实盘额外要求 `DATABASE_URL`,用于恢复状态持久化。
- 实盘额外要求 `POLYGON_RPC_URL`,用于代理钱包授权和 redemption。
- 检查 bot 将使用 live 还是 paper 模式:实现 `is_live_mode()`,同时判断 `BOT_MODE` 等于 `live`、`LIVE_TRADING_ENABLED` 小写等于 `true`、`DRY_RUN` 小写等于 `false`。
- 加载策略配置:用 `CONFIG_PATH` 环境变量或默认 `config.json` 作为路径,读取 JSON,取 `strategies.nothing_happens` 节点中的 `max_no_price` 和 `order_size_usdc`。
- 以编程方式运行 bot:`import asyncio`,`from bot.main import main`,`asyncio.run(main())`。
- 检查 DB stats:`DATABASE_URL=$DATABASE_URL python scripts/db_stats.py`。
- 解析 Heroku 日志为 HTML:`heroku logs --num=1500 -a "$HEROKU_APP_NAME" | python scripts/parse_logs.py --html > report.html`。
- 从 Heroku app 导出 DB:`python scripts/export_db.py --app "$HEROKU_APP_NAME"`。
- 快速禁用实盘(kill switch):`heroku config:set LIVE_TRADING_ENABLED=false -a "$HEROKU_APP_NAME"`,或使用 `./live_disabled.sh`。
- kill switch 后 bot 会在下一轮立即回退到纸面模式,无需重启。
- 不重新部署调整 NO 价格上限:用 `jq '.strategies.nothing_happens.max_no_price = 0.05' config.json > tmp.json && mv tmp.json config.json`。
- 提交价格上限变更:`git add config.json && git commit -m "lower max_no_price to 0.05"`。
- 推送价格上限变更:`git push heroku main:main`。
- 添加更多关键词排除:在 `exclude_keywords` 中加入 `golf`、`ufc`、`esport` 等。
- 排查 bot 意外使用纸面模式:检查 `BOT_MODE`、`LIVE_TRADING_ENABLED`、`DRY_RUN` 三个标志是否都正确。
- 排查实盘下 `DATABASE_URL` 错误:`heroku addons:create heroku-postgresql -a "$HEROKU_APP_NAME"`。
- 排查订单从未发送:`heroku config:set DRY_RUN=false`。
- 排查 Dashboard 无法访问:`heroku config:set PORT=8080`。
- 排查 worker dyno 立即崩溃:`heroku ps:scale worker=0`。
- 排查 bot 买入体育市场:把运动/联盟名称加入配置的 `exclude_keywords`。
- 排查日志不可读(JSON):通过 `scripts/parse_logs.py` 管道处理。
适用边界 · 注意事项
- 不适用于非 Polymarket 市场,也不适用于非独立 Yes/No 市场。
- 不适用于希望交易体育市场的场景;机器人设计为过滤体育市场。
- 不适用于未配置全部三个实盘标志(`BOT_MODE=live`、`LIVE_TRADING_ENABLED=true`、`DRY_RUN=false`)和所需 secrets 时期望真实下单;默认会走纸面模式。