CommunityRédaction et éditiongithub.com

jpantsjoha/pinescript-plugin

Compétences Pine Script v6 et outils MCP pour les agents de codage — soutenus par un validateur réel, pas par des descriptions.

Qu'est-ce que pinescript-plugin ?

Cette compétence fournit aux agents de codage (comme Claude Code, Cursor, Codex) des outils MCP et des directives précises pour écrire du Pine Script v6 fiable. Elle met l'accent sur la validation obligatoire via des outils MCP (`validate_pine_script`, `lookup_pine_reference`) avant de déclarer qu'un script compile. Elle couvre le modèle d'exécution (une fois par barre, `var` pour la persistance, `ta.*` inconditionnel), les constructeurs surchargés (`line.new`, `label.new`, `box.new`), l'anti-repainting, les limites de plateforme (64 appels `plot()`, 40 appels `request.*()`), les fonctionnalités ajoutées depuis 2025, et les erreurs de compilation courantes. L'objectif est d'éviter les erreurs fréquentes comme deviner les noms de paramètres ou utiliser `=` au lieu de `:=`.

Compatible avec~Claude Code~Codex CLI~Cursor
npx skills add jpantsjoha/pinescript-plugin

Installed? Explore more Rédaction et édition skills: steipete/notion, langchain-ai/langchain, bytedance/podcast-generation · View all 6 →

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

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

LimiteValeur
Appels plot()64
Appels request.*()40
Taille du script80 000 tokens
Temps de boucle500 ms
Objets de dessin500 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.isinNovembre 2025
request.footprint(), types footprint / volume_rowJanvier 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

MessageCause
end of line without line continuationEspace blanc après un opérateur, ou expression enveloppée mal formée
Undeclared identifierVariable 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 requisUn 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

Références

Skills associés