Polymarket Bot Tutorial · Chương 30 trong 32
Mã quản trị rủi ro cấp production cho Polymarket bots: position caps, daily loss limits, halt sentinels, fill-rate watchdogs, reconcile-on-restart, idempotent retries. Code patterns từ trader production thực tế.
Chương này bao gồm những gì
Mã risk là phần lớn của một production trading bot. Logic strategy là phần dễ; các caps, halts, watchdogs và reconcilers xung quanh mới là thứ quyết định bot có sống sót qua tuần tệ đầu tiên hay không. Chương này là pattern risk cấp production.
- Tại sao mã risk là phần lớn nhất của một trading bot thực thụ
- Position caps (per-market, per-strategy, total)
- Daily loss kill switch
- Halt sentinels (file-based emergency stop)
- Fill-rate watchdog
- Reconcile diary với on-chain khi restart
- Code: production-grade halt-aware loop
Tại sao mã risk là phần lớn nhất của một trading bot thực thụ
Một số đo mà chúng tôi thực hiện trên codebase bot của chính mình: 60% LOC là mã risk (caps, halts, watchdogs, reconciliation). 30% là strategy. 10% là glue.
Tỷ lệ đó là đúng. Strategy là phần dễ - mô tả khi nào vào và khi nào thoát chỉ gói gọn trong vài chục dòng. Mã risk là tất cả những thứ còn lại: làm gì khi giá đi ngược bạn nhanh hơn dự kiến, làm gì khi fills ngừng khớp, làm gì khi WebSocket rớt, làm gì khi strategy hóa ra không có lợi nhuận.
Hầu hết câu chuyện thất bại của builder đều có cùng một hình dạng: strategy hoạt động, nhưng bot vẫn tiếp tục giao dịch qua một regime change vì không có halt nào được kích hoạt. Hãy viết phần halts trước khi viết strategy.
Position caps (per-market, per-strategy, total)
Ba cap, được thực thi trong code.
- Per-market cap: tối đa $X cho mỗi market, bất kể edge confidence. Thường gặp: $25-100 cho bot nhỏ, $200-500 cho production. Giới hạn blast radius của một quyết định sai ở một market đơn lẻ.
- Per-strategy cap: nếu bạn chạy nhiều strategy, mỗi strategy sẽ nhận một phần của tổng capital. Thường gặp: 30-50% cho mỗi strategy. Ngăn một ngày tệ của một strategy nuốt hết capital của các strategy khác.
- Total cap: tối đa % số dư wallet được deploy đồng thời. Thường gặp: 50-70%. Chừa capital cho cơ hội bất ngờ hoặc để bắt các lỗi bookkeeping của chính bot.
Cả ba cap đều nên được thực thi bên trong hàm đặt order, không chỉ trong logic strategy. Strategy có thể có bug; cổng order-placement là tuyến phòng thủ cuối cùng.
Daily loss kill switch
Single risk control quan trọng nhất: một daily-loss kill switch.
Quy tắc: nếu realized + unrealized PnL kể từ nửa đêm UTC giảm xuống dưới -X% so với số dư daily ban đầu, bot sẽ dừng mở vị thế mới và (tuỳ chọn) flatten các vị thế hiện có. X thường là: 5-10%.
Toán học: một bot có expected win rate 60% có thể có khoảng 5% xác suất gặp chuỗi thua 10 trade liên tiếp. Nếu không có kill switch, chuỗi đó sẽ cộng dồn: lỗ $200 → bot vẫn tiếp tục trade → lỗ thêm $200 → wallet giảm 40%. Khi switch kích hoạt ở -10%, ngày tệ sẽ chỉ bị giới hạn ở $200, và ngày mai bot bắt đầu lại từ đầu.
Switch được thực thi phía server: ghi một file halt hoặc đặt một database flag mà trading loop kiểm tra ở mỗi vòng lặp. Chỉ restart sau khi đã review thủ công.
Halt sentinels (file-based emergency stop)
Cơ chế halt đơn giản nhất có thể: bot kiểm tra một file (ví dụ /opt/pmt/HALT) ở mỗi vòng lặp và dừng trading nếu file đó tồn tại.
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)
Để halt ngay lập tức từ bất kỳ đâu (SSH, Telegram bot, monitoring system): touch /opt/pmt/HALT. Để tiếp tục: rm /opt/pmt/HALT.
Cách làm dựa trên file này được cố ý giữ low-tech vì nó hoạt động trong những điều kiện mà các cơ chế halt tinh vi hơn thất bại: khi bot bị crash một phần, khi database không truy cập được, khi API key bị rate-limited. File system access luôn sẵn có.
Fill-rate watchdog
Strategy giả định các lệnh FOK được khớp ở một tỷ lệ nhất định (thường 60-80%). Khi tỷ lệ này giảm đáng kể, đã có điều gì đó thay đổi: market makers rút đi, strategy của bạn bị nhận diện, hoặc đang có sự cố API. Dù lý do là gì, giả định làm nền cho phép tính PnL của strategy đã bị hỏng.
Logic watchdog: đếm rolling 24-hour fill-rate. Nếu < 30% (hoặc 50% so với expected), alert + auto-halt. Chỉ resume sau khi manual review.
Watchdog cũng hữu ích như một công cụ chẩn đoán. Một cú rơi fill-rate đột ngột thường tương quan với một sự kiện bên ngoài (Polymarket deploy, Polygon congestion, IP của bạn bị rate-limited) mà bạn vẫn muốn biết dù tác động giao dịch là gì.
Reconcile diary vs on-chain khi restart
Bot duy trì một diary về các vị thế mà nó nghĩ rằng mình đang nắm giữ. Chain duy trì sự thật. Hai bên phải luôn khớp; khi không khớp, bot đang vận hành dựa trên một niềm tin sai và sẽ giao dịch sai.
Logic reconciliation: ở mỗi lần restart và một lần mỗi giờ trong quá trình chạy bình thường, lấy on-chain balances cho mọi token mà bot đã chạm tới. So sánh với diary; alert + halt nếu balance của bất kỳ token nào khác diary quá mức rounding tolerance.
Nguyên nhân phổ biến nhất của divergence là một order thành công nhưng API call của bot bỏ lỡ (timeout, retry không bao giờ được ghi lại). Chain có vị thế; bot nghĩ là không có. Nếu không reconcile, bot sẽ không đặt lệnh take-profit và vị thế sẽ chạy tới lúc resolution.
Code: production-grade halt-aware loop
Tham chiếu: trading loop production với tất cả risk controls được gắn vào.
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)
Pattern là: mỗi vòng lặp đều phải đi qua cổng kiểm soát. Bug của strategy không thể bypass các control, theo đúng thiết kế.





