Polymarket Bot Tutorial · Chapter 30 of 32

Polymarket bots کے لیے production-grade risk management code: position caps, daily loss limits, halt sentinels, fill-rate watchdogs, reconcile-on-restart, idempotent retries۔ حقیقی production trader سے code patterns۔

اس chapter میں کیا شامل ہے

Risk code ایک production trading bot کا زیادہ تر حصہ ہوتا ہے۔ Strategy logic آسان حصہ ہے؛ اس کے اردگرد لگے caps، halts، watchdogs، اور reconcilers یہ طے کرتے ہیں کہ bot اپنی پہلی خراب week میں survive کرے گا یا نہیں۔ یہ chapter production-grade risk pattern ہے۔

  • Risk code ایک real trading bot کا زیادہ تر حصہ کیوں ہے
  • Position caps (per-market, per-strategy, total)
  • Daily loss kill switch
  • Halt sentinels (file-based emergency stop)
  • Fill-rate watchdog
  • Restart پر diary vs on-chain reconcile کرنا
  • Code: production-grade halt-aware loop

Risk code ایک real trading bot کا زیادہ تر حصہ کیوں ہے

ہم نے اپنے bot codebase پر ایک measurement کی: 60% LOC risk code ہے (caps, halts, watchdogs, reconciliation)۔ 30% strategy ہے۔ 10% glue ہے۔

یہ ratio درست ہے۔ Strategy آسان حصہ ہے - کب enter کرنا ہے اور کب exit کرنا ہے، یہ چند درجن lines میں fit ہو جاتا ہے۔ Risk code باقی سب کچھ ہے: جب price توقع سے تیزی سے آپ کے خلاف جائے تو کیا کرنا ہے، جب fills آنا بند ہو جائیں تو کیا کرنا ہے، جب WebSocket drop ہو جائے تو کیا کرنا ہے، جب strategy غیر منافع بخش ثابت ہو تو کیا کرنا ہے۔

زیادہ تر builder failure stories ایک ہی shape رکھتی ہیں: strategy کام کر رہی تھی، لیکن bot نے regime change کے دوران trading جاری رکھی کیونکہ کوئی halt fire نہیں ہوا۔ Strategy لکھنے سے پہلے halts لکھیں۔

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

تین caps، code میں enforce کیے گئے۔

  • Per-market cap: edge confidence سے قطع نظر ہر market پر زیادہ سے زیادہ $X۔ عام طور پر: چھوٹے bots کے لیے $25-100، production کے لیے $200-500۔ یہ ایک single-market غلط call کے blast radius کو محدود کرتا ہے۔
  • Per-strategy cap: اگر آپ multiple strategies چلاتے ہیں تو ہر strategy کو total capital کا ایک slice ملتا ہے۔ عام طور پر: ہر strategy کے لیے 30-50%۔ یہ ایک strategy کے خراب دن کو دوسروں کا capital کھانے سے روکتا ہے۔
  • Total cap: wallet balance کا زیادہ سے زیادہ % جو بیک وقت deploy ہو۔ عام طور پر: 50-70%۔ یہ unexpected opportunities یا bot کی اپنی bookkeeping bugs کو catch کرنے کے لیے capital چھوڑتا ہے۔

تینوں caps order-placement function کے اندر enforce ہونے چاہئیں، صرف strategy logic میں نہیں۔ Strategy میں bug ہو سکتا ہے؛ order-placement gate آخری defense line ہے۔

Daily loss kill switch

سب سے اہم single risk control: daily-loss kill switch۔

Rule: اگر midnight UTC سے لے کر realized + unrealized PnL starting daily balance کے -X% سے نیچے چلا جائے، تو bot نئے positions کھولنا بند کر دیتا ہے اور (اختیاری طور پر) موجودہ positions flatten کر دیتا ہے۔ عام X: 5-10%۔

Math: 60% expected win rate والا bot شاید 10-trade losing streak کا 5% chance رکھتا ہے۔ Kill switch کے بغیر یہ streak compound ہوتی ہے: $200 loss → bot trading جاری رکھتا ہے → مزید $200 loss → wallet 40% down۔ Switch کے -10% پر fire ہونے کے ساتھ، خراب دن $200 پر cap ہو جاتا ہے، اور اگلے دن bot fresh start کرتا ہے۔

Switch server-side enforce ہوتا ہے: ایک halt file لکھیں یا database flag set کریں جسے trading loop ہر iteration میں check کرتا ہے۔ Restart صرف manual review کے بعد کریں۔

Halt sentinels (file-based emergency stop)

سب سے سادہ halt mechanism: bot ہر loop iteration میں ایک file check کرتا ہے (مثلاً /opt/pmt/HALT) اور اگر file موجود ہو تو trading روک دیتا ہے۔

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 کرنے کے لیے (SSH, Telegram bot, یا monitoring system): touch /opt/pmt/HALT۔ Resume کرنے کے لیے: rm /opt/pmt/HALT۔

File-based approach جان بوجھ کر low-tech ہے کیونکہ یہ اُن حالات میں بھی کام کرتی ہے جہاں زیادہ sophisticated halt mechanisms fail ہو جاتے ہیں: جب bot جزوی طور پر crash ہو چکا ہو، جب database unreachable ہو، جب API key rate-limited ہو۔ File-system access ہمیشہ available ہوتا ہے۔

Fill-rate watchdog

Strategy یہ assume کرتی ہے کہ FOK orders کسی rate پر fill ہوں گی (اکثر 60-80%)۔ جب یہ rate نمایاں طور پر گر جائے تو کچھ بدل چکا ہوتا ہے: market makers ہٹ گئے، آپ کی strategy identify ہو گئی، کوئی API outage جاری ہے۔ وجہ کچھ بھی ہو، وہ assumption ٹوٹ گئی ہے جس پر strategy کی PnL math مبنی تھی۔

Watchdog logic: rolling 24-hour fill-rate count۔ اگر < 30% ہو (یا expected کا 50%) تو alert + auto-halt۔ Resume صرف manual review کے بعد۔

Watchdog diagnosis کے لیے بھی مفید ہے۔ Fill-rate میں اچانک drop عموماً کسی external event سے correlate کرتا ہے (Polymarket deploy, Polygon congestion, آپ کے IP کا rate-limited ہونا) جس کے بارے میں آپ جاننا چاہیں گے، trading impact سے قطع نظر۔

Restart پر diary vs on-chain reconcile کرنا

Bot ایک diary maintain کرتا ہے جس میں وہ positions درج ہوتی ہیں جو اس کے خیال میں اس کے پاس ہیں۔ Chain حقیقت maintain کرتی ہے۔ دونوں کو ہمیشہ agree کرنا چاہیے؛ جب ایسا نہ ہو تو bot غلط belief پر operate کر رہا ہوتا ہے اور غلط trade کرے گا۔

Reconciliation logic: ہر restart پر اور normal operation کے دوران ہر گھنٹے بعد، bot نے جن tokens کو touch کیا ہے ان سب کے on-chain balances fetch کریں۔ Diary سے compare کریں؛ اگر کسی token کا balance rounding tolerance سے زیادہ different ہو تو alert + halt کریں۔

Difference کی سب سے common وجہ ایک successful order ہوتا ہے جسے bot کی API call miss کر دیتی ہے (timeout، retry کبھی record نہیں ہوا)۔ Chain کے پاس position ہوتی ہے؛ bot سمجھتا ہے کہ نہیں ہے۔ Reconciliation کے بغیر bot take-profit exit post نہیں کرے گا اور position resolution تک ride کرتی رہے گی۔

Code: production-grade halt-aware loop

Reference: production trading loop جس میں تمام risk controls wired in ہیں۔

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 یہ ہے: ہر iteration gate سے گزرتی ہے۔ Construction کے لحاظ سے strategy bugs controls کو bypass نہیں کر سکتیں۔

اکثر پوچھے گئے سوالات

Halt sentinel کیا ہوتا ہے؟
ایک file (مثلاً, data/halt_autobuy) جسے bot ہر order سے پہلے check کرتا ہے۔ اگر file موجود ہو تو bot orders place کرنے سے انکار کر دیتا ہے، چاہے strategy کچھ بھی کہے۔ یہ آپ کو ایک single touch command کے ساتھ incident کے بیچ bot روکنے دیتا ہے۔ ہم نے April 2026 میں ایک wedged-fill incident کے بعد یہ exact pattern اپنے production trader میں add کیا تھا۔
مجھے کون سے position caps set کرنے چاہئیں؟
Per-market: bankroll کا 1-5%۔ Per-strategy: 10-20%۔ Total open exposure: bankroll کا 50-70% (cash buffer برقرار رکھیں)۔ SINGLE order کو strategy سے قطع نظر bankroll کے 1-2% پر cap کریں - ایک fat-fingered order کبھی account-sized نہیں ہونا چاہیے۔
Daily loss kill switch کیسے implement کروں؟
ہر UTC day کے لیے realized + unrealized PnL track کریں۔ اگر daily PnL bankroll کے -3 سے -5% سے نیچے آ جائے تو halt sentinel set کریں اور خود کو notify کریں۔ Bot نئے orders روک دیتا ہے؛ موجودہ positions manually manage کی جاتی ہیں۔ ہر روز 00:00 UTC پر reset کریں۔
Crash کے بعد restart پر bot کو کیا کرنا چاہیے؟
تین steps: (1) SDK کے ذریعے local diary کے مقابلے میں open orders reconcile کریں۔ (2) On-chain open positions کو اپنے local state کے خلاف check کریں۔ (3) اگر کچھ بھی diverge کرے تو bot halt کریں اور manual review لازمی بنائیں۔ کبھی بھی inconsistent state میں auto-resume نہ کریں۔
ایک single bug کو میرا account empty کرنے سے کیسے روکوں؟
Layered limits: code-level position cap، code-level order-size cap، file-level halt sentinel، exchange-level (Polymarket) implicit minimum/maximum، monitoring alerts جو unusual order rate پر آپ کو page کریں۔ کوئی ایک layer کافی نہیں ہوتا - یہ multiply کرتے ہیں۔
اگر logging fail ہو جائے تو کیا bot trade کرے؟
نہیں۔ اگر bot اپنی diary میں لکھ نہیں سکتا تو restart پر reconcile نہیں کر سکتا، جس کا مطلب ہے کہ crash inconsistent state پیدا کرے گا۔ Logging fail ہو تو bot hard-fail کریں۔ Healthy production bots اپنی observability کے بارے میں حد سے زیادہ محتاط ہوتے ہیں۔