Saya melihat error ' Pine tidak dapat menentukan panjang referensi dari sebuah seri. Harap gunakan max_bar_back'

Ketika sebuah skrip Pine dihitung, ini akan membuat buffer historis dengan ukuran tertentu untuk setiap variabel atau fungsi dalam kodenya. Buffer tersebut berisi informasi tentang nilai sebelumnya dari variabel/fungsi dan digunakan ketika kodenya merujuk ke nilai sebelumnya menggunakan operator referensi histori []. Ukuran buffer menentukan seberapa jauh nilai ini dapat diminta ke dalam historinya.

Pine secara otomatis menentukan ukuran buffer yang diperlukan untuk semua variabel dan fungsi dengan menganalisis referensi sebelumnya yang dibuat saat menghitung skrip pada 244 bar pertama. Jika tidak ada referensi sebelumnya yang terdeteksi, ukuran buffer bawaan ditetapkan ke variabel atau fungsinya. Untuk variabel, ukuran buffer bawaan adalah 300 bar, untuk fungsi hanya satu bar saja.

Dalam beberapa kasus, Pine tidak akan dapat menetapkan ukuran buffer yang tepat untuk fungsi tersebut dan ukuran buffer bawaan yang akan digunakan. Ini yang dapat terjadi: 

  • Dalam cabang atau pernyataan kondisional (if, iff, atau ?) ketika referensi sebelumnya ke variabel atau fungsi di dalam pernyataan bersyarat pertama kali dieksekusi ketika bar ke-244 telah berlalu.
  • Dalam fungsi yang mendukung panjang dinamis, ketika nilai panjang yang diteruskan ke fungsi setelah bar ke-244 lebih besar dari nilai apa pun yang diteruskan sebelumnya (saat buffer dihitung).

Mari lihat kode dibawah ini. Ini akan mengembalikan error yang disebutkan diatas karena:

  • Nilai variabel var1 tidak diketahui saat dikompilasi
  • Variabel test tidak meminta data lampau manapun pada 244 bar pertama pada chart

Karenanya, variabel test ditetapkan sebagai buffer bawaan dari 300 bar. Saat skrip meminta nilai dari bar ke 301 sebelumnya, yang mana berada diluar buffer variabelnya, sebuah error terjadi. 

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

Parameter max_bars_back dan fungsi max_bars_back() hadir untuk menyelesaikan masalah ini. Mereka memungkinkan anda untuk menentukan ukuran buffer yang tepat untuk suatu variabel dan fungsi saat buffer bawaannya tidak mencukupi. function exist to work around this. They allow you to specify the correct buffer size for variables and functions when the default buffer doesn’t suffice. Hapus komentar pemanggilan fungsi max_bars_back () dalam kode di atas. Sebuah buffer sebesar 301 akan ditetapkan ke variabel test dan sebagai hasilnya, skrip tersebut akan terkalkulasi secara tepat.

Berikut adalah contoh panggilan fungsi yang diatribusikan ke ukuran buffer satu-bar bawaannya karena tidak dipanggil dalam 244 bar pertama. Meskipun tidak ada referensi eksplisit ke nilai sebelumnya dengan menggunakan operator [], fungsinya tetap memerlukan 20 nilai terakhir untuk dihitung. Dengan demikian, skrip akan mengembalikan error max_bars_back:

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

Fungsi max_bars_back () tidak dapat digunakan untuk menetapkan ukuran buffer tertentu ke suatu fungsi. Saat anda perlu melakukannya, atau ketika anda ingin mengatur ukuran buffer bawaan untuk semua variabel dan fungsi dalam skrip, tambahkan parameter max_bars_back ke studi skrip atau pernyataan deklarasi strategi. Perhatikan bahwa menggunakan parameter akan meningkatkan penggunaan sumber daya skrip, jadi metode ini sebaiknya hanya digunakan saat diperlukan:

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

Anda juga dapat mengatasi masalah ini dengan mengeluarkan ekspresi bermasalah dari cabang kondisionalnya, dalam hal ini parameter max_bars_back tidak lagi diperlukan:

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

Error ini juga dapat muncul saat menggunakan fungsi yang memungkinkan panjang dinamis, yaitu nilai seri. Skrip berikut akan menampilkan kesalahan max_bars_back karena selama 300 bar pertama, sma() dihitung dengan panjang 50, dan dengan demikian hanya meminta 50 bar data historis, membatasi buffernya menjadi 50. Namun, setelah baris ke-300, panjangnya berubah menjadi 100, yang di luar batas buffer yang ditetapkan:

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

Untuk mengatasi masalah ini, Anda bisa membuat buffer yang lebih besar di awal penghitungan indikator dengan menggunakan nilai panjang yang sengaja dibuat. Dalam kode berikut, kami meminta 1000 batang data historis pada batang pertama penghitungan indikator kami. Ini menciptakan buffer 1000-bar permanen untuk sma() ini, dan sebagai hasilnya tidak pernah keluar batas

:

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

Anda dapat mempelajari lebih lanjut mengenai max_bars_back dan error yang berhubungan dengannya di Panduan Pengguna kami.