Polymarket Bot Tutorial · الفصل 30 من 32
شفرة إدارة مخاطر بمستوى الإنتاج لروبوتات Polymarket: حدود المراكز، حدود الخسارة اليومية، مؤشرات الإيقاف، مراقبة معدل التنفيذ، المطابقة عند إعادة التشغيل، وإعادة المحاولة idempotent. أنماط برمجية من متداول حقيقي في الإنتاج.
ما الذي يغطيه هذا الفصل
شفرة المخاطر هي معظم روبوت التداول في الإنتاج. منطق الاستراتيجية هو الجزء السهل؛ أما الحدود والوقفات ومراقبي الأداء وأدوات المطابقة المحيطة بها فهي ما يحدد ما إذا كان الروبوت سينجو من أول أسبوع سيئ له. هذا الفصل هو نمط إدارة المخاطر بمستوى الإنتاج.
- لماذا تُعد شفرة المخاطر معظم روبوت التداول الحقيقي
- حدود المراكز (لكل سوق، لكل استراتيجية، إجمالي)
- مفتاح إيقاف الخسارة اليومية
- مؤشرات الإيقاف (إيقاف طارئ قائم على ملف)
- مراقب معدل التنفيذ
- مطابقة الدفتر مقابل السلسلة عند إعادة التشغيل
- الشفرة: حلقة إنتاجية تراعي الإيقاف
لماذا تُعد شفرة المخاطر معظم روبوت التداول الحقيقي
قمنا بقياس ذلك في قاعدة شفرة روبوتنا الخاص: 60% من LOC هي شفرة مخاطر (حدود، إيقافات، مراقبة، مطابقة). 30% هي الاستراتيجية. 10% هي الشفرة الرابطة.
هذه النسبة صحيحة. الاستراتيجية هي الجزء السهل - وصف متى تدخل ومتى تخرج يمكن أن يُكتب في بضع عشرات من الأسطر. أما شفرة المخاطر فهي كل شيء آخر: ماذا تفعل عندما يتحرك السعر ضدك أسرع من المتوقع، ماذا تفعل عندما تتوقف عمليات التنفيذ، ماذا تفعل عندما ينقطع WebSocket، ماذا تفعل عندما يتضح أن الاستراتيجية غير مربحة.
تشترك معظم قصص فشل البناة في الشكل نفسه: كانت الاستراتيجية تعمل، لكن الروبوت واصل التداول خلال تغيّر النظام السوقي لأن أي Halt لم يُفعل. اكتب الإيقافات قبل أن تكتب الاستراتيجية.
حدود المراكز (لكل سوق، لكل استراتيجية، إجمالي)
ثلاثة حدود، تُفرض في الشفرة.
- حد لكل سوق: الحد الأقصى $X لكل سوق بغض النظر عن قوة الثقة في edge. النموذج المعتاد: $25-100 للروبوتات الصغيرة، و$200-500 للإنتاج. هذا يحد من نطاق الضرر الناتج عن قرار خاطئ في سوق واحد.
- حد لكل استراتيجية: إذا كنت تشغّل عدة استراتيجيات، تحصل كل واحدة على حصة من رأس المال الإجمالي. النموذج المعتاد: 30-50% لكل استراتيجية. يمنع يومًا سيئًا لاستراتيجية واحدة من استنزاف رأس المال الخاص بالبقية.
- الحد الإجمالي: أقصى % من رصيد المحفظة يتم نشره في الوقت نفسه. النموذج المعتاد: 50-70%. يترك رأس مال لفرص غير متوقعة أو لاكتشاف أخطاء المحاسبة الخاصة بالروبوت نفسه.
يجب فرض هذه الحدود الثلاثة داخل دالة وضع الأوامر، وليس فقط في منطق الاستراتيجية. قد تحتوي الاستراتيجية على bug؛ أما بوابة وضع الأوامر فهي خط الدفاع الأخير.
مفتاح إيقاف الخسارة اليومية
أهم ضابط مخاطر منفرد: مفتاح إيقاف للخسارة اليومية.
القاعدة: إذا انخفض realized + unrealized PnL منذ منتصف الليل UTC إلى أقل من -X% من الرصيد اليومي الابتدائي، يتوقف الروبوت عن فتح مراكز جديدة و(اختياريًا) يُصفّي المراكز الحالية. القيمة النموذجية لـ X: 5-10%.
المنطق: روبوت بنسبة فوز متوقعة 60% قد يواجه ربما سلسلة خسائر من 10 صفقات باحتمال 5%. من دون مفتاح الإيقاف، تتفاقم هذه السلسلة: خسارة $200 → يواصل الروبوت التداول → خسارة أخرى $200 → تنخفض المحفظة 40%. مع تفعيل المفتاح عند -10%، ينتهي اليوم السيئ عند $200 فقط، وغدًا يبدأ الروبوت من جديد.
يُفرض المفتاح من جهة الخادم: اكتب ملف halt أو اضبط علامة database يتحقق منها مسار التداول في كل تكرار. أعد التشغيل فقط بعد مراجعة يدوية.
مؤشرات الإيقاف (إيقاف طارئ قائم على ملف)
أبسط آلية إيقاف ممكنة: يتحقق الروبوت من وجود ملف (مثلًا /opt/pmt/HALT) في كل تكرار للحلقة ويتوقف عن التداول إذا كان الملف موجودًا.
def trading_loop():
while True:
if os.path.exists("/opt/pmt/HALT"):
log("HALT file detected, sleeping")
time.sleep(30)
continue
run_one_iteration()
time.sleep(5)
لإيقافه فورًا من أي مكان (SSH، بوت Telegram، نظام مراقبة): touch /opt/pmt/HALT. وللاستئناف: rm /opt/pmt/HALT.
النهج القائم على الملف منخفض التقنية عمدًا لأنه يعمل في الظروف التي تفشل فيها آليات الإيقاف الأكثر تعقيدًا: عندما يتعطل الروبوت جزئيًا، عندما يتعذر الوصول إلى قاعدة البيانات، عندما يكون API key خاضعًا لتقييد المعدل. الوصول إلى نظام الملفات متاح دائمًا.
مراقب معدل التنفيذ
تفترض الاستراتيجية أن أوامر FOK تُنفَّذ بمعدل معين (غالبًا 60-80%). عندما ينخفض المعدل بشكل ملحوظ، فهذا يعني أن شيئًا ما قد تغير: انسحب صانعو السوق، تم التعرف على استراتيجيتك، أو توجد مشكلة مستمرة في API. مهما كان السبب، فإن الافتراض الذي بُنيت عليه معادلة PnL للاستراتيجية قد كُسر.
منطق المراقب: عدّاد متحرك لمعدل التنفيذ خلال 24 ساعة. إذا كان < 30% (أو 50% من المتوقع)، يتم إرسال تنبيه + إيقاف تلقائي. لا تُستأنف العملية إلا بعد مراجعة يدوية.
المراقب مفيد أيضًا كأداة تشخيص. الانخفاض المفاجئ في معدل التنفيذ يرتبط عادةً بحدث خارجي (نشر في Polymarket، ازدحام في Polygon، تقييد معدل لعنوان IP الخاص بك) وهو أمر سترغب في معرفته بغض النظر عن أثره على التداول.
مطابقة الدفتر مقابل on-chain عند إعادة التشغيل
يحافظ الروبوت على دفتر يضم المراكز التي يعتقد أنه يحتفظ بها. بينما تحتفظ السلسلة بالحقيقة. يجب أن يتطابقا دائمًا؛ وعندما لا يتطابقان، يكون الروبوت يعمل على افتراض خاطئ وسيتداول بشكل غير صحيح.
منطق المطابقة: عند كل إعادة تشغيل ومرة كل ساعة أثناء التشغيل الطبيعي، اجلب أرصدة on-chain لكل token لمسه الروبوت. قارنها بالدفتر؛ أرسل تنبيهًا + أوقف الروبوت إذا اختلف رصيد أي token عن الدفتر بأكثر من هامش التقريب المسموح.
السبب الأكثر شيوعًا للاختلاف هو أمر تم تنفيذه بنجاح لكن استدعاء API الخاص بالروبوت فاته تسجيله (timeout، أو retry لم يُسجل أبدًا). السلسلة تملك المركز؛ الروبوت يعتقد أنه لا يملكه. من دون المطابقة، لن ينشر الروبوت أمر الخروج take-profit وسيستمر المركز حتى التسوية.
الشفرة: حلقة إنتاجية تراعي الإيقاف
مرجع: حلقة التداول الإنتاجية مع كل ضوابط المخاطر موصولة فيها.
def production_loop():
while True:
# Halt checks
if os.path.exists("/opt/pmt/HALT"):
sleep_with_log(30); continue
if daily_pnl_below_threshold():
create_halt("daily PnL kill"); continue
# Reconcile every hour
if now() - last_reconcile > 3600:
ok = reconcile_diary_vs_chain()
last_reconcile = now()
if not ok: create_halt("reconciliation failed"); continue
# Fill-rate watchdog
if recent_fill_rate() < 0.30:
create_halt("fill rate collapse"); continue
# Strategy
try:
run_strategy_once()
except Exception as e:
log_exception(e)
if consecutive_exceptions >= 5:
create_halt(f"exceptions: {e}"); continue
time.sleep(5)
النمط: كل تكرار يمر عبر البوابة. أخطاء الاستراتيجية لا يمكنها تجاوز الضوابط، بحكم التصميم.





