انتقل إلى المحتوى

تحسين أداء روبوت cBot

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

نطاق الاستخدام

يُستخدم الأمر optimize لتحسين معلمات روبوتات cBot. تملك المؤشرات والإضافات أوامر خاصة بها (indicator calculate وindicator history وcreate وbuild)، ولا يشملها التحسين.

المتطلبات المسبقة

  • يجب أن يكون cTrader CLI مثبتًا وأن تتمكن من تسجيل الدخول.
  • يجب تصدير روبوت cBot في ملف .algo وتجميعه ليعمل على .NET 8.
  • وجود ملف معلمات يحدد المعلمات التي سيجري تغيير قيمها أثناء البحث.

ملاحظة

لا يتوفر الأمر optimize إلا في الإصدار المحلي من cTrader CLI. ولا يتوفر في الإصدار الداخلي أو الإصدار السحابي.

الأمر optimize

ctrader-cli optimize <path-to-algo-file> --params=<path-to-params-file> [options]

يكون مسار ملف .algo هو الوسيطة الأولى. الخيار --params إلزامي. يجب تحديد الإطار الزمني الأساسي إما عبر --timeframe أو في ملف المعلمات. إذا لم يُحدَّد بأي من الطريقتين، يتوقف الأمر مع ظهور خطأ.

خيارات التحسين

الخيار الإلزامي الوحيد هو --params. تشمل الخيارات الاختيارية الشائعة المستخدمة في الأمثلة أدناه --timeframe و--method و--criteria و--optres و--passes-dir.

من المفيد معرفة الخيارات التالية قبل البدء:

  • --method — القيمة genetic (الافتراضية) أو grid. اختر grid إذا كان عدد تركيبات المعلمات قليلًا وأردت اختبارها جميعًا، واختر genetic إذا كان العدد كبيرًا وكان البحث الموجّه أسرع.
  • --cores — عدد عمليات العمل المتوازية التي تنفّذ مرحلة الاختبار العكسي لكل تكرار من تكرارات التحسين. تستخدم كل عملية عمل مسار تنفيذ واحدًا من المعالج (CPU thread)، ولذلك يستهلك التحسين عددًا من مسارات التنفيذ يقارب القيمة المحددة. القيم المقبولة هي الأعداد الصحيحة التي تبدأ من 1. القيمة الافتراضية هي نصف عدد المعالجات زائد واحد. خفّض هذه القيمة على خادم VPS صغير لترك موارد للمهام الأخرى، أو ارفعها على جهاز مخصص لتوزيع البحث الجيني على عدد أكبر من خيوط المعالجة.
  • --auto-select-best — يختار تلقائيًا أفضل تكرار عند انتهاء التحسين، حتى يكون ملف .cbotset الذي يضم أفضل إعدادات المعلمات جاهزًا للاستخدام دون خطوات إضافية.

ملاحظة

يستخدم الأمر optimize الخيار --timeframe، وليس --period. لا يزال الأمران run وbacktest يستخدمان --period. يرفض الأمر optimize الخيار --period باعتباره خيارًا غير معروف.

ملف المعلمات

الملف المحدد عبر --params هو كائن JSON يحتوي على مصفوفة parameters. له بنية الملف نفسها الذي يُصدَّر من واجهة التحسين في تطبيق cTrader لسطح المكتب، ولذلك يمكنك استخدام الملف المصدَّر من التطبيق مباشرةً.

{
  "parameters": [
    { "Name": "SlowPeriods",  "Optimize": true, "Min": "5",  "Max": "50", "Step": "5" },
    { "Name": "StopLossPips", "Optimize": true, "Min": "10", "Max": "60", "Step": "5" },
    { "Name": "MAType",       "Optimize": true, "Values": ["0", "1", "2"] },
    { "Name": "MySymbol",     "Optimize": true, "Values": ["EURUSD", "GBPUSD"] }
  ]
}

قواعد الحقول

  • الحقل Name إلزامي، ويجب أن تطابق قيمته اسم خاصية في روبوت cBot. شغّل ctrader-cli metadata <path-to-algo> للاطلاع على أسماء الخصائص المتاحة. إذا لم يوجد اسم في البيانات الوصفية لروبوت cBot، يُسجَّل ذلك في السجل ويُتجاهل المعلم، ثم يستمر التحسين باستخدام المعلمات المتبقية.
  • عند ضبط Optimize على true، يُدرج المعلم في عملية البحث. أما عند ضبطه على false، فتظل قيمته ثابتة.
  • تتطلب المعلمات التي تقبل نطاقًا من القيم، مثل الأعداد الصحيحة والأعداد ذات الفاصلة العائمة، الحقول Min وMax وStep إذا أردت تغيير قيمها أثناء التحسين.
  • تتطلب المعلمات ذات القيم المنفصلة، مثل التعدادات والرموز، مصفوفة Values غير فارغة إذا أردت تغيير قيمها أثناء التحسين.
  • الحقل ParameterType اختياري. إذا حُذف، يُستنتج النوع من البيانات الوصفية لروبوت cBot بمطابقة الحقل Name.

تثبيت معلم على قيمة واحدة

لإبقاء قيمة معلم ثابتة، أدرجه مع Optimize: false وقيمة Value الخاصة به:

{ "Name": "MAType",      "Value": "1", "Optimize": false },
{ "Name": "FastPeriods", "Value": "5", "Optimize": false }

تحذير

ملف المعلمات هو المرجع المعتمد. قبل تطبيق الملف، يعيد cTrader CLI ضبط جميع المعلمات بحيث لا تُفحص إلا المعلمات المدرجة بقيمة Optimize: true. يحتفظ المعلم غير المذكور في الملف إطلاقًا بقيمته الافتراضية، حتى إذا كان روبوت cBot يضبطه افتراضيًا على أنه قابل للتحسين. أدرج المعلم مع Optimize: true لإضافته إلى عملية التحسين.

تحسين الإطار الزمني الرئيسي

يمكن للأمر optimize فحص عدة أطر زمنية رئيسية إلى جانب معلمات روبوت cBot. يمكن تحديد الإطار الزمني الرئيسي من مصدرين، وتكون الأولوية للخيار --timeframe.

  • --timeframe <tf> — تؤدي القيمة الواحدة إلى تثبيت الإطار الزمني الرئيسي، بينما تتيح القيم المتعددة المفصولة بفواصل فحص عدة أطر زمنية.
  • ملف المعلمات — يحتوي الملف المصدَّر من تطبيق سطح المكتب بالفعل على معلم اصطناعي للإطار الزمني مخصص لهذا الغرض.

الإطار الزمني الأساسي للبيانات هو القيمة الوحيدة المحددة، أو القيمة المثبتة، أو أصغر إطار زمني من القيم التي يجري فحصها.

التوافق بين الأطر الزمنية وأوضاع البيانات

يجب أن تكون الأطر الزمنية الرئيسية، سواء كانت ثابتة أم يجري فحصها، متوافقة مع --data-mode المحدد.

وضع البيانات الأطر الزمنية الرئيسية الصالحة
open الأطر الزمنية من النوع نفسه التي تكون مضاعفات صحيحة لأصغر إطار زمني محدد.
m1 أو m1-csv أي إطار زمني قائم على الوقت. أما الأنواع غير القائمة على الوقت، مثل Renko وأشرطة النطاق السعري، فتُرفض.
ticks أي إطار زمني غير مخصص.

ملاحظة

تؤدي التركيبة غير الصالحة إلى إيقاف الأمر قبل تحميل أي بيانات، مع عرض القيم التي تسببت في الخطأ.

المعايير

يربط كل عنصر في --criteria مؤشر أداء باتجاه max أو min، مثل NetProfit:max. يسرد الجدول التالي جميع أسماء مؤشرات الأداء المدعومة وما يقيسه كل منها.

مؤشر الأداء ما الذي يقيسه
NetProfit الربح أو الخسارة النهائية بعملة الحساب
ProfitFactor إجمالي الربح مقسومًا على إجمالي الخسارة
MaxEquityDrawdownPercentages أكبر تراجع نسبي في رأس المال من أعلى مستوى إلى أدنى مستوى
MaxBalanceDrawdownPercentages أكبر تراجع نسبي في الرصيد من أعلى مستوى إلى أدنى مستوى
MaxEquityDrawdown أكبر تراجع مطلق في رأس المال، بعملة الحساب
MaxBalanceDrawdown أكبر تراجع مطلق في الرصيد، بعملة الحساب
WinningTrades عدد الصفقات المغلقة على ربح
LosingTrades عدد الصفقات المغلقة على خسارة
TotalTrades إجمالي عدد الصفقات المغلقة
AverageTrade صافي الربح مقسومًا على عدد الصفقات المغلقة

لزيادة صافي الربح إلى أقصى حد مع تقليل أقصى تراجع في رأس المال:

--criteria="NetProfit:max,MaxEquityDrawdownPercentages:min"

لتحديد ترتيب مخصص، استخدم --fitness بدلًا من ذلك. تعيد الدالة GetFitness في روبوت cBot درجة تقييم، ويحتفظ التحسين بالتكرارات ذات أعلى القيم. الخياران --fitness و--criteria غير متوافقين. حدّد أحدهما فقط.

خيارات بيئة الاختبار

يستخدم optimize خيارات بيئة الاختبار نفسها التي يستخدمها backtest. يوضح الجدول التالي الخيارات التي يدعمها الإصدار الحالي من CLI، ووظيفة كل منها، والفروق بين الأمرين عند الحاجة.

الخيار الوظيفة الإتاحة
--account رقم حساب التداول. كلا الأمرين
--symbol الرمز الذي سيُجرى عليه الاختبار. كلا الأمرين
--start تاريخ ووقت بداية فترة الاختبار. كلا الأمرين
--end تاريخ ووقت نهاية فترة الاختبار. كلا الأمرين
--balance الرصيد الابتدائي للمحاكاة. كلا الأمرين
--data-mode open أو m1 أو m1-csv أو tick-csv أو ticks. كلا الأمرين
--data-file مسار ملف CSV عند استخدام m1-csv أو tick-csv. كلا الأمرين
--commission مبلغ العمولة لكل صفقة. كلا الأمرين
--spread السبريد بوحدة النقطة (pip). كلا الأمرين
--precise-conversion استخدام تحويل دقيق بين أزواج العملات المختلفة. كلا الأمرين
--timeframe الإطار الزمني الأساسي للبحث في المعلمات. optimize فقط
--period الإطار الزمني الأساسي للتشغيل. backtest فقط
--report مسار حفظ تقرير HTML. backtest فقط
--report-json مسار حفظ تقرير JSON. backtest فقط

ملاحظة

لا تنطبق خيارات التقارير على optimize؛ استخدم بدلًا منها --optres و--passes-dir لحفظ النتائج.

مثال

ctrader-cli optimize "C:/test/Sample Trend cBot.algo" \
  --params=C:/test/optimize-params.json \
  --account=1234567 --symbol=EURUSD --timeframe=h1,h2 \
  --start="01/01/2025" --end="01/02/2025" \
  --balance=100000 --data-mode=open --commission=30 --spread=2 \
  --method=grid \
  --criteria="NetProfit:max,MaxEquityDrawdownPercentages:min" \
  --auto-select-best \
  --optres=C:/test/result.optres \
  --passes-dir=C:/test/result-passes \
  --ctid=letstrade --pwd-file=C:/test/password.pwd

المخرجات

أثناء التشغيل، يعرض optimize التقدم باستمرار في الطرفية:

Progress | Loading EURUSD, h1 | 42.00 % |
Progress | Optimization | 37.50 % |
  • الملخص — عند اكتمال التحسين، يعرض cTrader CLI في الطرفية ملخصًا يتضمن العدد الإجمالي للتكرارات والوقت المستغرق وأفضل تكرار مع إحصاءاته.
  • ملف النتائج — عند تحديد --optres، يحفظ cTrader CLI النتائج الكاملة في ملف JSON بامتداد .optres يسرد جميع التكرارات. يستخدم هذا الملف الصيغة نفسها لنتائج التحسين في تطبيق سطح المكتب، لذلك يمكنك فتحه أو استيراده في واجهة التحسين بذلك التطبيق.
  • تقارير كل تكرار — عند تحديد --passes-dir، يحفظ cTrader CLI ملفات التقارير لكل تكرار في هذا الدليل، مع مجلد فرعي لكل تكرار يحتوي على ملفات .html و.txt و.json و.cbotset. يعرض ملف .cbotset القيم الدقيقة للمعلمات المستخدمة في ذلك التكرار.

إذا لم تحدد --optres أو --passes-dir، ينتهي التحسين بعرض الملخص فقط.

ملاحظة

لا ينشئ الأمر optimize تقرير HTML شاملًا. لكن تُحفَظ ملفات HTML الخاصة بكل تكرار في --passes-dir عند تحديد هذا الخيار.

التحقق من تطبيق التحسين بصورة صحيحة

بعد التنفيذ، تأكد من أن البحث شمل المعلمات التي كنت تنوي فحصها.

  1. افتح ملف .cbotset لأحد التكرارات داخل --passes-dir، وتحقق من أن قيم المعلمات التي يجري تحسينها تتغير بين التكرارات، بينما تظل المعلمات المثبتة أو المحذوفة دون تغيير.
  2. إذا فحصت أطرًا زمنية متعددة، فتحقق من قيمة Chart.Period في ملف .cbotset لكل تكرار. يجب أن تتوافق مع الأطر الزمنية التي حددتها.
  3. افتح ملف .optres أو استورده إلى واجهة التحسين في تطبيق سطح المكتب لمراجعة الإعدادات ونتائج جميع التكرارات معًا.

التحقق من صحة الإعدادات والأخطاء الشائعة

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

يشير رمز الخروج في الجدول إلى القيمة التي يعيدها cTrader CLI إلى القشرة (shell). لم تُنشر القيم الرقمية الدقيقة لهذه الرموز؛ لذا تشير non-zero إلى فشل دون رمز محدد، بينما تشير unknown إلى خطأ داخلي يستلزم تغيير إصدار البرنامج أو التواصل مع الدعم.

العَرَض السبب المحتمل رمز الخروج الإجراء التالي
خطأ في التحقق: الخيار --params مفقود لم يُحدَّد ملف معلمات JSON. non-zero حدّد --params=<path>.
خطأ في التحقق: إطار زمني غير معروف قيمة --timeframe لا تطابق أي معرّف معروف. non-zero شغّل ctrader-cli periods واستخدم أحد المعرّفات المدرجة.
خطأ في التحقق: إطار زمني رئيسي غير صالح أحد الأطر الزمنية غير متوافق مع --data-mode المحدد. non-zero اختر إطارًا زمنيًا آخر أو وضعًا آخر للخيار --data-mode.
خطأ في التحقق: أزواج معايير بتنسيق غير صحيح اسم مؤشر الأداء غير صحيح، أو الاتجاه ليس max ولا min. non-zero استخدم أحد أسماء مؤشرات الأداء المدعومة مع max أو min.
خطأ في التحقق: مؤشر معيار غير معروف أحد الأسماء المحددة في --criteria ليس ضمن أسماء المؤشرات المدعومة. non-zero استخدم أحد أسماء مؤشرات الأداء المدرجة في قسم Criteria.
خطأ في التحقق: قيمة غير معروفة للخيار --method قيمة --method ليست genetic ولا grid. non-zero استخدم --method=genetic (الافتراضي) أو --method=grid.
تحديد --fitness و--criteria معًا الخياران غير متوافقين. non-zero حدّد إما --fitness أو --criteria، وليس كليهما.
الأمر optimize غير متاح يجري استخدام الإصدار الداخلي أو السحابي من CLI. unknown انتقل إلى الإصدار المحلي المخصص للمستخدمين.