أرى رسالة خطأ "لا تستطيع لغة Pine تحديد طول المرجع لسلسلة. حاول استخدام max_bars_back"

عندما يتم حساب نص Pine ، فإنه ينشئ مخزنًا مؤقتًا تاريخيًا بحجم معين لكل متغير أو دالة في الكود. يحتوي هذا المخزن المؤقت على معلومات حول القيم السابقة للمتغير / الدالة ويتم استخدامه عندما يشير الرمز إلى القيم السابقة باستخدام عامل تشغيل مرجع التاريخ [ ]. يحدد حجم المخزن المؤقت إلى أي مدى يمكن طلب هذه القيمة في السجل.

يحدد Pine تلقائيًا حجم المخزن المؤقت المطلوب لجميع المتغيرات والدوال من خلال تحليل المراجع السابقة التي تم إجراؤها أثناء حساب البرنامج النصي على أول 244 عمودا بيانيا. إذا لم يتم اكتشاف مراجع سابقة ، يتم تعيين حجم مخزن مؤقت افتراضي للمتغير أو الدالة. بالنسبة للمتغيرات، يكون حجم المخزن المؤقت الافتراضي هو 300 عمود بياني، أما بالنسبة للدوال فهو عمود بياني واحد.

في بعض الحالات ، لا يتمكن Pine من تعيين حجم المخزن أو البافر المؤقت المناسب لهذه الدالة ويتم استخدام حجم المخزن المؤقت الافتراضي بدلاً من ذلك. يمكن أن يحدث هذا:

  • في فروع العبارات الشرطية (if ، iff ، أو؟) عندما يتم تنفيذ المراجع السابقة إلى متغير أو دالة داخل العبارة الشرطية لأول مرة عند مرور العمود البياني 244 بالفعل.
  • في الوظائف التي تدعم الطول الديناميكي ، عندما تكون قيمة الطول التي تم تمريرها إلى الدالة بعد العمود البياني 244 أكبر من أي قيمة تم تمريرها إليها من قبل (عندما كان يتم حساب المخزن المؤقت).

ألق نظرة على الكود أدناه. سيعيد الخطأ المذكور أعلاه للأسباب التالية:

  • قيمة المتغير var1 غير معروفة في وقت التجميع
  • لا يطلب متغير الاختبار أي بيانات سابقة على أول 244 عمود بياني من الرسم البياني

نتيجة لذلك ، يتم تعيين مخزن مؤقت افتراضي لمتغير الاختبار من 300 عمود بياني. عندما يطلب البرنامج النصي قيمة العمود البياني301 في الماضي ، والذي يقع خارج المخزن المؤقت للمتغير ، يحدث خطأ.

//@version=4
study("max_bars_back var",overlay=true)
var1 = input(301)
test = 0.0
//max_bars_back(test, 301)
if bar_index > 244
    test := test[var1]
plot(test)
Java

توجد المعلمة max_bars_back والدالة max_bars_back () للعمل حول هذا الأمر. إنها تسمح لك بتحديد حجم المخزن المؤقت الصحيح للمتغيرات والوظائف عندما لا يكون المخزن المؤقت الافتراضي كافياً. قم بإلغاء تعليق استدعاء دالة max_bars_back () في الكود أعلاه. سيتم تعيين المخزن المؤقت 301 لمتغير الاختبار ونتيجة لذلك ، سيتم حساب البرنامج النصي بشكل صحيح.

فيما يلي مثال لاستدعاء دالة يُنسب إليه الحجم الافتراضي للمخزن المؤقت ذي العمود البياني الواحد لأنه لم يتم استدعاؤه في أول 244 عمود. على الرغم من عدم استخدام مرجع صريح للقيم السابقة باستخدام عامل التشغيل [ ] ، إلا أن الدالة تتطلب حساب القيم العشرين الماضية. سيعود البرنامج النصي بالتالي الخطأ max_bars_back:

//@version=4
study("Requires max_bars_back")
test = 0.0
if bar_index > 1000
    test := vwma(close, 20)
plot(test)
Java

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

//@version=4
study("Requires max_bars_back", max_bars_back=20)
test = 0.0
if bar_index > 1000
    test := vwma(close, 20)
plot(test)
Java


يمكنك أيضًا حل المشكلة عن طريق إخراج التعبير الإشكالي من الفرع الشرطي ، وفي هذه الحالة لا تكون المعلمة max_bars_back مطلوبة:

//@version=4
study("Requires max_bars_back")
test = 0.0
vwma20 = vwma(close, 20)
if bar_index > 1000
    test := vwma20
plot(test)
Java

قد ينشأ الخطأ أيضًا عند استخدام الدوال التي تسمح بأطوال ديناميكية ، أي قيم السلسلة. سيقوم البرنامج النصي التالي بإلقاء خطأ max_bars_back لأنه خلال أول 300 عمود بياني، يتم حساب sma () بطول 50 ، وبالتالي طلب 50 عمود بياني فقط من البيانات التاريخية ، مما يحد من المخزن أو البافر المؤقت إلى 50. بعد العمود البياني 300 ، ومع ذلك ، تغير الطول إلى 100 ، وهو خارج حدود البافرالمؤقت المحدد:

//@version=4
study("Out of bounds")
series_length = bar_index > 300 ? 100 : 50
plot(sma(close, series_length))
Java

للتغلب على هذه المشكلة ، يمكنك إنشاء مخزن مؤقت أكبر في بداية حسابات المؤشر باستخدام قيمة طول كبيرة عن قصد. في الكود التالي ، نطلب 1000 شريط من البيانات التاريخية على الشريط الأول من حسابات مؤشرنا. يؤدي هذا إلى إنشاء مخزن مؤقت دائم يبلغ 1000 عمود بياني لـ sma () الخاص بنا ، ونتيجة لذلك ، لا نتجاوز الحدود مطلقًا:


//@version=4
study("Not out of bounds") series_length = bar_index > 300 ? 100 : 50 passed_length = bar_index == 0 ? 1000 : series_length plot(sma(close, passed_length))
Java

يمكنك معرفة المزيد حول max_bars_back والخطأ ذي الصلة في دليل المستخدم الخاص بنا.