Polymarket Bot Tutorial · Bölüm 30 / 32

Polymarket botları için production-grade risk management code: position caps, daily loss limits, halt sentinels, fill-rate watchdogs, reconcile-on-restart, idempotent retries. Gerçek production trader’dan code patterns.

Bu bölüm neleri kapsıyor

Risk code, production trading bot’unun büyük kısmıdır. Strategy logic kolay kısımdır; etrafındaki caps, halts, watchdogs ve reconcilers bot’un ilk kötü haftasından sağ çıkıp çıkmayacağını belirler. Bu bölüm, production-grade risk pattern’ini anlatır.

  • Why risk code is most of a real trading bot
  • Position caps (per-market, per-strategy, total)
  • Daily loss kill switch
  • Halt sentinels (file-based emergency stop)
  • Fill-rate watchdog
  • Reconcile diary vs on-chain on restart
  • Code: production-grade halt-aware loop

Why risk code is most of a real trading bot

Kendi bot codebase’imizde yaptığımız bir ölçüm: LOC’nin %60’ı risk code (caps, halts, watchdogs, reconciliation). %30’u strategy. %10’u glue.

Bu oran doğru. Strategy işin kolay kısmıdır - ne zaman gireceğini ve ne zaman çıkacağını tanımlamak birkaç düzine satıra sığar. Risk code ise diğer her şeydir: fiyat beklendiğinden daha hızlı size karşı hareket ettiğinde ne yapılacağı, fills durduğunda ne yapılacağı, WebSocket düştüğünde ne yapılacağı, strategy’nin kârsız olduğu ortaya çıktığında ne yapılacağı.

Çoğu builder failure hikâyesi aynı kalıba sahiptir: strategy çalışıyordur, ama bot bir regime change boyunca trade etmeye devam etmiştir çünkü hiç halt tetiklenmemiştir. Strategy’yi yazmadan önce halts’ları yazın.

Position caps (per-market, per-strategy, total)

Kod içinde uygulanan üç cap.

  • Per-market cap: edge confidence ne olursa olsun market başına maksimum $X. Tipik: küçük botlar için $25-100, production için $200-500. Tek bir markette yanlış bir call’ın yaratacağı etki alanını sınırlar.
  • Per-strategy cap: birden fazla strategy çalıştırıyorsanız, her biri toplam capital’dan bir pay alır. Tipik: strategy başına %30-50. Bir strategy’nin kötü gününün diğerlerinin capital’ını tüketmesini önler.
  • Total cap: aynı anda deploy edilen wallet balance’ın maksimum yüzdesi. Tipik: %50-70. Beklenmedik fırsatlar veya bot’un kendi bookkeeping bug’larını yakalamak için capital bırakır.

Üç cap’in de order-placement function içinde uygulanması gerekir; sadece strategy logic içinde değil. Strategy’de bug olabilir; order-placement gate son savunma hattıdır.

Daily loss kill switch

En önemli tek risk control: daily-loss kill switch.

Kural: UTC midnight’tan beri realized + unrealized PnL, günlük başlangıç balance’ının -X% altına düşerse bot yeni position açmayı durdurur ve (isteğe bağlı olarak) mevcut position’ları flatten eder. Tipik X: %5-10.

Matematik: %60 beklenen win rate’e sahip bir botun 10 trade’lik losing streak yaşama ihtimali belki %5’tir. Kill switch olmadan bu streak birleşir: $200 loss → bot trade etmeye devam eder → bir $200 loss daha → wallet %40 düşer. Switch -%10’da tetiklenirse kötü gün $200 ile sınırlanır ve yarın bot temiz bir başlangıç yapar.

Switch server-side uygulanır: trading loop’un her iteration’da kontrol ettiği bir halt file yazın veya database flag’i ayarlayın. Yalnızca manuel review’den sonra yeniden başlatın.

Halt sentinels (file-based emergency stop)

Mümkün olan en basit halt mechanism: bot her loop iteration’da bir dosya kontrol eder (ör. /opt/pmt/HALT) ve dosya varsa trading’i durdurur.

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)

Herhangi bir yerden anında durdurmak için (SSH, Telegram bot, monitoring system): touch /opt/pmt/HALT. Devam ettirmek için: rm /opt/pmt/HALT.

File-based yaklaşım kasıtlı olarak low-tech’tir çünkü daha sofistike halt mechanisms başarısız olduğunda da çalışır: bot kısmen çöktüğünde, database erişilemez olduğunda, API key rate-limit’e takıldığında. File-system access her zaman kullanılabilir.

Fill-rate watchdog

Strategy, FOK orders’ın belli bir oranda fill olacağını varsayar (çoğu zaman %60-80). Oran belirgin biçimde düştüğünde bir şey değişmiştir: market makers çekilmiştir, strategy’niz tespit edilmiştir, bir API outage sürüyordur. Sebep ne olursa olsun, strategy’nin PnL math’ine temel olan varsayım bozulmuştur.

Watchdog logic: 24 saatlik rolling fill-rate sayımı. Eğer < %30 ise (veya beklenenin %50’sinin altındaysa), alert + auto-halt. Yalnızca manuel review’den sonra devam edin.

Watchdog ayrıca diagnostic olarak da faydalıdır. Ani fill-rate düşüşü genellikle dış bir event ile ilişkilidir (Polymarket deploy, Polygon congestion, IP’nizin rate-limit’e takılması) ve trading etkisinden bağımsız olarak bunu bilmek istersiniz.

Reconcile diary vs on-chain on restart

Bot, elinde tuttuğunu düşündüğü position’ların bir diary’sini tutar. Chain gerçeği tutar. Bunlar her zaman aynı olmalıdır; olmadıklarında bot yanlış bir inançla çalışıyor demektir ve hatalı trade yapacaktır.

Reconciliation logic: her restart’ta ve normal operation sırasında saatte bir, bot’un dokunduğu her token için on-chain balance’ları çekin. Diary ile karşılaştırın; herhangi bir token’ın balance’ı rounding tolerance’dan fazla farklıysa alert + halt.

Ayrışmanın en yaygın nedeni, bot’un API call’unun kaçırdığı başarılı bir order’dır (timeout, retry never recorded). Chain’de position vardır; bot yok sanıyordur. Reconciliation olmadan bot take-profit exit’i koymaz ve position çözülmeye kadar taşınır.

Code: production-grade halt-aware loop

Referans: tüm risk controls entegre edilmiş production trading loop.

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 şu: her iteration gate’den geçer. Strategy bug’ları, yapısal olarak, controls’ları atlayamaz.

Sık sorulan sorular

Halt sentinel nedir?
Bot’un her order’dan önce kontrol ettiği bir dosya (ör. data/halt_autobuy). Dosya varsa, strategy aksi yönde söylese bile bot order place etmeyi reddeder. Tek bir touch command ile bot’u olay ortasında durdurmanızı sağlar. Bu exact pattern’i, Nisan 2026’daki wedged-fill incident sonrasında production trader’ımıza ekledik.
Hangi position caps’i ayarlamalıyım?
Per-market: bankroll’un %1-5’i. Per-strategy: %10-20. Total open exposure: bankroll’un %50-70’i (cash buffer bırakın). Tek bir order’ı strategy’den bağımsız olarak bankroll’un %1-2’si ile sınırlandırın - tek bir yanlış tuş basımı account-sized olmamalı.
Daily loss kill switch’i nasıl uygularım?
UTC day başına realized + unrealized PnL’yi takip edin. Daily PnL bankroll’un -%3 ila -%5 altına düşerse halt sentinel’ını ayarlayın ve kendinize bildirim gönderin. Bot yeni order’ları durdurur; mevcut position’lar manuel yönetilir. Her gün 00:00 UTC’de sıfırlayın.
Crash sonrası restart’ta bot ne yapmalı?
Üç adım: (1) SDK üzerinden open orders’ları local diary’nizle reconcile edin. (2) On-chain open positions’ları local state’inizle karşılaştırın. (3) Bir uyumsuzluk varsa bot’u durdurun ve manuel review zorunlu olsun. Asla inconsistent state içinde auto-resume etmeyin.
Tek bir bug’ın hesabımı boşaltmasını nasıl önlerim?
Layered limits: code-level position cap, code-level order-size cap, file-level halt sentinel, exchange-level (Polymarket) implicit minimum/maximum, unusual order rate için sizi uyaran monitoring alerts. Tek bir katman yeterli değildir - hepsi birlikte çarpan etkisi yaratır.
Logging başarısız olursa bot trade etmeli mi?
Hayır. Bot diary’sine yazamıyorsa restart sonrası reconcile edemez; bu da bir crash’in inconsistent state’e yol açacağı anlamına gelir. Logging başarısız olursa bot’u hard-fail edin. Sağlıklı production bot’lar kendi observability’leri konusunda paranoyaktır.