Skip to content
→ المدونة

راقب Kalshi وPolymarket باستخدام Python

dino.markets

Kalshi وPolymarket ينشران كتالوجات ونماذج تسعير منفصلة، ولكل منهما معرِّفاته الخاصة. المراقب المفيد بين المنصتين يجب أن يتأكد أولاً من أن قائمتين تشيران إلى الادعاء نفسه قبل أن يضع سعريهما في صف واحد. تتولى Dino خطوة المطابقة هذه وتعيد كائن Market واحد يحمل سعري المنصتين معًا، لذا يمكن لبرنامج Python أن يركز على الترشيح والعرض.

يبني هذا الدرس مراقبًا صغيرًا في الطرفية باستخدام حزمة dino-markets الرسمية. يرتّب الأسواق المطابَقة المفتوحة من لقطة REST المتأخرة المتاحة في خطة Free. يضيف القسم الأخير الدفق المباشر لتلقّي التحديثات لحظة حدوثها.

ثبِّت العميل وأنشئ مفتاحًا

أنشئ مفتاح API مجاني واحفظه في متغيّر بيئة. ثم ثبِّت حزمة Python:

export DINO_API_KEY=sk_live_...
pip install dino-markets

يقرأ العميل DINO_API_KEY تلقائيًا. يجلب الطلب الأول كتالوج Market المفتوح والمباشر، مرتَّبًا حسب أكبر فارق ملاحَظ بين المنصتين:

from dino_markets import Dino

client = Dino()

catalog = client.markets(
    status="open,live",
    sort="-spread_pts",
    limit=25,
)

ranked = [
    market
    for market in catalog["markets"]
    if market["spread_pts"] is not None
]
if not ranked:
    raise SystemExit("No priced matched markets are available right now.")

print("as returned by the delayed REST snapshot")
for market in ranked:
    print(
        f'{market["spread_pts"]:>5.1f} pts  '
        f'{market["title"]:<42} '
        f'{market["category"]}/{market["market_type"]}'
    )

تبقى أسعار REST متأخرة نحو دقيقتين عن اللحظة الحية في كل خطة. هذا يجعل النتيجة مناسبة لتصفح الكتالوج والبحث. يمكنها أيضًا أن تؤسس عرضًا محليًا قبل وصول تحديثات الدفق.

اعرض سعري المنصتين على كل نتيجة

يحافظ كل Market على الشكل نفسه لـ outcomes[] عبر الفئات الرياضية وغير الرياضية. تحمل كل نتيجة سعري المنصتين معًا إضافة إلى حقل cheaper. السعر الغائب يكون None، لذا رشِّحه صراحةً قبل حساب الفارق:

def priced_outcomes(market):
    return [
        outcome
        for outcome in market["outcomes"]
        if outcome["kalshi"] is not None
        and outcome["polymarket"] is not None
    ]

for market in ranked[:10]:
    print(f'\n{market["title"]}')
    for outcome in priced_outcomes(market):
        gap = abs(outcome["kalshi"] - outcome["polymarket"]) * 100
        print(
            f'  {outcome["name"]:<24} '
            f'Kalshi {outcome["kalshi"]:.2f}  '
            f'Polymarket {outcome["polymarket"]:.2f}  '
            f'gap {gap:.1f} pts'
        )

spread_pts ملاحظة عبر نتائج Market. لا تعني أن مراجحة قابلة للتنفيذ موجودة. تعيش الـOpportunities المؤكَّدة في مورد منفصل هو client.find_arbitrage() وتحمل أرجلاً مختارة ورسومًا وحجمًا وحداثة لقطة.

راجع التسوية قبل استخدام صف

استجابة القائمة خفيفة. اسحب Market واحدًا عبر id الثابت الخاص به عندما يحتاج المراقب إلى شروط المنصة ومخاطر التسوية:

selected = ranked[0]
detail = client.market(selected["id"])

print(detail["title"], detail["match"], detail["signal"])
for risk in detail.get("settlement", {}).get("risks", []):
    print(risk["severity"], risk["event"], risk["note"])

id هو معرِّف Dino الثابت وهو المفتاح الصحيح للصفوف المخزَّنة مؤقتًا. قد يتغيّر العنوان المعروض ومعرِّفات المنصة عند إعادة تحليل قائمة. أعد سحب التفاصيل عند تغيّر updated_at كي يلتقط المراقب هويّة منقَّحة أو إفصاح تسوية جديدًا.

أضف تحديثات في الوقت الفعلي

ثبِّت اعتماديّة الدفق الاختيارية واستخدم مساعد إعادة الاتصال في الـSDK:

pip install "dino-markets[stream]"
import asyncio
from dino_markets import Dino, watch

client = Dino()

def on_publication(channel, frame):
    if frame.get("type") != "price":
        return
    print(
        channel,
        frame["id"],
        frame.get("spread_pts"),
        frame.get("priced_at"),
    )

asyncio.run(watch(client, on_publication))

يصدر المساعد تذكرة جديدة قصيرة العمر لكل محاولة اتصال ويستعيد المنشورات الأخيرة بعد انقطاع قصير. يتلقى مفتاح Free القناة المنسَّقة sample. تتلقى كل خطة مدفوعة دفق Market الكامل.

أبقِ إقلاع REST في البرنامج حتى بعد إضافة تحديثات WebSocket. فهو يمنح المراقب لقطة بداية، بينما تطبِّق أطر الدفق تغيّرات السعر الحالية على معرِّفات Market المخزَّنة تلك. يوثِّق مرجع WebSocket سلوك الاستعادة، ويغطي مرجع كائن Market كل حقل استُخدم هنا.

المراقب المكتمل يقرأ بيانات مطابَقة ويعرض فوارق الأسعار. لا يضع أوامر في أي من المنصتين. هذه بيانات لمطورين لا نصيحة تداول أو مالية. أنشئ مفتاحًا مجانيًا لتشغيل نسخة REST أولاً.

المزيد من المدونة