אני מקבל הודעת שגיאה 'פיין לא יכול לקבוע את אורך הפניה של סדרה. נסה להשתמש max_bars_back

כאשר סקריפט  Pine מחשב הוא יוצר מאגר היסטורי בגודל מסוים לכל משתנה או פונקציה בקוד.  מאגר זה מכיל מידע על ערכים קודמים של המשתנה / פונקציה ומשמש כאשר הקוד מתייחס לערכי העבר באמצעות המפעיל [] היסטוריית הפניות. גודל המאגר מציין כמה רחוק בהיסטוריה ניתן לבקש ערך זה.

Pine קובע באופן אוטומטי את גודל המאגר הנדרש עבור כל המשתנים והפונקציות על ידי ניתוח הפניות בעבר שנעשו תוך חישוב הסקריפט ב 244 הברים הראשונים. אם לא אותרו אזכורים קודמים, מוגדר ברירת מחדל של רישום למשתנה או לפונקציה. עבור משתנים, גודל המאגר המוגדר כברירת מחדל הוא 300 ברים, עבור פונקציות זה בר אחד.

במקרים מסוימים, פיין אינו מסוגל להקצות גודל המאגר מתאים עבור פונקציה זו, ובמקום זאת, משתמשים בגודל המאגר המוגדר כברירת מחדל. זה יכול לקרות במצבים הבאים:

בענפים של משפטים מותנים (אם, iff, או?) כאשר הפניות קודמות למשתנה או לפונקציה בתוך המשפט המותנה מבוצעות לראשונה כאשר הבר ה -244 כבר עבר.

בפונקציות התומכות באורך דינמי, כאשר ערך האורך שהועבר לפונקציה לאחר הבר 244 גדול מכל ערך שהועבר אליו לפני כן (בעת חישוב המאגר).

//@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 וכתוצאה מכך, הסקריפט יחשב כראוי.

להלן דוגמה לקריאת פונקציה אליה מיוחס גודל המאגר של בר אחד. אף שלא נעשה שימוש בהתייחסות מפורשת לערכי עבר המשתמשים במפעיל [], הפונקציה בכל זאת מחייבת את 20 הערכים האחרונים כדי לחשב. לכן הסקריפט יחזיר את השגיאה .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 ועל השגיאה הקשורה במדריך למשתמש שלנו.