Je vois l'erreur "Pine ne peut pas déterminer la durée de référencement d'une série. Essayez d'utiliser max_bars_back"

Lorsqu'un script Pine est calculé, il crée un tampon historique d'une certaine taille pour chaque variable ou fonction du code. Cette mémoire tampon contient des informations sur les valeurs antérieures de la variable/fonction et est utilisée lorsque le code se réfère aux valeurs antérieures à l'aide de l'opérateur de référence historique []. La taille de la mémoire tampon précise jusqu'où cette valeur peut être demandée dans l'historique. 

Pine détermine automatiquement la taille de la mémoire tampon requise pour toutes les variables et fonctions en analysant les références passées faites lors du calcul du script sur les 244 premières barres. Si aucune référence passée n'est détectée, une taille de mémoire tampon par défaut est attribuée à la variable ou à la fonction. Pour les variables, la taille de la mémoire tampon par défaut est de 300 barres, pour les fonctions, elle est d'une barre. 

  • Dans certains cas, Pine n'est pas en mesure d'attribuer une taille de tampon appropriée pour cette fonction et la taille de tampon par défaut est utilisée à la place. Cela peut arriver : 
  • Dans les branches des déclarations conditionnelles (if, iff, ou ?) lorsque les références passées à une variable ou une fonction à l'intérieur de la déclaration conditionnelle sont exécutées pour la première fois alors que la 244e barre est déjà passée.
  • Dans les fonctions qui prennent en charge la longueur dynamique, lorsque la valeur de longueur passée à la fonction après la 244e barre est supérieure à toute valeur qui lui a été passée avant (lors du calcul du tampon).

Regardez le code ci-dessous. Il affichera l'erreur susmentionnée parce que :

  • La valeur de la variable var1 n'est pas connue au moment de la compilation
  • La variable test ne demande aucune donnée passée sur les 244 premières barres du graphique

De ce fait, la variable test se voit attribuer un tampon par défaut de 300 barres. Lorsque le script demande la valeur de la 301e barre dans le passé, qui se trouve en dehors du tampon de la variable, une erreur se produit.

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

Le paramètre max_bars_back et la fonction max_bars_back() existent pour contourner ce problème. Ils vous permettent de spécifier la taille correcte du tampon pour les variables et les fonctions lorsque le tampon par défaut ne suffit pas. Dé-commentez l'appel à la fonction max_bars_back() dans le code ci-dessus. Un tampon de 301 sera attribué à la variable de test et, par conséquent, le script effectuera les calculs correctement.

Voici un exemple d'appel de fonction auquel est attribuée la taille de tampon par défaut d'une barre parce qu'il n'est pas invoqué dans les 244 premières barres. Bien qu'aucune référence explicite aux valeurs passées utilisant l'opérateur [] ne soit utilisée, la fonction nécessite néanmoins les 20 dernières valeurs pour effectuer le calcul. Le script affichera donc l'erreur 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

Vous pouvez également résoudre le problème en retirant l'expression problématique de la branche conditionnelle, auquel cas le paramètre max_bars_back n'est pas nécessaire :

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

L'erreur peut également se produire lors de l'utilisation de fonctions permettant des longueurs dynamiques, c'est-à-dire des valeurs de série. Le script suivant lancera l'erreur max_bars_back car pendant les 300 premières barres, sma() est calculé avec une longueur de 50, et n'a donc demandé que 50 barres de données historiques, limitant son buffer à 50. Après la 300e barre, cependant, la longueur est passée à 100, ce qui est en dehors des limites de son tampon établi :

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

Pour contourner ce problème, vous pouvez générer un tampon plus important au début des calculs de l'indicateur en utilisant une valeur de longueur intentionnellement grande. Dans le code suivant, nous demandons 1000 barres de données historiques sur la première barre des calculs de notre indicateur. Cela crée une mémoire tampon permanente de 1000 barres pour notre sma(), et par conséquent nous ne dépassons jamais les limites :

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


Vous pouvez en savoir plus sur max_bars_back et l'erreur correspondante dans notre manuel d'utilisation.