بناء واختبار cBots
بناء واختبار cBots من cTrader (C# و Python، كلاهما .NET) من محرر Monaco المتقدم
داخل المتصفح، التشغيل على صورة ghcr.io/spotware/ctrader-console الرسمية.
البناء
- صفحة Builder تستضيف محرر Monaco؛ يقوم
CBotBuilderبترجمة المشروع باستخدامdotnet buildداخل حاوية مؤقتة (AppOptions.BuildImage، مع ربط دليل العمل في/work)، بحيث لا تصل أهداف MSBuild غير الموثوقة إلى مضيف النظام. يتم تخزين مؤقت استعادة NuGet عبر المشاريع بوساطة مجلد مشترك. يحتاج المضيف الويب إلى وصول مقبس Docker. - قوالب البدء C# و Python موجودة في
src/Nodes/Builder/Templates/.
التشغيل والاختبار
- Instances = التسلسل الهرمي TPH (
Run/Backtest×Pending/Scheduled/Starting/Running/Stopping/Stopped/Failed). يحل الانتقال محل الكيان (تغيير معرف)، يتم نقل معرف الحاوية. - يختار
NodeSchedulerالعقدة المؤهلة الأقل تحميلاً؛ يوجهContainerDispatcherFactoryإلى وكيل HTTP عقدة بعيدة أو موزع Docker محلي. - تقوم برامج الاستكمال بالتوفيق مع الحاويات الخاروج (تخرج حاويات الاختبار ذاتياً عبر
--exit-on-stop)؛ التقرير موجود → مكتمل (تخزينReportJson)، مفقود → فشل. - يتم بث سجلات الحاوية الحية إلى المتصفح عبر SignalR؛ يتم تحليل منحنيات الأسهم من التقرير ورسمها بيانياً.
يتم تخزين بيانات السوق للاختبار مؤقتاً لكل حساب
تقوم cTrader Console بتنزيل بيانات علامات/أشرطة تاريخية إلى --data-dir الخاص بها. هذا الدليل هو
ذاكرة تخزين مؤقت مستقرة وثابتة مفتاحة حسب حساب التداول (رقم حسابه) — مرتبطة من
قرص العقدة في مسار الحاوية الخاص بها (/mnt/data)، جبل منفصل وغير متداخل من
دليل العمل لكل مثيل. لذا يعيد استخدام كل اختبار على نفس الحساب البيانات التي تم تنزيلها بالفعل
بدلاً من إعادة تنزيلها في كل تشغيل. (في السابق
كان دليل البيانات يعيش تحت دليل العمل لكل مثيل، والذي يتغير معرفه في كل تشغيل، مما أجبر على تنزيل جديد
في كل اختبار.) دليل العمل المؤقت لكل مثيل لا يزال يحتوي على الخوارزمية والمعاملات وكلمة المرور
والتقرير؛ يتم احتساب ذاكرة البيانات المشتركة في استخدام بيانات الاختبار لعقدة ما وحذفها بواسطة
إجراء تنظيف العقدة.
إعدادات الاختبار
يعرض حوار Backtest إعدادات اختبار cTrader Console التي يمكن للمستخدم ضبطها، بحيث لا تضطر أبداً إلى لمس سطر أوامر:
- الرمز / الإطار الزمني — الإطار الزمني هو قائمة منسدلة من كل فترة cTrader (
t1…t1000،m1…m45,h1…h12,D1/D2/D3,W1,Month1، وفترات Renko/Range/Heikin)، في الكتابة الكنسية للكونسول، بحيث تختار دائماً--periodصحيحة. - من / إلى — نافذة الاختبار (
--start/--end). - وضع البيانات — واحد من ثلاثة أنماط cTrader (
--data-mode): بيانات علامة (tick، دقيقة)، أشرطة m1 (m1، سريعة)، أو أسعار الافتتاح فقط (open، الأسرع). - الرصيد الأولي — الافتراضي
10000(--balance). الرصيد الصفر لا يضع أي صفقات يجعل cTrader ينبت تقرير فارغ ثم يتعطل عليه ("Message expected")، لذلك يتم إرسال رصيد غير صفري دائماً. - العمولة —
--commission. - السبريد —
--spread، حقل رقمي بالنقاط لا يمكن أن ينخفض عن 0. إنه مخفي في وضع Tick data، حيث تستمد cTrader السبريد من بيانات العلامة نفسها (لا يتم إرسال--spread).
يتم إدارة دليل البيانات (--data-file / --data-dir) بواسطة التطبيق نفسه (ذاكرة تخزين مؤقت لكل حساب، انظر
أعلاه)، وليس معروضة في الحوار.
:::note cTrader يتعطل على اختبار فارغ
إذا كان الاختبار ينتج بدون نتائج — بدون صفقات، أو بدون بيانات سوق للتواريخ/الرمز المختار —
فإن كاتب التقرير الخاص به cTrader Console يرمي Message expected وينهي بدون تقرير. التطبيق لا يمكنه
إصلاح هذا الخلل العلوي، لكنه يكتشفه ويحدد علامة Instance Failed بسبب قابل للتنفيذ
("لا توجد نتائج اختبار للنطاق المحدد…") بدلاً من تتبع مكدس خام. اختر نطاق تاريخ أوسع
يحتوي على بيانات سوق متاحة وحاول مرة أخرى.
:::
صفحة تفاصيل الحالة
يعرض فتح حالة (/instance/{id}) حالتها الحية والسجلات و — لاختبار — منحنى الأسهم. عنوان علامة التبويب في المتصفح يعكس
حالة معينة (اسم cBot · النوع · الرمز، على سبيل المثال
TrendBot · Backtest · EURUSD) بحيث تكون علامة التشغيل المباشر وعلامة الاختبار قابلة للتمييز في لمحة.
يتم تتبع التشغيل والاختبار من نفس cBot كـ lineages مختلفة (معرف lineage ثابت يتم نقله
عبر انتقالات الحالة)، بحيث تتبع الصفحة حالة واحدة بالضبط ولا تخلط أبداً بيانات التشغيل مع
الاختبار.
عناصر تحكم دورة حياة الحالة
يحتوي كل صف حالة (وصفحة التفاصيل الخاصة به) على عناصر تحكم صحيحة في الحالة. تعرض حالة نشطة إيقاف؛ تعرض حالة طرفية (Stopped / Completed / Failed) Start (▶) لإعادة تشغيله باستخدام نفس cBot والحساب والرمز والإطار الزمني ومجموعة المعاملات والصورة (يعاد تشغيل التشغيل كتشغيل، اختبار كاختبار). يظهر النقر على Stop إشعار "Stopping…" وتعطيل الرمز حتى يتم حله، وتظهر عملية تشغيل محدثة في القائمة على الفور — بدون تحديث الصفحة.
يتم المثابرة على سجلات وحدة التحكم عند انتهاء حالة — للتشغيل (عند الإيقاف) و الاختبار (عند الاكتمال) على حد سواء — بحيث تبقى سجلات آخر تشغيل قابلة للعرض على صفحة التفاصيل و عبر شريط أدوات السجل، نسخة إلى الحافظة (رمز نسخ السجلات) أو تنزيل (رمز تنزيل السجلات) حتى بعد اختفاء الحاوية. كلاهما يعمل على سجل وحدة التحكم الكامل للحالة، وليس فقط الذيل المرئي على الشاشة.
يحافظ الاختبار المكتمل أيضاً على تقرير cTrader بكلا الصيغتين — JSON الخام (نفسه الذي يقرأه منحنى الأسهم والتحليل الاصطناعي) والتقرير HTML الكامل. كلاهما قابل للتنزيل من صف الاختبار و صفحة التفاصيل عبر رموز مخصصة. يتم الاحتفاظ بـ آخر تشغيل فقط التقارير، والرموز معطلة لأي اختبار لم يتم بدؤه أو قيد التشغيل أو فشل (وليست موجودة أبداً لحالة تشغيل) — فقط الاختبار المكتمل له تقرير لتنزيله.
تم تحميل uploaded .algo أبداً هنا، لذا يتم ترك عمود Last Build الخاص به على صفحة cBots
فارغ (يعرض وقت البناء فقط لـ cBots التي تبنيها في المتصفح).
تعديل وإعادة تشغيل حالة موقوفة
حالة موقوفة (تشغيل أو اختبار) لها عنصر تحكم تعديل — رمز على صفه في القائمة و بجانب Start/Stop على صفحة التفاصيل الخاصة بها — الذي يفتح حوار مملوء مسبقاً بتكوينه الحالي. يمكنك تغيير حساب التداول والرمز والإطار الزمني ومجموعة المعاملات وعلامة الصورة (وللاختبار، النافذة وجميع إعدادات الاختبار أعلاه)، ثم Save & start إعادة تشغيله مع إعدادات جديدة (استبدال الحالة الموقوفة). عنصر التحكم معطل بينما الحالة نشطة — فقط حالة موقوفة يمكن تعديلها.
التشغيل من محرر الأكواد
النقر على Run في محرر الأكواد يفتح حوار بدلاً من إطلاق تشغيل أعمى مرموز:
- حساب التداول (مطلوب) — حساب cTrader الذي يتصل به cBot.
- مجموعة المعاملات (اختياري) — اختر مجموعة موجودة، أو اتركها فارغة للتشغيل باستخدام قيم المعاملات الافتراضية للـ cBot. يوجد زر + بجانب المحدد لإنشاء مجموعة معاملات جديدة مضمنة (انظر أدناه) وتحديدها.
- الرمز / الإطار الزمني الافتراضي إلى
EURUSD/h1ويمكن تغييرها؛ Cancel أو Run.
عند Run يحفظ المحرر + ينشئ المصدر الحالي، يبدأ الحالة على الحساب المختار
بمعاملات مختارة، ثم يتابع سجلات الحاوية الحية. (يعيد تيار السجل ملف تعريف الارتباط للمستخدم الموقع
إلى مركز /hubs/logs SignalR، بحيث يتصل بدلاً من الفشل مع
Invalid negotiation response received.)
مجموعات المعاملات
مجموعة المعاملات هي مجموعة مسماة وقابلة لإعادة الاستخدام من تجاوزات معاملات cBot مخزنة كـ
كائن JSON مسطح يرسم كل اسم معامل إلى قيمة عددية، على سبيل المثال {"Period": 14, "Label": "trend"}. في
وقت التشغيل/الاختبار يتم تحويله إلى ملف params.cbotset cTrader
({ "Parameters": { … } }). يمكنك إنشاء/تعديل مجموعة كـ JSON خام من حوار cBot
مجموعات المعاملات أو مضمنة من حوار التشغيل.
تنتمي كل مجموعة معاملات إلى cBot: يسرد حوار مجموعة المعاملات الجديدة جميع cBots الخاص بك و يجب عليك اختيار واحد —
يتم حظر الإنشاء حتى يتم اختيار cBot. اسم المجموعة فريد لكل cBot:
سيؤدي إنشاء أو إعادة تسمية مجموعة باسم آخر موجود بالفعل في نفس cBot إلى رفض (خطأ واضح في الحوار،
409 Conflict في API). قد يتم إعادة استخدام نفس الاسم على cBot مختلف.
يتم التحقق من صحة JSON عند الحفظ: يجب أن يكون كائن مسطح واحد قيمه كلها عددية
(string / number / bool). جذر غير كائن أو مصفوفة أو كائن متداخل أو قيمة null أو JSON سيء التكوين
سيتم رفضه (خطأ واضح في الحوار، 400 Bad Request في API). كائن فارغ {}
مسموح به ويعني "بدون تجاوزات".
ملاحظات سطر الأوامر cTrader Console
تحتاج الاختبارات إلى --data-mode (الافتراضي m1)، التواريخ كـ dd/MM/yyyy HH:mm، و
params.cbotset JSON موضعي arg؛ يرفض run قيمة --data-dir (الاختبار فقط). انظر
ContainerCommandHelpers.
العقد والقياس
تتسع سعة الاستكمال بإضافة وكلاء العقد (تسجيل ذاتي + نبضات القلب). انظر اكتشاف العقدة و الحجم.
حساب التداول مطلوب
تشغيل أو اختبار cBot يتطلب حساب cTrader للاتصال به. حتى تضيف واحد تحت
حسابات التداول، تكون أزرار تشغيل cBot جديد / اختبار cBot جديد معطلة (مع
تلميح) والصفحة تظهر موجه يربط إلى إعداد الحساب — لا تزيد من خطأ خام
stream connect failed من cBot بدون حساب.