Begrüßen Sie Pine Script v5

Oct 7, 2021

Heute wird Pine zu v5! Die neue Version unserer Indikator- und Strategie-Programmiersprache bringt eine Vielzahl von aufregenden neuen Funktionen und Verbesserungen. Pine ist jetzt leistungsfähiger als je zuvor, und die Änderungen in v5 werden uns helfen, die Sprache auf ein neues Niveau zu bringen. In diesem Beitrag stellen wir Ihnen nur einige der neuen Funktionen vor. Lesen Sie unbedingt auch unsere Versionshinweise und den Migrationsleitfaden.

v4 zu v5 Konverter

Bestehende Pine-Skripte, die frühere Versionen von Pine verwenden, laufen unverändert weiter, aber wir haben ein Konvertierungstool im Pine-Editor bereitgestellt, das Programmierer bei der Konvertierung ihrer v4-Skripte in v5 unterstützt. Künftige Verbesserungen von Pine werden ausschließlich für v5 eingeführt, daher empfehlen wir, Ihre Indikatoren und Strategien zu konvertieren, wenn Sie von den neuen Funktionen profitieren möchten. Das Tool zur Konvertierung von v4 nach v5 ist verfügbar, wenn ein v4-Skript im Editor geladen ist, und zwar über das Dropdown-Menü Mehr:

Beachten Sie, dass nicht der gesamte v4-Code automatisch konvertiert werden kann. Wenn Sie auf Probleme bei der Konvertierung stoßen oder Ihre Skripte lieber manuell konvertieren möchten, finden Sie in unserem Migrationsleitfaden, der alle Änderungen zwischen v4 und v5 dokumentiert, eine Anleitung.

Bibliotheken

Eine wichtige Neuerung von Pine in der Version 5 sind die Bibliotheken. Bibliotheken sind eine neue Art der Veröffentlichung, mit der Sie benutzerdefinierte Funktionen erstellen können, die in anderen Skripten wiederverwendet werden können. Sobald eine Bibliothek veröffentlicht ist, können andere Skripte (seien es Indikatoren, Strategien oder sogar andere Bibliotheken) sie importieren und ihre Funktionen nutzen. Sie können Bibliotheken verwenden, um komplexe Algorithmen oder häufig verwendete Funktionen einzubinden, so dass Sie oder die gesamte Pine-Gemeinschaft sie leicht wiederverwenden können.

Um mit Bibliotheken zu arbeiten, lesen Sie unsere Handbuch Website über Bibliotheken. Am Ende dieses Beitrags finden Sie Bibliotheksbeispiele, die von Mitgliedern unseres PineCoders Teams veröffentlicht wurden. Sie können veröffentlichte Bibliotheken aus dem Skript-Feed hier sehen.

Standardwerte für benutzerdefinierte Funktionen

Eine Verbesserung, die Hand in Hand mit Bibliotheken geht: Für Parameter in benutzerdefinierten Funktionen kann ein Standardwert definiert werden, wodurch sie praktisch optional werden. Im folgenden Beispiel deklarieren wir eine benutzerdefinierte Funktion customPow(), die base zur Potenz von exp erhebt. Wenn exp beim Aufruf der Funktion nicht angegeben wird, wird 2 verwendet:

//@version=5
indicator("")
customPow(base, exp = 2) =>
    result = 1
    for i = 1 to exp
        result *= base
plot(customPow(11)) // 11^2
plot(customPow(11, 4)) // 11^4

Switch

Die neue switch-Anweisung ist eine Abwandlung der bekannten if-Anweisung. Wenn Sie jemals einen großen Baum von if-else-Anweisungen erstellen mussten, werden Sie zu schätzen wissen, wie viel bequemer es ist, das gewünschte Ergebnis mit switch zu erreichen. In unserem Referenzhandbuch können Sie mehr darüber erfahren. Im folgenden Code sehen Sie ihn in Aktion. Es handelt sich um unseren integrierten Average True Range-Indikator, der jetzt eine switch-Anweisung verwendet, um verschiedene Glättungsalgorithmen für seine Berechnungen bereitzustellen:

//@version=5
indicator(title="Average True Range", shorttitle="ATR", timeframe="")
lengthInput = input.int(title="Length", defval=14, minval=1)
smoothingInput = input.string(title="Smoothing", defval="RMA", options = ["RMA", "SMA", "EMA", "WMA"])

maFunction(source, length) =>
    switch smoothingInput
        "RMA" => ta.rma(source, length)
        "SMA" => ta.sma(source, length)
        "EMA" => ta.ema(source, length)
        => ta.wma(source, length)

plot(maFunction(ta.tr(true), lengthInput), title = "ATR", color=#B71C1C)

Zeichnungssammlungen

Eine große Verbesserung der Lebensqualität bei der Arbeit mit Pine-Zeichnungen: Die neuen integrierten Array-Variablen line.all, label.all, box.all und table.all enthalten immer die IDs aller Zeichnungen des angegebenen Typs, die von Ihrem Skript gezeichnet wurden.

Sie können sie z. B. verwenden, um die Anzahl der auf dem Chart angezeigten Zeichnungen auf der Grundlage eines benutzerdefinierten Wertes zu kürzen. Im folgenden Skript wird bei jeder neuen Tageseröffnung eine Linie gezeichnet (bis zu einem Limit von ~50, basierend auf dem Standard-Linienlimit des Skripts). Anschließend wird geprüft, ob die Anzahl der durch die Skripteingaben erlaubten Linien überschritten wurde, und wenn ja, wird die älteste Linie gelöscht:

//@version=5
indicator("Daily Open", overlay = true)

qtyOfLinesInput = input.int(10, "Draw only last n lines", minval = 0, maxval = 50)

if ta.change(time("1D"))
    line.new(bar_index, open, bar_index + 1, open, extend = extend.right)
    if array.size(line.all) > qtyOfLinesInput
        line.delete(array.get(line.all, 0))

While

Eine weitere lang erwartete Funktion von Pine, die mit v5 eingeführt wurde, sind while-Loops. Die while-Anweisung erzeugt eine Schleife, die anhält, wenn die Bedingung falsch ist oder ein break-Befehl in der Schleife verwendet wird.

Hier ist ein Beispiel für einen Indikator, der die Differenz zwischen dem durchschnittlichen Abstand, den wir benötigen, um das Aufwärts- und Abwärtsvolumen zu finden, und dem Gesamtvolumen der letzten n Balken berechnet. Je weiter wir zurückblicken müssen, um das Auf- oder Abwärtsvolumen zu finden, desto bärischer oder bullischer ist sein Wert:

//@version=5
var int MAX_BARS_BACK = 500
indicator("Volume bias", max_bars_back = MAX_BARS_BACK)

int lookBackInput = input.int(20, "Volume Look Back (bars)", minval = 2, maxval = int(MAX_BARS_BACK / 4))

// Stop the script if the chart does not contain volume data.
bool noVol = na(volume) and nz(math.sum(nz(volume), 200) == 0, true)
if noVol
    runtime.error("No volume data.")

volumeBias(lookBack, maxLookBack) =>
    bool  barUp = ta.rising(close, 1)
    bool  barDn = ta.falling(close, 1)
    float upVolume = 0.
    float dnVolume = 0.
    float avgVolume = math.sum(nz(volume), lookBack)
    int[] upBarNos = array.new_int(0)
    int[] dnBarNos = array.new_int(0)
    int   bar = 1
    bool  volumeFound = false
    while (not volumeFound) and bar < maxLookBack
        if barUp[bar] and upVolume < avgVolume
            upVolume += nz(volume[bar])
            array.push(upBarNos, bar)
        else if barDn[bar] and dnVolume < avgVolume
            dnVolume += nz(volume[bar])
            array.push(dnBarNos, bar)
        bar += 1
        volumeFound := upVolume >= avgVolume and dnVolume >= avgVolume
    float volumeBias = bar >= maxLookBack ? na : array.avg(dnBarNos) - array.avg(upBarNos)

float bias = volumeBias(lookBackInput, MAX_BARS_BACK)
plot(bias, "Volume Bias", bias > 0 ? color.lime : color.fuchsia)
hline(0)

Die while-Schleife des Skripts wird so lange ausgeführt, bis das erforderliche Volumen sowohl im Aufwärts- als auch im Abwärtsvolumen gefunden wird, und wir haben nicht über die maximal zulässige Anzahl von Balken hinaus zurückgeblickt. Das Skript veranschaulicht auch eine weitere Funktion, die Pine v5 hinzugefügt wurde: runtime.error().

runtime.error()

Mit der Funktion runtime.error() ist es jetzt möglich, die Ausführung eines Skripts anzuhalten und eine Fehlermeldung anzuzeigen, wenn eine beliebige Bedingung in Pine definiert wird. Dies ist besonders praktisch für Skriptentwickler, die verhindern wollen, dass User ihre Indikatoren falsch verwenden. Die Funktion kann auch als unorthodoxes Debugging-Tool verwendet werden, um die Ausführung z. B. während einer Schleife oder innerhalb einer Funktion anzuhalten.

Um die neue Funktion zu verwenden, rufen Sie einfach die Funktion runtime.error() auf, wenn Ihre Bedingungen erfüllt sind. Wenn sie ausgeführt wird, hält sie das Skript an und zeigt das bekannte Ausrufezeichen neben dem Namen des Indikators an. Wenn User auf das Ausrufezeichen klicken, erscheint die Meldung, die Sie im Funktionsaufruf verwendet haben.

Der folgende Code ist ein einfacher VWAP-Indikator mit zwei benutzerdefinierten Fehlern. Der erste wird angezeigt, wenn für das Symbol keine Volumendaten vorhanden sind: VWAP wird auf der Grundlage des Volumens berechnet; wenn also kein Volumen vorhanden ist, kann das Skript nicht funktionieren. Der zweite Fehler erscheint, wenn der Zeitrahmen auf dem Chart 1D oder höher ist. Bei den grundlegenden VWAP-Berechnungen werden die volumengewichteten gleitenden Durchschnittsdaten auf jedem neuen Balken akkumuliert und zu Beginn eines neuen Tages zurückgesetzt, so dass der Indikator nur auf Intraday-Zeitrahmen nützlich ist.

//@version=5
indicator("VWAP with custom errors")
if na(volume) // Will be true on symbols with no volume data e.g. TVC:SPX
    runtime.error("There is no volume data for this symbol.")
else if timeframe.isdwm // Will be true on 1D and higher timeframes
    runtime.error("Session-based VWAP does not show meaningful data on timeframes >= 1D.
     Please switch to a lower timeframe.")
plot(ta.vwap)

Neue Strategieparameter

Gute Nachrichten für Strategieentwickler! Wir haben eine ganze Reihe neuer Variablen und Funktionen hinzugefügt, die Ihnen Einblick in Trade-Eigenschaften, Statistiken und Metriken geben. Ihre Werte werden aktualisiert, wenn der Broker-Emulator Ihre Orders ausführt, sodass Sie die Werte verfolgen können, während Ihre Strategie fortschreitet.

Click here to see the Pine Reference Manual for details on each one

strategy.closedtrades.entry_price() / strategy.opentrades.entry_price()

strategy.closedtrades.entry_bar_index() / strategy.opentrades.entry_bar_index()

strategy.closedtrades.entry_time() / strategy.opentrades.entry_time()

strategy.closedtrades.size() / strategy.opentrades.size()

strategy.closedtrades.profit() / strategy.opentrades.profit()

strategy.closedtrades.commission() / strategy.opentrades.commission()

strategy.closedtrades.max_runup() / strategy.opentrades.max_runup()

strategy.closedtrades.max_drawdown() / strategy.opentrades.max_drawdown()

strategy.closedtrades.exit_price()

strategy.closedtrades.exit_bar_index()

strategy.closedtrades.exit_time()

strategy.convert_to_account()

strategy.convert_to_symbol()

strategy.account_currency

 

Neue Namespaces

Unsere Gemeinschaft von Pine-Programmierern sagt uns, dass sie die beispiellose Rate von Ergänzungen zu schätzen weiß, die wir in den letzten Jahren in Pine vorgenommen haben und wir beabsichtigen, dieses Tempo auch in Zukunft beizubehalten. Dadurch entsteht jedoch ein ständiger Strom neuer Pine-Funktionen und eingebauter Variablen. Um dieses verrückte Wachstum zu unterstützen, mussten wir die ~600 aktuellen Namen, die in der Sprache verwendet werden, besser organisieren. Zu diesem Zweck haben wir neue Namespaces hinzugefügt, um die Funktionen so zu gruppieren, dass sie ihre Verwendung besser widerspiegeln. Viele Namen von Funktionsparametern wurden ebenfalls umbenannt, um sie leichter verständlich zu machen.

Ein Beispiel für einen neuen Namespace ist ta., der nun alle Variablen und Funktionen im Zusammenhang mit der technischen Analyse enthält. Dadurch wird es für Sie einfacher, das Referenzhandbuch zu durchsuchen und alle Variablen und Funktionen zu finden, die die Werte gängiger Indikatoren zurückgeben. Dementsprechend ist sma() jetzt ta.sma(). Es ist nicht notwendig, sich die neuen Namespaces zu merken; wenn Sie den älteren Namen einer Funktion ohne ihrenNamespace in den Editor eingeben und den Hotkey Autovervollständigen (Strg + Leertaste bzw. Cmd + Leertaste unter MacOS) drücken, erscheint ein Popup mit passenden Vorschlägen:

Dasselbe gilt für die Suche im Referenzhandbuch; wenn Sie einen bekannten Funktionsnamen ohne seinen Namespace eingeben, wird der neue Name angezeigt. Die vollständige Liste der Änderungen in v5 finden Sie in unserem Migrationshandbuch.

Veröffentlichte Bibliotheken

Die folgenden Veröffentlichungen sind Beispiele für Bibliotheken, die auf TradingView von den PineCodern veröffentlicht wurden, die uns helfen, neue Pine-Funktionen zu testen:

ColorScheme by RicardoSantos

Matrix_Functions_Lib_JD by Duyck

Enchanced_ta by HeWhoMustNotBeNamed

Wir hoffen, dass Sie die neuen Funktionen nützlich finden. Und bitte geben Sie uns weiterhin Ihr Feedback und Ihre Vorschläge – wir erstellen TradingView für Sie und sind immer daran interessiert zu erfahren, was Sie über unsere Plattform-Updates denken.

Look first Then leap

TradingView wurde für Sie entwickelt. Stellen Sie sicher, dass Sie unsere fantastischen Features optimal nutzen
Chart öffnen