Polymarket Bot Tutorial · Bab 30 dari 32
Kode manajemen risiko production-grade untuk Polymarket bots: position caps, daily loss limits, halt sentinels, fill-rate watchdogs, reconcile-on-restart, idempotent retries. Pola kode dari trader production nyata.
Apa yang dibahas chapter ini
Kode risk adalah sebagian besar dari production trading bot. Logika strategy adalah bagian yang mudah; caps, halts, watchdogs, dan reconcilers di sekelilingnya adalah hal yang menentukan apakah bot akan bertahan melewati minggu buruk pertamanya. Chapter ini adalah pola risk production-grade.
- Mengapa risk code adalah sebagian besar dari trading bot nyata
- Position caps (per-market, per-strategy, total)
- Daily loss kill switch
- Halt sentinels (emergency stop berbasis file)
- Fill-rate watchdog
- Reconcile diary vs on-chain saat restart
- Kode: production-grade halt-aware loop
Mengapa risk code adalah sebagian besar dari trading bot nyata
Satu pengukuran yang kami buat pada codebase bot kami sendiri: 60% LOC adalah risk code (caps, halts, watchdogs, reconciliation). 30% adalah strategy. 10% adalah glue.
Rasio itu benar. Strategy adalah bagian yang mudah - menjelaskan kapan masuk dan kapan keluar cukup dalam beberapa puluh baris. Risk code adalah semuanya yang lain: apa yang harus dilakukan ketika price bergerak melawan Anda lebih cepat dari yang diperkirakan, apa yang harus dilakukan ketika fills berhenti masuk, apa yang harus dilakukan ketika WebSocket putus, apa yang harus dilakukan ketika strategy ternyata tidak menguntungkan.
Kebanyakan kisah kegagalan builder memiliki pola yang sama: strategy-nya berhasil, tetapi bot terus trading melewati regime change karena tidak ada halt yang aktif. Tulis halts sebelum Anda menulis strategy.
Position caps (per-market, per-strategy, total)
Tiga cap, ditegakkan di code.
- Per-market cap: maksimum $X per market tanpa memandang confidence edge. Tipikal: $25-100 untuk bot kecil, $200-500 untuk production. Membatasi blast radius dari satu keputusan salah pada satu market.
- Per-strategy cap: jika Anda menjalankan beberapa strategy, masing-masing mendapat porsi dari total capital. Tipikal: 30-50% per strategy. Mencegah hari buruk satu strategy menghabiskan capital milik yang lain.
- Total cap: maksimum % dari wallet balance yang dideploy secara bersamaan. Tipikal: 50-70%. Menyisakan capital untuk peluang tak terduga atau untuk menangkap bug bookkeeping bot sendiri.
Ketiga cap harus ditegakkan di dalam fungsi order-placement, bukan hanya di logika strategy. Strategy bisa saja punya bug; gate order-placement adalah garis pertahanan terakhir.
Daily loss kill switch
Kontrol risiko tunggal yang paling penting: daily-loss kill switch.
Aturan: jika realized + unrealized PnL sejak tengah malam UTC turun di bawah -X% dari starting daily balance, bot berhenti membuka posisi baru dan (opsional) flatten posisi yang sudah ada. Nilai X tipikal: 5-10%.
Matematikanya: bot dengan expected win rate 60% mungkin memiliki peluang 5% untuk losing streak 10 trade. Tanpa kill switch, streak itu akan berlipat: rugi $200 → bot tetap trading → rugi $200 lagi → wallet turun 40%. Dengan switch yang aktif pada -10%, hari buruk dibatasi pada $200, dan besok bot mulai segar lagi.
Switch ditegakkan di server-side: tulis file halt atau set database flag yang dicek trading loop setiap iterasi. Restart hanya setelah manual review.
Halt sentinels (emergency stop berbasis file)
Mekanisme halt paling sederhana yang mungkin: bot memeriksa sebuah file (mis. /opt/pmt/HALT) di setiap iterasi loop dan berhenti trading jika file tersebut ada.
def trading_loop():
while True:
if os.path.exists("/opt/pmt/HALT"):
log("HALT file detected, sleeping")
time.sleep(30)
continue
run_one_iteration()
time.sleep(5)
Untuk menghentikan segera dari mana saja (SSH, Telegram bot, monitoring system): touch /opt/pmt/HALT. Untuk melanjutkan: rm /opt/pmt/HALT.
Pendekatan berbasis file ini sengaja low-tech karena bekerja dalam kondisi ketika mekanisme halt yang lebih canggih gagal: saat bot crash sebagian, saat database tidak dapat dijangkau, saat API key terkena rate-limit. Akses file-system selalu tersedia.
Fill-rate watchdog
Strategy mengasumsikan order FOK terisi pada rate tertentu (sering 60-80%). Ketika rate turun signifikan, ada sesuatu yang berubah: market makers menarik diri, strategy Anda teridentifikasi, outage API sedang berlangsung. Apa pun alasannya, asumsi yang mendasari matematika PnL strategy sudah rusak.
Logika watchdog: hitung rolling fill-rate 24 jam. Jika < 30% (atau 50% dari expected), alert + auto-halt. Lanjutkan hanya setelah manual review.
Watchdog juga berguna sebagai diagnostik. Penurunan fill-rate yang tiba-tiba biasanya berkorelasi dengan event eksternal (Polymarket deploy, kemacetan Polygon, IP Anda kena rate-limit) yang tetap perlu Anda ketahui terlepas dari dampak trading-nya.
Reconcile diary vs on-chain saat restart
Bot menyimpan diary posisi yang menurutnya sedang dipegang. Chain menyimpan kebenaran. Keduanya harus selalu sama; ketika tidak sama, bot beroperasi berdasarkan keyakinan yang salah dan akan trading dengan keliru.
Logika reconciliation: pada setiap restart dan sekali per jam selama operasi normal, ambil on-chain balances untuk setiap token yang pernah disentuh bot. Bandingkan dengan diary; alert + halt jika balance token mana pun berbeda dari diary lebih dari toleransi rounding.
Penyebab divergence yang paling umum adalah order yang berhasil tetapi API call bot tidak menangkapnya (timeout, retry tidak pernah tercatat). Chain memiliki position-nya; bot mengira tidak punya. Tanpa reconciliation, bot tidak akan mem-post exit take-profit dan posisi akan berlanjut sampai resolution.
Kode: production-grade halt-aware loop
Referensi: trading loop production dengan semua kontrol risk terhubung.
def production_loop():
while True:
# Halt checks
if os.path.exists("/opt/pmt/HALT"):
sleep_with_log(30); continue
if daily_pnl_below_threshold():
create_halt("daily PnL kill"); continue
# Reconcile every hour
if now() - last_reconcile > 3600:
ok = reconcile_diary_vs_chain()
last_reconcile = now()
if not ok: create_halt("reconciliation failed"); continue
# Fill-rate watchdog
if recent_fill_rate() < 0.30:
create_halt("fill rate collapse"); continue
# Strategy
try:
run_strategy_once()
except Exception as e:
log_exception(e)
if consecutive_exceptions >= 5:
create_halt(f"exceptions: {e}"); continue
time.sleep(5)
Pola ini: setiap iterasi melewati gate. Bug strategy tidak dapat melewati kontrol, secara desain.





