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)

النمط: كل تكرار يمر عبر البوابة. أخطاء الاستراتيجية لا يمكنها تجاوز الضوابط، بحكم التصميم.

الأسئلة الشائعة

ما هو halt sentinel؟
هو ملف (مثلًا، data/halt_autobuy) يتحقق منه الروبوت قبل كل أمر. إذا كان الملف موجودًا، يرفض الروبوت وضع الأوامر حتى لو قالت الاستراتيجية غير ذلك. يتيح لك إيقاف الروبوت أثناء الحادثة بأمر touch واحد. أضفنا هذا النمط نفسه إلى متداولنا الإنتاجي بعد حادثة wedged-fill في أبريل 2026.
ما حدود المراكز التي يجب أن أضعها؟
لكل سوق: 1-5% من bankroll. لكل استراتيجية: 10-20%. إجمالي التعرض المفتوح: 50-70% من bankroll (احتفظ بهامش نقدي). ضع حدًا لأمر واحد منفرد عند 1-2% من bankroll بغض النظر عن الاستراتيجية - لا ينبغي أبدًا أن يكون أمر واحد نتيجة خطأ إدخال بحجم الحساب كله.
كيف أطبّق مفتاح إيقاف الخسارة اليومية؟
تتبع realized + unrealized PnL لكل يوم UTC. إذا انخفض PnL اليومي إلى أقل من -3 إلى -5% من bankroll، اضبط halt sentinel وأرسل تنبيهًا لنفسك. يتوقف الروبوت عن الأوامر الجديدة؛ أما المراكز الحالية فتُدار يدويًا. أعد الضبط يوميًا عند 00:00 UTC.
ماذا يجب أن يفعل الروبوت عند إعادة التشغيل بعد انهيار؟
ثلاث خطوات: (1) طابق الأوامر المفتوحة عبر SDK مقابل الدفتر المحلي. (2) افحص المراكز المفتوحة on-chain مقابل حالتك المحلية. (3) إذا ظهر أي اختلاف، أوقف الروبوت واطلب مراجعة يدوية. لا تُعد الاستئناف تلقائيًا أبدًا في حالة غير متسقة.
كيف أمنع bug واحدًا من تصفير حسابي؟
حدود متعددة الطبقات: حد للمركز على مستوى الشفرة، وحد لحجم الأمر على مستوى الشفرة، halt sentinel على مستوى الملف، حدود ضمنية على مستوى المنصة (Polymarket)، وتنبيهات مراقبة تنبهك عند معدل أوامر غير معتاد. لا توجد طبقة واحدة كافية - إنها تتضاعف معًا.
هل يجب أن يتداول الروبوت إذا فشل logging؟
لا. إذا لم يستطع الروبوت الكتابة إلى دفتاره، فلن يتمكن من المطابقة عند إعادة التشغيل، وهذا يعني أن انهيارًا سيؤدي إلى حالة غير متسقة. اجعل الروبوت يفشل بشكل حاسم إذا تعطل logging. روبوتات الإنتاج السليمة تكون شديدة التحفظ بشأن قابلية الملاحظة الخاصة بها.