'Pine bir serinin referans uzunluğunu belirleyemez. max_bars_back kullanmayı deneyin' hatasını alıyorum

Bir Pine komut dosyası hesaplandığında, koddaki her değişken veya işlev için belirli bir boyutta tarihsel bir arabellek oluşturur. Bu arabellek, değişken/işlevin önceki değerleri hakkında bilgiler içerir ve kod [] geçmişe referans veren operatörü kullanarak geçmiş değerlere başvurduğunda kullanılır. Arabellek boyutu bu değerin geçmişe ne kadar uzakta referans edilebileceğini belirtir.

Pine tüm değişkenler için gerekli arabellek boyutunu otomatik olarak belirler ve ilk 244 çubuktaki komut dosyası hesaplanırken geçmiş referansları analiz ederek çalışır. Geçmiş referans algılanmazsa, değişkene veya işleve varsayılan bir arabellek boyutu atanır. Değişkenler için varsayılan arabellek boyutu 300 çubuktur, işlevler için bir çubuktur.

Bazı durumlarda, Pine bu işlev için uygun bir arabellek boyutu atayamaz ve bunun yerine varsayılan arabellek boyutu kullanılır. Bu olabilir:

  • var1 değişkeni değer derleme sırasında bilinmemektedir
  • test değişkeni grafiğin ilk 244 çubuğunda geçmiş veri istemiyor

Bundan dolayı, test değişkenine 300 çubuklu varsayılan bir arabellek atanır. Komut dosyası, bu arabellek dışında 301 çubukluk bir değer istediğinde, hata oluşur.

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

Bunun üstesinden gelmek için max_bars_back parametresi ve  max_bars_back() fonksiyonu vardır. Varsayılan arabellek yeterli olmadığında değişkenler ve fonksiyonlar için doğru arabellek boyutunu belirlemenize izin verir. Yukarıdaki kodda max_bars_back() fonksiyonunu kaldırın. test değişkenine 301 arabelleği atanacak ve sonuç olarak kod düzgün bir şekilde hesaplanacaktır.

Burada, ilk 244 çubukta çağrılmadığından, varsayılan tek çubuklu arabellek boyutunun ilişkilendirildiği işlev çağrısına bir örnek verilmiştir.

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

 max_bars_back() fonksiyonu bir işleve belirli bir arabellek boyutu atamak için kullanılamaz.Böyle yapmak istediğinizde, yada bir komut dosyasındaki tüm değişkenler ve işlevler için varsayılan arabellek boyutunu ayarlamak istediğinizde, komut dosyasının çalışmasına veya strateji bildirimi ifadesine max_bars_back parametresini ekleyin. Parametreyi kullanmanın komut dosyasının kaynak kullanımını artıracağını unutmayın, bu nedenle bu yöntem yalnızca gerektiğinde kullanılmalıdır:

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

Sorunlu ifadeyi koşullu sapmadan çıkararak da sorunu çözebilirsiniz, bu durumda max_bars_back parametresi gerekli değildir:

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

Hata, dinamik uzunluklara, yani seri değerlere izin veren fonksiyonlar kullanılırken de ortaya çıkabilir. Aşağıdaki komut dosyası max_bars_back hatasını atacaktır çünkü ilk 300 çubuk sırasında sma() 50 uzunluğunda hesaplanır ve bu nedenle sadece 50 çubuk geçmiş veri talep ederek arabelleğini 50 ile sınırlar. Ancak 300. çubuktan sonra, uzunluk, yerleşik tampon sınırlarının dışında olan 100 olarak değiştirildi:

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

Bu durumu netleştirmek için, kasıtlı olarak büyük bir uzunluk değeri kullanarak gösterge hesaplamalarının başında daha büyük bir arabellek oluşturabilirsiniz. Aşağıdaki kodda, gösterge hesaplamalarımızın ilk çubuğunda 1000 çubuk geçmiş veri talep ediyoruz. Bu, sma() için kalıcı bir 1000 bar tampon oluşturur ve sonuç olarak asla sınırların dışına çıkmayız:

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

max_bars_back ve ilgili hata hakkında daha fazla bilgiyi Kullanım Kılavuzumuzda bulabilirsiniz.