تحسين أداء روبوت 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 عند تحديد هذا الخيار.
التحقق من تطبيق التحسين بصورة صحيحة ¶
بعد التنفيذ، تأكد من أن البحث شمل المعلمات التي كنت تنوي فحصها.
- افتح ملف
.cbotsetلأحد التكرارات داخل--passes-dir، وتحقق من أن قيم المعلمات التي يجري تحسينها تتغير بين التكرارات، بينما تظل المعلمات المثبتة أو المحذوفة دون تغيير. - إذا فحصت أطرًا زمنية متعددة، فتحقق من قيمة
Chart.Periodفي ملف.cbotsetلكل تكرار. يجب أن تتوافق مع الأطر الزمنية التي حددتها. - افتح ملف
.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 | انتقل إلى الإصدار المحلي المخصص للمستخدمين. |