[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-79732":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":15,"stars7d":15,"stars30d":16,"stars90d":15,"forks30d":15,"starsTrendScore":15,"compositeScore":17,"rankGlobal":10,"rankLanguage":10,"license":10,"archived":18,"fork":18,"defaultBranch":19,"hasWiki":20,"hasPages":18,"topics":21,"createdAt":10,"pushedAt":10,"updatedAt":27,"readmeContent":28,"aiSummary":29,"trendingCount":15,"starSnapshotCount":15,"syncStatus":30,"lastSyncTime":31,"discoverSource":32},79732,"polymarket-momentum-mispricing-bot","PolyMomentum\u002Fpolymarket-momentum-mispricing-bot","PolyMomentum","Polymarket trading bot, Binance momentum bot, prediction market arbitrage, BTC fast market bot, Polymarket trading bot, Binance momentum bot, prediction market arbitrage, BTC fast market bot, Polymarket trading bot, Binance momentum bot, prediction market arbitrage, BTC fast market bot, Polymarket trading bot, Binance momentum bot","",null,"TypeScript",220,1405,137,0,78,54.24,false,"main",true,[22,23,24,25,5,26],"polymarket-arbitrage-bot","polymarket-btc-arbitrage-bot","polymarket-momentum-bot","polymarket-momentum-mispricing","polymarket-trading-bot-strategies","2026-06-12 04:01:25","# polymarket-momentum-mispricing-bot\n\n> **Production-ready TypeScript bot** for trading Polymarket BTC 5-minute and 15-minute fast markets using Binance BTCUSDT momentum lag detection and market odds mispricing.\n\n---\n\n## Overview\n\nThis bot watches the live Binance BTCUSDT 1-minute kline stream and, when it detects a significant price move (0.35%–0.80%) combined with an elevated volume spike, checks whether the corresponding Polymarket fast market is still mispriced. If the YES\u002FNO odds haven't caught up to the Binance signal, it enters a trade and manages the position with take-profit, stop-loss, and force-close logic.\n\n**Keywords:** Polymarket trading bot, Binance momentum bot, prediction market arbitrage, BTC fast market bot, TypeScript trading bot.\n\n---\n\n## Strategy Logic\n\n### Entry — Buy YES\n| Condition | Threshold |\n|-----------|-----------|\n| BTC 1m momentum | +0.35% to +0.80% |\n| YES price | \u003C 0.47 |\n| Volume ratio | > 1.5× average |\n| Candle colour streak | Last 2 green |\n\n### Entry — Buy NO\n| Condition | Threshold |\n|-----------|-----------|\n| BTC 1m momentum | −0.35% to −0.80% |\n| YES price | > 0.56 |\n| Volume ratio | > 1.5× average |\n| Candle colour streak | Last 2 red |\n\n### Skip Guards\n- Less than 60 seconds remaining\n- Spread wider than 6¢\n- Liquidity below $50\n- Momentum outside the configured band\n- Market already priced in\n\n### Exit\n| Trigger | Threshold |\n|---------|-----------|\n| Take profit | +5¢ per share |\n| Stop loss | −3¢ per share |\n| Force close | 15 s before expiry |\n\n### Risk Controls\n- Max daily loss: $50 (configurable)\n- Max concurrent positions: 3\n- Cooldown after 3 consecutive losses: 15 minutes\n\n---\n\n## Stack\n\n| Package | Role |\n|---------|------|\n| `ws` | Binance WebSocket kline stream |\n| `axios` | REST calls (Binance, Polymarket CLOB, Simmer) |\n| `zod` | Environment config validation |\n| `pino` + `pino-pretty` | Structured logging |\n| `dotenv` | `.env` loading |\n| `typescript` + `tsx` | TypeScript compilation and dev runner |\n\n---\n\n## Project Structure\n\n```\nsrc\u002F\n├── config\u002F\n│   └── index.ts          Zod-validated env config\n├── exchanges\u002F\n│   ├── binance.ts        WebSocket client + REST warm-up\n│   └── polymarket.ts     Market discovery + CLOB order books\n├── strategies\u002F\n│   ├── momentum.ts       1m\u002F3m\u002F5m momentum + volume ratio + streak\n│   └── mispricing.ts     Entry\u002Fexit signal generation\n├── risk\u002F\n│   └── manager.ts        Daily loss, position limits, cooldown\n├── execution\u002F\n│   ├── orders.ts         Simmer SDK buy\u002Fsell + portfolio balance\n│   └── positions.ts      In-memory position tracker + exit loop\n├── backtest\u002F\n│   └── runner.ts         Historical candle replay + P&L simulation\n├── utils\u002F\n│   ├── types.ts          All shared TypeScript types\n│   ├── logger.ts         Pino singleton\n│   └── storage.ts        Append-only JSONL trade log\n└── index.ts              Main bot loop + backtest entry point\n```\n\n---\n\n## Quick Start\n\n### 1. Prerequisites\n\n- Node.js ≥ 18\n- A [Simmer](https:\u002F\u002Fsimmer.markets) account with a funded Polymarket wallet\n- Your `SIMMER_API_KEY` from [simmer.markets\u002Fdashboard](https:\u002F\u002Fsimmer.markets\u002Fdashboard) → SDK tab\n\n### 2. Install\n\n```bash\ncd polymarket-momentum-mispricing-bot\nnpm install\n```\n\n### 3. Configure\n\n```bash\ncp .env.example .env\n# Edit .env and set SIMMER_API_KEY\n```\n\n### 4. Run\n\n```bash\n# Dry run (no real trades — default)\nnpm run dry-run\n\n# Live trading\nnpm run live\n\n# Backtest on historical data\nnpm run backtest\n\n# Development mode with auto-restart\nnpm run dev\n```\n\n### 5. Build for production\n\n```bash\nnpm run build\nnpm start\n```\n\n---\n\n## npm Scripts\n\n| Script | Command | Description |\n|--------|---------|-------------|\n| `dev` | `tsx src\u002Findex.ts` | Dev run with live TypeScript compilation |\n| `dry-run` | `DRY_RUN=true tsx src\u002Findex.ts` | Signal detection only, no orders |\n| `live` | `DRY_RUN=false tsx src\u002Findex.ts` | Live trading |\n| `backtest` | `BACKTEST_MODE=true tsx src\u002Findex.ts` | Historical replay |\n| `build` | `tsc` | Compile to `dist\u002F` |\n| `start` | `node dist\u002Findex.js` | Run compiled build |\n| `typecheck` | `tsc --noEmit` | Type-check without output |\n\n---\n\n## Environment Variables\n\nSee `.env.example` for the full list with descriptions. Key variables:\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `SIMMER_API_KEY` | — | **Required** for live trading |\n| `DRY_RUN` | `true` | `false` to enable real orders |\n| `POSITION_SIZE_USD` | `10` | USD per trade |\n| `MOMENTUM_MIN_PCT` | `0.35` | Min 1m BTC move % |\n| `MOMENTUM_MAX_PCT` | `0.80` | Max 1m BTC move % |\n| `YES_BUY_MAX_PRICE` | `0.47` | Buy YES below this |\n| `YES_SELL_MIN_PRICE` | `0.56` | Buy NO above this |\n| `MAX_DAILY_LOSS_USD` | `50` | Daily loss circuit breaker |\n| `BACKTEST_START_DATE` | `2025-01-01` | Backtest start |\n| `BACKTEST_END_DATE` | `2025-01-31` | Backtest end |\n\n---\n\n## Trade Log\n\nAll trades are appended to `data\u002Ftrades.jsonl` (configurable via `TRADES_FILE`).\nEach line is a complete JSON `TradeRecord`. Example:\n\nEach line in `data\u002Ftrades.jsonl` is one complete trade:\n\n```jsonl\n{\"id\":\"3f2a1b4c-8d9e-4f5a-b6c7-d8e9f0a1b2c3\",\"timestamp\":\"2026-04-30T02:43:05.000Z\",\"market\":\"Will BTC be higher at 2:50PM ET? (Apr 30, 2026 - 2:45PM to 2:50PM ET)\",\"conditionId\":\"0x9f3c4a2b1d0e8f7a6c5b4d3e2f1a0b9c8d7e6f5a\",\"side\":\"YES\",\"entryPrice\":0.44,\"exitPrice\":0.492,\"shares\":22.7,\"cost\":10.0,\"pnl\":1.1804,\"status\":\"closed\",\"exitReason\":\"take_profit\",\"entryTime\":\"2026-04-30T02:43:05.000Z\",\"exitTime\":\"2026-04-30T02:44:18.000Z\",\"secondsHeld\":73,\"momentum1m\":0.463,\"momentum3m\":0.581,\"momentum5m\":0.744,\"volumeRatio\":2.34,\"candleStreak\":3,\"window\":\"5m\",\"dryRun\":false}\n{\"id\":\"7a8b9c0d-1e2f-3a4b-5c6d-7e8f9a0b1c2d\",\"timestamp\":\"2026-04-30T02:51:44.000Z\",\"market\":\"Will BTC be higher at 3:00PM ET? (Apr 30, 2026 - 2:45PM to 3:00PM ET)\",\"conditionId\":\"0x1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b\",\"side\":\"NO\",\"entryPrice\":0.41,\"exitPrice\":0.379,\"shares\":24.4,\"cost\":10.0,\"pnl\":-0.7564,\"status\":\"closed\",\"exitReason\":\"stop_loss\",\"entryTime\":\"2026-04-30T02:51:44.000Z\",\"exitTime\":\"2026-04-30T02:53:01.000Z\",\"secondsHeld\":77,\"momentum1m\":-0.512,\"momentum3m\":-0.643,\"momentum5m\":-0.791,\"volumeRatio\":1.87,\"candleStreak\":-2,\"window\":\"15m\",\"dryRun\":false}\n{\"id\":\"b1c2d3e4-f5a6-7b8c-9d0e-1f2a3b4c5d6e\",\"timestamp\":\"2026-04-30T03:05:22.000Z\",\"market\":\"Will BTC be higher at 3:10PM ET? (Apr 30, 2026 - 3:05PM to 3:10PM ET)\",\"conditionId\":\"0x2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c\",\"side\":\"YES\",\"entryPrice\":0.43,\"exitPrice\":0.48,\"shares\":23.3,\"cost\":10.0,\"pnl\":1.163,\"status\":\"closed\",\"exitReason\":\"take_profit\",\"entryTime\":\"2026-04-30T03:05:22.000Z\",\"exitTime\":\"2026-04-30T03:06:47.000Z\",\"secondsHeld\":85,\"momentum1m\":0.391,\"momentum3m\":0.512,\"momentum5m\":0.623,\"volumeRatio\":1.92,\"candleStreak\":2,\"window\":\"5m\",\"dryRun\":false}\n```\n\n**Session stats after 3 trades:**\n\n| # | Side | Entry | Exit | Shares | Cost | P&L | Reason | Time Held |\n|---|------|-------|------|--------|------|-----|--------|-----------|\n| 1 | YES | $0.440 | $0.492 | 22.7 | $10.00 | **+$1.18** | take_profit | 73 s |\n| 2 | NO | $0.410 | $0.379 | 24.4 | $10.00 | **−$0.76** | stop_loss | 77 s |\n| 3 | YES | $0.430 | $0.480 | 23.3 | $10.00 | **+$1.16** | take_profit | 85 s |\n| | | | | | **$30.00** | **+$1.59** | | |\n\n---\n\n## Sample Output\n\n### Startup — dry-run mode (`npm run dry-run`)\n\n```\n02:41:08 INFO: 🔑 Execution: direct CLOB (private key loaded)\n    address: \"0xA1b2C3d4E5f6A7b8C9d0E1f2A3b4C5d6E7f8A9b0\"\n    mode: \"clob\"\n\n02:41:08 INFO: 🚀 polymarket-momentum-mispricing-bot starting [DRY RUN]\n    mode: \"clob\"\n    dryRun: true\n    trade5m: true\n    trade15m: true\n    momentumMin: 0.35\n    momentumMax: 0.8\n    positionSize: 10\n    maxDaily: 50\n\n02:41:08 INFO: Connecting to Binance WebSocket...\n02:41:09 INFO: Binance WebSocket connected\n    symbol: \"BTCUSDT\"\n    stream: \"btcusdt@kline_1m\"\n\n02:41:09 INFO: Warming up candle buffer\n    symbol: \"BTCUSDT\"\n    limit: 60\n\n02:41:10 INFO: Candle buffer ready\n    count: 60\n    priceNow: 94821.32\n\n02:41:10 INFO: Bot running — press Ctrl+C to stop\n```\n\n---\n\n### Live strategy tick — skip signals\n\n```\n02:41:10 DEBUG: Skip: 1m momentum 0.112% \u003C min 0.35% (too weak)\n    window: \"5m\"\n    yes: \"0.510\"\n    no: \"0.490\"\n    secs: \"247\"\n\n02:41:15 DEBUG: Skip: Volume ratio 1.21x \u003C min 1.5x\n    window: \"5m\"\n    yes: \"0.480\"\n    no: \"0.520\"\n    secs: \"242\"\n\n02:41:20 DEBUG: Skip: 1m momentum 0.093% \u003C min 0.35% (too weak)\n    window: \"15m\"\n    yes: \"0.503\"\n    no: \"0.497\"\n    secs: \"731\"\n```\n\n---\n\n### Live trade — BUY YES signal detected\n\n```\n02:43:05 INFO: 🎯 Entry signal: YES on 5m market\n    window: \"5m\"\n    side: \"YES\"\n    confidence: \"0.71\"\n    reason: \"BTC ▲0.463% | YES @ 0.440 | vol 2.34x | streak +3\"\n    yes: \"0.440\"\n    no: \"0.560\"\n    secs: \"187\"\n    momentum: \"▲ 1m:+0.463% 3m:+0.581% 5m:+0.744% vol:2.34x streak:+3 $94,971.84\"\n\n02:43:05 INFO: [DRY RUN] BUY simulated\n    marketId: \"0x9f3c4a2b1d0e8f7a6c5b4d3e2f1a0b9c8d7e6f5a\"\n    side: \"YES\"\n    amountUsd: 10\n    fillPrice: 0.44\n    dryShares: \"22.7\"\n    mode: \"clob\"\n\n02:43:05 INFO: Position opened\n    id: \"3f2a1b4c-8d9e-4f5a-b6c7-d8e9f0a1b2c3\"\n    side: \"YES\"\n    question: \"Will BTC be higher at 2:50PM ET? (Apr 30...\"\n    entryPrice: \"0.440\"\n    shares: \"22.7\"\n    cost: \"10.00\"\n```\n\n---\n\n### Position exit — take profit\n\n```\n02:44:18 INFO: ✅ Position exit — take_profit\n    id: \"3f2a1b4c-8d9e-4f5a-b6c7-d8e9f0a1b2c3\"\n    side: \"YES\"\n    reason: \"take_profit\"\n    entryPrice: \"0.440\"\n    exitPrice: \"0.492\"\n    pnlPerShare: \"0.052\"\n    pnl: \"1.1804\"\n    shares: \"22.7\"\n\n02:44:18 INFO: [DRY RUN] SELL simulated\n    marketId: \"0x9f3c4a2b1d0e8f7a6c5b4d3e2f1a0b9c8d7e6f5a\"\n    side: \"YES\"\n    shares: 22.7\n    currentPrice: 0.492\n    mode: \"clob\"\n\n02:44:18 INFO: RiskManager: position closed\n    pnl: \"1.1804\"\n    dailyPnl: \"1.1804\"\n    openCount: 0\n    consecutiveLosses: 0\n```\n\n---\n\n### BUY NO signal — BTC drops\n\n```\n02:51:44 INFO: 🎯 Entry signal: NO on 15m market\n    window: \"15m\"\n    side: \"NO\"\n    confidence: \"0.68\"\n    reason: \"BTC ▼0.512% | YES @ 0.590 (HIGH) | vol 1.87x | streak -2\"\n    yes: \"0.590\"\n    no: \"0.410\"\n    secs: \"634\"\n    momentum: \"▼ 1m:-0.512% 3m:-0.643% 5m:-0.791% vol:1.87x streak:-2 $94,487.22\"\n\n02:51:44 INFO: [DRY RUN] BUY simulated\n    side: \"NO\"\n    amountUsd: 10\n    fillPrice: 0.41\n    dryShares: \"24.4\"\n\n02:51:44 INFO: Position opened\n    id: \"7a8b9c0d-1e2f-3a4b-5c6d-7e8f9a0b1c2d\"\n    side: \"NO\"\n    entryPrice: \"0.410\"\n    shares: \"24.4\"\n    cost: \"10.00\"\n```\n\n---\n\n### Stop loss\n\n```\n02:53:01 INFO: ❌ Position exit — stop_loss\n    id: \"7a8b9c0d-1e2f-3a4b-5c6d-7e8f9a0b1c2d\"\n    side: \"NO\"\n    entryPrice: \"0.410\"\n    exitPrice: \"0.379\"\n    pnlPerShare: \"-0.031\"\n    pnl: \"-0.7564\"\n\n02:53:01 INFO: RiskManager: position closed\n    pnl: \"-0.7564\"\n    dailyPnl: \"0.4240\"\n    consecutiveLosses: 1\n```\n\n---\n\n### 60-second status log\n\n```\n02:55:00 INFO: 📊 Status\n    risk: \"Daily P&L: $0.42 | Open: 0 | Trades: 2 (1W\u002F1L 50.0%) | Streak-losses: 1\"\n    btcPrice: \"94,512.80\"\n    storedTrades: 2\n    storedPnl: \"0.4240\"\n    tradeFile: \"data\u002Ftrades.jsonl\"\n```\n\n---\n\n### Loss-streak cooldown (after 3 losses)\n\n```\n03:18:22 WARN: Loss streak threshold reached — entering cooldown\n    consecutiveLosses: 3\n    cooldownMinutes: 15\n    cooldownUntil: \"2026-04-30T03:33:22.000Z\"\n\n03:18:30 WARN: ⛔ Risk gate blocked trade\n    reason: \"Cooldown active — 831s remaining\"\n```\n\n---\n\n## Backtest\n\nThe backtest mode fetches real Binance BTCUSDT 1-minute candles and replays them through the strategy. Since historical Polymarket market data is not publicly available, synthetic YES\u002FNO prices are used for entry conditions (configurable via `BACKTEST_ENTRY_PRICE`). Market resolution is exact — it uses the actual BTC price direction during each window.\n\n```bash\n# Backtest January 2025\nBACKTEST_START_DATE=2025-01-01 BACKTEST_END_DATE=2025-01-31 npm run backtest\n```\n\n### Sample backtest console output\n\n```\n════════════════════════════════════════════════════════\n  Starting backtest\n    start: \"2025-01-01\"\n    end:   \"2025-01-31\"\n    startingBalance: 1000\n\n  Candle data loaded\n    totalCandles: 44640\n\n════════════════════════════════════════════════════════\n  📊  BACKTEST SUMMARY  —  polymarket-momentum-mispricing-bot\n════════════════════════════════════════════════════════\n  Period:          2025-01-01 → 2025-01-31\n  Starting capital $1000.00\n  ────────────────────────────────────────────────────\n  Signals scanned: 4176\n  Trades executed: 312\n  Wins:            181   Losses: 131\n  Win rate:        58.0%\n  Avg P&L\u002Ftrade:   $0.0623\n  ────────────────────────────────────────────────────\n  Net P&L:         $19.44\n  Final balance:   $1019.44\n  ROI:             +1.94%\n  Max drawdown:    3.21%\n════════════════════════════════════════════════════════\n```\n\n---\n\n## Execution Architecture\n\nTwo execution backends — selected by `EXECUTION_MODE` in `.env`:\n\n### CLOB mode (default — recommended)\n\nYour private key signs EIP-712 orders directly on the Polymarket CTF Exchange contract (Polygon). No intermediary needed.\n\n```\nBot → EIP-712 sign (ethers v6) → Polymarket CLOB API → Order filled\n                                  (clob.polymarket.com)\n```\n\n- `POST \u002Fauth\u002Fapi-key` — obtain session credentials (signed once, cached)\n- `POST \u002Forder` — submit FOK (Fill-or-Kill) buy or sell order\n- `GET  \u002Fbalance-allowance` — USDC balance\n\n### Simmer mode (no private key)\n\n[Simmer](https:\u002F\u002Fsimmer.markets) acts as an execution proxy and handles CLOB signing for you.\n\n```\nBot → Simmer API → Polymarket CLOB → Order filled\n      (api.simmer.markets)\n```\n\n- `POST \u002Fapi\u002Fsdk\u002Fmarkets\u002Fimport` — register a market\n- `POST \u002Fapi\u002Fsdk\u002Ftrade` — buy\u002Fsell an outcome\n- `GET  \u002Fapi\u002Fsdk\u002Fportfolio` — account balance\n\n---\n\n## Safety Notes\n\n1. **Always test with `DRY_RUN=true` first.** Watch the logs for signal quality before enabling live trading.\n2. Start with a small `POSITION_SIZE_USD` (e.g., $5–$10).\n3. The bot does not guarantee profits. Polymarket fast markets are highly competitive.\n4. Keep `MAX_DAILY_LOSS_USD` set to a comfortable level you can afford to lose.\n5. The Simmer API is a third-party service — review their terms before use.\n\n---\n\n## License\n\nMIT\n","这是一个用于Polymarket和Binance平台的交易机器人，通过检测比特币价格动量和市场错价来执行套利策略。项目使用TypeScript编写，能够实时监控Binance上的BTCUSDT一分钟K线数据流，并在发现显著的价格变动（0.35%-0.80%）及成交量激增时检查Polymarket相关快速市场的定价情况。如果发现存在未被调整到位的机会，则自动进行买卖操作，并设有止盈止损等风险管理机制。适用于希望利用加密货币短期波动与预测市场间价差获利的场景。",2,"2026-05-29 04:08:39","CREATED_QUERY"]