الصفحاتمعاملات الإدخال · 14 / 29
معاملات الإدخال
تتيح لك معاملات الإدخال تحويل القيم داخل شيفرة استراتيجيتك (مثل طول فترة الرجوع أو الحد الأقصى لعدد مراكز الشراء المفتوحة) إلى مفاتيح تضبطها من نوافذ التشغيل — دون تعديل الملف في كل مرة تريد فيها تجربة رقم جديد. ينطبق ربط params نفسه على Run backtest (الاختبارات الرجعية) وBulk forward (AutoTrading / QuantCloud) ومعاملات خوارزمية Chart forward test. ويُوصف Test في تشغيل الشيفرة؛ أما عمليات المسح المتعددة التشغيل فتُغطّى ضمن التحسين. ولا تُملأ params عند Run البسيط.
تغطي هذه الصفحة نصفي هذا التدفق:
- التصريح عن
paramsفي ملف Python - ربط تلك params بنوافذ التشغيل لتتمكن من ضبطها وحفظها وتحسينها (راجع أيضًا إعدادات التشغيل المسبقة (.qcs))
كيف يعمل في لمحة
- في ملف استراتيجيتك، تستورد كائنًا خاصًا
paramsوتقرأ منه خصائص (مثلparams.PERIOD). - تفحص بيئة التطوير شيفرتك لاكتشاف تلك الأسماء وتعرضها في نافذة التشغيل (Test أو bulk forward أو chart forward).
- تُدخل نوعًا وقيمة لكل اسم في مربع الحوار (أو تعرّف مسحًا عند التحسين).
- عند بدء التشغيل، يملأ المحرك
paramsبقيمك قبل تشغيل نصّك، فتكون القيم متاحة لحظة استيراد ملفك.
تُملأ المدخلات في نوافذ Run backtest وBulk forward وChart forward test. ولا تُملأ في Run البسيط (
/ws/run) — استخدم القيم الافتراضية بـhasattrإن أردت أن يعمل الملف نفسه بالطريقتين. راجع دورة حياة الاستراتيجية لمعرفة متى تكونparamsمرئية لدوال الاستدعاء.
التصريح عن params في استراتيجيتك
أضف استيرادًا واحدًا وأشر إلى كل اسم معامل كخاصية على params:
from quantcraft.inputs import params
PERIOD = params.PERIOD if hasattr(params, "PERIOD") else 14
MAX_OPEN_LONGS = params.MAX_OPEN_LONGS if hasattr(params, "MAX_OPEN_LONGS") else 3
USE_FILTER = params.USE_FILTER if hasattr(params, "USE_FILTER") else True
LABEL = params.LABEL if hasattr(params, "LABEL") else "default"تنطبق بعض القواعد:
- اكتبه بصيغة
from quantcraft.inputs import params. يقبل التعبير النمطي للاكتشاف أيضًا الصيغتين الأقدمfrom quantcraft.inputs_module import paramsو**from ide.inputs_module import params** لتستمر النصوص الحالية في العمل — راجع المرجع — لكن الشيفرة الجديدة يجب أن تستخدمquantcraft.inputs. ويجب أن تكون بصيغةfrom … import params: فصيغةimport quantcraft.inputs as inpلا تُكتشف، لذا لن تظهر علامة تبويب Script. - يطبّق المشغّل قيم النافذة قبل تحميل نص الدخول، وهذا كافٍ لـ
from quantcraft.inputs import paramsفي ملف الاستراتيجية. paramsكائن واحد «حي». يبدّل كل تشغيل القيم الكامنة خلفه، لذا يعرض دائمًا مدخلات هذا التشغيل — بما في ذلك في الوحدات المساعدة التي استوردته أثناء تشغيل أمامي سابق، وبشكل منفصل لعمليات التشغيل الأمامي الجارية في آن واحد. والتشغيل الذي يبدأ دون مدخلات يرىparamsفارغًا، ولا يرى قيم التشغيل السابق أبدًا.- يجب أن يكون كل اسم معامل معرّف Python صالحًا (
A–Zوa–zو0–9و_، ولا يبدأ برقم)؛ وأي شيء آخر يُتجاهل. - يجب أن يتضمن كل مدخل رمز
params.NAMEحرفيًا في المصدر ليتمكن IDE من اكتشافه. يطابق العميلparams.<معرّف>بتعبير نمطي؛ أما الأسماء المشار إليها عبرgetattr(params, "NAME", default)فقط فـلا تُكتشف ولن تظهر في علامة تبويب Script. ويعملgetattr(params, "NAME", default)وقت التشغيل — فقط أبقِparams.NAMEحرفيًا في السطر نفسه للاكتشاف. - يمكنك استخدام
params.NAMEفي أي مكان في الملف — على المستوى الأعلى أو داخلon_initأو داخلon_barوهكذا. يصبح كل إشارة فريدة مدخلًا سيسألك عنه مربع الحوار. - لا يوجد مخطط في الوحدة نفسها — فالأسماء التي تشير إليها هي المخطط.
تجنّب (لن يدرج النموذج المعامل):
MA_PERIOD = getattr(params, "MA_PERIOD", 24) # no params.MA_PERIOD token
PERIOD = 14 # no params referenceأنماط شائعة:
def on_init():
global lookback
lookback = int(params.PERIOD)
def on_bar(bar_index, bar, fundamentals=None, symbol=None):
if bar.bars_back < lookback:
return
...نصيحة: اقرأ القيمة مرة واحدة في متغير محلي/عام حتى لا تدفع كلفة البحث عن الخاصية في كل عمود.
ربط نافذة Test / الاختبار الرجعي
افتح مربع حوار Test من شريط أدوات المحرر (زر Test). عندما يصرّح ملفك عن مدخلات params.NAME، تظهر علامة تبويب Script تضم صفوف المعاملات وOptimize. وقد فحصت بيئة التطوير ملفك النشط بالفعل بحثًا عن إشارات params.NAME، فيظهر كل معامل استخدمته كصف.
لكل صف تضبط:
| العمود | ما تُدخله |
|---|---|
| Parameter | الاسم (للقراءة فقط — يأتي من شيفرتك). |
| Type | واحد من int و**float** و**str** و**bool** (وتُقبل أيضًا الأسماء المستعارة integer و**number** و**boolean** عند النقل). |
| Value | القيمة المراد استخدامها في التشغيل. |
ملاحظات بشأن خيارات Type:
int/integer— أعداد صحيحة (مثل14)؛ وفواصل الآلاف مقبولة (1,000←1000).float/number— أعداد عشرية (مثل0.5و1e-3)؛ وتُزال الفواصل من الأرقام.bool/boolean—true/falseوyes/noوy/nوon/offو1/0(بأي حالة أحرف). وأي شيء آخر يوقف التشغيل برسالةinvalid boolean: …. وتعرض النافذة True/False.str— نص حر، يُحفظ كما هو (مع إزالة المسافات المحيطة).
عند بدء الاختبار الرجعي، يجمع مربع الحوار صفوفك ويرسلها إلى المحرك. يضبط المحرك القيم على params قبل تشغيل on_init() لديك، بحيث:
from quantcraft.inputs import params
PERIOD = params.PERIOD # <- already filled by the time this line executesإذا لم يكن لاسم معامل صف في مربع الحوار (حذفت الإدخال، أو يشير ملفك إلى اسم جديد تمامًا لم تضبطه بعد)، فلن تحتوي params على تلك الخاصية وسيُطلق القراءة المباشرة لـ params.NAME الاستثناء AttributeError. أضف الصف في مربع الحوار وأعد التشغيل — أو استخدم نمط hasattr + القيمة الافتراضية else المعروض أعلاه (الذي لا يزال يتضمن رمز params.NAME للاكتشاف).
تُحفظ قيم مربع الحوار بين عمليات التشغيل، فلا حاجة إلى إعادة كتابتها في كل مرة. احفظ مجموعات المعاملات الكاملة وأعد تحميلها بـإعدادات التشغيل المسبقة (.qcs).
تحسين المعاملات
في علامة تبويب Script، فعّل Optimize لتشغيل استراتيجيتك مرات عديدة بتركيبات معاملات مختلفة. اختر Brute force أو Genetic:
القوة الغاشمة
لكل صف معامل، يضيف مربع الحوار عمودي Step وMax حيث يكون ذلك منطقيًا:
int/float— تعرّف شبكة منفصلة: القيمة الابتدائية ← الخطوة ← الحد الأقصى.bool— تُجرَّبtrueوfalseمعًا.str— تبقى ثابتة (معاملات السلاسل لا تشكّل شبكة).
يشغّل المحرك كل تركيبة من تلك القيم المنفصلة ويبلّغ عن كل تشغيل على حدة في عرض Test Results.
مفيد للشبكات الصغيرة (حفنة من المعاملات بقيم قليلة لكل منها). تتضخم التركيبات بسرعة — أبقِ فضاء البحث متواضعًا.
الجيني
لفضاءات البحث الأكبر، بدّل إلى Genetic ليعثر بحث تطوري على تركيبات جيدة دون تجربة كل خلية:
- Population size — عدد تركيبات المعاملات المقيَّمة في كل جيل.
- Generations — عدد الأجيال المراد تشغيلها (كل منها مجموعة كاملة من الاختبارات الرجعية).
- Elitism — أفضل الأفراد يُنسخون دون تغيير إلى الجيل التالي.
- Crossover rate (
0–1) — احتمال أن ينتج والدان طفلًا مختلطًا. - Mutation rate (
0–1) — احتمال أن يقفز جين إلى قيمة أخرى. - Fitness metric — المقياس المراد تحسينه (Sharpe أو Sortino أو العائد الإجمالي وغيرها).
- Random seed (اختياري) — قابلية إعادة إنتاج المجموعة والمُشغِّلات.
يعرض الوضعان التقدّم المباشر في لوحة المخرجات (شريط تقدّم في الترويسة) وزر Stop لإنهاء تشغيل طويل.
عند انتهاء التحسين، يعرض عرض Test Results عمليات التشغيل مرتبة حسب مقياس اللياقة لديك، ويمكنك التعمّق في كل منها.
نصائح
-
تُكتشف الأسماء من ملفك: إذا لم يظهر صف، فتحقق من إشارات
params.NAMEومن أنك تستوردparamsمنquantcraft.inputs(وتُطابَق أيضًا المسارات الأقدمquantcraft.inputs_moduleو**ide.inputs_module** للنصوص الحالية). -
أبقِ الأسماء بصيغة UPPER_SNAKE_CASE — فبحسب العرف تُقرأ كثوابت في شيفرتك.
-
حدّد أنواعًا مناسبة في مربع الحوار ليفعل التحويل ما تتوقعه (مثلًا لا تضبط
intلقيمة مثل0.5). -
القيم المنطقية غير حساسة لحالة الأحرف —
Trueوtrueو1وyesكلها تُقيَّم صحيحة. -
استخدم Optimize لعمليات البحث عن المعاملات، لا نصوص المحرر: القوة الغاشمة شاملة، والجينية للفضاءات الأكبر.
-
Run البسيط لا يملأ params: عند نقر Run، لا تُملأ
params. استخدم القيم الافتراضية بـhasattr(مع رمزparams.NAMEحرفي) إن أردت أن يعمل الملف نفسه مع Run وTest معًا:from quantcraft.inputs import params PERIOD = params.PERIOD if hasattr(params, "PERIOD") else 14 -
تستخدم عمليات التشغيل الأمامي قواعد الاكتشاف نفسها — تفحص نافذتا bulk forward وchart forward بحثًا عن
params.NAMEبالطريقة نفسها التي يفعلها مربع حوار الاختبار الرجعي.

