Pine Script v6
Validieren, bevor du behauptest, es funktioniert
Pine scheitert zur Kompilierzeit auf Arten, die auf dem Bildschirm gut lesbar aussehen. Gib niemals ein Skript zurück, das du nicht überprüft hast.
validate_pine_script # MCP-Tool – gibt strukturierte Fehler mit Zeilennummern zurück
lookup_pine_reference # MCP-Tool – echte Signatur für jedes v6-Symbol
Wenn der MCP-Server nicht verfügbar ist, sage, dass das Skript unvalidiert ist, anstatt zu implizieren, dass es kompiliert.
Rate keine Parameternamen. lookup_pine_reference existiert, weil Raten der häufigste einzelne Fehler ist: colour für color erfinden, shape= für style=, oder textalign bei einer Funktion, die text_halign erwartet.
Das Ausführungsmodell bestimmt alles
Ein Skript wird einmal pro Balken ausgeführt, von links nach rechts durch die Historie, dann bei jedem Tick des live-Balkens.
// FALSCH – setzt jeden Balken zurück, also ist es immer 1
int count = 0
count := count + 1
// RICHTIG – `var` initialisiert einmal und bleibt bestehen
var int count = 0
count := count + 1
= deklariert. := weist neu zu. Zweimal = für denselben Namen ist ein Fehler.
ta.*-Funktionen müssen auf jedem Balken ausgeführt werden. Sie behalten internen Zustand, daher führt ein Aufruf innerhalb einer Bedingung stillschweigend zu Korruption:
// FALSCH – ta.sma schreitet nur fort, wenn die Bedingung wahr ist
value = condition ? ta.sma(close, 20) : na
// RICHTIG – unbedingt berechnen, dann auswählen
smaValue = ta.sma(close, 20)
value = condition ? smaValue : na
Überladene Konstruktoren
line.new, label.new und box.new akzeptieren jeweils zwei Formen. Beide sind gültig:
line.new(x1=bar_index[1], y1=low[1], x2=bar_index, y2=high) // Koordinaten
line.new(first_point=chart.point.now(low), second_point=chart.point.now(high))
label.new(x=bar_index, y=high, text="hi") // Koordinaten
label.new(point=chart.point.now(high), text="hi")
box.new(left=bar_index[5], top=high, right=bar_index, bottom=low) // Koordinaten
box.new(top_left=p1, bottom_right=p2)
Parameternamen unterscheiden sich je nach Funktion und können leicht verwechselt werden: label.new nimmt textalign entgegen; box.new und table.cell nehmen text_halign / text_valign.
Anti-Repainting
// REPAINT – der aktuelle höherzeitliche Balken bildet sich noch
d = request.security(syminfo.tickerid, "D", close)
// STABIL – der vorherige, abgeschlossene Balken
d = request.security(syminfo.tickerid, "D", close[1], lookahead=barmerge.lookahead_off)
Cache den Aufruf in einer Variable; wiederhole ihn niemals inline. Schütze Divisionen von security-abgeleiteten Werten mit nz().
Plattformbeschränkungen
| Grenzwert | Wert |
|---|---|
plot()-Aufrufe | 64 |
request.*()-Aufrufe | 40 |
| Skriptgröße | 80.000 Tokens |
| Schleifenzeit | 500 ms |
| Zeichenobjekte | 500 je Linie/Label/Box (erhöhbar über max_*_count) |
Seit 2025 hinzugefügte API – oft übersehen
| Funktion | Veröffentlicht |
|---|---|
box.set_xloc() | März 2025 |
active bei jedem input.*() | Juli 2025 |
timeframe_bars_back bei time() / time_close() | Okt. 2025 |
syminfo.isin | Nov. 2025 |
request.footprint(), footprint / volume_row-Typen | Jan. 2026 |
sort_field bei array.sort() / matrix.sort() | Apr. 2026 |
Mehrzeilige Strings """…""" | Apr. 2026 |
calc_on_every_history_tick bei strategy() | Juli 2026 |
Regeln werden auch entfernt: TradingView hat die Einrückungsbeschränkungen für umgebrochene Zeilen im Dezember 2025 aufgehoben, sodass eine Fortsetzung mit vier Leerzeichen eingerückt oder gar nicht eingerückt legal ist. Überprüfe die Release Notes, bevor du behauptest, ein Symbol sei ungültig.
Skriptstruktur
//@version=6
indicator("Titel", overlay=true) // oder strategy(...)
// imports -> typen -> konstanten -> eingaben -> funktionen
// -> berechnungen -> orders -> plots -> alerts
Häufige Kompilierungsfehler
| Nachricht | Ursache |
|---|---|
end of line without line continuation | Nachgestellte Leerzeichen nach einem Operator oder ein unterbrochener umgebrochener Ausdruck |
Undeclared identifier | Variable nur innerhalb eines if zugewiesen; vorher mit var oder einem Standardwert deklarieren |
Cannot call 'ta.sma' with 'series' wo simple erforderlich | Ein length-Argument muss simple int sein – Eingaben sind es, Serienwerte nicht |
Mismatched input ... expecting | = für Neuzuweisung verwendet, wo := erforderlich ist |