Pine Script v6
Validez avant de prétendre que ça fonctionne
Pine échoue à la compilation de manières qui semblent correctes sur l'écran. Ne renvoyez jamais un script que vous n'avez pas vérifié.
validate_pine_script # Outil MCP — renvoie des erreurs structurées avec numéros de ligne
lookup_pine_reference # Outil MCP — signature réelle pour tout symbole v6
Si le serveur MCP est indisponible, dites que le script n'est pas validé plutôt que de laisser croire qu'il compile.
Ne devinez pas les noms de paramètres. lookup_pine_reference existe car deviner est la cause d'échec la plus fréquente : inventer colour pour color, shape= pour style=, ou textalign sur une fonction qui attend text_halign.
Le modèle d'exécution décide tout
Un script s'exécute une fois par barre, de gauche à droite dans l'historique, puis à chaque tick de la barre en direct.
// FAUX — se réinitialise à chaque barre, donc vaut toujours 1
int count = 0
count := count + 1
// CORRECT — `var` initialise une fois et persiste
var int count = 0
count := count + 1
= déclare. := réaffecte. Utiliser = deux fois sur le même nom est une erreur.
Les fonctions ta.* doivent s'exécuter sur chaque barre. Elles maintiennent un état interne, donc les appeler dans une conditionnelle le corrompt silencieusement :
// FAUX — ta.sma n'avance que lorsque la condition est vraie
valeur = condition ? ta.sma(close, 20) : na
// CORRECT — calculer d'abord sans condition, puis sélectionner
smaValue = ta.sma(close, 20)
valeur = condition ? smaValue : na
Constructeurs surchargés
line.new, label.new et box.new acceptent chacun deux formes. Les deux sont valides :
line.new(x1=bar_index[1], y1=low[1], x2=bar_index, y2=high) // coordonnées
line.new(first_point=chart.point.now(low), second_point=chart.point.now(high))
label.new(x=bar_index, y=high, text="salut") // coordonnées
label.new(point=chart.point.now(high), text="salut")
box.new(left=bar_index[5], top=high, right=bar_index, bottom=low) // coordonnées
box.new(top_left=p1, bottom_right=p2)
Les noms de paramètres diffèrent selon la fonction et sont faciles à confondre : label.new prend textalign ; box.new et table.cell prennent text_halign / text_valign.
Anti-repainting
// REPEINT — la barre actuelle de la timeframe supérieure est encore en formation
d = request.security(syminfo.tickerid, "D", close)
// STABLE — la barre précédente, fermée
d = request.security(syminfo.tickerid, "D", close[1], lookahead=barmerge.lookahead_off)
Mettez en cache l'appel dans une variable ; ne le répétez jamais en ligne. Protégez les divisions de valeurs dérivées de request.security avec nz().
Limites de la plateforme
| Limite | Valeur |
|---|---|
Appels plot() | 64 |
Appels request.*() | 40 |
| Taille du script | 80 000 tokens |
| Temps de boucle | 500 ms |
| Objets de dessin | 500 chacun (ligne/label/box — augmenter via max_*_count) |
API ajoutée depuis 2025 — souvent oubliée
| Fonctionnalité | Date de sortie |
|---|---|
box.set_xloc() | Mars 2025 |
active sur tous les input.*() | Juillet 2025 |
timeframe_bars_back sur time() / time_close() | Octobre 2025 |
syminfo.isin | Novembre 2025 |
request.footprint(), types footprint / volume_row | Janvier 2026 |
sort_field sur array.sort() / matrix.sort() | Avril 2026 |
Chaînes multilignes """…""" | Avril 2026 |
calc_on_every_history_tick sur strategy() | Juillet 2026 |
Des règles sont également supprimées : TradingView a supprimé les restrictions d'indentation pour les lignes enveloppées en décembre 2025, donc une continuation indentée de quatre espaces, ou même non indentée, est légale. Vérifiez les notes de version avant d'affirmer qu'un symbole est invalide.
Structure du script
//@version=6
indicator("Titre", overlay=true) // ou strategy(...)
// imports -> types -> constantes -> entrées -> fonctions
// -> calculs -> ordres -> tracés -> alertes
Erreurs de compilation courantes
| Message | Cause |
|---|---|
end of line without line continuation | Espace blanc après un opérateur, ou expression enveloppée mal formée |
Undeclared identifier | Variable assignée uniquement à l'intérieur d'un if ; déclarez-la avant avec var ou une valeur par défaut |
Cannot call 'ta.sma' with 'series' où simple est requis | Un argument length doit être simple int — les entrées le sont, les valeurs de série ne le sont pas |
Mismatched input ... expecting | = utilisé pour une réaffectation alors que := est nécessaire |