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ế.

Các câu hỏi thường gặp

Halt sentinel là gì?
Một file (ví dụ, data/halt_autobuy) mà bot kiểm tra trước mỗi order. Nếu file tồn tại, bot sẽ từ chối đặt order ngay cả khi strategy yêu cầu. Cho phép bạn dừng bot giữa sự cố chỉ bằng một lệnh touch. Chúng tôi đã thêm đúng pattern này vào production trader của mình sau một sự cố wedged-fill vào tháng 4 năm 2026.
Tôi nên đặt position caps nào?
Per-market: 1-5% bankroll. Per-strategy: 10-20%. Tổng open exposure: 50-70% bankroll (giữ cash buffer). Cap một SINGLE order ở mức 1-2% bankroll bất kể strategy - một lệnh bấm nhầm không bao giờ được phép lớn bằng cả account.
Làm thế nào để triển khai daily loss kill switch?
Theo dõi realized + unrealized PnL theo từng ngày UTC. Nếu daily PnL giảm xuống dưới -3 đến -5% bankroll, đặt halt sentinel và thông báo cho chính bạn. Bot sẽ dừng các order mới; các vị thế hiện có sẽ được quản lý thủ công. Reset vào 00:00 UTC mỗi ngày.
Bot nên làm gì khi restart sau một crash?
Ba bước: (1) Reconcile open orders qua SDK với local diary của bạn. (2) Kiểm tra open positions on-chain với local state của bạn. (3) Nếu có bất kỳ chỗ nào diverge, hãy halt bot và yêu cầu manual review. Không bao giờ auto-resume vào một state không nhất quán.
Làm sao để ngăn một bug duy nhất làm trống tài khoản của tôi?
Các giới hạn theo tầng: position cap ở cấp code, order-size cap ở cấp code, halt sentinel ở cấp file, giới hạn ngầm ở cấp exchange (Polymarket), và monitoring alerts để page bạn khi order rate bất thường. Không có tầng nào là đủ; chúng phải kết hợp với nhau.
Bot có nên trade nếu logging của tôi bị lỗi không?
Không. Nếu bot không thể ghi vào diary, nó không thể reconcile sau khi restart, đồng nghĩa với việc crash sẽ dẫn đến state không nhất quán. Hãy hard-fail bot nếu logging thất bại. Các production bot khỏe mạnh luôn cảnh giác với chính khả năng quan sát của mình.