تخطَّ إلى المحتوى

إعادة استخدام الاستراتيجيات والاختبارات التاريخية

تبقى خلايا البحث شيفرة Rust عادية قابلة للتحرير. تسهّل هذه الدوال المساعدة إعادة استخدام شيفرة الاستراتيجية الموجودة والنتائج المسجّلة؛ ولا تستبدل التحليل المخصص أو تقدّم محرك تداول منفصلًا.

ضمن Strategy code & backtests:

  • يحمّل Load research tools مكتبة استراتيجيتك العامة ومكوناتها باسم project::، واعتمادياتها المعتادة، ودوال الاختبار التاريخي والبحث المساعدة معًا. لا يتصل بمصدر بيانات ولا يشغّل استراتيجية.
  • يسرد Add discovery cell اختبارات المشروع التاريخية المكتملة ومعرّفات معلمات الرسم البياني.
  • اختر تشغيلًا مرجعيًا وآخر مرشحًا، ثم Add comparison cell.
  • يحدّث Refresh saved runs المنتقيات بعد تجربة دون إعادة ضبط المتغيرات.
  • ينشئ Add signal chart & heatmap مثالًا قابلًا للتحرير للتشغيل المحدد.
  • يستخدم Add isolated backtest cell اللقطات التاريخية المحمّلة بالفعل في الدفتر.

تدرج أزرار Add… cell الشيفرة دون تنفيذها. يترجم Load research tools بيئة التشغيل ويهيئها، لكنه لا يشغّل خلايا دفترك المحفوظة أبدًا. إذا كانت نسخة المشروع نفسها مستوردة بالفعل إلى جلسة قيد التشغيل، فإنه يعيد استخدام تلك الجلسة دون إعادة الترجمة أو ضبط المتغيرات أو وسم المخرجات بأنها غير محدّثة. أما الاستيرادات الجديدة أو المعدّلة فتعيد ضبط متغيرات الجلسة وتسم المخرجات السابقة بأنها غير محدّثة.

تُستعاد الشموع المحمّلة بالفعل وإعدادات التاريخ والوقت الأصلية عند تحميل الأدوات. ولا يؤدي تعديل حقول التاريخ في الجلسة إلى تغيير الفترة المنسوبة إلى لقطة موجودة؛ حمّل البيانات مرة أخرى لاستخدام فترة مختلفة.

الترجمة والتخزين المؤقت

Section titled “الترجمة والتخزين المؤقت”

يحل الاستيراد الأول اعتماديات المشروع، ويترجم AQE وPolars ووحدات المشروع المُصدَّرة، ثم يربط دوال الدفتر المساعدة ويستعيد اللقطات المحمّلة. تعرض لوحة الجلسة مرحلة التجهيز أو الترجمة والوقت المنقضي؛ ويلغي Stop/reset العملية. تُخزَّن الاعتماديات المترجمة مؤقتًا لكل دفتر عبر عمليات إعادة الضبط وإعادة تشغيل التطبيق. يختلف البناء الأولي للدفتر عن بناء تطبيق سطح المكتب أو الملف التنفيذي للاستراتيجية، وقد يستغرق عدة دقائق أيضًا.

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

بعد تحديث AQS، أعِد تشغيل جلسة الدفتر لاعتماد تغييرات إعداد المترجم. قد يعيد Cargo بناء الاعتماديات مرة واحدة عند تغيير ملف التعريف، ثم يعيد استخدام تلك الذاكرة المؤقتة في عمليات التحميل التالية. لا حاجة إلى حذف ذاكرة الترجمة المؤقتة.

احتفظ بالدفتر نفسه وذاكرة ترجمته المؤقتة للعمل المتكرر. استخدم Refresh saved runs لتحديث منتقيات الاختبارات التاريخية دون ترجمة. بعد تحرير مصادر هذا المشروع أو ملف تعريفه، انقر Load research tools مرة أخرى. وبعد تحرير AQE أو اعتمادية مسار خارجية أخرى، استخدم Stop/reset ثم Load research tools لفرض فحص استيراد جديد. تمسح إعادة الضبط المتغيرات، لا ذاكرة الاعتماديات المؤقتة؛ وأعِد تشغيل خلايا الإعداد المخصصة بعدها.

إعادة استخدام نموذج ألفا أو مؤشر أو مرحلة معالجة

Section titled “إعادة استخدام نموذج ألفا أو مؤشر أو مرحلة معالجة”

على سبيل المثال، يستطيع مشروع Three Amigo يصدّر وحدة openingrange استخدام تنفيذ ألفا الفعلي الخاص به:

use project::openingrange::Openingrange;
let alpha: Openingrange = Openingrange::new(
45, "07:00".to_string(), 14, 2.0, 1.5, false,
);
let study: AqsBacktest = aqs_run_alpha(alpha, &research_snapshot).await?;
let btc = study.bars("BTCUSD", "5m")?;
let signals = study.signals("BTCUSD")?;
aqs_chart(&btc).candles().signals(&signals)?.show()?;

استخدم اسم الوحدة والمُنشئ الفعليَّين لمكوّنك. تنفّذ aqs_run_alpha إعادة تشغيل تاريخية في AQE باستخدام دورة حياة ألفا وبيانات تاريخية مصفّاة زمنيًا. وهي دراسة للإشارات التداولية فقط، دون مرحلة لإرسال أوامر الدخول، وليست اختبارًا تاريخيًا لعائد الاستراتيجية. أما نماذج ألفا التي تتطلب إعدادًا مخصصًا لدورة الحياة أو أطرًا زمنية إضافية أو متغيرات مشتركة أو حالة تنفيذ، فينبغي اختبارها ضمن استراتيجية متكاملة.

استخدم أنواع متغيرات صريحة عند حدود الشيفرة المستوردة، كما في المثال أعلاه. قد يتطلب التحليل التزايدي للأنواع في دفتر Rust تصريحًا بالنوع حتى عندما يستطيع بناء Cargo عادي استنتاجه. إذا أبلغت خلية عن تعذّر تحديد نوع متغير، فصرّح به، مثل let btc: DataFrame = ...;، ثم أعِد تحميل الجلسة أو الإعداد إذا طلب التشخيص إعادة الضبط.

يمكن لمؤشر مستورد العمل مباشرةً على data.bars(symbol)?. وتتطلب مراحل معالجة الإشارات التداولية المستوردة سياق استراتيجية وحالات إشارات تداولية مناسبة. سجّلها في Strategy المخصصة لك في AQE، ثم شغّل تلك الاستراتيجية:

// my_strategy implements AQE's existing Strategy interface.
let run = aqs_run_strategy(
my_strategy, &research_snapshot, 100_000.0, 10,
).await?;
aqs_table(&run.trades()?, 20)?;

تستخدم إعادة التشغيل المخصصة هذه إعدادات الرسوم الافتراضية في PaperBroker، وقيمتَي رأس المال النقدي والرافعة المالية المُمرَّرتين صراحةً. ولا ترث تسجيلات دورة الحياة أو إعدادات الرسوم من الرسم البياني. للحفاظ على تلك الإعدادات، استخدم تجربة على الرسم البياني المحفوظ كما هو موضّح أدناه. ويمكنك أيضًا تعريف دوال ومؤشرات ونماذج واستراتيجيات مباشرةً في خلايا Rust.

قراءة الاختبارات التاريخية الموجودة

Section titled “قراءة الاختبارات التاريخية الموجودة”
aqs_table(&backtests.list()?, 100)?;
let run = backtests.load("backtests/your-run-id")?;
run.metrics()

تتضمن القائمة عمليات التشغيل المكتملة في مجلد backtests/ للمشروع المرتبط، وعمليات التشغيل المكتملة في research/experiments/. استخدم المعرّف المُعاد؛ إذ تُرفض المسارات المطلقة المباشرة ومحاولات الانتقال إلى المجلد الأب. يجب أن تتوفر المقاييس وbacktest.db معًا.

let equity = run.equity()?;
let trades = run.trades()?; // Closed round trips
let insights = run.insights()?; // Full saved insight records
let btc = run.bars("BTCUSD", "5m")?;
let fills = run.table("trade_log")?;
let monthly = run.table("monthly_returns")?;
aqs_table(&insights, 20)?;
aqs_plot(&equity, "equity")?;

تختار bars الرمز والإطار الزمني المحفوظَين بدقة والتدفق غير الخاص بالخصائص. وتضيف عمود timestamp من نوع Int64 بالميلي ثانية بتوقيت UTC. تضيف equity ذلك الطابع الزمني إلى جانب return_pct، أي تغير حقوق الملكية من أول قيمة مرصودة، وdrawdown_pct، أي التراجع نسبةً إلى أعلى قيمة مرصودة حتى اللحظة. وهذه ليست عوائد معدّلة للتدفقات النقدية.

تحافظ table(name) على أسماء الأعمدة والبيانات المخزّنة. تشمل الجداول المتاحة الشموع وسجل الحساب والإشارات التداولية وسجل التداول والصفقات المكتملة والعوائد الشهرية والأداء الزمني وسلاسل التراجع وأداء الاستراتيجية وحالات السوق والتعرض للعوامل والارتباطات وتركيز المراكز والانزلاق السعري وأقصى حركة معاكسة للصفقة MAE وأداء إعدادات التداول ونسبة شارب المتحركة وعمليات مسح المعلمات ونتائج الاختبار المتقدم زمنيًا. قد تفتقر عمليات التشغيل القديمة إلى بعض الجداول وتبلّغ عن خطأ بدلًا من اختلاق بيانات.

تقتصر القراءات الكاملة على 250,000 صف و64 MiB لكل طلب. يؤدي تجاوز الحد إلى خطأ، لا إلى نتيجة مقتطعة بصمت. استخدم تقسيم الصفحات صراحةً لعمليات التشغيل الأكبر:

let (page, has_more) = run.table_page("insights", 10_000, 0)?;
// Next page: run.table_page("insights", 10_000, 10_000)?

مقارنة الاستراتيجيات والإشارات التداولية

Section titled “مقارنة الاستراتيجيات والإشارات التداولية”
let baseline = backtests.load("backtests/baseline-id")?;
let candidate = backtests.load("backtests/candidate-id")?;
aqs_compare_backtests(&[&baseline, &candidate])?;
aqs_returns_heatmap(&[&baseline, &candidate])?;
let differences = aqs_compare_insights(&baseline, &candidate)?;
aqs_table(&differences, 30)?;
دفتر بحث في AQS يعرض شيفرة Rust لمقارنة الاختبارات التاريخية والإشارات التداولية، وملخصًا للحساب، ومخططين منفصلين لتغيّر قيمة الحساب والتراجع لتشغيلين محفوظين.دفتر بحث في AQS يعرض شيفرة Rust لمقارنة الاختبارات التاريخية والإشارات التداولية، وملخصًا للحساب، ومخططين منفصلين لتغيّر قيمة الحساب والتراجع لتشغيلين محفوظين.

قارن عمليات التشغيل المحفوظة باستخدام ملخص للحساب ومنحنيات تغيّر قيمته والتراجع. عرض لقطة شاشة المقارنة بالحجم الكاملعرض لقطة شاشة المقارنة بالحجم الكامل.

تقبل aqs_compare_backtests من 2–6 عمليات تشغيل، وتعرض ملخصًا ومنحنيات متراكبة لتغيّر حقوق الملكية والتراجع. تستخدم الإحصاءات جميع بيانات رصد الحساب المحمّلة، بينما تُؤخذ عينات من المنحنيات للعرض. يحتفظ كل تشغيل بأوقات الرصد الخاصة به بتوقيت UTC. ولا تُرحَّل القيم السابقة لملء الفجوات، ولا تُعاد معايرة السلاسل على نقطة رصد مشتركة مختلقة.

تحقّق من تطابق نوافذ الاختبار ورأس المال الأولي والتدفقات النقدية ومراجعة المصدر ومجموعة البيانات والتهيئة ومواصفات الأصول والرسوم قبل نسبة الفروق إلى تغيير نموذج. تعرض الدالة فترات مختلفة لكنها لا تدّعي أنها تجارب مضبوطة. وتظل المقاييس المسجّلة متاحة عبر metrics().

تطابق aqs_compare_insights الإشارات التداولية المولّدة بحسب الرمز ووقت الإنشاء الدقيق ونموذج ألفا والاتجاه والإطار الزمني، وما إذا كانت الإشارة التداولية أمًا أو فرعية، لا بحسب معرّفات UUID العشوائية. وتحتسب الإشارات التداولية المكررة. تعيد أعداد الإشارات التداولية في التشغيل المرجعي والمرشح، وعدد المتطابق منها، والإشارات التداولية المنفردة في كل تشغيل. وهي لا تؤكد تطابق عمليات تنفيذ الأوامر أو الربح والخسارة؛ وللتحقق من ذلك، افحص جداول الإشارات التداولية والصفقات كاملةً.

تقارن aqs_compare(&data, symbols, "close") الأقدم أسعار السوق، لا أداء الاختبار التاريخي.

وضع علامات للإشارات المولّدة أو عمليات الدخول المنفّذة

Section titled “وضع علامات للإشارات المولّدة أو عمليات الدخول المنفّذة”
let candles = baseline.bars("BTCUSD", "5m")?;
let generated = baseline.signals("BTCUSD")?;
aqs_chart(&candles).candles().signals(&generated)?.show()?;
let executed = baseline.fills("BTCUSD")?;
aqs_chart(&candles).candles().signals(&executed)?.show()?;

تستخدم علامات الإشارات التداولية المولّدة created_at، وتستخدم علامات الدخول المنفّذ filled_at. توليد الإشارة التداولية لا يثبت تنفيذ أمرها. تحتاج إطارات بيانات العلامات المخصصة إلى timestamp بالميلي ثانية بتوقيت UTC، وside بقيمة Buy/Sell دون تمييز بين الأحرف الكبيرة والصغيرة، واختياريًا label. صفِّ البيانات بنفسك لتقتصر على رمز واحد في الرسم البياني وبحد أقصى 500 علامة.

يضع المخطط التفاعلي العلامة على الشمعة المعروضة السابقة، ويحتفظ بوقت الحدث الدقيق في نصها. لا تُعرَض العلامات الخارجة عن النطاق. قد يغيّر تقليل العينات موضعها البصري؛ لكنه لا يغيّر الطابع الزمني المخزّن أبدًا. تستخدم لقطات أوراق AQI العارض التفاعلي نفسه لمخططات السلاسل الزمنية المحفوظة، وتحتفظ ببديل SVG ثابت مع تعليقات وقت الحدث.

تشغيل تجربة معزولة لرسم بياني محفوظ

Section titled “تشغيل تجربة معزولة لرسم بياني محفوظ”

احفظ الرسم البياني وحمّل البيانات التاريخية، ثم افحص معرّفات العقد وأسماء المدخلات الفعلية:

project_parameters
let baseline = aqs_backtest()
.name("Baseline")
.snapshot(&research_snapshot)
.run()?;
let candidate = aqs_backtest()
.name("Candidate")
.snapshot(&research_snapshot)
.parameter("actual-node-id", "actual-input-name", 45)
.run()?;
aqs_compare_backtests(&[&baseline, &candidate])?;

يأخذ المشغّل لقطة للشيفرة المصدرية للمشروع والرسم البياني المحفوظ، ويتحقق من بصمات ملفات Parquet التاريخية، وينشئ مدخلات CSV، ويستخدم توليد شيفرة AQE المعتاد مع PaperBroker. ويحتفظ بإعدادات تحديد الحجم والمخاطر وترتيب مراحل المعالجة ودورة الحياة والرسوم في الرسم البياني. تنطبق القيم البديلة على هذه التجربة فقط، ولا يُعاد كتابة ملف .aqmeta الأصلي أو الشيفرة المصدرية أو ملف تعريف المشروع. لا تتضمن التجربة تغييرات الرسم البياني غير المحفوظة في المحرر. حدد القيم الافتراضية للمعلمات الفائقة أولًا؛ فلا تُشغَّل عمليات مسح لتركيبات المعلمات ضمنيًا.

توجد كل تجربة في research/experiments/<id>/، مع لقطة مصدرها وإعدادها وprovenance.json وexecution.log وملفات نتائج الاختبار التاريخي المعتادة في AQE. تعيد عمليات البناء استخدام research/experiment-target/. ينهي Stop/reset شجرة عمليات الدفتر، بما فيها أي تجربة نشطة. تحتفظ عمليات التشغيل الفاشلة بالتشخيصات ولا تُدرَج كمكتملة.

تظل اعتماديات المسارات الخارجية تشير إلى مجلدات شيفرتها المصدرية الموجودة، ولا تُنسَخ إلى التجربة. أبقِ تلك الاعتماديات ثابتة أثناء مقارنة عمليات التشغيل. يُستخدم ملف قفل المشروع نقطة بداية، لكن قد يعدّل Cargo اختيار الاعتماديات وفق متطلبات بناء البحث؛ افحص Cargo.lock النهائي للتجربة عند إعادة إنتاج النتائج.

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

يمكن تضمين الشيفرة المحددة ومخططات المقارنة ومخططات العلامات والخرائط الحرارية ومعاينات الجداول في كتلة دفتر AQI. لا ينفّذ القراء أي شيء. ولا ترفع المشاركة تلقائيًا أشجار مصادر المشروع أو قواعد البيانات الخام أو مجموعات البيانات أو بيانات الاعتماد. راجع أي شيفرة أو مسارات مطبوعة أو معاينات بيانات قبل حفظ ورقة أو نشرها.