پولی مارکیٹ بوٹ ٹیوٹوریل · باب 24 از 32

پولی مارکیٹ Perps کا ایک مکمل عوامی API ہے جس کے ساتھ آفیشل TypeScript اور Python SDKs بھی موجود ہیں۔ اس باب میں اصل انٹرفیس پر ایک بوٹ بنایا گیا ہے۔ اس میں پراکسی ٹریڈنگ کلید سے تصدیق، REST اور WebSocket پر مارکیٹ ڈیٹا، ٹیک پرافٹ اور اسٹاپ لاس والے آرڈرز، اور وہ رسک کنٹرولز شامل ہیں جو لیوریج والے بوٹ کو اکاؤنٹ خالی کرنے سے روکتے ہیں۔

Build your own theme park, free in your browserاشتہار یہاں اشتہار دیں
بنانے سے پہلے۔ امریکہ، کینیڈا، کیوبا، ایران، شمالی کوریا، شام، کریمیا، ڈونیٹسک یا لوہانسک سے Perps پر آرڈر دینے کی اجازت نہیں ہے، اور polymarket.com مزید ممالک کو بھی بلاک کرتا ہے۔ بوٹ یا غیر ملکی سرور استعمال کرنے سے یہ پابندی ختم نہیں ہوتی۔ لیوریج کے ساتھ ایک بگ بہت تیزی سے رقم ڈبو دیتا ہے، اس لیے کم سے کم سائز پر ٹیسٹ کریں۔ Perps میں نئے ہیں؟ پولی مارکیٹ Perps گائیڈ سے شروع کریں۔

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

  • بوٹ بنانے والوں کے لیے اہم اعداد
  • Perps API کی ساخت
  • مرحلہ 1: SDK انسٹال کریں اور سیشن کھولیں
  • مرحلہ 2: REST اور WebSocket پر مارکیٹ ڈیٹا پڑھیں
  • مرحلہ 3: ٹیک پرافٹ اور اسٹاپ لاس کے ساتھ آرڈرز دیں
  • مرحلہ 4: کوڈ میں رسک کنٹرولز کے ساتھ بوٹ کا ڈھانچہ
  • غلطیاں، ڈیڈ مینز سوئچ، بوٹس کے قواعد اور ہوسٹنگ

یہاں ہر SDK میتھڈ اور اینڈ پوائنٹ پولی مارکیٹ کی Perps دستاویزات (docs.polymarket.com/perps، 6 نومبر 2026 کو پڑھی گئیں) سے لیا گیا ہے۔ ہماری اپنی منطق تبصروں میں نشان زد ہے، اور اسٹریٹیجی فنکشن ایک لیبل شدہ پلیس ہولڈر ہے۔

بوٹ بنانے والوں کے لیے اہم اعداد (نومبر 2026 تک)

آئٹمقدر
REST بیس URLhttps://api.perpetuals.polymarket.com
WebSocketwss://ws.perpetuals.polymarket.com/v1/ws
TypeScript SDK@polymarket/client (دستخط کے لیے viem کے ساتھ)
Python SDKpolymarket-client (async)
عوامی ڈیٹا/v1/info/*، تصدیق کی ضرورت نہیں
نجی ریڈز/v1/account/*، polymarket-proxy اور polymarket-secret ہیڈرز کے ساتھ
دستخط شدہ رائٹس/v1/trade/*، پراکسی کلید کا EIP-712 دستخط، 5 منٹ کے لیے درست
سیشن کریڈینشلزبطور ڈیفالٹ ایک ہفتے بعد ختم ہو جاتے ہیں
کم از کم آرڈر$10 نوشنل مالیت؛ کم از کم ڈپازٹ 10 pUSD
سب سے بڑا مارکیٹ آرڈر50x اور 20x مارکیٹس پر $1M، زیادہ تر دیگر مارکیٹس پر $500K، 3x اور 5x کوائنز پر $50K
قیمت اور سائز کا فارمیٹاعشاری اسٹرنگز، مارکیٹ کے اعشاریہ مقامات اور 5 اہم ہندسوں سے زیادہ نہیں
زیادہ سے زیادہ لیوریج50x (BTC، ETH، USA500، US100)، بصورت دیگر ہر مارکیٹ کے لحاظ سے 20x، 10x، 5x یا 3x، بڑی پوزیشنز کے لیے کم
فیس (بنیادی درجہ)ٹیکر 0.040%، میکر 0.0125%؛ ANT پر آدھی قیمت
فنڈنگہر گھنٹے، زیادہ سے زیادہ +/-4% فی گھنٹہ
TP/SL ٹرگرزمارک قیمت پر، آخری ٹریڈ پر نہیں
WebSocket کیپ الائیوتقریباً ہر 25 سیکنڈ پر پنگ؛ تقریباً 65 سیکنڈ کی خاموشی کے بعد کنکشن کو غیر فعال سمجھیں
ٹکر کی تازگیزیادہ سے زیادہ 10 سیکنڈ پرانا

Perps API کی ساخت

Perps ایک ہائبرڈ ایکسچینج ہے۔ میچنگ آف چین ہوتی ہے، جبکہ تحویل اور تصفیہ Polygon پر ہوتے ہیں۔ صرف ڈپازٹس اور رقم نکلوانا آن چین ہوتے ہیں، اس لیے ہر آرڈر پر گیس فیس نہیں لگتی۔ API کی تین تہیں ہیں:

  • عوامی ڈیٹا (/v1/info/): انسٹرومنٹس، ٹکرز، آرڈر بک، کینڈلز، ٹریڈز، فنڈنگ اور فیس۔ اس کے لیے نہ کلید کی ضرورت ہے اور نہ کوئی جغرافیائی پابندی ہے۔
  • نجی ریڈز (/v1/account/): پورٹ فولیو، بیلنسز، آرڈرز، مکمل شدہ آرڈرز اور کنفیگ۔
  • دستخط شدہ رائٹس (/v1/trade/): آرڈرز، منسوخیاں، لیوریج، آئسولیٹڈ مارجن اور آٹو کینسل۔ ہر رائٹ کو MessagePack میں انکوڈ کیا جاتا ہے، keccak256 سے ہیش کیا جاتا ہے، اور پراکسی کلید اس پر EIP-712 typed data کے طور پر دستخط کرتی ہے۔

دستخط کا کام SDKs آپ کے لیے کر دیتے ہیں۔ ایک OpenAPI اسپیک (دستاویزات کی سائٹ پر /api-spec/perps-openapi.json) اور WebSocket کے لیے ایک AsyncAPI اسپیک بھی موجود ہے۔

سمبلز دستاویزات کی مثالوں سے مختلف ہیں۔ دستاویزات میں BTC-PERP دکھایا گیا ہے۔ لائیو API BTC-USD، SP500-USD (USA500)، NAS100-USD (US100)، ANT-USD وغیرہ واپس کرتا ہے۔ انسٹرومنٹس کی فہرست حاصل کریں، لائیو symbol سے ملان کریں اور عددی id محفوظ کریں۔ مثالوں سے IDs کاپی نہ کریں: لائیو API میں BTC کا ID 6 اور SP500 کا 1 ہے۔

مرحلہ 1: SDK انسٹال کریں اور سیشن کھولیں

pip install polymarket-client یا npm install @polymarket/client@latest viem سے انسٹال کریں۔ بوٹ کو آپ کے پولی مارکیٹ والیٹ کا ایڈریس چاہیے، اور اس سائنر کی پرائیویٹ کلید بھی جو Perps اکاؤنٹ کا مالک ہے (اکاؤنٹ سائنر EOA سے منسلک ہوتا ہے، Safe سے نہیں)۔ سیشن کھولتے وقت ایک بار دستخط کیا جاتا ہے تاکہ ایک نئی پراکسی ٹریڈنگ کلید کو اجازت مل جائے۔ اس کے بعد ہر آرڈر پر یہی کلید دستخط کرتی ہے، اس لیے فنڈز والی آپ کی کلید کبھی ٹریڈ نہیں کرتی۔ سیشن بعد میں دوبارہ شروع کرنے کے لیے session.credentials کو انکرپٹ کر کے محفوظ رکھیں۔

import asyncio
import os
from datetime import timedelta

from polymarket import AsyncSecureClient


async def main():
    client = await AsyncSecureClient.create(
        private_key=os.environ["PRIVATE_KEY"],
        wallet=os.environ["POLYMARKET_WALLET_ADDRESS"],
    )
    # One signature creates a proxy trading key. Orders are signed by the proxy,
    # not by your wallet key. Credentials expire after one week by default.
    session = await client.open_perps_session(
        expires_in=timedelta(days=1),
        label="perps-bot",
    )
    stored = session.credentials.model_dump(mode="json")  # keep it encrypted

    instruments = await client.fetch_perps_instruments()
    btc = next(i for i in instruments if i.symbol == "BTC-USD")
    print(btc.id, btc.max_leverage, btc.min_notional, btc.price_decimals)


asyncio.run(main())
import { createSecureClient } from "@polymarket/client";
import { privateKey } from "@polymarket/client/viem";

const client = await createSecureClient({
  wallet: process.env.POLYMARKET_WALLET_ADDRESS!,
  signer: privateKey(process.env.PRIVATE_KEY!),
});

// One signature creates a proxy trading key. Orders are signed by the proxy,
// not by your wallet key. Credentials expire after one week by default.
const session = await client.openPerpsSession({
  expiresIn: 24 * 60 * 60 * 1000,
  label: "perps-bot",
});
const stored = session.credentials; // keep it encrypted

const instruments = await client.fetchPerpsInstruments();
const btc = instruments.find((i) => i.symbol === "BTC-USD");
if (!btc) throw new Error("BTC-USD not listed");
console.log(btc.id, btc.maxLeverage, btc.minNotional, btc.priceDecimals);

کوڈ سے ڈپازٹ کرنے (deposit_to_perps / depositToPerps) کے لیے polymarket.com کی Settings میں API Keys سے ایک Relayer API کلید بھی درکار ہے۔ زیادہ آسان اور محفوظ طریقہ یہ ہے کہ ویب ایپ میں اکاؤنٹ میں رقم جمع کریں اور بوٹ کو رقم کی منتقلی سے دور رکھیں۔ 5 نومبر 2026 سے، جن اکاؤنٹس میں ودڈرال ایڈریس بک فعال ہے وہ صرف محفوظ کیے گئے ایڈریسز پر ہی رقم نکال سکتے ہیں۔ ڈیش بورڈز کے لیے ریڈ اونلی کلید استعمال کریں (ایسی پراکسی جس کا لیبل read-only: ہو اور جو دستخط شدہ رائٹس کو مسترد کرتی ہے)۔ ڈیش بورڈز پر ٹریڈنگ کلید کبھی استعمال نہ کریں۔ کلید کو محفوظ رکھنے کا طریقہ ہمارے والیٹس اور تصدیق والے باب میں بیان کیا گیا ہے۔

مرحلہ 2: REST اور WebSocket پر مارکیٹ ڈیٹا پڑھیں

ٹکر میں تین قیمتیں ہوتی ہیں: انڈیکس (Pyth، Chainlink Data Streams اور Hyperliquid جیسے فیڈز سے نکالی گئی منصفانہ قدر)، مارک (PnL، مارجن، لیکویڈیشن اور TP/SL کے لیے استعمال ہوتی ہے) اور لاسٹ (صرف ایگزیکیوشن کے لیے)۔ ان کے علاوہ فنڈنگ ریٹ اور اگلی فنڈنگ کا وقت بھی ہوتا ہے۔ اپنے سگنلز کی بنیاد مارک یا انڈیکس پر رکھیں۔

# Inside your async main(), after Step 1 (btc is the BTC-USD instrument)
from polymarket import AsyncPublicClient
from polymarket.streams import PerpsBboSpec

client = AsyncPublicClient()

ticker = await client.fetch_perps_ticker(instrument_id=btc.id)
print(ticker.mark_price, ticker.index_price, ticker.funding_rate)

stream = await client.subscribe(PerpsBboSpec(instrument_id=btc.id))
async for event in stream:
    print(event.payload.bid_price, event.payload.ask_price)
// After Step 1 (btc is the BTC-USD instrument)
import { createPublicClient } from "@polymarket/client";

const client = createPublicClient();

const ticker = await client.fetchPerpsTicker({ instrumentId: btc.id });
console.log(ticker.markPrice, ticker.indexPrice, ticker.fundingRate);

const stream = await client.subscribe([{ topic: "perps.bbo", instrumentId: btc.id }]);
for await (const event of stream) {
  console.log(event.payload.bidPrice, event.payload.askPrice);
}

SDK کے بغیر خام WebSocket پر {"id": 1, "req": "sub", "chs": ["bbo::6"]} سے سبسکرائب کریں۔ دستیاب چینلز میں bbo::<id>، book::<id>، trades::<id>، tickers::<id> اور klines::<id>::1m شامل ہیں۔ ہر اپ ڈیٹ کے ساتھ ایک سیکوئنس نمبر sq آتا ہے۔ سلسلے میں خلا آنے یا دوبارہ کنکشن کے بعد، اسٹیٹ REST کے ذریعے دوبارہ پڑھیں۔ بیک ٹیسٹس کے لیے list_perps_candles / listPerpsCandles ہسٹری کو صفحات میں لاتا ہے (REST اینڈ پوائنٹ ہر کال میں زیادہ سے زیادہ 1,000 کینڈلز واپس کرتا ہے)۔

مرحلہ 3: ٹیک پرافٹ اور اسٹاپ لاس کے ساتھ آرڈرز دیں

ہر آرڈر میں یہ چیزیں ہوتی ہیں: ایک side (BUY یا SELL)، بیس ایسٹ کی اکائیوں میں quantity، pUSD میں اختیاری price، اور ٹائم ان فورس (gtc، ioc یا fok)۔ Post-only کے لیے GTC ضروری ہے، اور reduce-only صرف پوزیشن کو چھوٹا کر سکتا ہے۔ لانگ یا شارٹ کا کوئی الگ فلیگ نہیں ہوتا۔ جب کوئی پوزیشن نہ ہو تو BUY لانگ کھولتا ہے اور SELL شارٹ کھولتا ہے۔

بریکٹ آرڈر انٹری کے ساتھ ایک ٹیک پرافٹ اور ایک اسٹاپ لاس جوڑ دیتا ہے۔ جب تک انٹری پوری طرح مکمل نہ ہو جائے، یہ دونوں غیر فعال رہتے ہیں۔ اگر انٹری منسوخ ہو جائے یا صرف جزوی طور پر مکمل ہو تو یہ بھی منسوخ ہو جاتے ہیں۔ نیچے دی گئی قیمتیں فرضی ہیں۔

# Inside your async main(), after Step 1 (btc is the BTC-USD instrument)
from polymarket import PerpsTpSlTrigger

result = await session.place_order(
    instrument_id=btc.id,
    side="BUY",
    price="100000",
    quantity="0.01",
    time_in_force="gtc",
    take_profit=PerpsTpSlTrigger(trigger_price="104000"),
    stop_loss=PerpsTpSlTrigger(trigger_price="98000"),
)
print(result.order.id, result.order.status)
// After Step 1 (btc is the BTC-USD instrument)
import { OrderSide, PerpsTimeInForce } from "@polymarket/client";

const result = await session.placeOrder({
  instrumentId: btc.id,
  side: OrderSide.BUY,
  price: "100000",
  quantity: "0.01",
  timeInForce: PerpsTimeInForce.GTC,
  takeProfit: { triggerPrice: "104000" },
  stopLoss: { triggerPrice: "98000" },
});
console.log(result.order.id, result.tpSl.stopLoss?.orderId);

کھلی پوزیشن کے لیے place_position_tp_sl / placePositionTpSl ایسے ٹرگرز لگاتا ہے جو پوری پوزیشن بند کر دیتے ہیں۔ قواعد یہ ہیں:

  • ٹرگرز مارک قیمت پر نظر رکھتے ہیں اور reduce-only آرڈر بھیجتے ہیں۔ پوزیشن TP/SL مارکیٹ قیمت پر باہر نکلتا ہے، اس لیے کم گہرائی والی آرڈر بکس میں سلپیج کی توقع رکھیں۔
  • ہر مارکیٹ میں صرف ایک پوزیشن ٹیک پرافٹ اور ایک اسٹاپ لاس لگ سکتا ہے۔ اسٹاپ منتقل کرنے کے لیے پہلے اسے منسوخ کر کے پھر نیا بنانا پڑتا ہے، اور یہ دونوں کام ایک ہی ایٹمک عمل میں نہیں ہوتے۔
  • جس ٹرگر کو مارک قیمت پہلے ہی عبور کر چکی ہو وہ مسترد ہو جاتا ہے، اور مارک قیمت سے بہت دور کی لمیٹ قیمتیں بھی قبول نہیں کی جاتیں۔

آرڈر کے عمل کو خودکار بنانے سے پہلے ہاتھ سے آزمانا چاہیں تو پولی مارکیٹ Perps پر BTC مارکیٹ کھولیں اور سب سے چھوٹا اجازت شدہ آرڈر دیں۔ مکمل ہونے والے آرڈرز، فیس اور پوزیشن پینل دیکھ لینے کے بعد API کے جوابات سمجھنا آسان ہو جاتا ہے۔

مرحلہ 4: کوڈ میں رسک کنٹرولز کے ساتھ بوٹ کا ڈھانچہ

نیچے دیے گئے Python ڈھانچے میں صرف دستاویزات میں موجود SDK کالز استعمال ہوئی ہیں، جبکہ رسک کی منطق ہماری اپنی ہے۔ اس میں تحفظ کی تین تہیں ہیں:

  1. لیوریج کی حد۔ لیوریج آئسولیٹڈ مارجن کے ساتھ 3x یا مارکیٹ کی زیادہ سے زیادہ حد پر سیٹ کیا جاتا ہے، ان میں سے جو بھی کم ہو۔ جو سائز کم حد والے رسک درجے میں آتے ہوں انہیں مسترد کر دیا جاتا ہے۔
  2. کِل سوئچز۔ ایک HALT فائل، 5% کی یومیہ نقصان کی حد، اور لیکویڈیشن کی صورت میں اخراج۔ سوئچ reduce-only IOC آرڈرز سے پوزیشنز بند کرتا ہے، باقی آرڈرز منسوخ کرتا ہے، اور پھر جانچتا ہے کہ پوزیشنز اور آرڈرز دونوں ختم ہو گئے ہیں۔
  3. ہر پوزیشن پر اسٹاپ۔ Fill-or-kill انٹریز کی وجہ سے کوئی غیر محفوظ جزوی تکمیل نہیں ہوتی۔ ہر تکمیل کے بعد پوزیشن پر اسٹاپ اور ٹیک پرافٹ لگایا جاتا ہے۔ اگر یہ مسترد ہو جائیں تو پوزیشن فوراً بند کر دی جاتی ہے۔
import asyncio
import logging
import os
from datetime import timedelta
from decimal import Decimal, ROUND_DOWN

from polymarket import AsyncSecureClient, PerpsPositionTpSlTrigger

SYMBOL = "BTC-USD"                   # live API symbol; docs examples say "BTC-PERP"
LEVERAGE_CAP = 3                     # our cap, far below the 50x BTC allows
RISK_PER_TRADE = Decimal("20")       # pUSD we accept losing if the stop fills
STOP_PCT = Decimal("0.02")           # stop 2% from entry
TAKE_PCT = Decimal("0.04")           # take profit 4% from entry
MAX_NOTIONAL = Decimal("2000")       # hard cap per position, in pUSD
MAX_SLIPPAGE = Decimal("0.002")      # worst entry price: ask + 0.2%
MAX_FUNDING = Decimal("0.0005")      # skip longs if funding > 0.05% per hour
DAILY_LOSS_LIMIT = Decimal("0.05")   # kill switch at -5% of start equity
HALT_FILE = "/opt/perps-bot/HALT"    # touch this file to stop the bot


def fit(value: Decimal, decimals: int, sig: int = 5) -> str:
    """Round down to the market's decimals and to 5 significant figures."""
    v = value.quantize(Decimal(1).scaleb(-decimals), rounding=ROUND_DOWN)
    if v != 0:
        step = Decimal(1).scaleb(v.adjusted() - sig + 1)
        if step > Decimal(1).scaleb(-decimals):
            v = v.quantize(step, rounding=ROUND_DOWN)
    return format(v, "f")


def tier_cap(inst, notional: Decimal) -> int:
    """Max leverage allowed for this notional by the market's risk tiers."""
    cap = inst.max_leverage
    for tier in inst.risk_tiers:
        if notional >= Decimal(tier.lower_bound):
            cap = tier.max_leverage
    return cap


async def close_all(session):
    """Close every position with reduce-only IOC orders, then cancel the rest."""
    portfolio = await session.fetch_portfolio()
    for pos in portfolio.positions:
        if pos.size != 0:
            await session.place_order(
                instrument_id=pos.instrument_id,
                side="SELL" if pos.size > 0 else "BUY",
                quantity=abs(pos.size),
                time_in_force="ioc",
                reduce_only=True,
            )
    await session.cancel_all_orders()


async def kill_switch(session, reason: str):
    logging.error("KILL SWITCH: %s", reason)
    for attempt in range(3):
        await close_all(session)
        portfolio = await session.fetch_portfolio()
        open_orders = await session.fetch_open_orders()
        if not open_orders and all(p.size == 0 for p in portfolio.positions):
            return
        await asyncio.sleep(2)
    logging.critical("Positions still open after kill switch: act manually")


async def open_long(client, session, inst):
    ticker = await client.fetch_perps_ticker(instrument_id=inst.id)
    if Decimal(ticker.funding_rate) > MAX_FUNDING:
        return                                     # longs would pay too much
    book = await client.fetch_perps_book(instrument_id=inst.id, depth=10)
    if not book.asks:
        return
    ask = Decimal(book.asks[0].price)
    stop = ask * (1 - STOP_PCT)
    qty = RISK_PER_TRADE / (ask - stop)            # size from the stop, not leverage
    qty = min(qty, MAX_NOTIONAL / ask)
    notional = qty * ask
    if notional < Decimal(inst.min_notional):
        return
    if tier_cap(inst, notional) < LEVERAGE_CAP:
        return                                     # size would break our cap

    entry = await session.place_order(
        instrument_id=inst.id,
        side="BUY",
        price=fit(ask * (1 + MAX_SLIPPAGE), inst.price_decimals),
        quantity=fit(qty, inst.quantity_decimals),
        time_in_force="fok",                       # all or nothing
    )
    if entry.order.status != "filled":
        return

    try:                                           # stop on the whole position
        await session.place_position_tp_sl(
            instrument_id=inst.id,
            take_profit=PerpsPositionTpSlTrigger(
                trigger_price=fit(ask * (1 + TAKE_PCT), inst.price_decimals)),
            stop_loss=PerpsPositionTpSlTrigger(
                trigger_price=fit(stop, inst.price_decimals)),
        )
    except Exception:
        logging.exception("TP/SL rejected: closing the unprotected position")
        await close_all(session)


async def my_signal(client, inst) -> bool:
    """PLACEHOLDER: your strategy goes here. Not part of the SDK."""
    return False


async def main():
    logging.basicConfig(level=logging.INFO)
    client = await AsyncSecureClient.create(
        private_key=os.environ["PRIVATE_KEY"],
        wallet=os.environ["POLYMARKET_WALLET_ADDRESS"],
    )
    session = await client.open_perps_session(
        expires_in=timedelta(days=1), label="perps-bot")
    inst = next(i for i in await client.fetch_perps_instruments()
                if i.symbol == SYMBOL)

    # Control 1: leverage cap and isolated margin, set before any order
    await session.update_leverage(
        instrument_id=inst.id,
        leverage=min(LEVERAGE_CAP, inst.max_leverage),
        cross_margin=False,
    )

    # Field names below follow the documented portfolio JSON
    # (margin.total_account_value, in_liquidation). Check them in your SDK.
    start_equity = Decimal((await session.fetch_portfolio()).margin.total_account_value)

    while True:
        portfolio = await session.fetch_portfolio()
        equity = Decimal(portfolio.margin.total_account_value)

        # Control 2: kill switches
        if os.path.exists(HALT_FILE):
            await kill_switch(session, "HALT file found")
            break
        if equity < start_equity * (1 - DAILY_LOSS_LIMIT):
            await kill_switch(session, f"daily loss limit hit: {equity}")
            break
        if portfolio.in_liquidation:
            await kill_switch(session, "account in liquidation")
            break

        in_position = any(p.instrument_id == inst.id and p.size != 0
                          for p in portfolio.positions)
        if not in_position and await my_signal(client, inst):
            await open_long(client, session, inst)   # Control 3 lives here

        await asyncio.sleep(5)


asyncio.run(main())

سائز کا حساب۔ سائز اسٹاپ کے فاصلے سے طے ہوتا ہے، لیوریج سے نہیں۔ فرض کریں BTC کی فروخت قیمت 100,000 pUSD ہے اور اسٹاپ 2% پر ہے، تو اسٹاپ 98,000 پر ہوگا۔ فی یونٹ رسک 2,000 ہے، اس لیے مقدار 20 / 2,000 = 0.01 BTC بنتی ہے، یعنی 1,000 pUSD کی نوشنل مالیت۔ 3x پر اس کے لیے تقریباً 333 pUSD مارجن درکار ہے۔ BTC کی مینٹیننس مارجن ریٹ 1% (0.5 / 50x) ہے، اس لیے لانگ کی لیکویڈیشن قیمت 100,000 x (1 - 1/3) / (1 - 0.01) = تقریباً 67,340 بنتی ہے، یعنی 32.7% کی گراوٹ۔ -2% والا اسٹاپ اس سے بہت پہلے چل جاتا ہے۔ اگر اسٹاپ اپنی ٹرگر قیمت پر مکمل ہو تو نقصان 20 pUSD کے ساتھ فیس ہوگا۔ 0.040% ٹیکر ریٹ پر پوزیشن کھولنے کی فیس 0.40 اور بند کرنے کی تقریباً 0.39 ہے، اس لیے سلپیج سے پہلے کل نقصان تقریباً 20.79 pUSD بنتا ہے۔ لیوریج صرف یہ طے کرتا ہے کہ کتنا مارجن بندھا رہے گا۔ اس سے اسٹاپ پر ہونے والا نقصان نہیں بدلتا۔

لائیو جانے سے پہلے یہ چیزیں شامل کریں: یومیہ ٹریڈز کی حد، مکمل ہونے والے آرڈرز اور کِل سوئچز پر الرٹس، اور اسٹارٹ اپ پر مطابقت کی جانچ (fetch_portfolio، fetch_open_orders، fetch_orders، list_fills)۔ مزید کے لیے ہمارے رسک کوڈ اور پیپر ٹریڈنگ والے ابواب، Perps لیوریج اور لیکویڈیشن گائیڈ اور Perps فنڈنگ ریٹس گائیڈ دیکھیں۔

غلطیاں، دوبارہ کوششیں اور ڈیڈ مینز سوئچ

  • 503 service_unavailable کا مطلب یہ نہیں کہ درخواست یقینی طور پر ناکام ہو گئی۔ ریڈز اور لیوریج کی تبدیلیوں کو بیک آف کے ساتھ دوبارہ بھیجیں اور Retry-After کی پابندی کریں۔ دستخط شدہ بیلنس تبدیلیوں (مارجن، رقم نکلوانا) کے لیے صرف وہی اصل دستخط شدہ درخواست دوبارہ بھیجیں، کیونکہ نیا دستخط ایک دوسری ایڈجسٹمنٹ شمار ہوگا۔
  • signature expired: دستخط 5 منٹ سے پرانا ہے۔ سسٹم کی گھڑی ہم آہنگ رکھیں۔
  • insufficient_margin / invalid_leverage: یہ جانچ آپ کی پوزیشن کے ساتھ تمام زیر التوا آرڈرز کو بھی شامل کرتی ہے۔
  • message_rate_limited: WebSocket کا بجٹ ختم ہو گیا ہے۔ ریڈ اونلی کلیدوں کو فی IP فی منٹ 1,000 پیغامات (برسٹ 50) ملتے ہیں، اور فی اکاؤنٹ فی گیٹ وے چار کنکشنز۔ باقی حدود کے لیے دستاویزات کا Rate Limits صفحہ دیکھیں۔
  • فارمیٹ کی غلطیاں: اعشاریہ مقامات بہت زیادہ ہیں یا 5 سے زیادہ اہم ہندسے ہیں۔ اسی لیے fit() استعمال کیا گیا ہے۔

اگر آپ کا بوٹ آٹو کینسل کو دوبارہ فعال کرنا بند کر دے تو یہ ہر کھلا آرڈر منسوخ کر دیتا ہے۔ ڈیڈ لائن کم از کم 5 سیکنڈ آگے ہونی چاہیے، اور ہر UTC دن میں ٹرگرز کی تعداد محدود ہے، اس لیے بوٹ کو صاف طریقے سے بند کرتے وقت اسے غیر فعال کر دیں۔

// For quoting bots: cancel all resting orders if this process dies
await session.armAutoCancel({ cancelAt: Date.now() + 60_000 });
const rearm = setInterval(() => {
  // A missed re-arm is fail-safe: the armed switch still fires.
  session.armAutoCancel({ cancelAt: Date.now() + 60_000 }).catch(console.error);
}, 20_000);

// On a clean shutdown
clearInterval(rearm);
await session.disarmAutoCancel();
آٹو کینسل اور اسٹاپس۔ دستاویزات کے مطابق آٹو کینسل بھی TP/SL آرڈر کے منسوخ ہونے کی ایک وجہ ہے، اس لیے کریش کی صورت میں کھلی پوزیشن کا اسٹاپ ہٹ سکتا ہے۔ آٹو کینسل کوٹنگ بوٹس، جیسے مارکیٹ میکرز، کے لیے موزوں ہے۔ ہمارے ڈھانچے میں کوئی زیر التوا انٹری نہیں ہوتی، اس لیے اسٹاپس کو برقرار رکھنے کے لیے اس میں آٹو کینسل بند رکھا گیا ہے۔ دونوں صورتوں میں کریش ہونے والے بوٹ کو لیکویڈیشن سے کم لیوریج ہی بچاتا ہے۔

مقابلے، بلڈر کوڈز اور بوٹس کے قواعد

دستاویزات API کے استعمالات میں "مارکیٹ سگنلز پر ردعمل دینے والے ٹریڈنگ بوٹس" اور مارکیٹ میکرز کا ذکر کرتی ہیں۔ یہاں قواعد کے دو مجموعے لاگو ہوتے ہیں۔

  • مقابلے۔ واش ٹریڈنگ، سیلف ٹریڈنگ، متعدد اکاؤنٹس، بنیادی طور پر حجم بڑھانے کے لیے ٹریڈنگ، اور "پروگرام میں ہیرا پھیری کے لیے بنائے گئے بوٹس، اسکرپٹس یا خودکار ذرائع" ممنوع ہیں۔ جو بوٹ حقیقی ٹریڈنگ کرتا ہے اس میں کوئی مسئلہ نہیں، لیکن صرف حجم بڑھانے والا بوٹ نااہل قرار دیا جا سکتا ہے۔
  • بلڈر کوڈز۔ دوسرے صارفین کے لیے ٹریڈ کرنے والی ایپ ہر ٹریڈر کی منظوری سے زیادہ سے زیادہ 10 بیسس پوائنٹس کی فیس شامل کر سکتی ہے۔ ایپ کو ہر صارف کے مقام کی تصدیق کرنی ہوگی اور محدود دائرہ اختیار سے آنے والے آرڈرز بلاک کرنے ہوں گے۔ صرف انتباہ دینا کافی نہیں۔

میکر لیکویڈیٹی انعامات اور مقابلوں کی تفصیل پولی مارکیٹ Perps گائیڈ میں دی گئی ہے۔

بوٹ کی ہوسٹنگ

لیوریج والا بوٹ لیپ ٹاپ پر نہیں چلانا چاہیے۔ اسے اپنا WebSocket کنکشن مسلسل زندہ رکھنا ہوتا ہے، مکمل ہونے والے آرڈرز پر سیکنڈوں میں ردعمل دینا ہوتا ہے، اور گھر کا انٹرنیٹ بند ہونے پر بھی چلتے رہنا ہوتا ہے۔ اسے VPS پر systemd کے تحت خودکار ری اسٹارٹ کے ساتھ چلائیں۔ کلید ایسی environment فائل میں رکھیں جسے صرف بوٹ والا یوزر پڑھ سکے، اور سسٹم کی گھڑی ہم آہنگ رکھیں۔ محدود مقامات سے آرڈر دینے کی اجازت نہیں ہے، اس لیے بوٹ امریکہ یا کینیڈا میں ہوسٹ نہ کریں، اور اپنے اوپر لاگو پابندی سے بچنے کے لیے کبھی VPS استعمال نہ کریں۔ ہم اپنے بوٹس TradingVPS پر چلاتے ہیں (ایفیلیئیٹ لنک: ہمیں ایک چھوٹا کمیشن ملتا ہے اور آپ کو وہی قیمت ادا کرنی پڑتی ہے)۔ ہمارے VPS ہوسٹنگ والے باب میں لیٹنسی، قیمت اور علاقوں کے لحاظ سے اس کا دوسرے فراہم کنندگان سے موازنہ کیا گیا ہے۔

پیپر ٹریڈنگ کے بعد پولی مارکیٹ Perps صفحے سے اکاؤنٹ میں تھوڑی رقم جمع کریں۔ سائز بڑھانے سے پہلے بوٹ کو ایک ہفتے تک کم سے کم سائز پر چلائیں۔

اہم نکات

  • آفیشل SDKs استعمال کریں: @polymarket/client یا polymarket-client۔ آپ کا والیٹ صرف ایک بار دستخط کرتا ہے، اور آرڈرز پر پراکسی کلید دستخط کرتی ہے۔
  • مارکیٹس کو لائیو سمبل (BTC-USD، نہ کہ BTC-PERP) سے پہچانیں اور ان کا عددی ID محفوظ کریں۔
  • سائز اسٹاپ کے فاصلے سے طے کریں، لیوریج کی حد کوڈ میں رکھیں، آئسولیٹڈ مارجن استعمال کریں، اور ہر پوزیشن پر آرڈر مکمل ہوتے ہی اسٹاپ لگائیں۔
  • TP/SL مارک قیمت پر ٹرگر ہوتا ہے اور مارکیٹ قیمت پر باہر نکلتا ہے۔ آٹو کینسل اسٹاپس کو ہٹا سکتا ہے۔
  • بوٹس کی اجازت ہے، لیکن مقابلوں میں ہیرا پھیری کی اجازت نہیں۔ کسی محدود ملک سے کبھی ٹریڈ نہ کریں۔

اکثر پوچھے جانے والے سوالات

کیا پولی مارکیٹ Perps کے پاس ٹریڈنگ بوٹس کے لیے API ہے؟
جی ہاں۔ api.perpetuals.polymarket.com پر ایک REST API اور ws.perpetuals.polymarket.com پر ایک WebSocket موجود ہے۔ آفیشل SDKs بھی دستیاب ہیں: TypeScript کے لیے @polymarket/client اور Python کے لیے polymarket-client۔ پولی مارکیٹ کی دستاویزات میں ٹریڈنگ بوٹس اور مارکیٹ میکنگ سسٹمز کو API کے معاون استعمالات میں شامل کیا گیا ہے۔
مجھے TypeScript SDK استعمال کرنا چاہیے یا Python SDK؟
کوئی بھی۔ دونوں میں ایک ہی طریقہ کار ہے: محفوظ کلائنٹ بنائیں، Perps سیشن کھولیں، انسٹرومنٹس حاصل کریں، TP/SL کے ساتھ آرڈرز دیں، اور ایونٹس اسٹریم کریں۔ TypeScript SDK دستخط کے لیے viem استعمال کرتا ہے، اور Python SDK async ہے۔ وہی زبان چنیں جس میں آپ کا بوٹ پہلے سے لکھا ہوا ہے۔
کیا میرے بوٹ کو میرے مرکزی والیٹ کی پرائیویٹ کلید درکار ہے؟
صرف سیشن کھولنے کے لیے۔ وہ ایک دستخط ایک پراکسی ٹریڈنگ کلید کو اجازت دیتا ہے، اور اس کے بعد آرڈرز پر پراکسی ہی دستخط کرتی ہے۔ سیشن کریڈینشلز بطور ڈیفالٹ ایک ہفتے بعد ختم ہو جاتے ہیں۔ انہیں انکرپٹ کر کے محفوظ کریں اور ڈیش بورڈز کے لیے ریڈ اونلی کلیدیں استعمال کریں۔
Perps API کے ذریعے اسٹاپ لاس کیسے سیٹ کیا جاتا ہے؟
انٹری آرڈر کے ساتھ takeProfit اور stopLoss ٹرگرز بریکٹ کی صورت میں جوڑ دیں، یا کھلی پوزیشن پر placePositionTpSl (Python میں place_position_tp_sl) کال کریں۔ ٹرگرز مارک قیمت پر نظر رکھتے ہیں اور reduce-only آرڈر کے ذریعے باہر نکلتے ہیں۔ پوزیشن TP/SL پوری پوزیشن کو مارکیٹ قیمت پر بند کرتا ہے۔
پولی مارکیٹ Perps پر کم از کم آرڈر سائز کیا ہے؟
ہر آرڈر کی کم از کم نوشنل مالیت $10 ہے، اور کم از کم ڈپازٹ 10 pUSD ہے (نومبر 2026 تک)۔ قیمتیں اور سائز ہر مارکیٹ کے اعشاریہ مقامات کے مطابق ہونے چاہئیں اور ان میں 5 سے زیادہ اہم ہندسے نہیں ہونے چاہئیں، ورنہ آرڈر مسترد ہو جاتا ہے۔
کیا کوئی کِل سوئچ یا ڈیڈ مینز سوئچ موجود ہے؟
جی ہاں۔ اگر آپ کا بوٹ آٹو کینسل کو دوبارہ فعال کرنا بند کر دے تو یہ ہر کھلا آرڈر منسوخ کر دیتا ہے، اور cancelAllOrders سے آپ جب چاہیں تمام آرڈرز ختم کر سکتے ہیں۔ دستاویزات کے مطابق آٹو کینسل بھی TP/SL آرڈر کے منسوخ ہونے کی ایک وجہ ہے، اس لیے کریش کی صورت میں آپ کے اسٹاپس بھی ہٹ سکتے ہیں۔ اپنا کِل سوئچ بھی خود کوڈ کریں۔
کیا میں امریکہ یا کینیڈا سے پولی مارکیٹ Perps بوٹ چلا سکتا ہوں؟
نہیں۔ امریکہ، کینیڈا، کیوبا، ایران، شمالی کوریا، شام، کریمیا، ڈونیٹسک یا لوہانسک سے Perps پر آرڈر دینے کی اجازت نہیں ہے۔ وہاں بوٹ ہوسٹ نہ کریں، اور اپنے اوپر لاگو پابندی سے بچنے کے لیے VPS یا VPN استعمال نہ کریں۔
کیا پولی مارکیٹ Perps کے ٹریڈنگ مقابلوں میں بوٹس کی اجازت ہے؟
بوٹ کے ذریعے ٹریڈنگ کی اجازت ہے۔ مقابلے کے قواعد کے تحت واش ٹریڈنگ، سیلف ٹریڈنگ، متعدد اکاؤنٹس، بنیادی طور پر حجم بڑھانے کے لیے ٹریڈنگ، اور پروگرام میں ہیرا پھیری کے لیے بنائے گئے بوٹس یا اسکرپٹس ممنوع ہیں۔ ان قواعد کی خلاف ورزی پر نااہلی ہو سکتی ہے۔