أرسل تنبيه Telegram في اللحظة التي يفتح فيها فارق سعري بين المنصتين
ليس كل فارق يستحق رسالة. معظم ما يعبر التغذية صغير ويُغلق من تلقاء نفسه خلال ثوانٍ، والهاتف الذي يهتز لكل ذلك يتوقف الناس عن مراجعته. يخبرك الدفق أصلاً بأي الفوارق حقيقي: لا يُضبط حقل potential_arb_pct في تحديث السعر إلا عندما تتقاطع المنصتان في مراجحة مؤكَّدة ومتحقَّق من تسويتها، لذا لا يكلّفك الترشيح عليه أي حساب إضافي. في قياساتنا الخاصة، بقيت أوسع الفوارق التي سجّلناها مفتوحة لوسيط قدره 13.7 ثانية قبل أن تُغلق، وهو أطول من الوسيط البالغ 9.2 ثانية عبر كل الفوارق، لكنه لا يزال قصيرًا جدًا لتلاحظه بمراجعة شاشة. لهذا وُجد التنبيه.
الاشتراك في التغذية المطابَقة
تدفق الاتصال هو نفسه الموضّح في مراقبة الفوارق من متصفح وتشغيل مستهلك يبقى فعّالًا: اسحب تذكرة قصيرة الأجل، ثم اتصل ومرّرها في حقل data.t بإطار الاتصال. تأتي القنوات المتاحة لك من مستوى مفتاحك، فلا توجد خطوة اشتراك منفصلة بعد الاتصال.
import json
import os
import time
import requests
import websocket
API_KEY = os.environ["DINO_API_KEY"]
TELEGRAM_TOKEN = os.environ["TELEGRAM_BOT_TOKEN"]
TELEGRAM_CHAT_ID = os.environ["TELEGRAM_CHAT_ID"]
THRESHOLD_PCT = 5.0
DEBOUNCE_SECONDS = 30
_last_sent = {}
def mint_ticket():
resp = requests.post(
"https://api.dino.markets/v1/stream/token",
headers={"Authorization": f"Bearer {API_KEY}"},
)
return resp.json()
def run():
while True:
mint = mint_ticket()
ws = websocket.create_connection(mint["ws_url"])
ws.send(json.dumps({"id": 1, "connect": {"data": {"t": mint["ticket"]}}}))
try:
while True:
# one WS frame can carry several newline-separated objects
for line in ws.recv().split("\n"):
if not line:
continue
msg = json.loads(line)
if msg == {}:
ws.send("{}") # server ping, pong straight back or the connection drops
continue
data = (msg.get("push") or {}).get("pub", {}).get("data")
if data and data.get("type") == "price":
handle_event(data)
except Exception:
pass
finally:
ws.close()
time.sleep(1)
if __name__ == "__main__":
run()
ترشيح فارق مؤهَّل
handle_event هي حيث يُطبَّق الحد. يغيب potential_arb_pct عن معظم تحديثات السعر ولا يظهر إلا عندما يؤكّد الخادم مراجحة حقيقية، لذا يُستبعد كل ما هو دون الحد، أو ما ليس مراجحة أصلاً، قبل أن يصل إلى Telegram:
def handle_event(event):
arb_pct = event.get("potential_arb_pct")
if arb_pct is None or arb_pct < THRESHOLD_PCT:
return
outcomes = event.get("outcomes") or []
label = " vs ".join(o["key"] for o in outcomes[:2]) if len(outcomes) >= 2 else event["id"]
maybe_alert(event["id"], label, arb_pct)
الدفع إلى Telegram
تقبل واجهة بوت Telegram البرمجية طلب POST عاديًا، وإرسال رسالة لا يتجاوز بضعة أسطر بمجرد أن يكون لديك رمز بوت ومعرّف محادثة من BotFather:
def send_telegram(text):
requests.post(
f"https://api.telegram.org/bot{TELEGRAM_TOKEN}/sendMessage",
data={"chat_id": TELEGRAM_CHAT_ID, "text": text},
)
يأخذ webhook الخاص بـDiscord الشكل نفسه. استبدل الرابط بالـwebhook الذي يمنحك إياه Discord، وضع النص في حقل content بدلاً من text. يبقى كل ما قبل هذه الدالة كما هو في الحالتين.
تجميع الفارق الواحد في رسالة واحدة
فارق يتجاوز 5% ويستمر طوال وسيطه البالغ 13.7 ثانية قد يعبر مقبسك كعدة أحداث بينما يستمر السعران في التعديل أحدهما نحو الآخر. بلا فحص مناسب، يعني ذلك عدة رسائل لأمر يعيشه الشخص كلحظة واحدة. تحتفظ maybe_alert بطابع زمني لكل سوق وتتجاهل أي شيء ضمن نافذة تهدئة منذ آخر رسالة أرسلتها لهذا السوق نفسه:
def maybe_alert(mm_id, label, arb_pct):
now = time.time()
if now - _last_sent.get(mm_id, 0) < DEBOUNCE_SECONDS:
return
_last_sent[mm_id] = now
send_telegram(f"Arb on {label}: {arb_pct:.1f}%")
تغطي الثلاثون ثانية بارتياح الوسيط البالغ 13.7 ثانية حتى لأوسع الفوارق، دون دمج فارقين منفصلين في المباراة نفسها في رسالة واحدة.
ما لا يفعله هذا
يقرأ هذا السكربت التغذية ويفحص حدًا، ثم يرسل رسالة إذا تجاوزه الفارق. لا يضع أمرًا، ولا يلمس واجهة التداول البرمجية لأي من المنصتين إطلاقًا. هذه بيانات لمطورين لا نصيحة تداول أو مالية، والتنبيه هو كل الناتج هنا. أين يعمل هذا فعليًا، بحيث يبقى مستيقظًا الساعة 3 فجرًا حين يفتح الفارق، موضّح في أين تُشغّل مستهلك دفق.
التغذية المطابَقة والحد المذكور في هذا المقال مجانيا القراءة. أما الحصول على التنبيه في اللحظة التي يفتح فيها الفارق، بدلاً من لقطة عمرها دقيقتان، فيحتاج إلى الدفق في الوقت الفعلي في خطة Basic فأعلى.
المزيد من المدونة
راقب Kalshi وPolymarket باستخدام Python
ابنِ مراقبًا بلغة Python لأسواق Kalshi وPolymarket المطابَقة، ثم وسّع لقطة REST المتأخرة بتحديثات في الوقت الفعلي.
خادم Kalshi و Polymarket عبر MCP في Claude و Cursor
صِل Claude أو Cursor بخادم MCP الخاص بـ Dino لأسواق Kalshi و Polymarket، وافحص الأسواق المطابَقة مع سياق التسوية.
قارِن بين Kalshi و Polymarket بأمان
قارِن عقود Kalshi و Polymarket مع مخاطر التسوية وفروق العقود المرفَقة بكل سعر ملاحَظ.