ฉันเห็นข้อความแจ้งข้อผิดพลาด 'Pine ไม่สามารถกำหนดความยาวอ้างอิงของซีรีส์ได้ ลองใช้ max_bars_back'

เมื่อมีการคำนวณสคริปต์ Pine จะสร้างบัฟเฟอร์ประวัติขนาดหนึ่งสำหรับตัวแปรหรือฟังก์ชันแต่ละตัวในโค้ด บัฟเฟอร์นั้นมีข้อมูลเกี่ยวกับค่าก่อนหน้าของตัวแปร/ฟังก์ชันและถูกใช้เมื่อโค้ดอ้างถึงค่าที่ผ่านมาโดยใช้ [] ตัวดำเนินการอ้างอิงประวัติ ขนาดของบัฟเฟอร์ระบุว่าค่านี้สามารถขอประวัติได้มากน้อยเพียงใด

Pine กำหนดขนาดบัฟเฟอร์ที่ต้องการโดยอัตโนมัติสำหรับตัวแปรและฟังก์ชันทั้งหมดโดยการวิเคราะห์การอ้างอิงในอดีตที่ทำขึ้นในขณะที่คำนวณสคริปต์ใน 244 แท่งแรก หากตรวจไม่พบการอ้างอิงที่ผ่านมาขนาดบัฟเฟอร์เริ่มต้นจะถูกกำหนดให้กับตัวแปรหรือฟังก์ชัน สำหรับตัวแปรขนาดบัฟเฟอร์เริ่มต้นคือ 300 บาร์สำหรับฟังก์ชันคือหนึ่งแถบ

ในบางกรณี Pine ไม่สามารถกำหนดขนาดบัฟเฟอร์ที่เหมาะสมสำหรับฟังก์ชันนั้น และใช้ขนาดบัฟเฟอร์เริ่มต้นแทน สิ่งนี้สามารถเกิดขึ้นได้:

  • ในสาขาของคำสั่งแบบมีเงื่อนไข (if, iff หรือ ?) เมื่อการอ้างอิงในอดีตไปยังตัวแปรหรือฟังก์ชันภายในคำสั่งแบบมีเงื่อนไขจะถูกดำเนินการครั้งแรกเมื่อแถบที่ 244 ผ่านไปแล้ว
  • ในฟังก์ชันที่รองรับความยาวแบบไดนามิก เมื่อค่าความยาวส่งผ่านไปยังฟังก์ชันหลังจากแท่งที่ 244 มีค่ามากกว่าค่าใดๆ ที่ส่งผ่านมาก่อนหน้า (เมื่อคำนวณบัฟเฟอร์)

ดูโค้ดด้านล่าง มันจะส่งคืนข้อผิดพลาดดังกล่าวเนื่องจาก:

  • ไม่ทราบค่าตัวแปร var1 ในขณะคอมไพล์
  • ตัวแปร test ไม่ขอข้อมูลที่ผ่านมาใน 244 แท่งแรกของแผนภูมิ

ด้วยเหตุนี้ตัวแปร test จึงได้รับการกำหนดบัฟเฟอร์เริ่มต้น 300 บาร์ เมื่อสคริปต์ร้องขอค่าของแถบที่ 301 ในอดีตซึ่งอยู่นอกบัฟเฟอร์ของตัวแปรจะเกิดข้อผิดพลาด

//@version=4study("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 แท่งแรก แม้ว่าจะไม่มีการใช้การอ้างอิงอย่างชัดเจนถึงค่าในอดีตโดยใช้ตัวดำเนินการ [] แต่ฟังก์ชันนี้ต้องการค่า 20 ที่ผ่านมาในการคำนวณ สคริปต์จะส่งคืนข้อผิดพลาด max_bars_back:

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

ไม่สามารถใช้ฟังก์ชัน max_bars_back() เพื่อกำหนดขนาดบัฟเฟอร์เฉพาะให้กับฟังก์ชัน เมื่อคุณจำเป็นต้องทำเช่นนั้นหรือเมื่อคุณต้องการกำหนดขนาดบัฟเฟอร์เริ่มต้นสำหรับตัวแปรและฟังก์ชันทั้งหมดในสคริปต์ให้เพิ่มพารามิเตอร์ max_bars_back ในคำสั่งการศึกษาหรือการประกาศกลยุทธ์ของสคริปต์ โปรดทราบว่าการใช้พารามิเตอร์จะเพิ่มการใช้ทรัพยากรของสคริปต์ดังนั้นจึงควรใช้วิธีนี้เมื่อจำเป็นเท่านั้น:

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

คุณยังสามารถแก้ไขปัญหาได้โดยนำ expression ที่มีปัญหาออกจากเงื่อนไขซึ่งในกรณีนี้ไม่จำเป็นต้องใช้พารามิเตอร์ 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

เมื่อต้องการแก้ไขปัญหานี้ คุณสามารถสร้างบัฟเฟอร์ขนาดใหญ่ขึ้นในช่วงเริ่มต้นของการคำนวณของอินดิเคเตอร์โดยเจตนาใช้ค่าความยาวขนาดใหญ่ ในโค้ดต่อไปนี้ เราขอข้อมูลในอดีต 1,000 แท่งในแถบแรกของการคำนวณอินดิเคเตอร์ของเรา สิ่งนี้จะสร้างบัฟเฟอร์ 1,000 บาร์ถาวรสำหรับ 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 และข้อผิดพลาดที่เกี่ยวข้องได้ใน คู่มือผู้ใช้ของเรา