Polymarket Bot Tutorial · Sura ya 32 kati ya 32
Real Polymarket bot mistakes na postmortems: phantom fills, sticky-fail dedup, lol-ctg-ccg whipsaw, NegRisk flag bug, premature go-live - na commits na dates ambazo zilifix kila moja.
Sura hii inafunika nini
Production diary yetu wenyewe ya bugs zilizocost real money. Pattern inajali zaidi kuliko specifics - same classes ya bug zinarecur katika bots, na cure kawaida ni missing watchdog, sio better strategy. Sura hii imekusudiwa kukuhifadhi tuition.
- Phantom fills (commits e68a087, 8bb7761)
- NegRisk flag bug (commit 06deaef)
- Sticky-fail dedup (commit 4c0bef1)
- Whipsaw incident: lol-ctg-ccg
- Premature go-live: 2025 wipe
- Sleep-through-bug: kill switch ilifanya kazi
- Lessons zinazogeneralize
Phantom fills (commits e68a087, 8bb7761)
First major phantom-fill incident kwenye trader wetu, May 2025. Bot iliweka FOK buys 22, zote zilimatch kwenye CLOB. Bot mara moja ilijaribu kupost GTC sells 22. 8 walirefuse na "balance: 0 / sum of active orders: 0 / order amount: 10000000."
Root cause: settlement lag (sura ya 12). CLOB ilimatch katika 100ms, bot ilipost sell katika 200ms, lakini Polygon ERC-1155 transfer ilichukua ~sekunde 2. CLOB ilirefuse sell kwa sababu chain bado ilionyesha zero balance.
Fix: insert 5-second blocking wait kati ya successful buy yoyote na GTC follow-up yoyote kwenye token sawa. Commits e68a087 na 8bb7761. Zero phantom-fill incidents tangu.
Lesson: API time na chain time ni timelines tofauti. Code inayodhani ni synchronous itahit failure mode hii exact.
NegRisk flag bug (commit 06deaef)
NegRisk multi-outcome event na candidates 8 ilikuwa na momentary arb ya 1.8c (sum ya YES asks = 0.982). Arber yetu ilifire FOK buys zote 8. 6 zilifill; 2 zilisettle katika wrong exchange contract.
Root cause: bot ilikuwa inaita createAndPostOrder bila kuset negRisk: true katika flags object. Markets mbili zilikuwa na different historical creation date na zilihitaji flag; six hazikuhitaji kwa sababu underlying contract tayari ilikuwa inaroute kupitia NegRisk by default.
Fix: soma market.negRisk kutoka Gamma kwa kila market, pass through kwenye kila order call. Commit 06deaef. Tuli-re-run arb na flag set; remaining 2 zilisettle correctly.
Lesson: kamwe usidefault market property. Soma explicitly kutoka source of truth kila wakati.
Sticky-fail dedup (commit 4c0bef1)
Bot ili-retry failed buy mara 5 katika sekunde 12. First attempt actually ilishinda (network timeout ilisababisha bot kutoona response); retries 4 zifuatazo ziliunda 4 additional positions. Total: positions 5 kwenye market sawa wakati tulitaka 1.
Root cause: hakuna idempotent client-order-id. Bot retry logic ilikuwa "ikiwa ilifail, jaribu tena na new salt." CLOB haikuwa na njia ya kutambua retries kama duplicates.
Fix: tengeneza deterministic UUID per intended order kabla ya first attempt. Retries zote zinatumia same client-order-id, kuruhusu CLOB kudedup. Commit 4c0bef1.
Lesson: retries bila idempotence ni duplicates. Kila order inahitaji stable client-side identifier.
Whipsaw incident: lol-ctg-ccg
Esports match (CTG vs CCG) ilikuwa na bot ilingie buy kwa 0.45 wakati imbalance ilipoflip positive. Ndani ya sekunde 30, imbalance ilflip negative na GTC sell yetu kwa 0.50 iliihit na order ya mtu mwingine. PnL: +5c × 10 shares = +$0.50.
Dakika 10 baadaye, same market imbalance ilflip positive tena. Bot iliingie tena kwa 0.42. Wakati huu imbalance haikureerover; mid ilidrift kwa 0.18 na position ilirenden hadi resolution kwa 0.
Root cause: strategy ilitreat imbalance kama directional signal lakini haikutrack kwamba imbalance ilikuwa inabounce - signals zote zilikuwa noise, sio information. Bot ilikuwa whipsawed katika failed signals mbili kwenye market sawa ndani ya dakika 20.
Fix: cooldown per market - baada ya fill, hakuna new entries kwenye market sawa kwa dakika 30. Iliruhusu multiple entries katika markets tofauti, lakini sio back-to-back kwenye same one.
Lesson: signal inayobouce sio signal. Filter kwa persistence kabla ya kuact.
Premature go-live: 2025 wipe
New market-making strategy ilipita paper trades 12. Builder hakusubiri kwa 30, aliamua "looking good," alideploy live na $500 ya capital. Ndani ya masaa 18 wallet ilikuwa kwa $200.
Root cause: trades 12 sio sample ya kutosha kutofautisha 60% WR kutoka 35% WR. Strategy actually ilikuwa 35% WR; 12-trade paper window ilikuwa kwa bahati na unrepresentative streak.
30-trade gate ipo kwa sababu. Variance kwenye 12-trade sample inafanya isiweze kutofautishwa kutoka "strategy haifanyi kazi."
Lesson: discipline inashinda conviction. 30-trade gate sio negotiable.
Sleep-through-bug: kill switch ilifanya kazi
Bot ilikuwa na off-by-one katika time-of-day filter - ilipangiwa kupause kwa 02:00 UTC, actually ilikuwa inapause kwa 03:00 UTC. Wakati wa un-paused hour ya 02:00-03:00, Polygon RPC ilikuwa inarate-limit requests zetu heavily; bot read path ilikuwa inarudisha stale data.
Bot iliendelea kutrade kwenye stale prices. PnL kwenye hour: -$3.20 katika trades 22. Daily-loss kill switch ilitrigger kwa -5%, halt bot, ilituma Telegram alert kwa 03:08 UTC. Builder aliamka kwenye halted bot kwa 09:00, total damage limited kwa kill threshold.
Lesson: bug ilikuwa real lakini kill switch ilifanya kazi. -$3.20 badala ya -$50.00. Risk controls hazizuii bugs; zinacap cost ya bugs usizoona zikiingia.
Lessons zinazogeneralize
Katika postmortems zote, patterns nne zinarudia.
- API time ≠ chain time. Settlement lag, RPC lag, WebSocket lag - zote zinaintroduce gaps ambazo bot code lazima ihandle explicitly.
- Retries zinahitaji idempotence. Retry bila client-order-id ni duplicate-order risk. Daima.
- Soma kila market property explicitly. NegRisk flag, tick size, expiration. Kamwe usidefault; daima soma kutoka source of truth.
- Kill switch ni floor, sio feature. Risk controls zinacap losses kwenye bugs. Strategies hazizuii bugs; zinadhani bot inafanya kazi correctly. Bot haitafanya kazi correctly daima.
Kila sura katika mfululizo huu ina moja ya patterns hizi embedded mahali. Ni load-bearing principles ya production bot. Zikuruke na utazipata tena katika postmortems zako mwenyewe.





