我看到'Pine cannot determine the referencing length of a series. Try using max_bars_back'錯誤

計算Pine腳本時,它將為代碼中的每個變量或函數建立一定大小的歷史緩衝區。該緩衝區包含有關變數/函數的先前值的資訊,當代碼使用 [] 歷史引用運算符引用過去的值時,將使用該緩衝區。緩衝區的大小指定可以請求該值到歷史記錄的距離。

Pine透過分析在前244根K線上計算腳本時過去所做的引用來自動確定所有變數和函數所需的緩衝區大小。如果未檢測到任何過去的引用,則將預設緩衝區大小分配給變數或函數。對於變數,預設緩衝區大小為300根K線,對於函數,預設緩衝區大小為1根K線。

在某些情況下,Pine無法為該函數分配適當的緩衝區大小,而是使用預設緩衝區大小。可能會發生:

  • 在條件語句的分支(if, iff, or ?)中,當第244根K線已經通過時,首先執行對條件語句中變數或函數的過去引用。
  • 在支持動態長度的函數中,當傳遞給第244根K線之後的函數的長度值大於傳遞給函數前的任何值時(計算緩衝區時)。

看看下面的代碼。它將返回上述錯誤,因為:

  • 編譯時未知var1變數值
  • 測試變數不要求圖表的前244根K線顯示任何過去的數據

因此,將為測試變數分配預設的300根K線緩衝區。當腳本過去請求變數的緩衝區之外的301根K線的值時,會發生錯誤。

//@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緩衝區分配給測試變數,結果腳本將正確計算。

這是一個函數調用的示例,預設的單根K線(one-bar)緩衝區大小歸因於該函數調用,因為在前244根K線中未調用它。儘管沒有使用 [] 運算符明確引用過去的值,但是該函數仍然需要過去的20個值來進行計算。因此,腳本將返回 max_bars_back 錯誤:

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

max_bars_back() 函數不能用於為函數分配特定的緩衝區大小。如果需要這樣做,或者要為腳本中的所有變數和函數設定預設緩衝區大小,請在腳本的 studystrategy 聲明語句中添加 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根K線期間,sma() 的長度為50,因此僅請求了50根K線的歷史數據,從而將其緩衝區限制為50。但是,在第300根K線之後,長度更改為100,超出了已建立緩衝區的範圍:
//@version=4
study("Out of bounds")
series_length = bar_index > 300 ? 100 : 50
plot(sma(close, series_length))
Java要變通解決此問題,您可以透過故意使用較大的長度值在指標計算的開頭生成較大的緩衝區。在以下代碼中,我們在指標計算的第一根K線上請求1000根K線歷史數據。這為我們的 sma() 建立了一個永久的1000根K線緩衝區,因此我們永遠不會超出範圍:
//@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 和相關錯誤的更多資訊。