دليل Polymarket Bot · الفصل 17 من 32
استخدم اختلال دفتر أوامر Polymarket كإشارة سعر قصيرة الأجل: نسبة حجم bid إلى ask، احتساب microprice، نصف عمر الإشارة، ومتى تتفوق bots الاختلال على التنفيذ العشوائي.
ما الذي يغطيه هذا الفصل
اختلال دفتر الأوامر هو نسبة عمق جانب الشراء إلى عمق جانب البيع في limit order book. في Polymarket له أفضلية تنبؤية حقيقية لكنها قصيرة العمر - عادةً من 5 إلى 30 ثانية قبل أن يتحرك mid. هذا الفصل يشرح نمط الاحتساب والظروف التي تكون فيها الإشارة مضللة.
- ما هو اختلال دفتر الأوامر
- احتساب microprice
- الاختلال كإشارة اتجاهية
- نصف عمر الإشارة في Polymarket
- متى تكون إشارات الاختلال مضللة
- Code: حساب الاختلال مع كل WS tick
ما هو اختلال دفتر الأوامر
اختلال دفتر الأوامر هو نسبة إجمالي عمق جانب الشراء إلى إجمالي عمق جانب البيع في limit order book. وعند احتسابه على أعلى N مستويات (وغالبًا N=5)، فإنه يلتقط ضغط المتداولين التراكمي الذي لم ينعكس بعد في mid-price.
الصيغة: imbalance = (Σ bid[i].price × bid[i].size for i in [0..N]) − (Σ ask[i].price × ask[i].size) / (Σ both). المجال من -1 إلى +1؛ القيم الموجبة تعني ضغط شراء أكبر، والسالبة تعني ضغط بيع أكبر.
الإشارة حقيقية تجريبيًا على Polymarket لكنها مشوشة. يمكن لحوت واحد أن يصنع انطباعًا زائفًا بالاختلال لمدة 30-60 ثانية قبل أن تتم مراجعته عبر arbitrage. إنها مفيدة كميزة واحدة ضمن عدة ميزات، لكنها خطيرة إذا استُخدمت كمحفّز وحيد.
احتساب microprice
microprice هو تحسين للـ mid البسيط: متوسط مرجح لأفضل bid وأفضل ask، موزونًا بأحجامهما النسبية.
microprice = (best_bid × ask_size + best_ask × bid_size) / (bid_size + ask_size)
عندما يكون صفّ جانب bid أكبر بكثير من جانب ask، يقترب microprice من ask. الفكرة هنا: وجود عدد أكبر من المشترين المنتظرين يعني أن الصفقة التالية يُرجَّح أن ترفع ask، وبالتالي تكون القيمة العادلة أقرب إلى ask.
microprice هو مؤشر متقدم من 5 إلى 30 ثانية للحركة الفعلية في mid. تستخدمه bots الإنتاجية كسعر مرجعي لقرارات جني الربح بدلًا من mid الساذج.
الاختلال كإشارة اتجاهية
من الملاحظة الإنتاجية: عندما يتحول الاختلال من -0.3 إلى +0.5 خلال 10 ثوانٍ من دون حدث إخباري مرافِق، يرتفع mid بمقدار 1-2 سنت خلال 30-60 ثانية التالية في نحو 65% من الحالات.
هذه أفضلية حقيقية لكنها تتلاشى عند أحجام المراكز الصغيرة بعد الرسوم. لتحقيق الربح، يجب على bot أن يحدد حجمًا يكفي لالتقاط الحركة بعد الرسوم، لكن من دون أن يحرك دفتر الأوامر بنفسه. دفاتر Polymarket غالبًا ما تكون رقيقة بما يكفي لأن أي شيء فوق 50 سهمًا قد يحرك السوق.
اجمع الاختلال مع ميزات أخرى: سرعة التداول (كلما زادت الصفقات كانت الإشارة أقرب إلى الحقيقية)، تحرك best-bid فعلًا إلى الأعلى (وليس مجرد انتقال العمق)، وأن يكون السوق ليس في وضع مدفوع بالأخبار.
نصف عمر الإشارة في Polymarket
إشارة الاختلال تتلاشى. بيانات الإنتاج من trader لدينا: اختلال > 0.6 → حركة متوقعة في mid بمقدار 1.2c خلال 60 ثانية، مع نصف عمر يقارب 30 ثانية. بعد 90 ثانية تصبح القيمة التنبؤية معدومة.
النتيجة لتصميم bot: تحرك بسرعة أو تجاهل الإشارة. bot يحتاج 15 ثانية لاتخاذ القرار يستهلك نصف الأفضلية قبل وضع الأمر. يجب أن يكون حد التأخير الزمني لاستراتيجيات الاختلال أقل من 5 ثوانٍ من ظهور الإشارة إلى إطلاق FOK.
الاستراتيجيات التي تحتفظ بالمراكز لفترة أطول من نصف العمر (1-2 دقيقة) تراهن على الإشارة التالية، لا الحالية. كن واضحًا بشأن هذا؛ لا تحتفظ عن طريق الخطأ بمراكز مدفوعة بالاختلال حتى التسوية.
متى تكون إشارات الاختلال مضللة
تكون الإشارة مضللة عندما يتحقق أحد ثلاثة شروط.
- حركة مدفوعة بالأخبار: يكون الاختلال نتيجةً لخبر لم تره بعد. التداول ضده يخسر؛ أما التداول معه فهو news arbitrage، أي استراتيجية مختلفة.
- Whale spoofing: أمر كبير يوضع ثم يُلغى بسرعة، فينشئ اختلالًا زائفًا طوال المدة. صفِّ ذلك عبر التحقق من استمرار الاختلال لمدة 10 ثوانٍ أو أكثر قبل التفعيل.
- إعادة التوازن في نهاية الفترة: صانعو السوق يسحبون quotes لأسباب تتعلق بالمخزون لا بالمعلومة. ينعكس الاختلال بعد دقائق عندما يعيد MM تسعير quotes.
الفلتر المدمج هو: اختلال > threshold AND سرعة التداول > baseline AND لا يوجد حدث إخباري خلال آخر 5 دقائق. كل فلتر منفردًا يولد عددًا كبيرًا من الإيجابيات الكاذبة.
Code: حساب الاختلال مع كل WS tick
مرجع: اشترك في تحديثات WebSocket للدفتر، وأعد حساب الاختلال مع كل tick.
def on_book_message(msg):
bids = msg.get("bids", [])[:5]
asks = msg.get("asks", [])[:5]
bid_usd = sum(float(b["price"]) * float(b["size"]) for b in bids)
ask_usd = sum(float(a["price"]) * float(a["size"]) for a in asks)
total = bid_usd + ask_usd
if total < 100: return # illiquid
imb = (bid_usd - ask_usd) / total
state[msg["asset_id"]] = {
"imb": imb,
"best_bid": float(bids[0]["price"]) if bids else 0,
"best_ask": float(asks[0]["price"]) if asks else 1,
"ts": time.time()
}
# decision logic with cooldown + filters
if imb > 0.6 and time.time() - last_fired.get(msg["asset_id"], 0) > 60:
check_filters_and_maybe_fire(msg["asset_id"])
الحالة تكون لكل token على حدة. يَحول cooldown دون الإفراط في الإطلاق على الإشارة نفسها. الفلاتر (التحقق من الأخبار، سرعة التداول) هي التي تسمح بمرور trade الفعلي.





