Polymarket Bot Tutorial · Kabanata 32 ng 32

Tunay na Polymarket bot mistakes at postmortems: phantom fills, sticky-fail dedup, lol-ctg-ccg whipsaw, NegRisk flag bug, premature go-live - kasama ang commits at petsa na nag-aayos sa bawat isa.

Ano ang sinasaklaw ng kabanatang ito

Aming sariling production diary ng bugs na nagkahalaga ng tunay na pera. Mas mahalaga ang pattern kaysa sa specifics - ang parehong mga klase ng bug ay nag-uulit sa kabuuan ng bots, at ang lunas ay karaniwang nawawalang watchdog, hindi mas mahusay na strategy. Ang kabanatang ito ay nilayon upang i-save sa iyo ang matrikula.

  • 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: gumana ang kill switch
  • Mga aral na nagge-generalize

Phantom fills (commits e68a087, 8bb7761)

Ang unang major phantom-fill incident sa aming trader, Mayo 2025. Naglagay ang bot ng 22 FOK buys, lahat nag-match sa CLOB. Ang bot ay agad na nagtangka na mag-post ng 22 GTC sells. Ang 8 sa kanila ay tinanggihan na may "balance: 0 / sum of active orders: 0 / order amount: 10000000."

Root cause: settlement lag (kabanata 12). Nag-match ang CLOB sa 100ms, ang bot ay nag-post ng sell sa 200ms, ngunit ang Polygon ERC-1155 transfer ay tumagal ng ~2 segundo. Tinanggihan ng CLOB ang sell dahil ang chain ay nagpapakita pa rin ng zero balance.

Fix: maglagay ng 5-segundong blocking wait sa pagitan ng anumang matagumpay na buy at anumang GTC follow-up sa parehong token. Commits e68a087 at 8bb7761. Walang phantom-fill incidents simula noon.

Aral: ang API time at chain time ay magkaibang timelines. Ang code na nag-aakala na sila ay synchronous ay tatamaan ang eksaktong failure mode na ito.

NegRisk flag bug (commit 06deaef)

Isang NegRisk multi-outcome event na may 8 kandidato ay nagkaroon ng momentary arb ng 1.8c (sum ng YES asks = 0.982). Ang aming arber ay nag-fire ng lahat ng 8 FOK buys. 6 sa kanila ay nag-fill; 2 ay nag-settle sa maling exchange contract.

Root cause: ang bot ay tumatawag sa createAndPostOrder nang walang pag-set ng negRisk: true sa flags object. Ang dalawa sa markets ay may magkaibang historical creation date at nangailangan ng flag; anim ay hindi kailangan ang flag dahil ang underlying contract nila ay nag-ro-route na sa pamamagitan ng NegRisk sa default.

Fix: basahin ang market.negRisk mula sa Gamma para sa bawat market, ipasa sa bawat order call. Commit 06deaef. Pinatakbo naming muli ang arb na may flag set; ang natitirang 2 ay nag-settle nang tama.

Aral: huwag kailanman i-default ang market property. Basahin ito ng tahasan mula sa source of truth bawat oras.

Sticky-fail dedup (commit 4c0bef1)

Ang bot ay nag-retry ng failed buy ng 5 beses sa 12 segundo. Ang unang attempt ay aktwal na nagtagumpay (ang network timeout ay nagdulot sa bot na hindi makita ang response); ang sumunod na 4 retries ay gumawa ng 4 karagdagang positions. Total: 5 positions sa parehong market kung kailan gusto namin ng 1.

Root cause: walang idempotent client-order-id. Ang retry logic ng bot ay "kung nabigo ito, subukang muli na may bagong salt." Walang paraan ang CLOB upang kilalanin ang mga retry bilang duplicates.

Fix: bumuo ng deterministic UUID bawat intended order bago ang unang attempt. Lahat ng retries ay gumagamit ng parehong client-order-id, na nagpapahintulot sa CLOB na mag-dedup. Commit 4c0bef1.

Aral: ang retries nang walang idempotence ay duplicates. Bawat order ay nangangailangan ng matatag na client-side identifier.

Whipsaw incident: lol-ctg-ccg

Ang esports match (CTG vs CCG) ay nagkaroon ng bot na pumasok sa buy sa 0.45 kapag ang imbalance ay lumipat sa positive. Sa loob ng 30 segundo, ang imbalance ay lumipat sa negative at ang aming GTC sell sa 0.50 ay tinamaan ng order ng iba. PnL: +5c × 10 shares = +$0.50.

10 minuto mamaya, ang imbalance ng parehong market ay lumipat ulit sa positive. Pumasok muli ang bot sa 0.42. Sa pagkakataong ito ang imbalance ay hindi nag-recover; ang mid ay nag-drift sa 0.18 at ang position ay sumakay sa resolution sa 0.

Root cause: tinrato ng strategy ang imbalance bilang directional signal ngunit hindi sinusubaybayan na ang imbalance ay tumatalbog - parehong signals ay noise, hindi impormasyon. Ang bot ay na-whipsaw sa dalawang failed signals sa parehong market sa loob ng 20 minuto.

Fix: cooldown bawat market - pagkatapos ng fill, walang bagong entries sa parehong market sa loob ng 30 minuto. Pinayagan ang maraming entries sa kabuuan ng iba't ibang markets, ngunit hindi back-to-back sa pareho.

Aral: ang signal na tumatalbog ay hindi signal. Mag-filter para sa persistence bago kumilos.

Premature go-live: 2025 wipe

Isang bagong market-making strategy ay pumasa sa 12 paper trades. Hindi naghintay ang builder ng 30, nagdesisyon na "mukhang maganda," nag-deploy live na may $500 ng kapital. Sa loob ng 18 oras ang wallet ay nasa $200.

Root cause: ang 12 trades ay hindi sapat na sample upang ma-distinguish ang 60% WR mula sa 35% WR. Ang strategy ay aktwal na 35% WR; ang 12-trade paper window ay nagkataon na nagkaroon ng unrepresentative streak.

Ang 30-trade gate ay umiiral para sa dahilan. Ang variance sa 12-trade sample ay nagpapatugma nito sa "ang strategy ay hindi gumagana."

Aral: ang disiplina ay tumatalo sa kumbiksyon. Ang 30-trade gate ay hindi negotiable.

Sleep-through-bug: gumana ang kill switch

Ang bot ay may off-by-one sa time-of-day filter nito - nilayon na mag-pause sa 02:00 UTC, ay aktwal na nag-pa-pause sa 03:00 UTC. Sa panahon ng un-paused 02:00-03:00 hour, ang Polygon RPC ay heavily rate-limiting ang aming requests; ang read path ng bot ay nagbabalik ng stale data.

Patuloy ang pag-trade ng bot sa stale prices. PnL sa oras: -$3.20 sa kabuuan ng 22 trades. Nag-trigger ang daily-loss kill switch sa -5%, hinati ang bot, nagpadala ng Telegram alert sa 03:08 UTC. Nagising ang builder sa halted bot sa 09:00, ang total damage ay limitado sa kill threshold.

Aral: ang bug ay totoo ngunit gumana ang kill switch. -$3.20 sa halip na -$50.00. Hindi pinipigilan ng risk controls ang bugs; ito ay nag-cap ng cost ng bugs na hindi mo nakita na dumarating.

Mga aral na nagge-generalize

Sa kabuuan ng lahat ng postmortems, apat na patterns ang nag-uulit.

  1. API time ≠ chain time. Settlement lag, RPC lag, WebSocket lag - lahat ay nagpapakilala ng gaps na dapat tahasang hawakan ng bot code.
  2. Ang retries ay nangangailangan ng idempotence. Ang retry nang walang client-order-id ay duplicate-order risk. Palagi.
  3. Basahin ang bawat market property nang tahasan. NegRisk flag, tick size, expiration. Huwag kailanman i-default; palaging basahin mula sa source of truth.
  4. Ang kill switch ay ang sahig, hindi feature. Nag-cap ang risk controls ng losses sa bugs. Hindi pinipigilan ng strategies ang bugs; ipinapalagay nila na gumagana ang bot nang tama. Hindi palaging gagana nang tama ang bot.

Bawat kabanata sa series na ito ay may isa sa mga pattern na ito na naka-embed sa isang lugar. Sila ang load-bearing principles ng production bot. Laktawan ang mga ito at makikita mo silang muli sa iyong sariling postmortems.

Mga madalas na tanong

Ano ang pinakamamahal na Polymarket bot mistake?
Pagpunta live bago naabot ng paper-trading ang 30-trade gate. Ginawa namin ito. Hindi lamang ang pagkawala ng pera ang mistake - ito ay ang pagkawala ng pagkakataon na matuto mula sa strategy sa controlled environment. Ang mga bots na nag-live nang masyadong maaga ay alinman na-nuke at iniwan, o nag-aaksaya ng buwan na nag-re-recover bago muling mag-paper-trade.
Ano ang phantom fill bug?
Kapag naniniwala ang bot na ang order ay nag-fill ngunit ang exchange ay nag-record nito bilang hindi pa filled. Mga sintomas: ang position ay lumilitaw sa state ng iyong bot ngunit hindi on-chain, na humahantong sa double-orders sa retry. Naayos sa aming trader sa tatlong commits (e68a087, 8bb7761, 06deaef): gumamit ng FOK para sa buys, mag-poll ng status hanggang matched, huwag kailanman magtiwala sa status=delayed bilang filled.
Ano ang lol-ctg-ccg whipsaw incident?
Ang esports market sa manipis na order book kung saan ang aming trader ay nag-fire ng -$2.55 stop-loss sa 0.14, pagkatapos ay nakitang nag-recover ang presyo sa 0.325 sa loob ng 2 minuto. Nakonpigura namin ang stop-loss sa -4 percentage points na masyadong tight para sa manipis na esports books. Fix: pinalawak ang SL sa -8pp para sa low-liquidity markets, pinanatili ang mas tight na SL lamang para sa malalaking books (NBA, high-liquidity soccer). Tingnan ang memory/trader-sl-wider.md.
Paano nagpakita ang NegRisk flag bug?
Naglagay ang bot ng orders nang walang pag-set ng neg_risk=true sa multi-outcome markets. Tinanggihan ang orders na may nakakalitong error messages, na humahantong sa multi-second delays bago mag-retry, na humahantong sa missed fills. Ang fix sa commit 06deaef: palaging i-set ang neg_risk bawat market metadata, huwag kailanman ipagpalagay.
Ano ang sleep-through-bug incident?
Naipit ang wallet na may stuck order sa 4am. Inutusan ng owner ang bot na mag-halt; tinapik ang data/halt_autobuy file. Na-detect ng bot ang file bago ang susunod na trade attempt at tumanggi na maglagay ng orders. Nagising ang owner sa malinis na state sa halip na mas masama. Na-validate ang halt-sentinel pattern; ipinapadala namin ito default ngayon sa bawat bot.
Ano ang nag-iisang pinaka-generalizable na aral mula sa mga postmortems na ito?
Huwag kailanman magtiwala sa happy path. Bawat bug na aming ipinadala ay nagmula sa pag-aakala na nagtagumpay ang request, ang fill ay totoo, o ang presyo ay hindi gagalaw. Mag-code defensively: ipagpalagay na ang orders ay nabibigo, ipagpalagay na ang reconciliations ay nag-di-diverge, ipagpalagay na ang isang market ay malapit nang gumawa ng kakaiba. Maliit ang paranoia tax; ang cost ng paglaktaw nito ay ang postmortem na isusulat mo mamaya.