Tôi thấy 'Pine không thể xác định độ dài tham chiếu của một chuỗi. Hãy thử sử dụng lỗi max_bars_back '

Khi một tập lệnh Pine được tính toán, nó tạo ra một bộ đệm lịch sử có kích thước nhất định cho mỗi biến hoặc hàm trong mã. Bộ đệm đó chứa thông tin về các giá trị trước đó của biến / hàm và được sử dụng khi mã đề cập đến các giá trị trong quá khứ bằng toán tử tham chiếu lịch sử []. Kích thước của bộ đệm chỉ định khoảng cách giá trị này có thể được yêu cầu trong lịch sử.

Pine tự động xác định kích thước bộ đệm cần thiết cho tất cả các biến và hàm bằng cách phân tích các tham chiếu trước đây được thực hiện trong khi tính toán tập lệnh trên 244 thanh đầu tiên. Nếu không có tham chiếu nào trong quá khứ được phát hiện, kích thước bộ đệm mặc định được gán cho biến hoặc hàm. Đối với các biến, kích thước bộ đệm mặc định là 300 thanh, đối với các hàm là một thanh.

Một vấn đề thường phát sinh trong các nhánh của câu lệnh điều kiện (if, iff, hoặc?) Khi các tham chiếu trước đây đến một biến hoặc hàm bên trong câu lệnh điều kiện được thực thi lần đầu tiên khi thanh thứ 244 đã trôi qua. Trong những trường hợp như vậy, Pine sẽ không thể chỉ định kích thước bộ đệm thích hợp cho chức năng đó và kích thước bộ đệm mặc định sẽ được sử dụng. Hãy xem đoạn mã dưới đây. Nó sẽ trả về lỗi nói trên vì:

  • Giá trị biến var1 không được biết tại thời điểm biên dịch
  • Biến kiểm tra không yêu cầu bất kỳ dữ liệu quá khứ nào trên 244 thanh đầu tiên của biểu đồ

Do đó, biến kiểm tra được gán bộ đệm mặc định gồm 300 thanh. Khi tập lệnh yêu cầu giá trị của thanh thứ 301 trong quá khứ, nằm ngoài bộ đệm của biến, lỗi xảy ra.

//@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)

Tham số max_bars_back và hàm max_bars_back () tồn tại để giải quyết vấn đề này. Chúng cho phép bạn chỉ định kích thước bộ đệm chính xác cho các biến và hàm khi bộ đệm mặc định không đủ. Bỏ ghi chú lệnh gọi hàm max_bars_back () trong đoạn mã trên. Bộ đệm 301 sẽ được gán cho biến kiểm tra và kết quả là tập lệnh sẽ tính toán đúng.

Đây là một ví dụ về một lệnh gọi hàm mà kích thước bộ đệm một thanh mặc định được gán cho vì nó không được gọi trong 244 thanh đầu tiên. Mặc dù không có tham chiếu rõ ràng nào đến các giá trị trong quá khứ bằng toán tử [] được sử dụng, nhưng hàm vẫn yêu cầu 20 giá trị trong quá khứ để tính toán. Do đó, tập lệnh sẽ trả về lỗi max_bars_back:

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

Không thể sử dụng hàm max_bars_back () để gán kích thước bộ đệm cụ thể cho một hàm. Khi bạn cần làm như vậy hoặc khi bạn muốn đặt kích thước bộ đệm mặc định cho tất cả các biến và hàm trong tập lệnh, hãy thêm tham số max_bars_back vào nghiên cứu tập lệnh hoặc tuyên bố chiến lược. Lưu ý rằng việc sử dụng tham số sẽ làm tăng mức sử dụng tài nguyên của tập lệnh, vì vậy phương pháp này chỉ nên được sử dụng khi cần thiết:

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

Bạn cũng có thể giải quyết vấn đề bằng cách lấy biểu thức có vấn đề ra khỏi nhánh điều kiện, trong trường hợp đó tham số max_bars_back không bắt buộc:

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


Bạn có thể tìm hiểu thêm về max_bars_back và lỗi liên quan trong Hướng dẫn sử dụng của chúng tôi.