← العودة إلى قائمة المقالات
July 3, 2026
5 دقائق للقراءة

فضاء المعاملات ذو المحورين: لماذا ينبغي أن يكون معظم المسح لديك شبه مجاني

فضاء المعاملات ذو المحورين: لماذا ينبغي أن يكون معظم المسح لديك شبه مجاني
#التداول الخوارزمي
#الاختبار الخلفي
#البحث في المعاملات
#التحسين
#التخزين المؤقت
#لعنة الأبعاد
Part 4 of 10 · Collection
High-Performance Backtest Engines

جزء من سلسلة "اختبارات خلفية بلا أوهام".

عادة ما تروى لعنة الأبعاد بوصفها تحذيرا: كل معامل تضيفه يضاعف فضاء البحث، ومن ثم فإن استراتيجية ذات 18 بعدا لا أمل في مسحها. هذا التأطير يفترض ضمنا أن كل بعد يكلف الشيء نفسه عند التقييم. وهذا غير صحيح. في محركنا الثنائي/الثلاثي الأطر الزمنية، ثلثا المعاملات شبه مجانية المسح، بينما يحمل الثلث الباقي فاتورة الحساب كلها تقريبا. وما إن ترى هذا الانقسام حتى تكف عبارة "فضاء البحث أكبر من اللازم" عن كونها الشكوى الصحيحة. السؤال الصحيح هو: أي الأبعاد تدفع ثمنها فعلا؟

البعد الذي لم يكن بحاجة إلى إعادة حساب

يشغل معيارنا القياسي للبحث في المعاملات استراتيجية زخم متعددة الأطر الزمنية: متوسط هال المتحرك ونسخته الثلاثية التنعيم (HMA3) على إطارين زمنيين أو ثلاثة، مع بوابة فصل اتجاهي تقرر متى يكون التقاطع "نظيفا" بما يكفي للتصرف بناء عليه. فضاء البحث الكامل للنسخة الثلاثية الأطر يبلغ ثمانية عشر بعدا — الفترة وطول HMA لكل إطار زمني، إضافة إلى مجموعة من عتبات الفصل للدخول والخروج على كل إطار.

الطريقة الساذجة لمسح هذا الفضاء هي حلقة واحدة: اختر متجه معاملات، وابن كل مؤشر من الصفر، وشغل المحاكاة، وقيم النتيجة، ثم كرر. من هناك بدأنا. كانت الطريقة بطيئة، وكانت بطيئة لسبب اتضح أنه محرج ما إن سميناه باسمه: في الغالبية الساحقة من التجارب المتجاورة، كنا نعيد حساب مؤشرات لم تتغير أصلا.

حرك عتبة فصل الدخول من 0.03 إلى 0.035 وأعد التشغيل. متوسط هال على سنة كاملة من شموع الدقيقة الواحدة مطابق للتجربة السابقة حتى آخر بت — فالعتبة لا تظهر في تعريفه في أي موضع. ومع ذلك تعيد الحلقة الساذجة بناءه في كل مرة بلا استثناء، على أكثر من نصف مليون شمعة، وبعمق ثلاثة أطر زمنية. كنا ننفق كامل ميزانية الحساب تقريبا على إعادة اشتقاق كميات ثابتة تجاه المعامل الذي كنا نغيره فعلا.

تلك الملاحظة هي المقال كله. فلحظة أن تلاحظ أن بعض المعاملات يغير المؤشرات وبعضها الآخر لا يغير سوى قاعدة القرار المطبقة على مؤشرات ثابتة، يكف فضاء المعاملات عن كونه سحابة مسطحة من الأبعاد ويصبح طبقتين متداخلتين بأسعار متباينة تباينا هائلا.

محوران، لا محور واحد

محورا فضاء معاملات بسعرين مختلفين: شبكة مؤشرات مكلفة متناثرة تفتح كل خلية منها صفيحة كثيفة شبه مجانية من تكوينات العتبات

قسم المعاملات بحسب ما تجبرك إعادة تقييمها على إعادة حسابه:

  • المحور المكلف — معاملات المؤشرات. فترة الإطار الزمني وطول HMA. غير أيا منهما وسيتعين عليك إعادة بناء المؤشر على كامل سلسلة الأسعار: إعادة أخذ عينات الإطار الزمني الأعلى، وتشغيل ترجيح هال، وإعادة حساب سلسلة التقاطعات والفصل عند كل تقاطع. هذا مسح O(n) لكل شمعة من التاريخ، وتدفعه كاملا عن كل توليفة مميزة. في الاستراتيجية الثلاثية الأطر يضم هذا المحور ستة معاملات: (period, hma_length) لكل من الإطار العالي والمتوسط والمنخفض.

  • المحور الرخيص — عتبات القرار. بوابات الفصل الاتجاهي التي تقرر، بالنظر إلى سلسلتي التقاطع والفصل المحسوبتين مسبقا، ما إذا كان ينبغي الدخول أو الخروج. غير عتبة ولن يتحرك أي مؤشر. كل ما تعيد تشغيله هو تمريرة O(n) واحدة على الإشارات المحسوبة مسبقا، تفحص البوابات وتسجل التنفيذات. في الاستراتيجية الثلاثية الأطر يضم هذا المحور اثني عشر معاملا (أربع عتبات فصل — دخول شراء، دخول بيع، خروج شراء، خروج بيع — على كل من الأطر الثلاثة). أما النسخة الثنائية الأطر فتضم ثمانية (أربع عتبات على كل من الإطارين).

إذن الشكل الحقيقي للفضاء هو: 6 مكلفة + 12 رخيصة = 18 للنسخة الثلاثية الأطر، و4 مكلفة + 8 رخيصة = 12 للنسخة الثنائية الأطر. ثلثا الأبعاد يقيمان على المحور الرخيص. والمحوران لا يختلفان في العدد فحسب — بل يختلفان في تكلفة الوحدة بأكثر من ثلاث مراتب عشرية، وهذا هو الرقم الذي يدور حوله باقي هذا المقال.

البنية متداخلة تداخلا صارما. كل نقطة على المحور المكلف — توليفة (period, hma_length) ملموسة واحدة لكل إطار زمني — تعرف مجموعة من مصفوفات الإشارات الثابتة. وفوق ذلك الأساس الثابت تجلس صفيحة كاملة من المحور الرخيص: آلاف من متجهات العتبات، كل منها تمريرة سريعة على المصفوفات ذاتها. تدفع ثمن الأساس مرة واحدة وتوزعه على الصفيحة بأكملها.

لماذا المؤشرات ثابتة تجاه العتبات

لا يعمل التخزين المؤقت إلا بفضل حقيقة رياضية، لا تفصيلة تنفيذ محظوظة، وهي تستحق أن تصاغ بدقة لأنها الافتراض الذي يحمل البناء كله. مصفوفات المؤشرات دالة في (period, hma_length) وحدهما. وعتبات الفصل لا تظهر في تعريفها في أي موضع.

على وجه التحديد، يحسب المحرك مسبقا لكل إطار زمني أربع مصفوفات محاذاة على الفهرس الأساسي: متوسط هال hma، ونسخته الثلاثية التنعيم hma3، وسلسلة التقاطعات cross (+1 شراء / −1 بيع / 0)، ونسبة separation المئوية عند كل تقاطع. كل واحدة من هذه مشتقة من الأسعار ومن معاملي المؤشر. أما العتبة — الرقم الذي تقارن separation به — فتطبق لاحقا، عند لحظة القرار. وهي لا تمس المصفوفات أبدا.

هذه ليست إعادة ترتيب آمنة بداهة. إنها آمنة فقط لأننا كنا حريصين على توقيت توافر المعلومة، وهو ما يعنى به عمل انحياز النظر المسبق في موضع آخر من هذه السلسلة. مؤشر الإطار الزمني الأعلى عند الشمعة الأساسية i يحسب من شموع الإطار الأعلى المغلقة إضافة إلى شمعة قيد التكوين يساوي إغلاقها الجاري إغلاق الشمعة الأساسية الحالي close[i] — وهي قيمة معروفة عند الشمعة i. لا شيء من المستقبل يتسرب إلى الداخل. وهكذا فإن الإشارة المحسوبة مسبقا عند الشمعة i هي بالضبط ما كان سيراه روبوت تداول حي عند الشمعة i، وتبقى صالحة أيا كانت العتبة التي تختبرها في مواجهتها لاحقا. تخزين إشارة مسربة مؤقتا لا يعدو تخزين التسريب؛ أما تخزين إشارة سببية فيخزن شيئا يمكنك أن تتداول عليه فعلا.

يمنحنا هذا الثبات تحليلا إلى عوامل. اكتب تقييم متجه معاملات كامل واحد θ = (indicator_params, threshold_params) على النحو التالي:

signals   = build_indicators(indicator_params)      # EXPENSIVE, depends only on indicator_params
score     = simulate(signals, threshold_params)     # CHEAP, reuses signals across all thresholds

build_indicators لا تقرأ threshold_params. تلك الحقيقة الواحدة هي ما يجيز التخزين المؤقت: ثبت indicator_params، وغير threshold_params بحرية، وستكون signals ثابتا تحسبه مرة واحدة.

البنية: احسب مرة واحدة، وامسح مرات كثيرة

ذاكرة تخزين مؤقت للإشارات مفهرسة بمعاملات المؤشرات تغذي مسحا دفعيا سريعا: بناء مؤشر واحد يتفرع إلى صف عريض من تقييمات العتبات تتشارك المصفوفات المخزنة ذاتها

ينفذ المحرك (scripts/engine_multitf.py، الإيداع bfc8aaa في نظام الاختبار الخلفي لدينا) هذا التحليل بقطعتين تقول أسماؤهما بالضبط ما تفعلانه.

SignalCache — المحور المكلف، محفوظا في الذاكرة. إنه قاموس مفهرس بالمفتاح (period_bars, hma_length). اطلب منه إشارات إطار زمني ما فيعيد TFSignals المخزنة إن كانت توليفة المؤشر تلك قد بنيت من قبل، وإلا بناها مرة واحدة وخزنها. ولأن المفتاح هو معاملات المؤشر وحدها، فإن كل تكوين عتبات يتشارك توليفة مؤشر — وفي مسح عتبات كثيف يعني ذلك الآلاف منها — يصيب مدخل الذاكرة المؤقتة نفسه. الأطر الزمنية الأعلى تكافئ هذا بوجه خاص: شبكة خشنة من، مثلا، أربع فترات مرشحة مضروبة في حفنة من أطوال HMA هي عدد صغير من عمليات البناء المكلفة المميزة، ويعاد استخدام كل منها عبر صفيحة العتبات الكاملة المكدسة فوقها.

sweep_separations — المحور الرخيص، على دفعات. تأخذ مصفوفات الإشارات المخزنة ومصفوفة من متجهات العتبات (sps، بالشكل [m, 12]) وتمررها كلها عبر نواة مترجمة واحدة. كل صف هو تمريرة O(n) واحدة: امش على الشموع، وطبق البوابات، وسجل تنفيذات خالية من التسريب عند open[i+1]، واحسب PnL والوقت داخل المركز. لا يعاد بناء أي مؤشر داخل هذه الحلقة — فهي تقرأ cross وseparation مباشرة من الذاكرة المؤقتة. والمحاكاة الداخلية مترجمة آنيا (Numba)، وبالتالي فبمجرد الإحماء تهيمن على تكلفة كل تكوين عملية المسح الخطي الواحدة على الشموع، لا الحمل الزائد لبايثون.

تتركب القطعتان في البحث المتداخل الطبيعي: الحلقة الخارجية تمشي على المحور المكلف (كل دورة تبني توليفة مؤشر واحدة وتخزنها مؤقتا)، والحلقة الداخلية تنشر دفعة عريضة عبر المحور الرخيص على تلك المصفوفات المخزنة. وفي الكود يبدو الشكل كذلك تماما — حلقة مكلفة صغيرة تلف دفعة رخيصة عريضة:

cache = SignalCache(base_close, base_ts)           # keyed by (period, hma_length)

for htf_p, htf_h, mtf_p, mtf_h, ltf_p, ltf_h in indicator_grid:   # EXPENSIVE axis (coarse)
    htf = cache.get(htf_p, htf_h)                  # built once, then a cache hit forever
    mtf = cache.get(mtf_p, mtf_h)
    ltf = cache.get(ltf_p, ltf_h)

    sps = sample_thresholds(m=4000)                # CHEAP axis: [m, 12] threshold vectors
    pnl, n_trades, bars_in_pos = sweep_separations(  # one compiled batch, no indicator work
        base_close, base_open, htf, ltf, sps, mtf=mtf)

تلمس الباني المكلف بأقل عدد من المرات تسمح به شبكة المؤشرات، وتدع المسح الرخيص يتولى الحجم — آلاف من صفوف sps في مواجهة مصفوفات لا تتحرك أبدا. هذا هو التحسين بأكمله — لا تقريب، ولا دقة مفقودة، مجرد رفض لإعادة حساب ما لم يتغير.

ما يكلفه "المجاني" فعليا: الأرقام

مقارنة أعمدة لتكلفة كل تكوين: عمود شاهق لإعادة الحساب لكل تكوين بجانب شريحة رفيعة لتمريرة العتبات المخزنة، مع تعليق يشير إلى فجوة تناهز 1,600x

قسنا المحورين على حمل العمل التوضيحي: سنة كاملة من شموع الدقيقة الواحدة لزوج ETHUSDT (~527k شمعة)، بثلاثة أطر زمنية، مع إحماء المؤشرات وإخراج الترجمة الآنية (JIT) من التوقيت.

على المحور الرخيص، تحافظ sweep_separations على معدل ~5,600 تكوين عتبات في الثانية. وهذه محاكاة كاملة — بوابات وتنفيذات وPnL وتعرض — لكل تكوين، على أكثر من نصف مليون شمعة، بنحو 180 ميكروثانية لكل تكوين. وسبب قدرتها على هذه السرعة أنها لا تؤدي أي عمل على المؤشرات: كل تكوين يقرأ مصفوفتي cross وseparation المخزنتين ذاتهما.

الآن سعر البديل. بناء مجموعة مؤشرات الأطر الثلاثة مرة واحدة يستغرق ما يقارب بضع مئات من الميلي ثانية (~0.3 s) — إعادة أخذ عينات لثلاثة أطر زمنية، وترجيح هال، واستخراج التقاطعات والفصل على السنة كلها. فإذا أعدت حساب المؤشرات داخل حلقة التكوينات — التصميم الساذج ذو الحلقة الواحدة — لدفع كل واحد من تلك التكوينات البالغة 5,600 في الثانية ثمن بناء المؤشرات كاملا بدلا من ذلك. تتضخم تكلفة التكوين الواحد من ~180 ميكروثانية إلى ~0.3 ثانية:

التكلفة لكل تكوين التكوينات/الثانية
المحور الرخيص (إشارات مخزنة مؤقتا) ~180 µs ~5,600
إعادة حساب المؤشرات لكل تكوين ~0.3 s ~3.4

النسبة هي ~1,600x. مسح المحور الرخيص على إشارات مخزنة أرخص بنحو ثلاث مراتب عشرية من التصميم الساذج الذي يعيد بناء المؤشرات لكل متجه عتبات. وبصياغة ملموسة: دفعة من بضعة آلاف من تكوينات العتبات تنتهي في أقل من ثانية على المسار المخزن كانت ستستغرق الجزء الأكبر من ساعة لو أعاد كل تكوين بناء مؤشراته. النتائج نفسها، والدقة نفسها، ولا اختصارات في الرياضيات — الفرق الوحيد أن أحدهما يعيد حساب ثابت والآخر لا يفعل.

هذا ليس تحسينا دقيقا ترشه في النهاية. إنه يغير ما هو ممكن عمليا من عمليات البحث. عند 5,600 تكوين/ثانية يصبح محور العتبات كثيفا بما يكفي لاستكشافه استكشافا صحيحا — يمكنك تحمل شبكة دقيقة أو عينة عشوائية/QMC طويلة لكل توليفة مؤشرات — بينما يبقى المحور المكلف حفنة خشنة مقصودة من عمليات البناء. تتدفق ميزانية الحساب إلى حيث تكلف المعاملات شيئا فعلا.

لعنة الأبعاد، بعد إعادة التسعير

شبكة معاملات مسطحة موحدة أعيد وسمها خريطة أسعار من مستويين: بضع خلايا مكلفة محددة بخطوط ثقيلة، والبقية مظللة بوصفها شبه مجانية

عد إلى التأطير الذي افتتح به هذا المقال. تقول لعنة الأبعاد إن فضاء البحث ينمو نموا أسيا مع عدد المعاملات، ومن ثم فالمزيد من الأبعاد أسوأ بالمطلق. هذا صحيح فيما يخص حجم الشبكة. لكنه مضلل فيما يخص تكلفة تغطيتها، لأنه يسعر كل بعد بالسعر ذاته.

ما إن تفصل بين المحورين حتى يقرأ العدد قراءة مختلفة. الاستراتيجية الثلاثية الأطر ذات 18 بعدا، لكن 6 فقط من تلك الأبعاد مكلفة. الأبعاد الاثنا عشر الأخرى أبعاد على المحور الرخيص توسع الشبكة دون أن توسع فاتورة الحساب بأي قدر يذكر — يمكنك أن ترمي عليها آلاف التكوينات بثمن بخس. والاستراتيجية الثنائية الأطر ذات 12 بعدا منها 4 فقط مكلفة و8 رخيصة. وفي الحالتين تتركز غالبية "اللعنة" على المحور الذي يكاد مسحه لا يكلف شيئا.

إذن الطريقة الأمينة للتفكير في تكلفة البحث ليست "كم عدد المعاملات" بل "كم عدد المعاملات المكلفة، وما مدى الخشونة الممكنة لشبكتها". المحور المكلف هو حيث يؤلم النمو الأسي فعلا، وهو حيث تريد شبكة صغيرة حسنة الاختيار — بضع فترات مرشحة، ومدى متواضعا من أطوال HMA — وربما مصقولة من الخشن إلى الدقيق، على غرار التنقيب التكيفي متدرج الدقة الذي نستخدمه في موضع آخر. أما المحور الرخيص فهو حيث يمكنك أن تكون سخيا، لأن كل تكوين عتبات إضافي يكلف 180 ميكروثانية.

تتعمم إعادة التسعير هذه إلى ما هو أبعد بكثير من استراتيجية HMA لدينا. فالنمط — بعض المعاملات يغير السمات، ومعظم المعاملات يغير القاعدة المطبقة على سمات ثابتة — يتكرر في كل مكان في التداول المنهجي. أطوال المؤشرات وترددات إعادة أخذ العينات ونوافذ النظر إلى الخلف مكلفة؛ أما عتبات الدخول والخروج ومسافات وقف الخسارة ومضاعفات تحديد حجم المركز وبوابات التأكيد فرخيصة. متى كان معامل ما لا يعيد تشكيل سوى حد القرار فوق إشارات محسوبة سلفا، فمكانه المحور الرخيص، وهناك ينبغي مسحه. وتظهر مكاسب تخزين مؤقت قريبة من العائلة نفسها في التخزين المؤقت بصيغة parquet متعدد الأطر الزمنية وفي سلم سرعة المحرك الأوسع.

أين تصل فاتورة الغداء المجاني

المحور الرخيص رخيص في الحساب. لكنه ليس رخيصا في الإحصاء، والخلط بين الاثنين هو الطريق إلى تحويل مكسب في الأداء إلى آلة لفرط الملاءمة.

كل تكوين عتبات تقيمه هو محاولة، وحين تشغل آلاف المحاولات على مجموعة بيانات واحدة يبدو أفضلها جيدا بمحض الحظ جزئيا. جعل تلك المحاولات أرخص بمقدار 1,600x لا يجعل الحظ يختفي — بل يجعل تراكمه أسهل. مسح العتبات الكثيف هو بالضبط الموقف الذي يعض فيه تضخم الاختبار المتعدد أشد العض: مرشحون كثر، وتاريخ واحد، وقاعدة انتقاء تبلغ عن القيمة القصوى. أسرع محرك في العالم سيسلمك بكل سرور متجه عتبات يلائم ضوضاء نافذة الاختبار لديك ملاءمة بديعة ثم يفشل خارج العينة.

لذا يجب أن ينمو الانضباط مع السرعة. فلحظة أن تهبط تكلفة الحساب للمحاولة الواحدة نحو الصفر، تصبح المحاسبة الإحصائية هي القيد الملزم، وعليك أن تدفعها صراحة:

  • اخصم مقابل عدد المحاولات. قيم الفائز في ضوء عدد التكوينات التي جربتها، لا في ضوء الصفر. نسبة شارب المنكمشة واحتمال فرط ملاءمة الاختبار الخلفي وجدا لهذا بالضبط — فهما يحولان عبارة "جربنا 4,000 متجه عتبات" إلى اقتطاع من الميزة المبلغ عنها.
  • تحقق خارج العينة، لكل طية. المسح الرخيص يجب أن يشغل رغم ذلك داخل تقسيم التحقق التقدمي (walk-forward) صادق؛ فالعتبة التي لا تفوز إلا داخل العينة عديمة القيمة مهما كانت سرعة العثور عليها. محركنا يبقي التنفيذات خالية من التسريب (open[i+1]) تحديدا حتى لا يستطيع المحور الرخيص شراء الأداء عن طريق التلصص.
  • فضل الهضاب على القمم. لأن محور العتبات كثيف وسريع، يمكنك رسم خريطة سطح استجابته، لا مجرد نقطة argmax فيه. منطقة عريضة من العتبات تعمل كلها هي ميزة حقيقية؛ أما ذروة شائكة منفردة فهي أثر ملاءمة مصطنع — تمييز الهضبة مقابل القمة، الذي جعلته السرعة التي نصفها ذاتها ميسور التكلفة.

اقرأ بنية المحورين قراءتها الصحيحة: إنها لا تشتري لك مزيدا من الثقة، بل تشتري لك مزيدا من المحاولات بتكلفة الثقة نفسها لكل محاولة. وهذا قيم حقا — التغطية الكثيفة للمحور الرخيص هي ما يتيح لك العثور على الهضاب وتوصيف السطح — لكن فقط إذا أبقيت الدفتر الإحصائي أمينا. السرعة تزيل عذر الحساب عن البحث غير الوافي؛ لكنها لا تزيل واجب خصم ما يجده البحث الوافي.

كيف تنظم بحثك أنت

لتطبيق هذا على استراتيجيتك أنت، العمل في معظمه تصنيف — فرز معاملاتك على المحور الصحيح — تليه حلقة متداخلة:

  1. صنف كل معامل بحسب ما يجبرك على إعادة حسابه. إذا كان تغييره يغير مصفوفة مؤشر/سمة، فهو مكلف. وإذا كان لا يغير سوى مقارنة أو عتبة أو قاعدة تحجيم تطبق على مصفوفات ثابتة، فهو رخيص. وعند الشك اسأل: هل يظهر هذا المعامل في أي موضع داخل تعريف المؤشر؟ إن لم يكن كذلك، فهو رخيص.
  2. افهرس الذاكرة المؤقتة على المحور المكلف وحده. احفظ بناء السمات في الذاكرة مفهرسا بمعاملات مؤشراته (كما تفعل SignalCache بالمفتاح (period, hma_length)). عندها تعيد المحاولات المتجاورة التي تتشارك توليفة مؤشرات استخدام المصفوفات ذاتها مجانا.
  3. شغل المحور الرخيص دفعات فوق السمات المخزنة. شغل تكوينات العتبات كحلقة مترجمة محكمة على الإشارات المحسوبة مسبقا، لا كإعادات تقييم كاملة. من هنا تأتي إنتاجيتك — وفي حالتنا الـ ~5,600 تكوين/ثانية.
  4. داخل بين الحلقتين: المكلفة خارجا والرخيصة داخلا. أبق الشبكة المكلفة صغيرة ومقصودة (خشنة، أو من الخشن إلى الدقيق)؛ ودع المسح الرخيص يكون كثيفا. أنفق الميزانية حيث تكلف المعاملات شيئا.
  5. حدد ميزانية المحاولات في مواجهة فرط الملاءمة، لا في مواجهة الساعة. الآن وقد كف الوقت عن أن يكون الحد، دع نسبة شارب المنكمشة / PBO تكون هي الحد. قرر كم من محاولات المحور الرخيص يمكنك تحمله إحصائيا، وتحقق من الفائز خارج العينة.

المكسب الهندسي والحاجز الإحصائي وجهان لفكرة واحدة: فصل المحورين يتيح لك البحث في الأبعاد الرخيصة بحثا مستقصيا، وهذا بالضبط ما يوجب عليك بعد ذلك خصم مدى استقصائك في البحث.

الخلاصات

  1. ليست كل الأبعاد متساوية التكلفة. تنقسم معاملات الاستراتيجية إلى محور مكلف (المؤشرات — يعاد حسابها على السلسلة كلها) ومحور رخيص (العتبات — تمريرة O(n) على إشارات محسوبة مسبقا). في محركنا يعني ذلك 6 مكلفة + 12 رخيصة للنسخة الثلاثية الأطر، و4 + 8 للنسخة الثنائية الأطر.
  2. المؤشرات ثابتة تجاه العتبات، وذلك الثبات هو التحسين كله. بناء السمات يعتمد على معاملات المؤشرات وحدها، فتبني مرة واحدة، وتخزن مفهرسا بـ (period, hma_length)، وتعيد الاستخدام عبر كل تكوين عتبات يتشارك التوليفة.
  3. المحور الرخيص يعمل أرخص بنحو 1,600x. نحو ~5,600 تكوين عتبات/ثانية (~180 µs لكل تكوين) على إشارات مخزنة، مقابل ~0.3 s لكل تكوين إذا أعدت بناء المؤشرات في كل مرة. الدقة نفسها — الفرق الوحيد هو رفض إعادة حساب ثابت.
  4. لعنة الأبعاد هي في حقيقتها لعنة الأبعاد المكلفة. معظم عدد المعاملات يقيم على المحور الذي يكاد مسحه يكون مجانيا. أبق الشبكة المكلفة خشنة؛ وكن سخيا على الرخيصة.
  5. السرعة تنقل القيد الملزم من الحساب إلى الإحصاء. المسح الكثيف السريع آلة اختبار متعدد. اخصم مقابل عدد المحاولات، وتحقق لكل طية، وفضل الهضاب على القمم — الغداء المجاني حقيقي، لكن الفاتورة الإحصائية ليست اختيارية.

المحرك الكامل — SignalCache وsweep_separations والمحاكاة متعددة الأطر الخالية من التسريب واختبار التطابق الذي يثبتها على دلالات الشمعة الجارية الحية — يقيم في scripts/engine_multitf.py (الإيداع bfc8aaa) في نظام الاختبار الخلفي لدينا. في المرة القادمة التي يقول لك فيها أحدهم إن استراتيجية ذات 18 معاملا أكبر من أن تبحث، اسأله كم من تلك المعاملات يحرك المؤشرات فعلا. عادة يكون الجواب ثلثها، والبقية شبه مجانية.

blog.disclaimer

Authors

Eugen Soloviov
Eugen Soloviov

Trading-systems engineer

Trading-systems engineer building bots since 2017: cross-exchange arbitrage (connected up to 30 venues), cointegration-based pairs arbitrage across spot and futures, scalping, news and sentiment-driven strategies, trend algorithms, and portfolio management and balancing algorithms. Also builds sub-millisecond order execution, big-data warehouses, backtesting engines, AI agents, and trading interfaces (incl. open-source profitmaker.cc). Stack: JS/TS, Python, Rust/Zig/Go, DevOps, backend, frontend, architecture.

Newsletter

ابقَ متقدماً على السوق

اشترك في نشرتنا الإخبارية للحصول على رؤى حصرية حول تداول الذكاء الاصطناعي وتحليلات السوق وتحديثات المنصة.

نحترم خصوصيتك. يمكنك إلغاء الاشتراك في أي وقت.