آموزش Polymarket Bot · فصل 20 از 32
بهصورت programmatic کیفپولهای whale در Polymarket را track کنید و از top performers copy-trade بگیرید: کیفپولهای سودآور را از طریق leaderboard و on-chain analysis شناسایی کنید و tradeهای آنها را با قوانین size و timing mirror کنید.
این فصل چه چیزهایی را پوشش میدهد
کپیکردن کیفپولهای برنده در Polymarket ایده محبوبی است، اما whaleهای واقعی در Polymarket عمدتاً در حال انجام late-window arb روی markets حلشده هستند، نه directional bets. این فصل، research صادقانه از on-chain analysis است: کدام کیفپولها واقعاً ارزش copy کردن دارند، چرا بیشترشان ارزشش را ندارند، و math مربوط به position-sizing.
- شناسایی کیفپولهای سودآور
- تشخیص trade روی chain
- Position sizing نسبت به whale
- Latency: چقدر دیر، زیادی دیر است
- Filters: فقط walletهایی را follow کنید که verified edge دارند
- Code: تشخیص whale buy event، ثبت copy با size مناسب
شناسایی کیفپولهای سودآور
فرض اصلی whale-copying این است که برخی کیفپولها consistently سودآور هستند و copy کردن entryهای آنها بخشی از edgeشان را capture میکند. On-chain analysis از top walletهای Polymarket در سالهای 2025-26 نتیجهای واقعبینانهتر نشان داد: بیشتر whaleهای قابلمشاهده در حال انجام arbitrage در انتهای window روی markets حلشده هستند، نه directional trading.
Profileای که برای سه کیفپول whale candidate اندازهگیری کردیم:
- "hhhhhh6" (98.5% win rate, $n M volume) - 88% از entryها با قیمتهای ≥0.95، median entry timestamp برابر 226s از یک window 300s. صرفاً tail-yield arb، نه directional.
- "anonymous" (20% win rate) - gambler از نوع degenerate. Copy کردنش باعث ضرر میشود.
- "Jkim123" (53.5% win rate) - coin-flip. سیگنال ارزشمند برای copy کردن نیست.
0% از tradeهای این whaleها در 120 ثانیه اول هیچ window پنجدقیقهای رخ دادهاند. سیگنال predictive (اگر اصلاً وجود داشته باشد) از entryهای بزرگ در EARLY-window میآید - اما آن walletها همانهایی نیستند که در top leaderboard قرار دارند، چون کار سختی است.
تشخیص trade روی chain
تشخیص tradeهای wallet هدف نیازمند polling کردن data-api Polymarket یا subscribe شدن به on-chain CTF transfer eventهاست. گزینه data-api سادهتر است.
def watch_wallet(wallet_addr, last_seen_ts=0):
while True:
url = f"https://data-api.polymarket.com/activity?user={wallet_addr}&limit=100"
events = requests.get(url).json()
for ev in events:
ts = int(ev.get("timestamp", 0))
if ts <= last_seen_ts: continue
if ev["type"] == "TRADE":
process_whale_trade(ev)
last_seen_ts = max(last_seen_ts, ts)
time.sleep(5)
Polling با فاصله پنج ثانیه، کف عملی برای data-api است. پایینتر از این، rate limit میخورید. برای تشخیص زیرثانیهای، باید به on-chain ERC-1155 TransferSingle eventها از contract CTF subscribe شوید و آنها را با proxy address whale filter کنید.
Position sizing نسبت به whale
اگر copy خود را بهصورت یک fraction ثابت از trade whale size کنید، profile ریسک آنها را به ارث میبرید. دو alternative عملی وجود دارد.
- Cap-based: هر copy را به یک مبلغ ثابت دلاری ($10-50) size کنید، فارغ از اندازه whale. برای compound کردن کند است، اما loss هر trade محدود میماند.
- Win-rate-weighted: copy size را تابع win rate اخیر whale قرار دهید. win rate بالای 60% → copy با full-size؛ 40-60% → half-size؛ زیر 40% → skip.
رویکرد cap-based، انتخاب امنتر برای first deploy است. فقط بعد از اینکه win rate واقعی whale را روی copyهای خودتان اندازهگیری کردید، به سراغ win-rate-weighted بروید (که معمولاً از عدد headline آنها بدتر است، چون شما دیر میرسید).
Latency: چقدر دیر، زیادی دیر است
Trade whale ظرف 1-2 ثانیه پس از اجرا بهصورت public قابل مشاهده است. Copy کردن آن نیاز به latency سریعتر از این در سمت read دارد، بهعلاوه latency خودتان برای ثبت order.
End-to-end برای یک copy bot معمولی: polling پنج تا ده ثانیه + ثبت order در 200ms = در مجموع 5-15 ثانیه. وقتی copy شما اجرا میشود، signal whale دیگر در price منعکس شده است.
برای 99% copyها، این در Polymarket و marketهای باریک آن زیادی دیر است. Entry whale mid را 1-2 cent جابهجا کرده است؛ شما نسبت به نقطه ورود آنها همان premium یک تا دو سنتی را میپردازید. اگر edge آنها 3c بوده باشد، تا زمانی که شما برسید، نیمی از آن از بین رفته است.
Copy botهایی که واقعاً کار میکنند یا (a) بازارهای slow-moving را target میکنند که latency سی ثانیهای در آنها مهم نیست، یا (b) از on-chain event subscription استفاده میکنند تا در timeframe زیرثانیه واکنش نشان دهند.
Filters: فقط walletهایی را follow کنید که verified edge دارند
قبل از اضافه کردن هر wallet به list copy، سه filter را اعمال کنید.
- 30+ closed trades در history wallet. نمونههای کوچک noise هستند.
- Lifetime win rate > 60%، یا EV مثبت بهازای هر trade بر اساس entry priceها. یکی از این دو شرط؛ هر دو بهتر است.
- Pattern نباید late-window arb باشد. median seconds-to-resolution را هنگام entry بررسی کنید؛ اگر نزدیک 0 باشد، wallet در حال انجام tail-yield arb است که شما نمیتوانید آن را بازتولید کنید.
بیشتر whaleهای candidate یکی از این سه شرط را رد میکنند. pool walletهایی که واقعاً قابل copy هستند کوچک است. نگهداری این list نیاز به recheck دورهای دارد - walletهایی که ماه گذشته سودآور بودند، ممکن است این ماه نباشند.
Code: تشخیص whale buy event، ثبت copy با size مناسب
Reference: تشخیص یک ERC-1155 TransferSingle event برای whale تحت نظر و ثبت یک buy copy با size مناسب.
from web3 import Web3
w3 = Web3(Web3.WebsocketProvider(POLYGON_WSS))
ctf = w3.eth.contract(address=CTF_ADDR, abi=CTF_ABI)
WHALES = {"0xabc...": {"fraction": 0.05, "cap": 50}}
def on_transfer(event):
to = event.args["to"].lower()
if to not in WHALES: return
cfg = WHALES[to]
token_id = event.args.id
whale_size = event.args.value / 1e6
copy_size = min(cfg["cap"], whale_size * cfg["fraction"])
if copy_size < 5: return # not worth fees
book = fetch_book(str(token_id))
if book.best_ask:
place_fok(str(token_id), "BUY", book.best_ask + 0.01, copy_size)
# subscribe to ERC-1155 TransferSingle events from CTF
filt = ctf.events.TransferSingle.create_filter(fromBlock="latest")
while True:
for ev in filt.get_new_entries(): on_transfer(ev)
time.sleep(0.5)
برای تشخیص buy از sell، from را بررسی کنید (zero address = mint = whale خریده است) در مقابل to (zero address = burn = فروخته شده است).





