পলিমার্কেট বট টিউটোরিয়াল · অধ্যায় 24 / 32

পলিমার্কেট Perps-এর একটি সম্পূর্ণ পাবলিক API আছে, সঙ্গে অফিসিয়াল TypeScript ও Python SDK। এই অধ্যায়ে আসল ইন্টারফেসের ওপর একটি বট তৈরি করা হবে। এতে থাকবে প্রক্সি ট্রেডিং কী দিয়ে অথেন্টিকেশন, 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, 2026-11-06 তারিখে পড়া)। আমাদের নিজস্ব লজিক কমেন্টে চিহ্নিত করা আছে, আর স্ট্র্যাটেজি ফাংশনটি একটি চিহ্নিত প্লেসহোল্ডার।

বট নির্মাতাদের জন্য গুরুত্বপূর্ণ সংখ্যা (নভেম্বর 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 হিসেবে সাইন করা হয়।

SDK আপনার হয়ে সাইনিং করে দেয়। এছাড়া একটি OpenAPI স্পেক (ডকুমেন্টেশন সাইটে /api-spec/perps-openapi.json) এবং WebSocket-এর জন্য একটি AsyncAPI স্পেকও আছে।

সিম্বল ডকুমেন্টেশনের উদাহরণ থেকে আলাদা। ডকুমেন্টেশনে দেখানো হয় BTC-PERP। লাইভ API ফেরত দেয় BTC-USD, SP500-USD (USA500), NAS100-USD (US100), ANT-USD ইত্যাদি। ইনস্ট্রুমেন্ট তালিকা আনুন, লাইভ symbol মিলিয়ে নিন এবং সংখ্যাসূচক id সংরক্ষণ করুন। উদাহরণ থেকে ID কপি করবেন না: লাইভে BTC হলো 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 কী-ও লাগে। আরও সহজ ও নিরাপদ উপায়: ওয়েব অ্যাপে অ্যাকাউন্টে টাকা জমা দিন এবং বটকে টাকা লেনদেন থেকে দূরে রাখুন। 2026-11-05 থেকে, উইথড্রয়াল অ্যাড্রেস বুকে থাকা অ্যাকাউন্টগুলো শুধু সংরক্ষিত অ্যাড্রেসেই উইথড্র করতে পারে। ড্যাশবোর্ডের জন্য একটি রিড-অনলি কী ব্যবহার করুন (read-only: লেবেলযুক্ত একটি প্রক্সি, যা সাইন করা রাইট প্রত্যাখ্যান করে), কখনোই ট্রেডিং কী নয়। কী সংরক্ষণের বিষয়টি আমাদের ওয়ালেট ও অথেন্টিকেশন অধ্যায়ে আলোচনা করা হয়েছে।

ধাপ 2: REST ও WebSocket-এ মার্কেট ডেটা পড়ুন

টিকারে তিনটি দাম থাকে: index (Pyth, Chainlink Data Streams ও Hyperliquid-এর মতো ফিড থেকে ন্যায্য মূল্য), mark (PnL, মার্জিন, লিকুইডেশন ও TP/SL-এর জন্য ব্যবহৃত) এবং last (শুধু এক্সিকিউশনের জন্য), সঙ্গে ফান্ডিং রেট ও পরবর্তী ফান্ডিংয়ের সময়। সিগন্যাল তৈরি করুন মার্ক প্রাইস বা ইনডেক্স প্রাইসের ওপর ভিত্তি করে।

# 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)। পোস্ট-অনলির জন্য GTC লাগে; রিডিউস-অনলি শুধু একটি পজিশন ছোট করতে পারে। লং বা শর্টের আলাদা কোনো ফ্ল্যাগ নেই: কোনো পজিশন না থাকলে 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 এমন ট্রিগার যোগ করে যা পুরো পজিশন বন্ধ করে। নিয়মগুলো:

  • ট্রিগার মার্ক প্রাইস পর্যবেক্ষণ করে এবং একটি রিডিউস-অনলি অর্ডার পাঠায়। পজিশন TP/SL মার্কেট দামে বের হয়, তাই পাতলা অর্ডার বুকে স্লিপেজ আশা করুন।
  • প্রতি মার্কেটে একটি পজিশন টেক-প্রফিট ও একটি স্টপ-লস। স্টপ সরাতে হলে আগে বাতিল করে তারপর নতুন তৈরি করতে হয়, যা অ্যাটমিক নয়।
  • মার্ক প্রাইস ইতিমধ্যে পার হয়ে গেছে এমন ট্রিগার প্রত্যাখ্যাত হয়, আর মার্ক প্রাইস থেকে অনেক দূরের লিমিট দামও গ্রহণ করা হয় না।

অটোমেট করার আগে হাতে অর্ডার প্রক্রিয়াটি চেষ্টা করতে, পলিমার্কেট Perps-এ BTC মার্কেট খুলুন এবং অনুমোদিত সবচেয়ে ছোট অর্ডারটি দিন। ফিল, ফি ও পজিশন প্যানেল নিজের চোখে দেখলে API রেসপন্স বোঝা সহজ হয়।

ধাপ 4: কোডে রিস্ক কন্ট্রোল সহ একটি বট কাঠামো

নিচের Python কাঠামোতে শুধু ডকুমেন্টেড SDK কল ব্যবহার করা হয়েছে; রিস্ক লজিকটি আমাদের। সুরক্ষার তিনটি স্তর:

  1. লিভারেজের সীমা। লিভারেজ সেট করা হয় 3x অথবা মার্কেটের সর্বোচ্চ, যেটি কম, আইসোলেটেড মার্জিন সহ, এবং যেসব সাইজ কম সীমার রিস্ক টিয়ারে পড়ে সেগুলো প্রত্যাখ্যান করা হয়।
  2. কিল সুইচ। একটি HALT ফাইল, 5% দৈনিক ক্ষতির সীমা এবং লিকুইডেশনে প্রস্থান। সুইচটি রিডিউস-অনলি IOC অর্ডার দিয়ে পজিশন বন্ধ করে, বাকি অর্ডার বাতিল করে, তারপর যাচাই করে যে দুটোই শেষ হয়েছে।
  3. প্রতিটি পজিশনে একটি স্টপ। ফিল-অর-কিল এন্ট্রি মানে অরক্ষিত আংশিক পূরণ হবে না। প্রতিটি ফিলের পর একটি পজিশন স্টপ ও টেক-প্রফিট বসানো হয়; সেগুলো প্রত্যাখ্যাত হলে পজিশনটি সঙ্গে সঙ্গে বন্ধ করা হয়।
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-এর অধীনে স্বয়ংক্রিয় রিস্টার্ট সহ চালান, কী এমন একটি এনভায়রনমেন্ট ফাইলে রাখুন যা শুধু বট ইউজার পড়তে পারে, এবং ঘড়ি সিঙ্ক করুন। নিষিদ্ধ এলাকা থেকে অর্ডার দেওয়ার অনুমতি নেই, তাই যুক্তরাষ্ট্র বা কানাডায় হোস্ট করবেন না, এবং আপনার ওপর প্রযোজ্য কোনো ব্লক এড়াতে কখনোই VPS ব্যবহার করবেন না। আমরা নিজেদের বট চালাই TradingVPS-এ (অ্যাফিলিয়েট লিংক: আমরা একটি ছোট কমিশন পাই এবং আপনার দেওয়া দাম একই থাকে)। আমাদের VPS হোস্টিং অধ্যায় লেটেন্সি, দাম ও রিজিয়নের ভিত্তিতে এটিকে অন্যান্য প্রোভাইডারের সঙ্গে তুলনা করে।

পেপার ট্রেডিংয়ের পর পলিমার্কেট Perps পেজ থেকে অল্প পরিমাণ টাকা অ্যাকাউন্টে জমা দিন এবং আকার বাড়ানোর আগে এক সপ্তাহ সর্বনিম্ন সাইজে চালান।

মূল শিক্ষা

  • অফিসিয়াল SDK ব্যবহার করুন, @polymarket/client অথবা polymarket-client। আপনার ওয়ালেট একবার সাইন করে; অর্ডার সাইন করে একটি প্রক্সি কী।
  • লাইভ সিম্বল দিয়ে মার্কেট মেলান (BTC-USD, BTC-PERP নয়) এবং সংখ্যাসূচক ID সংরক্ষণ করুন।
  • স্টপের দূরত্ব থেকে সাইজ ঠিক করুন, কোডে লিভারেজের সীমা দিন, আইসোলেটেড মার্জিন ব্যবহার করুন, এবং ফিলের ঠিক পরেই প্রতিটি পজিশনে স্টপ বসান।
  • TP/SL মার্ক প্রাইসে ট্রিগার হয় এবং মার্কেট দামে বের হয়। অটো-ক্যানসেল স্টপ মুছে দিতে পারে।
  • বট অনুমোদিত, প্রতিযোগিতায় কারসাজি নয়। কখনোই নিষিদ্ধ দেশ থেকে ট্রেড করবেন না।

সাধারণ জিজ্ঞাসা

পলিমার্কেট Perps-এ কি ট্রেডিং বটের জন্য API আছে?
হ্যাঁ। api.perpetuals.polymarket.com-এ একটি REST API, ws.perpetuals.polymarket.com-এ একটি WebSocket এবং অফিসিয়াল SDK আছে: TypeScript-এর জন্য @polymarket/client এবং Python-এর জন্য polymarket-client। পলিমার্কেটের ডকুমেন্টেশনে ট্রেডিং বট ও মার্কেট-মেকিং সিস্টেমকে সমর্থিত ব্যবহার হিসেবে উল্লেখ করা হয়েছে।
আমার কি TypeScript নাকি Python SDK ব্যবহার করা উচিত?
যেকোনোটি। দুটোই একই প্রক্রিয়া কভার করে: একটি সিকিউর ক্লায়েন্ট তৈরি, একটি Perps সেশন খোলা, ইনস্ট্রুমেন্ট আনা, TP/SL সহ অর্ডার দেওয়া এবং ইভেন্ট স্ট্রিম করা। TypeScript SDK সাইনিংয়ের জন্য viem ব্যবহার করে। Python SDK async। আপনার বট যে ভাষায় আগে থেকেই লেখা, সেটিই বেছে নিন।
আমার বটের কি মূল ওয়ালেটের প্রাইভেট কী লাগবে?
শুধু সেশন খোলার জন্য। ওই একটি সিগনেচার একটি প্রক্সি ট্রেডিং কী অনুমোদন করে, এবং এরপর থেকে প্রক্সিই অর্ডার সাইন করে। সেশন ক্রেডেনশিয়ালের মেয়াদ ডিফল্টভাবে এক সপ্তাহ পর শেষ হয়। এগুলো এনক্রিপ্ট করে সংরক্ষণ করুন এবং ড্যাশবোর্ডের জন্য রিড-অনলি কী ব্যবহার করুন।
Perps API দিয়ে কীভাবে স্টপ-লস সেট করব?
এন্ট্রি অর্ডারের সঙ্গে ব্র্যাকেট হিসেবে takeProfit ও stopLoss ট্রিগার যুক্ত করুন, অথবা খোলা পজিশনে placePositionTpSl (Python-এ place_position_tp_sl) কল করুন। ট্রিগার মার্ক প্রাইস পর্যবেক্ষণ করে এবং একটি রিডিউস-অনলি অর্ডার দিয়ে বের হয়। পজিশন TP/SL পুরো পজিশনটি মার্কেট দামে বন্ধ করে।
পলিমার্কেট Perps-এ সর্বনিম্ন অর্ডার সাইজ কত?
প্রতি অর্ডারে $10 নোশনাল, এবং সর্বনিম্ন ডিপোজিট 10 pUSD (নভেম্বর 2026 অনুযায়ী)। দাম ও সাইজকে প্রতিটি মার্কেটের দশমিক স্থানের মধ্যে এবং সর্বোচ্চ 5টি সার্থক অঙ্কের মধ্যে থাকতে হবে, নইলে অর্ডার প্রত্যাখ্যাত হয়।
কোনো কিল সুইচ বা ডেড ম্যান'স সুইচ আছে কি?
হ্যাঁ। আপনার বট পুনরায় আর্ম করা বন্ধ করলে অটো-ক্যানসেল সব খোলা অর্ডার বাতিল করে, আর cancelAllOrders চাহিদামতো অর্ডার মুছে দেয়। ডকুমেন্টেশনে অটো-ক্যানসেলকে TP/SL অর্ডার বাতিল হওয়ার একটি উপায় হিসেবে উল্লেখ করা হয়েছে, তাই ক্র্যাশ হলে আপনার স্টপও মুছে যেতে পারে। নিজের কিল সুইচও কোডে লিখুন।
যুক্তরাষ্ট্র বা কানাডা থেকে কি পলিমার্কেট Perps বট চালাতে পারি?
না। যুক্তরাষ্ট্র, কানাডা, কিউবা, ইরান, উত্তর কোরিয়া, সিরিয়া, ক্রিমিয়া, দোনেৎস্ক বা লুহানস্ক থেকে Perps-এ অর্ডার দেওয়ার অনুমতি নেই। সেখানে বট হোস্ট করবেন না, এবং আপনার ওপর প্রযোজ্য কোনো ব্লক এড়াতে VPS বা VPN ব্যবহার করবেন না।
পলিমার্কেট Perps ট্রেডিং প্রতিযোগিতায় কি বট অনুমোদিত?
বট দিয়ে ট্রেড করা অনুমোদিত। প্রতিযোগিতার নিয়মে ওয়াশ ট্রেডিং, সেলফ-ট্রেডিং, একাধিক অ্যাকাউন্ট, মূলত ভলিউম তৈরির জন্য ট্রেডিং এবং প্রোগ্রামকে প্রভাবিত করার উদ্দেশ্যে বট বা স্ক্রিপ্ট নিষিদ্ধ। এগুলো ভাঙলে অযোগ্য ঘোষণা হতে পারে।