[TOC]
Die allgemeine Struktur des Codes in Pine folgt:
<version>
<declaration_statement>
<code>
Anmerkungen Symbole, die von der Pine-Sprache des FMZ unterstützt werden: Einzeilenoten//
, mehrzeilige Anmerkungen/* */
, wie z. B. die Anmerkungen im folgenden Beispiel:
[macdLine, signalLine, histLine] = ta.macd(close, 12, 26, 9) // calculate the MACD indicator
/*
The plot function draws the indicator line on the chart
*/
plot(macdLine, color = color.blue, title='macdLine')
plot(signalLine, color = color.orange, title='signalLine')
plot(histLine, color = color.red, title='histLine')
Eine Kompiliereranweisung der folgenden Form teilt dem Kompilierer mit, mit welcher Version von Pine das Skript geschrieben wurde:
//@version=5
Die Standardversion ist V5, die aus dem Code weggelassen werden kann//@version=5
.
indicator()
strategy()
Die Erklärungserklärung bestimmt den Typ des Skripts, der wiederum bestimmt, was in ihm erlaubt ist, und wie es verwendet und ausgeführt wird. Setzen Sie Schlüsseleigenschaften des Skripts, wie seinen Namen, wo er erscheinen wird, wenn er dem Diagramm hinzugefügt wird, die Präzision und das Format der angezeigten numerischen Werte und bestimmte numerische Werte, die sein Laufzeitverhalten bestimmen, zum Beispiel die maximale Anzahl von Zeichnungsobjekten, die im Diagramm angezeigt werden sollen. Für Strategien umfassen Attribute Argumente, die das Backtesting steuern, wie Anfangskapital, Provisionen, Rutsch usw.indicator()
oderstrategy()
Die Erklärung muss in einem Strategiecode in Pine of FMZ enthalten sein.
Zeilen in einem Skript, die keine Kommentare oder Compiler-Anweisungen sind, sondern Statements, die den Algorithmus des Skripts implementieren.
if
, for
, while
oderswitch
und andere KonstrukteDie Auskünfte können auf verschiedene Weise angeordnet werden.
space
odertab
(Tab-Taste). Ihr erstes Zeichen muss auch das erste Zeichen der Zeile sein. Zeilen, die an der ersten Position einer Zeile beginnen, sind per Definition Teil des globalen Umfangs des Skripts.local block
ist immer für Struktur- oder mehrzeilige Funktionsdeklarationen erforderlich. Ein lokaler Block muss durch einen Tab oder vier Leerzeichen eingelegt werden (andernfalls wird er als der verknüpfte Code der vorherigen Zeile analysiert, der als der kontinuierliche Inhalt der vorherigen Zeile bestimmt wird), und jeder lokale Block definiert einen anderen lokalen Bereich.Zum Beispiel drei lokale Blöcke, einen in der kundenspezifischen Funktionsdeklaration und zwei in der Variablendeklaration mit der if-Struktur, wie folgt:
indicator("", "", true) // Declaration statement (global scope), can be omitted
barIsUp() => // Function declaration (global scope)
close > open // Local block (local scope)
plotColor = if barIsUp() // Variable declaration (global scope)
color.green // Local block (local scope)
else
color.red // Local block (local scope)
runtime.log("color", color = plotColor) // Call a built-in function to output the log (global scope)
Lange Linien können über mehrere Linien aufgeteilt oder
a = open + high + low + close
Es kann so verpackt werden (beachten Sie, dass die Anzahl der durchgeschlagenen Leerzeichen pro Zeile kein Vielfaches von 4 ist):
a = open +
high +
low +
close
Ein langer Plot ((() Anruf kann wie folgt verpackt werden:
close1 = request.security(syminfo.tickerid, "D", close) // closing price data series of syminfo.tickerid daily level of the current trading pair
close2 = request.security(syminfo.tickerid, "240", close) // closing price data series of syminfo.tickerid 240-minute level of the current trading pair
plot(ta.correlation(close, open, 100), // Line-long plot() calls can be wrapped
color = color.new(color.purple, 40),
style = plot.style_area,
trackprice = true)
Behauptungen in benutzerdefinierten Funktionsdeklarationen können ebenfalls eingewürft werden. Da jedoch ein lokaler Block syntaktisch mit einem Eintrag (4 Leerzeichen oder 1 Tab) beginnen muss, muss die Fortsetzung einer Behauptung beim Aufspalten auf die nächste Zeile mit mehr als einem Eintrag (nicht gleich 4 Vielfachen von Leerzeichen) beginnen.
test(c, o) =>
ret = c > o ?
(c > o+5000 ?
1 :
0):
(c < o-5000 ?
-1 :
0)
a = test(close, open)
plot(a, title="a")
Zeitreihe ist kein Datentyp oder Format, sondern ein Konzept einer grundlegenden Struktur in der PINE-Sprache.
Nehmen Sie die integrierte Variableopen
Das ist ein Beispiel.open
Die integrierte Variable zeichnet den Eröffnungspreis jeder Int-Repräsentation BAR auf, wenn dieseopen
ist eine 5-minütige Int-Repräsentationsperiode.open
Die Variable zeichnet den Eröffnungspreis jeder 5-minütigen Int-Repräsentation BAR (Bar) auf.open
In der Zeitreihe werden die vorhergehenden Werte (Vergangene Werte) in der Zeitreihe mit dem[]
Wenn die Strategie auf einer bestimmten Int-Repräsentation BAR ausgeführt wird,open[1]
Die Bedeutung bezieht sich auf den Eröffnungspreis der vorherigen Int-Repräsentation BAR der aktuellen Int-Repräsentation BAR.
ObwohlZeitreihenist sehr an die Datenstruktur
Die Zeitreihen, die in der Sprache der Kiefer entworfen sind, können leicht den kumulativen Wert des Schlusskurses im Strategiecode berechnen, und es ist nicht notwendig, Schleifstrukturen wie für, nur die eingebaute Funktion zu verwenden.ta.cum(close)
Für ein anderes Beispiel müssen wir den Durchschnittswert der Differenz zwischen dem höchsten Preis und dem niedrigsten Preis der letzten 14 Int-Repräsentations-BARs (d. h. der 14 Int-Repräsentations-BARs, die dem aktuellen Zeitpunkt der Ausführung des Codes am nächsten sind) berechnen, der wie folgt geschrieben werden kann:ta.sma(high - low, 14)
Das Ergebnis des Aufrufs einer Funktion auf einer Zeitreihe wird auch eine Spur auf der Zeitreihe hinterlassen, wieder verwenden wir die[]
Zum Beispiel können wir beim Testen, ob der Schlusskurs der aktuellen Int-Repräsentation BAR den maximalen Wert des höchsten Preises in der letzten 10 Int-Repräsentation BAR (ohne die aktuelle Int-Repräsentation BAR) übersteigt, schreiben:breach = close > ta.highest(close, 10)[1]
, und wir können auch schreibenbreach = close > ta.highest(close[1], 10)
Also...ta.highest(close, 10)[1]
undta.highest(close[1], 10)
sind gleichwertig.
Dies kann mit dem folgenden Code überprüft werden:
strategy("test pine", "test", true)
a = ta.highest(close, 10)[1]
b = ta.highest(close[1], 10)
plotchar(true, title="a", char=str.tostring(a), location=location.abovebar, color=color.red)
plotchar(true, title="b", char=str.tostring(b), location=location.belowbar, color=color.green)
Der obige Testcode liefert die Werte von a und b für jede BAR in der entsprechenden Zeitreihe.
Anweisungen für die Festlegung der Argumente der eingebauten Vorlage
Pricing Currency Precision
Der Wert der Preise wird auf 2 gesetzt, was bis zum zweiten Dezimalpunkt genau ist, genau auf 0,01. Dann repräsentiert jeder Punkt der Rutschpunkte 0,01 Preiseinheiten. Zu diesem Zeitpunkt wird der Rutschpunkt auf 5 gesetzt, und die Rutschrate beim Auftragen ist 0,05 (der Rutsch bezieht sich auf den Teil des Preises, der beim Auftragen eines Bestellbetrags für einen besseren und Handicap-Auftrag überschwemmt).SetMaxBarLen
in derjavascript
srategy.strategy(title = "open long example", pyramiding = 3) // The number of orders placed in the same direction allowed by pyramiding
strategy.entry("long1", strategy.long, 0.01) // Open a long position at the market price, specify the group label as long1
strategy.entry("long2", strategy.long, 0.02, when = close > ta.ema(close, 10)) // The condition is triggered, the order is executed, and the market price opens a long position
strategy.entry("long3", strategy.long, 0.03, limit = 30000) // Specify the (lower) price, plan to place a buy order, wait for a deal to open a position, and open a position at a limit price
strategy(title = "close long example", pyramiding = 2) // The number of orders placed in the same direction allowed by pyramiding
strategy.entry("long1", strategy.long, 0.1) // Open a long position at the market price, specify the group label as long1
strategy.entry("long2", strategy.long, 0.1) // Open a long position at the market price, specify the group label as long2
strategy.close("long1", when = strategy.position_size > 0.1, qty_percent = 50, comment = "close buy entry for 50%") // To close a position, specify to close 50% of the positions whose group label is long1
strategy.close("long2", when = strategy.position_size > 0.1, qty_percent = 80, comment = "close buy entry for 80%") // To close a position, specify to close 80% of the positions whose group label is long2
Der Positionsmechanismus der PINE-Sprache ähnelt einer Einwegposition. Zum Beispiel, wenn eine Position in der Long-Richtung (Long-Position) gehalten wird, wird die Ausführung ausgelöst, und die Position in der Long-Richtung wird zuerst geschlossen. (Schließen Sie alle Long-Positionen) und dann den ausgelösten Auftrag ausführen (in der gegenüberliegenden Richtung zur Position vor dem Schließen).
Wenn Sie eine Bestellung mit dem Befehl "Order Placement" platzieren, wenn kein Preis angegeben ist, ist der Standard eine Marktbestellung. Zusätzlich zur Marktbestellung können Sie auch eine Bestellung über eine geplante Bestellung platzieren, die nicht sofort zur Bestellung ausgeführt wird. Die geplante Bestellung existiert in der geplanten Bestellwarteschlange des Programms, wenn sie nicht ausgelöst wird, und kann in der Registerkarte strategy.entry
Funktion, um eine Bestellung zu platzieren, können wir dielimit
, stop
arguments.
var isTrade = false
if not barstate.ishistory and not isTrade
isTrade := true
strategy.entry("test 1", strategy.long, 0.1, stop=close*1.3, comment="test 1 order") // stop
strategy.entry("test 2", strategy.long, 0.2, limit=close*0.7, comment="test 2 order") // limit
strategy.entry("test 3", strategy.short, 0.3, stop=close*0.6, limit=close*1.4, comment="test 3 order") // stop-limit
Grenzreihenfolge
Wenn der Auftrag ein Kaufbefehl ist (d. h. derdirection
Das Argument iststrategy.long
), wird der Auftrag nur ausgelöst, wenn der aktuelle Marktpreis unter diesem Preis liegt.
Wenn es sich bei dem Auftrag um einen Verkaufsbefehl handelt (d. h.direction
Das Argument iststrategy.short
), wird der Auftrag nur ausgelöst, wenn der aktuelle Marktpreis höher ist als dieser Preis.
Aufforderung zur Einstellung
Wenn es sich bei der Bestellung um einen Kaufbefehl handelt, wird die Bestellung nur ausgelöst, wenn der aktuelle Marktpreis höher ist als dieser Preis. Wenn es sich bei einem Auftrag um einen Verkaufsauftrag handelt, wird der Auftrag nur ausgelöst, wenn der aktuelle Marktpreis unter diesem Preis liegt.
Stop-Limit-Anweisung
Dielimit
undstop
Die Bestellung wird zum Preis ausgelöst, der die Bedingungen zuerst erfüllt.
//@version=5
strategy("Percent of Equity Order", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)
// Simple moving average crossover strategy
longCondition = ta.crossover(ta.sma(close, 14), ta.sma(close, 28))
shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28))
// If the moving average crossover condition is met, buy or sell
if (longCondition)
strategy.entry("Long", strategy.long)
if (shortCondition)
strategy.entry("Short", strategy.short)
Nach Festlegungdefault_qty_type=strategy.percent_of_equity
, gesetztdefault_qty_value
Die Bestellmenge wird anhand des Betrags der auf dem Konto liegenden Währung berechnet. Zum Beispiel: Wenn das Girokonto 10.000 USDT hat, bedeutet die Angabe einer Order von 1% die Platzierung einer Order mit einer Skala von 100 USDT (berechnet anhand des aktuellen Verkaufspreises).
var ist ein Schlüsselwort für die Zuordnung und einmalige Initialisierung von Variablen.
Im Allgemeinen verursacht eine Variable-Zuteilungsgrammatik, die nicht das Schlüsselwort var enthält, dass der Variable
var variable_name = expression
Erläuterung:
variable_name
- Jeder Name einer Benutzervariable, der in Pine Script zulässig ist (er kann Groß- und Kleinbuchstaben, Zahlen und Unterzeichen (_) enthalten, kann aber nicht mit einer Zahl beginnen).expression
- Jeder arithmetische Ausdruck, genau wie die Definition einer regulären Variablen.Beispiel
// Var keyword example
var a = close
var b = 0.0
var c = 0.0
var green_bars_count = 0
if close > open
var x = close
b := x
green_bars_count := green_bars_count + 1
if green_bars_count >= 10
var y = close
c := y
plot(a, title = "a")
plot(b, title = "b")
plot(c, title = "c")
Die Variable
Auf FMZ ist es in Echtzeit-Preismodell und Schlusskursmodell unterteilt.var
undvarip
.
strategy("test pine", "test 1", true)
// Test var varip
var i = 0
varip ii = 0
// Print the i and ii changed in each round of the strategy logic on the graph
plotchar(true, title="ii", char=str.tostring(ii), location=location.abovebar, color=color.red)
plotchar(true, title="i", char=str.tostring(i), location=location.belowbar, color=color.green)
// Each round of logic execution increments i and ii by 1
if true
i := i + 1
ii := ii + 1
Echtzeitpreismodell
Der obige Testcode wird in zwei Phasen ausgeführt: 1. historische Int-Repräsentationsphase 2. Echtzeit-Int-Repräsentationsphase.var
, varip
werden in jeder Runde der Strategiecode-Ausführung schrittweise ausgeführt (weilif true
Wenn die historische Int-Repräsentationsphase endet, beginnt die Echtzeit-Int-Repräsentationsphase.var
, varip
Da es sich um ein Echtzeit-Preismodell handelt, wird der Strategie-Code für jede Preisänderung in einer Int-Repräsentation BAR einmal ausgeführt.i := i + 1
undii := ii + 1
Der Unterschied besteht darin, dass ii jedes Mal geändert wird. Obwohl i auch jedes Mal geändert wird, wird der vorherige Wert wiederhergestellt, wenn die Strategie-Logik in der nächsten Runde ausgeführt wird, und der Wert von i wird nicht aktualisiert, bis die aktuelle Int-Repräsentation BAR abgeschlossen ist (d. h. der vorherige Wert wird nicht wiederhergestellt, wenn die Strategie-Logik in der nächsten Runde ausgeführt wird).
Modell für den Schlusspreis
Da das Schlusskursmodell die Strategie-Logik nur einmal pro Int-Repräsentation BAR ausgeführt.var
undvarip
In dem obigen Beispiel verhalten sich bei dem Schlusskursmodell in der historischen Int-Repräsentationsphase und in der Echtzeit-Int-Repräsentationsphase genau gleich schrittweise und erhöhen sich um 1 pro Int-Repräsentation BAR.
varip (var intrabar persist) ist ein Schlüsselwort, das zur Zuordnung und einmaligen Initialisierung von Variablen verwendet wird.
varip variable_name = expression
Erläuterung:
variable_name
- Jeder Name einer Benutzervariable, der in einer Pine-Schrift zulässig ist (er kann große und kleine lateinische Zeichen, Zahlen und Unterzeichen (_) enthalten, kann aber nicht mit einer Zahl beginnen).expression
- Jeder arithmetische Ausdruck, wie die Zeit, die reguläre Variablen definiert.Beispiel
// varip
varip int v = -1
v := v + 1
plot(v)
Bei der Verwendung von var gibt das Diagramm den Wert von bar_index zurück. Bei varip tritt das gleiche Verhalten auf historischen Balken auf, aber bei Live-Bars gibt das Diagramm einen Wert zurück, der für jeden Tick um einen steigt.
AnmerkungenEs kann nur mit einfachen Typen wie float, int, bool, string und Arrays dieser Typen verwendet werden.
Es stellt den Wert einer bool-Variablen dar, oder einen Wert, der berechnet werden kann, wenn ein Ausdruck eineVergleichoderlogisch operator.
AnmerkungenSiehe Beschreibungen vonVergleicheBetreiber undDas ist logisch. Operators.
Siehe auch
bool
Es stellt den Wert einer bool-Variablen und das Ergebnis von Vergleichsoperationen und logischen Operationen dar.
AnmerkungenSiehe Beschreibungen vonVergleicheBetreiber undDas ist logisch. Operators.
Siehe auch
bool
Eine If-Anweisung definiert einen Satzblock, der ausgeführt werden muss, wenn die Bedingung eines Ausdrucks erfüllt ist.
Universeller Code von:
var_declarationX = if condition
var_decl_then0
var_decl_then1
...
var_decl_thenN
return_expression_then
else if [optional block]
var_decl_else0
var_decl_else1
...
var_decl_elseN
return_expression_else
else
var_decl_else0
var_decl_else1
...
var_decl_elseN
return_expression_else
Anmerkungen
var_declarationX
- Diese Variable erhält den Wert der if-Anweisungcondition
- Wenn die Bedingung wahr ist, die Logik in der Anweisung Blockthen
verwendet wird (var_decl_then0
, var_decl_then1
Wenn die Bedingung falsch ist, wird die Logik in der Anweisung blockelse if
oderelse
verwendet wird (var_decl_else0
, var_decl_else1
, etc.).return_expression_then
undreturn_expression_else
- Der letzte Ausdruck im Modul oder der Ausdruck aus dem Block else gibt den endgültigen Wert der Anweisung zurück.
Der Typ des zurückgegebenen Werts der if-Anweisung hängt von der Art derreturn_expression_then
undreturn_expression_else
. Beim Ausführen in TradingView müssen ihre Typen übereinstimmen: Wenn Sie einen Stringwert im else-Block haben, ist es nicht möglich, einen ganzen Wert aus dem entsprechenden Block zurückzugeben. Beim Ausführen im FMZ wird das folgende Beispiel keinen Fehler melden. Wenn der y-Wert
Beispiel
// This code compiles
x = if close > open
close
else
open
// This code doesn't compile by trading view
// y = if close > open
// close
// else
// "open"
plot(x)
Dieelse
Wenn die Bedingung falsch ist, wird der Variablen var_declarationX ein
Beispiel
// if
x = if close > open
close
// If current close > current open, then x = close.
// Otherwise the x = na.
plot(x)
Die Blöcke von
Beispiel
// if
x = if open > close
5
else if high > low
close
else
open
plot(x)
Der Ergebniswert derif
Es kann nützlich sein, wenn Sie Nebenwirkungen von Ausdrücken benötigen, zum Beispiel im Strategiehandel:
Beispiel
if (ta.crossover(high, low))
strategy.entry("BBandLE", strategy.long, stop=low)
else
strategy.cancel(id="BBandLE")
Wenn Anweisungen einander enthalten können:
Beispiel
// if
float x = na
if close > open
if close > close[1]
x := close
else
x := close[1]
else
x := open
plot(x)
Die
[var_declaration =] for counter = from_num to to_num [by step_num]
statements | continue | break
return_expression
var_declaration
- Eine optionale Variablenerklärung, die als Wert des return_expressions der Schleife zugewiesen wird.counter
- Eine Variable, die den Wert des Schleifzählers hält und bei jeder Iteration der Schleife um 1 oder den Wert step_numm erhöht/verringert.from_num
- Der Anfangswert des Zählers. to_num
- Der endgültige Wert des Zählers. Die Schleife bricht, wenn der Zähler größer als to_num ist (oder kleiner als to_num im Fall von_num > to_num). step_num
- Der Inkrement/Decrement-Wert des Zählers. Er ist optional. Der Standardwert ist +1 oder -1, abhängig von dem größten von from_num oder to_num. Bei Verwendung von Werten wird der Zähler auch nach dem größten von from_num oder to_num erhöht/decremented, so dass das +/- Zeichen von step_num optional ist.statements | continue | break
- eine beliebige Anzahl von Anweisungen oder der Schlüsselwörter return_expression
- Der Rückgabewert der Schleife, falls vorhanden, wird der Variablen in der var_declaration zugewiesen. Wenn die Schleife aufgrund der Schlüsselwörter continue
- Ein Schlüsselwort, das nur in Schleifen verwendet werden kann. Es verursacht die nächste Iteration der Schleife ausgeführt werden.break
- Das Schlüsselwort, um aus der Schleife zu kommen.
Beispiel
// Here, we count the quantity of bars in a given 'lookback' length which closed above the current bar's close
qtyOfHigherCloses(lookback) =>
int result = 0
for i = 1 to lookback
if close[i] > close
result += 1
result
plot(qtyOfHigherCloses(14))
Siehe auch
for...in
while
Diefor...in
construct ermöglicht die Wiederholung mehrerer Anweisungen für jedes Element des Arrays. Es kann mit einem der beiden Argumente verwendet werden:array_element
, oder mit zwei Argumenten:[index, array_element]
Die zweite Form beeinflusst nicht die Funktion der Schleife. Sie verfolgt den Index der aktuellen Iteration in der ersten Variablen des Tupels.
[var_declaration =] for array_element in array_id
statements | continue | break
return_expression
[var_declaration =] for [index, array_element] in array_id
statements | continue | break
return_expression
var_declaration
- Eine optionale Variablenerklärung, der der Wert der Schleifen zugewiesen wirdreturn_expression
.
index
- Eine optionale Variable, die den aktuellen Iterationsindex verfolgt. Der Index beginnt bei 0. Variablen sind im Loop-Body unveränderlich.array_element
.
array_element
- Eine Variable, die jedes aufeinanderfolgende Array-Element enthält, das in der Schleife verarbeitet werden soll.array_id
- Die Array-ID der Schleifeniteration.statements | continue | break
- eine beliebige Anzahl von Anweisungen oder der Schlüsselwörter return_expression
- Der Rückgabewert der Schleife wird der Variablen invar_declaration
Wenn die Schleife aufgrund der Schlüsselwörter continue
- Ein Schlüsselwort, das nur in Schleifen verwendet werden kann. Es verursacht die nächste Iteration der Schleife ausgeführt werden.break
- Das Schlüsselwort, um aus der Schleife zu kommen.
Ermöglicht die Änderung von Elementen eines Arrays oder ihrer Größe innerhalb einer Schleife.
Hier verwenden wir die Ein-Argument-Form vonfor...in
um für jeden Strich zu ermitteln, wie viele Stäbe einen OHLC-Wert haben, der größer ist als der SMA des
Beispiel
// Here we determine on each bar how many of the bar's OHLC values are greater than the SMA of 'close' values
float[ ] ohlcValues = array.from(open, high, low, close)
qtyGreaterThan(value, array) =>
int result = 0
for currentElement in array
if currentElement > value
result += 1
result
plot(qtyGreaterThan(ta.sma(close, 20), ohlcValues))
Hier verwenden wir die zwei-Argument-Form von für...in um die Werte unsererisPos
Anschluss antrue
Wenn ihre entsprechenden Werte in unserervaluesArray
die Arrays sind positiv:
Beispiel
// for...in
var valuesArray = array.from(4, -8, 11, 78, -16, 34, 7, 99, 0, 55)
var isPos = array.new_bool(10, false)
for [index, value] in valuesArray
if value > 0
array.set(isPos, index, true)
if barstate.islastconfirmedhistory
runtime.log(str.tostring(isPos))
Siehe auch
for
while
array.sum
array.min
array.max
Diewhile
Diese Anweisung erlaubt die bedingte Iteration von native Code-Blöcken.
variable_declaration = while boolean_expression
...
continue
...
break
...
return_expression
Erläuterung:variable_declaration
- Optionale Variablerdeklaration.return expression
kann einen Initialisierungswert für diese Variable bereitstellen.boolean_expression
- Wenn wahr, den lokalen Block deswhile
Wenn falsch, wird die Ausführung des Skripts nach demwhile
statement.
continue
- Die...continue
Das Schlüsselwort führt dazu, dass sich die Schleife auf die nächste Iteration verzweigt.break
- Die...break
Die Schaltfläche wird durch das Schlüsselwort beendet. Die Ausführung des Skripts wird nach demwhile
statement.
return_expression
- Optionale Zeile, die den Renditewert derwhile
statement.
Beispiel
// This is a simple example of calculating a factorial using a while loop.
int i_n = input.int(10, "Factorial Size", minval=0)
int counter = i_n
int factorial = 1
while counter > 0
factorial := factorial * counter
counter := counter - 1
plot(factorial)
AnmerkungenDer native Code-Block nach der erstenwhile
Sie müssen durch vier Leerzeichen oder einen Tab eingelegt werden.while
Schleife, der folgende Boole-Ausdruckwhile
muss schließlich falsch werden, oderbreak
Sie müssen hingerichtet werden.
Der Schaltbetreiber überträgt die Steuerung auf eine von mehreren Anweisungen basierend auf der Bedingung und dem Wert des Ausdrucks.
[variable_declaration = ] switch expression
value1 => local_block
value2 => local_block
...
=> default_local_block
[variable_declaration = ] switch
boolean_expression1 => local_block
boolean_expression2 => local_block
...
=> default_local_block
Wechseln mit Ausdruck:
Beispiel
// Switch using an expression
string i_maType = input.string("EMA", "MA type", options = ["EMA", "SMA", "RMA", "WMA"])
float ma = switch i_maType
"EMA" => ta.ema(close, 10)
"SMA" => ta.sma(close, 10)
"RMA" => ta.rma(close, 10)
// Default used when the three first cases do not match.
=> ta.wma(close, 10)
plot(ma)
Wechsel ohne Ausdruck:
Beispiel
strategy("Switch without an expression", overlay = true)
bool longCondition = ta.crossover( ta.sma(close, 14), ta.sma(close, 28))
bool shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28))
switch
longCondition => strategy.entry("Long ID", strategy.long)
shortCondition => strategy.entry("Short ID", strategy.short)
RückkehrDer Wert des letzten Ausdrucks im ausgeführten lokalen Anweisungsblock.
AnmerkungenNur einelocal_block
Instanzen oderdefault_local_block
kann ausgeführt werden.default_local_block
ist nur mit der=>
Tag, und wird nur ausgeführt, wenn der vorhergehende Block nicht ausgeführt wird.switch
Angabe wird einer Variablen zugeordnet unddefault_local_block
nicht angegeben ist, wird die Anweisung zurückgegebenna
wennlocal_block
Das Ergebnis einerswitch
Anweisung für eine Variable, allelocal_block
Instanzen müssen einen Wert desselben Typs zurückgeben.
Siehe auch
if
?:
Der Typ der Datenreihe ist in der Regel unnötig, um explizit dieseries
keyword.
Wird verwendet, um Variablen Werte zuzuweisen, jedoch nur, wenn die Variable deklariert wird (zuerst verwendet).
Der Zuweisungsoperator weist der Variablen auf der linken Seite einen Wert zu.
Nicht gleich. Anwendbar auf Ausdrücke jeglicher Art.
expr1 != expr2
RückkehrBoole-Wert oder eine Folge von Boole-Werten.
Modulo (Vollzahlrückstand). Anwendbar auf numerische Ausdrücke.
expr1 % expr2
RückkehrGanzzahl- oder Floatwert oder Wertreihe.
AnmerkungenBei der Berechnung des Ganzzahlrückstands wird der Quotient in Pine Script abgeschnitten, d.h. auf den niedrigsten absoluten Wert gerundet. Der resultierende Wert hat das gleiche Zeichen wie die Dividende.
Beispiel: -1 % 9 = -1 - 9 * abgeschnitten(-1/9) = -1 - 9 * abgeschnitten(-0.111) = -1 - 9 * 0 = -1.
Modulenaufgabe, anwendbar auf Zahlen.
expr1 %= expr2
Beispiel
// Equals to expr1 = expr1 % expr2.
a = 3
b = 3
a %= b
// Result: a = 0.
plot(a)
RückkehrGanzzahl- oder Floatwert oder Wertreihe.
Multiplikationszuweisung, anwendbar auf Zahlen.
expr1 * expr2
RückkehrGanzzahl- oder Floatwert oder Wertreihe.
Multiplikationszuweisung, anwendbar auf Zahlen.
expr1 *= expr2
Beispiel
// Equals to expr1 = expr1 * expr2.
a = 2
b = 3
a *= b
// Result: a = 6.
plot(a)
RückkehrGanzzahl- oder Floatwert oder Wertreihe.
Addition oder unarisches Plus. Anwendbar auf numerische Ausdrücke oder Zeichenfolgen.
expr1 + expr2
+ expr
RückkehrDas Binärsystem+
der Zeichenfolge gibt die Kombination von expr1 und expr2 zurück
Zahl Gibt einen ganzen oder einen Wert mit einem schwimmenden Zifferzeichen oder eine Wertfolge zurück:
Binär
AnmerkungenSie können arithmetische Operatoren sowohl mit Zahlen als auch mit Reihenvariablen verwenden.
Zusätzliche Zuordnung gilt für Zahlen oder Zeichenfolgen.
expr1 += expr2
Beispiel
// Equals to expr1 = expr1 + expr2.
a = 2
b = 3
a += b
// Result: a = 5.
plot(a)
RückkehrFür Zeichenfolgen, gibt die Verknüpfung von expr1 und expr2 zurück. Für Zahlen, gibt ein ganzzahliges oder float-Wert oder eine Reihe von Werten zurück.
AnmerkungenSie können arithmetische Operatoren sowohl mit Zahlen als auch mit Reihenvariablen verwenden.
Subtraktion oder unarische Minus.
expr1 - expr2
- expr
RückkehrGibt eine ganze Zahl oder einen Wert mit schwebendem Komma oder eine Reihe von Werten zurück:
Binär -
Gibt die Negation von expr zurück.
AnmerkungenSie können arithmetische Operatoren sowohl mit Zahlen als auch mit Reihenvariablen verwenden.
Abzugszuweisung. Anwendbar auf Zahlen.
expr1 -= expr2
Beispiel
// Equals to expr1 = expr1 - expr2.
a = 2
b = 3
a -= b
// Result: a = -1.
plot(a)
RückkehrGanzzahl- oder Floatwert oder Wertreihe.
Zuweisung von Divisionen, anwendbar auf Zahlen.
expr1 / expr2
RückkehrGanzzahl- oder Floatwert oder Wertreihe.
Zuweisung von Divisionen, anwendbar auf Zahlen.
expr1 /= expr2
Beispiel
// Equals to expr1 = expr1 / expr2.
a = 3
b = 3
a /= b
// Result: a = 1.
plot(a)
RückkehrGanzzahl- oder Floatwert oder Wertreihe.
Weniger als. Anwendbar auf numerische Ausdrücke.
expr1 < expr2
RückkehrBoolean-Wert oder Reihe von Boolean-Werten.
Weniger als oder gleich. Anwendbar auf Zahlen.
expr1 <= expr2
RückkehrBoolean-Wert oder Reihe von Boolean-Werten.
Geltend für Ausdrücke jeglicher Art.
expr1 == expr2
RückkehrBoolean-Wert oder Reihe von Boolean-Werten.
Der Operator switch
statements.
Die Grammatik der Funktionsdeklaration lautet:
<identifier>([<argument_name>[=<default_value>]], ...) =>
<local_block>
<function_result>
Eine<local_block>
ist null oder mehr Pine Script Anweisungen.<function_result>
ist eine Variable, ein Ausdruck oder ein Tupel.
Beispiel
// single-line function
f1(x, y) => x + y
// multi-line function
f2(x, y) =>
sum = x + y
sumChange = ta.change(sum, 10)
// Function automatically returns the last expression used in it
plot(f1(30, 8) + f2(1, 3))
AnmerkungenMehr über benutzerdefinierte Funktionen erfahren Sie auf den Seiten des Benutzerhandbuchs über Deklarierung von Funktionen und Scriptbibliotheken.
Größer als. Anwendbar auf numerische Ausdrücke.
expr1 > expr2
RückkehrBoolean-Wert oder Reihe von Boolean-Werten.
Größer als oder gleich. Anwendbar auf Zahlen.
expr1 >= expr2
RückkehrBoolean-Wert oder Reihe von Boolean-Werten.
Ternärer bedingter Operator.
expr1 ? expr2 : expr3
Beispiel
// Draw circles at the bars where open crosses close
s2 = ta.cross(open, close) ? math.avg(open,close) : na
plot(s2, style=plot.style_circles, linewidth=2, color=color.red)
// Combination of ?: operators for 'switch'-like logic
c = timeframe.isintraday ? color.red : timeframe.isdaily ? color.green : timeframe.isweekly ? color.blue : color.gray
plot(hl2, color=c)
Rückkehrexpr2 wenn expr1 als wahr ausgewertet wird, expr3 andernfalls. Nullwert (0 und auch NaN, +Infinity, -Infinity) gilt als falsch, jeder andere Wert als wahr.
AnmerkungenVerwenden Sie na für
Siehe auch
na
Die Anzahl der Bars in der Vergangenheit ist expr1, und sie muss numerisch sein.
expr1[expr2]
Beispiel
// [] can be used to "save" variable value between bars
a = 0.0 // declare `a`
a := a[1] // immediately set current value to the same as previous. `na` in the beginning of history
if high == low // if some condition - change `a` value to another
a := low
plot(a)
RückkehrEine Reihe von Werten.
Siehe auch
math.floor
Logische AND. Anwendbar auf booleanische Ausdrücke.
expr1 and expr2
RückkehrBoolean-Wert oder Reihe von Boolean-Werten.
Logische OR. Anwendbar auf Boolean-Ausdrücke.
expr1 or expr2
RückkehrBoolean-Wert oder Reihe von Boolean-Werten.
Logische Negation (NOT). Anwendbar auf booleanische Ausdrücke.
not expr1
RückkehrBoolean-Wert oder Reihe von Boolean-Werten.
Schlüsselwort verwendet, um den
Beispiel
// bool
bool b = true // Same as `b = true`
b := na
plot(b ? open : close)
AnmerkungenDie explizite Erwähnung des Typs in einer Variablerdeklaration ist optional, außer wenn er mit na initialisiert wird. Erfahren Sie mehr über Pine Script-Typen auf der Seite Benutzerhandbuch des Typsystems.
Siehe auch
var
varip
int
float
color
string
true
false
Schlüsselwort, das verwendet wird, um den
Beispiel
// int
int i = 14 // Same as `i = 14`
i := na
plot(i)
AnmerkungenDie explizite Erwähnung des Typs in einer Variablerdeklaration ist optional, außer wenn er mit na initialisiert wird. Erfahren Sie mehr über Pine Script-Typen auf der Seite Benutzerhandbuch des Typsystems.
Siehe auch
var
varip
float
bool
color
string
Schlüsselwort, mit dem explizit der Typ
Beispiel
// float
float f = 3.14 // Same as `f = 3.14`
f := na
plot(f)
AnmerkungenDie explizite Erwähnung des Typs in einer Variabeldeklaration ist optional, außer wenn er mit na initialisiert wird.
Siehe auch
var
varip
int
bool
color
string
Schlüsselwort, mit dem der
Beispiel
// string
string s = "Hello World!" // Same as `s = "Hello world!"`
// string s = na // same as ""
plot(na, title=s)
AnmerkungenDie explizite Erwähnung des Typs in einer Variablerdeklaration ist optional, außer wenn er mit na initialisiert wird. Erfahren Sie mehr über Pine Script-Typen auf der Seite Benutzerhandbuch des Typsystems.
Siehe auch
var
varip
int
float
bool
str.tostring
str.format
Schlüsselwort, mit dem explizit der
Beispiel
// color
color textColor = color.green
if barstate.islastconfirmedhistory
runtime.log("test", textcolor = textColor)
AnmerkungenDie Buchstabenpaare stellen Hexadezimalwerte von 00 bis FF (0 bis 255 im Dezimal) dar, wobei die RR-, GG- und BB-Paare die Werte für die Farbkomponenten
Die explizite Erwähnung des Typs in einer Variablerdeklaration ist optional, außer wenn er mit na initialisiert wird. Erfahren Sie mehr über Pine Script-Typen auf der Seite Benutzerhandbuch des Typsystems.
Siehe auch
var
varip
int
float
string
color.rgb
color.new
Schlüsselwort verwendet, um den array.new<type>
, array.from
function.
Beispiel
// array
array<float> a = na
a := array.new<float>(1, close)
plot(array.get(a, 0))
AnmerkungenArray-Objekte sind immer
Siehe auch
var
array.new
array.from
Objekte in der PINE-Sprache sind Instanzen benutzerdefinierter Typen (UDTs), die als methodlose Klassen verstanden werden können, die es Benutzern ermöglichen, benutzerdefinierte Typen in Strategien zu erstellen, um verschiedene Werte in einer Entität zu organisieren.
Definition von Typen
Lassen Sie uns einen Auftragstyp definieren, um Auftragsinformationen zu speichern:
type order
float price
float amount
string symbol
type
keyword.Erstellen von Objekten
Mit dem angegebenen Typ rufen Sie dienew()
Funktion zum Erstellen eines Objekts:
order1 = order.new()
order1 = order.new(100, 0.1, "BTC_USDT")
order1 = order.new(amount = 0.1, symbol = "BTC_USDT", price = 100)
Sie können auch leere Objekte erstellen:
order order1 = na
Schauen wir uns ein praktisches Beispiel an:
type order
float price
float amount
string symbol
if strategy.position_size == 0 and open > close
strategy.entry("long", strategy.long, 1)
order1 = order.new(strategy.opentrades.entry_price(strategy.opentrades - 1), strategy.opentrades.size(strategy.opentrades - 1), syminfo.ticker)
// runtime.log(order1) // Output {"data":{"price":46002.8,"amount":1,"symbol":"swap"},"_meta":0,"_type":"order"}
In diesem Beispiel:
order1 = order.new(strategy.opentrades.entry_price(strategy.opentrades - 1), strategy.opentrades.size(strategy.opentrades - 1), syminfo.ticker)
Es kann auch geschrieben werden:
order order1 = na
order1 := order.new(strategy.opentrades.entry_price(strategy.opentrades - 1), strategy.opentrades.size(strategy.opentrades - 1), syminfo.ticker)
Objekttyp für die Verwendung des Schlüsselworts var
//@version=5
indicator("Objects using `var` demo")
//@type A custom type to hold index, price, and volume information.
type BarInfo
int index = bar_index
float price = close
float vol = volume
//@variable A `BarInfo` instance whose fields persist through all iterations, starting from the first bar.
var BarInfo firstBar = BarInfo.new()
//@variable A `BarInfo` instance declared on every bar.
BarInfo currentBar = BarInfo.new()
// Plot the `index` fields of both instances to compare the difference.
plot(firstBar.index, "firstBar")
plot(currentBar.index, "currentBar")
Wenn Sie das Schlüsselwort var verwenden, um eine Variable zu deklarieren, die einem Objekt eines benutzerdefinierten Typs zugewiesen ist, gilt das Schlüsselwort automatisch für alle Felder des Objekts. Dies bedeutet, dass ein über das Schlüsselwort var deklariertes Objekt seinen Zustand zwischen jeder Iteration beibehält, ohne dass seine Feldwerte in jeder Iteration neu initialisiert werden müssen.
Durch das Zeichnen der Indexfelder der beiden Objekte können Sie die Unterschiede zwischen ihnen vergleichen. firstBar.index behält den zuvor festgelegten Wert in jeder Iteration bei, während currentBar.index in jeder Iteration auf den bar_index-Wert des aktuellen Eintrags neu initialisiert wird.
Objekttypen für die Verwendung des Schlüsselworts varip
//@version=5
indicator("Objects using `varip` fields demo")
//@type A custom type that counts the bars and ticks in the script's execution.
type Counter
int bars = 0
varip int ticks = 0
//@variable A `Counter` object whose reference persists throughout all bars.
var Counter counter = Counter.new()
// Add 1 to the `bars` and `ticks` fields. The `ticks` field is not subject to rollback on unconfirmed bars.
counter.bars += 1
counter.ticks += 1
// Plot both fields for comparison.
plot(counter.bars, "Bar counter", color.blue, 3)
plot(counter.ticks, "Tick counter", color.purple, 3)
In Pine wird das Schlüsselwort varip verwendet, um anzuzeigen, dass die Felder eines Objektes während der gesamten Skriptdurchführung bestehen bleiben und nicht auf unbestätigten Balken zurückrollen. In der Deklaration des Counter-Types verwendet das Feld bars nicht das Schlüsselwort varip, so dass es auf jedem nicht bestätigten Balken zurückrollt. Das Feld ticks verwendet das Schlüsselwort varip, so dass es nicht auf nicht bestätigten Balken zurückrollt. Das Counter-Objekt wird mit dem Schlüsselwort var deklariert, so dass es während der gesamten Skriptdurchführung bestehen bleibt. In jeder Iteration werden sowohl das Bars-Feld als auch das Tick-Feld um 1 erhöht. Schließlich können Sie den Unterschied zwischen den Feldern counter.bars und counter.ticks vergleichen. Der Wert von counter.bars rollt bei jedem nicht bestätigten Balken zurück, während der Wert von counter.ticks bis zum Ende der Skriptdurchführung weiter steigt.
Die BettlerWarum kann die Strategie der Quadrat-Kopie die Strategie der Pine nicht realisieren?
Die Erfinder quantifizieren - Kleine TräumeDas ist eine sehr schlechte Idee.
Die BettlerDer Optimierte Trend-Tracker von Zhang Ziyi
Die Erfinder quantifizieren - Kleine TräumeHallo, was ist die Strategie?