Pojawia się błąd 'Pine cannot determine the referencing length of a series. Try using max_bars_back'

Kiedy skrypt Pine jest obliczany, tworzy on historyczny bufor o określonym rozmiarze dla każdej zmiennej lub funkcji w kodzie. Bufor ten zawiera informacje o poprzednich wartościach zmiennej/funkcji i jest używany, gdy kod odwołuje się do przeszłych wartości za pomocą operatora historii []. Rozmiar bufora określa z jak odległej historii można zażądać danych. 

Pine automatycznie określa wymagany rozmiar bufora dla wszystkich zmiennych i funkcji poprzez analizę wcześniejszych odniesień dokonanych podczas obliczania skryptu na pierwszych 244 słupkach. Jeśli nie zostaną wykryte żadne przeszłe odwołania, do zmiennej lub funkcji zostanie przypisany domyślny rozmiar bufora. Dla zmiennych domyślny rozmiar bufora wynosi 300 słupków, dla funkcji jest to jeden słupek. 

W niektórych przypadkach Pine nie jest w stanie przypisać odpowiedniego rozmiaru bufora dla tej funkcji i zamiast niego używany jest domyślny rozmiar bufora. Może się to zdarzyć: 

  •  w gałęziach instrukcji warunkowych (if, iff, lub ?), gdy przeszłe odniesienia do zmiennej lub funkcji wewnątrz instrukcji warunkowej są wykonywane po raz pierwszy, gdy minął już słupek nr 244.
  • w funkcjach obsługujących długość dynamiczną, gdy wartość długości przekazana do funkcji po słupku nr 244 jest większa niż jakakolwiek wartość, która została przekazana do niej wcześniej (podczas obliczania bufora).

Spójrz na poniższy kod. Zwróci on wyżej wymieniony błąd, ponieważ:

  • Wartość zmiennej var1 jest nieznana w czasie kompilacji
  • Zmienna test nie wymaga żadnych danych historycznych dla pierwszych 244 słupków wykresu

Z tego powodu zmiennej test przypisywany jest domyślny bufor 300 słupków. Gdy skrypt zażąda wartości słupka nr 301 (czyli wartości, która znajduje się poza tym buforem), pojawi się błąd. 

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

Parametr max_bars_back oraz funkcja max_bars_back() istnieją po to, aby obejść to ograniczenie. Pozwalają one na określenie właściwego rozmiaru bufora dla zmiennych i funkcji, gdy domyślny bufor nie jest wystarczający. Odkomentuj wywołanie funkcji max_bars_back() w powyższym kodzie. Do zmiennej test zostanie przypisany bufor wielkości 301 i skrypt zostanie obliczony poprawnie.

Oto przykład wywołania funkcji, do której przypisany jest domyślny jednosłupkowy bufor, ponieważ nie jest ona wywoływana na pierwszych 244 słupkach. Chociaż nie zostało użyte żadne wyraźne odniesienie do przeszłych wartości przy użyciu operatora [], funkcja wymaga jednak do obliczenia ostatnich 20 wartości. W ten sposób skrypt zwróci błąd max_bars_back:

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

 Funkcja max_bars_back() nie może być wykorzystana do przypisania konkretnej wielkości bufora do funkcji. Kiedy musisz to zrobić lub chcesz nadać wszystkim funkcjom i zmiennym w kodzie określony rozmiar buforu, możesz dodać parametr max_bars_back do instrukcji wskaźnika skryptu lub deklaracji strategii. Należy pamiętać, że użycie tego parametru zwiększy wykorzystanie zasobów skryptu, więc metoda ta powinna być używana tylko wtedy, gdy jest to konieczne:

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

Problem można również rozwiązać, usuwając problematyczne wyrażenie z gałęzi warunkowej. W takim przypadku nie będzie potrzeby stosowania parametru 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)

Błąd może pojawić się również w przypadku użycia funkcji pozwalających na dynamiczne długości, czyli wartości serii. Poniższy skrypt wyrzuci błąd the max_bars_back ponieważ podczas pierwszych 300 słupków funkcja sma() jest obliczana z długością 50, a więc żąda tylko 50 słupków danych historycznych, ograniczając swój bufor do 50. Jednak po 300-tnym słupku długość zmieniła się na 100, co jest poza granicami ustalonego bufora:

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

Aby obejść ten problem, możesz wygenerować większy bufor na początku obliczeń wskaźnika poprzez celowe użycie dużej wartości długości. W poniższym kodzie żądamy 1000 słupków danych historycznych na pierwszym słupku obliczeń naszego wskaźnika. Tworzy to stały 1000-słupkowy bufor dla naszej funkcji sma(), w wyniku czego nigdy nie wychodzimy poza granice:

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


Więcej informacji na temat max_bars_back oraz związanym z nim błędem znajdziesz w naszej Instrukcji Obsługi.