[TOC] Je vous en prie.
La structure générale du code dans Pine est la suivante:
<version>
<declaration_statement>
<code>
Les symboles des notes supportés par la langue Pine de la FMZ: notes en une seule ligne//
, notes à plusieurs lignes/* */
, comme la méthode des notes dans l'exemple suivant:
[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')
Une instruction de compilateur de la forme suivante indique au compilateur quelle version de Pine le script a été écrit avec:
//@version=5
La version par défaut est V5, qui peut être omis du code//@version=5
.
indicator()
strategy()
L'instruction de déclaration détermine le type de script, qui à son tour détermine ce qui y est autorisé, et comment il est utilisé et exécuté. Définir les propriétés clés du script, telles que son nom, où il apparaîtra lorsqu'il est ajouté au graphique, la précision et le format des valeurs numériques qu'il affiche, et certaines valeurs numériques qui régissent son comportement en temps d'exécution, par exemple, le nombre maximal d'objets de dessin à afficher dans le graphique. Pour les stratégies, les attributs comprennent des arguments qui contrôlent le backtesting, tels que le capital initial, les commissions, le glissement, etc.indicator()
oustrategy()
la déclaration doit être incluse dans un code de stratégie en pin de la ZFM.
Les lignes d'un script qui ne sont pas des commentaires ou des instructions du compilateur, qui sont des instructions, qui mettent en œuvre l'algorithme du script.
if
, for
, while
ouswitch
et autres constructionsLes déclarations peuvent être organisées de différentes manières.
space
outab
Les lignes qui commencent à la première position d'une ligne font par définition partie de la portée globale du script.local block
est toujours nécessaire pour les déclarations de structure ou de fonction multilignes. Un bloc local doit être indenté par un onglet ou quatre espaces (sinon, il sera analysé comme le code concaténé de la ligne précédente, qui est déterminé comme le contenu continu de la ligne précédente de code), et chaque bloc local définit une portée locale différente.Par exemple, inclure trois blocs locaux, un dans la déclaration de fonction personnalisée et deux dans la déclaration de variable en utilisant la structure if, comme suit:
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)
Les lignes longues peuvent être divisées en plusieurs lignes, ou enveloppées. Une ligne enveloppée doit être indentée par n'importe quelle quantité d'espace blanc, tant qu'elle n'est pas un multiple de 4 (ces limites sont utilisées pour indenter des blocs locaux).
a = open + high + low + close
Il peut être emballé comme suit (notez que le nombre d'espaces en retrait par ligne n'est pas un multiple de 4):
a = open +
high +
low +
close
Un appel long peut être décrit comme suit:
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)
Les déclarations dans les déclarations de fonctions définies par l'utilisateur peuvent également être enveloppées. Cependant, comme un bloc local doit syntaxiquement commencer par un tiret (4 espaces ou 1 onglet), lors de sa division sur la ligne suivante, la continuation d'une déclaration doit commencer par plus d'un tiret (pas égal à 4 multiples d'espaces).
test(c, o) =>
ret = c > o ?
(c > o+5000 ?
1 :
0):
(c < o-5000 ?
-1 :
0)
a = test(close, open)
plot(a, title="a")
La série temporelle n'est pas un type ou un format de données, mais plutôt un concept de structure de base dans le langage PINE. Utilisé pour stocker des valeurs qui changent continuellement dans le temps, chaque valeur correspond à un point dans le temps.
Prenez la variable intégréeopen
Par exemple, leopen
la variable intégrée enregistre le prix d'ouverture de chaque représentation int BAR, si cetteopen
est une période de représentation int de 5 minutes.open
la variable enregistre le prix d'ouverture de chaque représentation int de 5 minutes BAR (bar).open
Pour faire référence aux valeurs précédentes (valeurs passées) dans la série temporelle, nous utilisons le[]
Lorsque la stratégie est exécutée sur une certaine représentation int BAR,open[1]
Le sens est de se référer au prix d'ouverture de la précédente représentation int BAR de la représentation int actuelle BAR.
Bien que...séries temporellesest très similaire à la structure de données
Les séries chronologiques conçues dans le langage du pin peuvent facilement calculer la valeur cumulée du prix de clôture dans le code de stratégie, et il n'y a pas besoin d'utiliser des structures de boucle telles que pour, seulement la fonction intégréeta.cum(close)
Pour un autre exemple, nous devons calculer la valeur moyenne de la différence entre le prix le plus élevé et le prix le plus bas des 14 dernières BAR de représentation int (c'est-à-dire les 14 BAR de représentation int les plus proches du moment actuel où le code est exécuté), qui peut être écrite comme suit:ta.sma(high - low, 14)
Le résultat de l'appel d'une fonction sur une série temporelle laissera également une trace sur la série temporelle, encore une fois nous utilisons le[]
Par exemple, lorsque nous testons si le prix de clôture de la représentation int actuelle BAR dépasse la valeur maximale du prix le plus élevé de la dernière représentation int 10 BAR (à l'exclusion de la représentation int actuelle BAR).breach = close > ta.highest(close, 10)[1]
On peut aussi écrirebreach = close > ta.highest(close[1], 10)
Alors...ta.highest(close, 10)[1]
etta.highest(close[1], 10)
sont équivalentes.
Ceci peut être vérifié par le code suivant:
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)
Le code de test ci-dessus fournira les valeurs de a et b sur chaque BAR dans la série temporelle correspondante.
Instructions pour définir les arguments du modèle intégré
Pricing Currency Precision
Par exemple, la précision de la devise de prix est réglée sur 2, ce qui est précis à la seconde décimale, précis à 0,01. Ensuite, chaque point de glissement représente 0,01 unité de prix. À ce moment-là, le point de glissement est réglé sur 5, et le glissement lors de la passation d'un ordre est de 0,05 (le glissement fait référence à la partie du prix qui déborde lors de la passation d'un ordre pour un meilleur et un ordre de handicap).SetMaxBarLen
dans lejavascript
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
Le mécanisme de position du langage PINE est similaire à la position unidirectionnelle. Par exemple, lors de la tenue d'une position dans la direction longue (position longue), s'il y a un ordre d'opération de vente, un ordre planifié, etc. (dans la direction opposée à la position), l'exécution sera déclenchée, et la position dans la direction longue sera fermée en premier. (Fermer toutes les positions longues), puis exécuter l'ordre déclenché (dans la direction opposée par rapport à la position avant la fermeture).
Lorsque vous passez un ordre à l'aide de la commande de placement d'ordre, si aucun prix n'est spécifié, l'ordre par défaut est un ordre de marché. En plus de l'ordre de marché, vous pouvez également passer un ordre via un ordre planifié, qui n'opère pas immédiatement pour passer un ordre. L'ordre planifié existe dans la file d'attente d'ordre planifiée du programme lorsqu'il n'est pas déclenché, et peut être vu dans l'onglet strategy.entry
fonction pour passer une commande, nous pouvons spécifier lelimit
, 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
ordre de limite
Lorsque l'ordre est un ordre d'achat (c'est-à-dire que le prix de l'ordre est supérieur à la valeur de l'ordre).direction
L'argument eststrategy.long
), l'ordre ne sera déclenché que lorsque le prix actuel du marché est inférieur à ce prix.
Lorsque l'ordre est un ordre de vente (c'est-à-direction
L'argument eststrategy.short
), l'ordre ne sera déclenché que si le prix actuel du marché est supérieur à ce prix.
ordre d'arrêt
Lorsque l'ordre est un ordre d'achat, l'ordre ne sera déclenché que lorsque le prix actuel du marché est supérieur à ce prix. Lorsqu'un ordre est un ordre de vente, l'ordre ne sera déclenché que si le prix actuel du marché est inférieur à ce prix.
ordre stop-limit
Lelimit
etstop
les arguments peuvent être définis en même temps, et l'ordre sera déclenché au prix qui remplit les conditions en premier.
//@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)
Après avoir précisédefault_qty_type=strategy.percent_of_equity
, réglédefault_qty_value
Le montant de la commande est calculé en fonction du montant de la devise libellée sur le compte. Par exemple: si le compte courant a 10 000 USDT, la mise en place d'une commande de 1% signifie placer une commande avec une échelle de 100 USDT (calculée sur la base du prix courant lors de la vente).
var est un mot clé utilisé pour l'attribution et l'initialisation ponctuelle de variables.
En général, la grammaire de l'attribution des variables qui ne contient pas le mot clé var provoque la valeur de la variable
var variable_name = expression
Expliquer:
variable_name
- Tout nom d'une variable utilisateur autorisé dans Pine Script (il peut contenir des lettres majuscules et minuscules en latin, des chiffres et des soulignements (_), mais il ne peut pas commencer par un nombre).expression
- Toute expression arithmétique, comme pour définir une variable régulière.Exemple
// 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")
La variable
Sur FMZ, il est divisé en modèle de prix en temps réel et modèle de prix de clôture.var
etvarip
.
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
Modèle de prix en temps réel
Le code de test ci-dessus est exécuté en deux phases: 1. phase de représentation int historique. 2. phase de représentation int temps réel. Dans le modèle de prix en temps réel, phase de représentation int historique, les variables i et ii déclarées parvar
, varip
sont exécutés progressivement à chaque ronde d'exécution du code de stratégie (parce queif true
Par conséquent, on peut voir que les nombres affichés sur la représentation int BAR du résultat du backtest sont augmentés de 1 un par un. Lorsque la phase de représentation int historique se termine, la phase de représentation int en temps réel commence.var
, varip
Comme il s'agit d'un modèle de prix en temps réel, le code de stratégie sera exécuté une fois pour chaque variation de prix dans une représentation int BAR,i := i + 1
etii := ii + 1
La différence est que ii est modifié à chaque fois. Bien que i soit également modifié à chaque fois, la valeur précédente sera restaurée lorsque la logique de stratégie est exécutée dans le tour suivant, et la valeur de i ne sera pas mise à jour jusqu'à ce que la représentation int actuelle BAR soit terminée (c'est-à-dire que la valeur précédente ne sera pas restaurée lorsque la logique de stratégie est exécutée dans le tour suivant). On peut donc voir que la variable i est toujours augmentée de 1 pour chaque BAR. Mais la variable ii est accumulée plusieurs fois pour chaque BAR.
Modèle de prix de clôture
Puisque le modèle de prix de clôture exécute la logique de stratégie une seule fois par représentation int BAR disparu.var
etvarip
Dans l'exemple ci-dessus, le modèle de prix de clôture se comporte exactement de la même manière, à la fois dans la phase de représentation int historique et dans la phase de représentation int en temps réel, en augmentant de 1 par représentation int BAR.
varip (var intrabar persist) est un mot-clé utilisé pour l'affectation et l'initialisation ponctuelle de variables.
varip variable_name = expression
Expliquer:
variable_name
- Tout nom d'une variable utilisateur autorisé dans un script Pine (il peut contenir des lettres majuscules et minuscules, des chiffres et des soulignements (_), mais il ne peut pas commencer par un nombre).expression
- Toute expression arithmétique, comme le temps définissant les variables régulières.Exemple
// varip
varip int v = -1
v := v + 1
plot(v)
Avec varip, le même comportement se produit sur les barres historiques, mais sur les barres en direct, le graphique renvoie une valeur qui augmente d'un pour chaque tick.
Les commentairesIl ne peut être utilisé qu'avec des types simples tels que float, int, bool, string et des tableaux de ces types.
Il représente la valeur d'une variable bool, ou une valeur qui peut être calculée quand une expression utilise unla comparaisonoulogique operator.
Les commentairesVeuillez consulter les descriptions deComparaisonLes opérateurs etC' est logique. Operators.
Voir aussi
bool
Il représente la valeur d'une variable bool et le résultat des opérations de comparaison et des opérations logiques.
Les commentairesVeuillez consulter les descriptions deComparaisonLes opérateurs etC' est logique. Operators.
Voir aussi
bool
Une instruction If définit un bloc d'instructions qui doit être exécuté lorsque la condition d'une expression est remplie.
Code universel de:
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
Les commentaires
var_declarationX
- Cette variable obtient la valeur de l'instruction ifcondition
- Si la condition est vraie, la logique dans le bloc de l'instructionthen
est utilisé (var_decl_then0
, var_decl_then1
Si la condition est fausse, la logique dans le bloc d'instructionelse if
ouelse
est utilisé (var_decl_else0
, var_decl_else1
, etc.).return_expression_then
etreturn_expression_else
- La dernière expression du module ou l'expression du bloc else renvoie la valeur finale de l'instruction.
Le type de la valeur de retour de l'instruction if dépend du type dereturn_expression_then
etreturn_expression_else
. Lors de l'exécution sur TradingView, leurs types doivent correspondre: lorsque vous avez une valeur de chaîne dans le bloc else, il n'est pas possible de retourner une valeur entière du bloc. Lors de l'exécution sur le FMZ, l'exemple suivant ne signalera pas d'erreur. Lorsque la valeur y est
Exemple
// 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)
Leelse
Dans ce cas, si la condition est false, la variable var_declarationX est attribuée une valeur
Exemple
// if
x = if close > open
close
// If current close > current open, then x = close.
// Otherwise the x = na.
plot(x)
Les blocs de
Exemple
// if
x = if open > close
5
else if high > low
close
else
open
plot(x)
La valeur résultante de laif
Il peut être utile si vous avez besoin d'effets secondaires d'expressions, par exemple dans le trading de stratégie:
Exemple
if (ta.crossover(high, low))
strategy.entry("BBandLE", strategy.long, stop=low)
else
strategy.cancel(id="BBandLE")
Si les instructions peuvent se contenir mutuellement:
Exemple
// if
float x = na
if close > open
if close > close[1]
x := close
else
x := close[1]
else
x := open
plot(x)
La construction
[var_declaration =] for counter = from_num to to_num [by step_num]
statements | continue | break
return_expression
var_declaration
- Une déclaration de variable facultative qui sera attribuée comme la valeur de l'expression return_expression de la boucle.counter
- Une variable qui détient la valeur du compteur de boucle, augmentant/décrémant de 1 ou la valeur step_num à chaque itération de la boucle.from_num
- La valeur de départ du compteur. to_num
- La valeur finale du compteur. La boucle s'interrompt lorsque le compteur est supérieur à to_num (ou inférieur à to_num dans le cas de from_num > to_num). step_num
- La valeur d'incrémentation/décrémentation du compteur. Elle est facultative. La valeur par défaut est +1 ou -1, selon la plus grande des valeurs de from_num ou to_num. Lors de l'utilisation de valeurs, le compteur est également augmenté/décrémenté selon la plus grande des valeurs de from_num ou to_num, de sorte que le signe +/- de step_num est facultatif.statements | continue | break
- N'importe quel nombre de phrases, ou les mots clés return_expression
- La valeur de retour de la boucle, si elle est présente, est attribuée à la variable dans var_declaration. Si la boucle sort en raison des mots clés continue
- Un mot clé qui ne peut être utilisé que dans les boucles, il provoque l'exécution de la prochaine itération de la boucle.break
- Le mot clé pour sortir de la boucle.
Exemple
// 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))
Voir aussi
for...in
while
Lefor...in
construct permet de répéter plusieurs instructions pour chaque élément du tableau.array_element
, ou avec deux arguments:[index, array_element]
La deuxième forme n'affecte pas la fonction de la boucle. Elle garde une trace de l'indice de l'itération en cours dans la première variable de la tuple.
[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
- Une déclaration de variable facultative à laquelle sera attribuée la valeur des bouclesreturn_expression
.
index
- Une variable optionnelle qui suit l'indice d'itération en cours. L'indice commence à 0. Les variables sont immuables dans le corps de la boucle. Lorsqu'il est utilisé, il doit être contenu dans une tuple qui contient égalementarray_element
.
array_element
- Une variable contenant chaque élément de matrice consécutif à traiter dans la boucle.array_id
- L'identifiant du tableau de l'itération.statements | continue | break
- N'importe quel nombre de phrases, ou les mots clés return_expression
- La valeur de retour de la boucle est attribuée à la variablevar_declaration
Si la boucle s'éteint en raison des mots clés continue
- Un mot clé qui ne peut être utilisé que dans les boucles, il provoque l'exécution de la prochaine itération de la boucle.break
- Le mot clé pour sortir de la boucle.
Permet de modifier les éléments d'un tableau ou leur taille dans une boucle.
Ici, nous utilisons la forme d'un seul argument defor...in
pour déterminer, pour chaque barre, combien de barres ont une valeur OHLC supérieure à la SMA de la valeur
Exemple
// 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))
Ici, nous utilisons la forme à deux arguments de for...in pour définir les valeurs de notreisPos
le tableau àtrue
Lorsque leurs valeurs correspondantes dans notrevaluesArray
les nombres de la matrice sont positifs:
Exemple
// 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))
Voir aussi
for
while
array.sum
array.min
array.max
Lewhile
l'instruction permet l'itération conditionnelle des blocs de code natifs.
variable_declaration = while boolean_expression
...
continue
...
break
...
return_expression
Expliquer:variable_declaration
- Déclaration facultative des variables.return expression
peut fournir une valeur d'initialisation pour cette variable.boolean_expression
- Si tel est le cas, exécuter le bloc local duwhile
Si la déclaration est fausse, l'exécution du script se poursuit après lawhile
statement.
continue
- Lecontinue
mot clé provoque la boucle à la branche à l'itération suivante.break
- Lebreak
L'exécution du script reprend après lewhile
statement.
return_expression
- ligne facultative indiquant la valeur de retour de l'indicateurwhile
statement.
Exemple
// 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)
Les commentairesLe bloc de code natif après le premierwhile
La ligne doit être entrecoupée de quatre espaces ou d'un onglet.while
boucle, l'expression booléenne suivantewhile
doit éventuellement devenir fausse, oubreak
doit être exécuté.
L'opérateur de commutation transfère le contrôle à l'une de plusieurs instructions en fonction de la condition et de la valeur de l'expression.
[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
commutateur avec expression:
Exemple
// 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)
commutateur sans expression:
Exemple
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)
RetoursLa valeur de la dernière expression dans le bloc d'instructions locales exécuté.
Les commentairesSeulement un deslocal_block
cas oudefault_local_block
peut être exécuté.default_local_block
est introduit uniquement avec le=>
Le code de la base de données est un code de la base de données, et est exécuté uniquement si le bloc précédent n'est pas exécuté.switch
l'instruction est attribuée à une variable etdefault_local_block
n'est pas spécifié, la déclaration renvoiena
silocal_block
Lorsque l'on attribue le résultat d'unswitch
déclaration à une variable, touteslocal_block
les instances doivent renvoyer une valeur du même type.
Voir aussi
if
?:
La série est un mot-clé qui indique le type de série de données.series
keyword.
Utilisé pour attribuer des valeurs aux variables, mais uniquement lorsque la variable est déclarée (la première fois utilisée).
L'opérateur d'attribution attribue une valeur à la variable de gauche. Utilisé pour attribuer des valeurs à des variables déclarées précédemment.
Applicable à toutes les expressions.
expr1 != expr2
RetoursValeur booléenne, ou une séquence de valeurs booléennes.
Modulo (résidu entier), applicable aux expressions numériques.
expr1 % expr2
RetoursValeur entière ou flottante, ou série de valeurs.
Les commentairesDans Pine Script, lorsque le reste entier est calculé, le quotient est tronqué, c'est-à-dire arrondi vers la valeur absolue la plus basse.
Exemple: -1 % 9 = -1 - 9 * tronqué ((-1/9) = -1 - 9 * tronqué ((-0,111) = -1 - 9 * 0 = -1.
Applicable aux expressions numériques.
expr1 %= expr2
Exemple
// Equals to expr1 = expr1 % expr2.
a = 3
b = 3
a %= b
// Result: a = 0.
plot(a)
RetoursValeur entière ou flottante, ou série de valeurs.
Assignation de multiplication, applicable aux expressions numériques.
expr1 * expr2
RetoursValeur entière ou flottante, ou série de valeurs.
Assignation de multiplication, applicable aux expressions numériques.
expr1 *= expr2
Exemple
// Equals to expr1 = expr1 * expr2.
a = 2
b = 3
a *= b
// Result: a = 6.
plot(a)
RetoursValeur entière ou flottante, ou série de valeurs.
Addition ou unary plus. Applicable aux expressions numériques ou aux chaînes.
expr1 + expr2
+ expr
RetoursLe binaire+
de la chaîne renvoie la combinaison de expr1 et expr2
Numéro renvoie une valeur entière ou à virgule flottante, ou une séquence de valeurs:
Le binaire
Les commentairesVous pouvez utiliser des opérateurs arithmétiques avec des nombres ainsi qu'avec des variables de série.
Applique aux expressions numériques ou aux chaînes.
expr1 += expr2
Exemple
// Equals to expr1 = expr1 + expr2.
a = 2
b = 3
a += b
// Result: a = 5.
plot(a)
RetoursPour les chaînes, renvoie la concaténation d'expr1 et expr2. Pour les nombres, renvoie une valeur entière ou flottante, ou une série de valeurs.
Les commentairesVous pouvez utiliser des opérateurs arithmétiques avec des nombres ainsi qu'avec des variables de série.
Soustraction ou moins unitaire, applicable aux expressions numériques.
expr1 - expr2
- expr
RetoursRenvoie une valeur entière ou à virgule flottante, ou une série de valeurs:
Le binaire -
renvoie la négation de expr.
Les commentairesVous pouvez utiliser des opérateurs arithmétiques avec des nombres ainsi qu'avec des variables de série.
Assignation de soustraction applicable aux expressions numériques.
expr1 -= expr2
Exemple
// Equals to expr1 = expr1 - expr2.
a = 2
b = 3
a -= b
// Result: a = -1.
plot(a)
RetoursValeur entière ou flottante, ou série de valeurs.
Assignation de division, applicable aux expressions numériques.
expr1 / expr2
RetoursValeur entière ou flottante, ou série de valeurs.
Assignation de division, applicable aux expressions numériques.
expr1 /= expr2
Exemple
// Equals to expr1 = expr1 / expr2.
a = 3
b = 3
a /= b
// Result: a = 1.
plot(a)
RetoursValeur entière ou flottante, ou série de valeurs.
Applicable aux expressions numériques.
expr1 < expr2
RetoursValeur booléenne, ou série de valeurs booléennes.
Moins ou égal à. Applicable aux expressions numériques.
expr1 <= expr2
RetoursValeur booléenne, ou série de valeurs booléennes.
Applicable aux expressions de tout type.
expr1 == expr2
RetoursValeur booléenne, ou série de valeurs booléennes.
L'opérateur switch
statements.
La grammaire de la déclaration de fonction est la suivante:
<identifier>([<argument_name>[=<default_value>]], ...) =>
<local_block>
<function_result>
Un<local_block>
est zéro ou plus d'instructions Pine Script.<function_result>
est une variable, une expression ou une tuple.
Exemple
// 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))
Les référencesVous pouvez en apprendre davantage sur les fonctions définies par l'utilisateur dans les pages du manuel de l'utilisateur sur les fonctions de déclaration et les bibliothèques de scripts.
Applicable aux expressions numériques.
expr1 > expr2
RetoursValeur booléenne, ou série de valeurs booléennes.
Plus grand que ou égal à, applicable aux expressions numériques.
expr1 >= expr2
RetoursValeur booléenne, ou série de valeurs booléennes.
L'opérateur conditionnel ternaire.
expr1 ? expr2 : expr3
Exemple
// 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)
Retoursexpr2 si expr1 est évalué comme vrai, expr3 autrement. La valeur zéro (0 et aussi NaN, +Infinity, -Infinity) est considérée comme fausse, toute autre valeur est vraie.
Les commentairesUtilisez na pour
Voir aussi
na
Le sous-script de la série donne accès aux valeurs précédentes de la série expr1. expr2 est le nombre de barres dans le passé, et il doit être numérique.
expr1[expr2]
Exemple
// [] 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)
RetoursUne série de valeurs.
Voir aussi
math.floor
Logique et applicable aux expressions booléennes.
expr1 and expr2
RetoursValeur booléenne, ou série de valeurs booléennes.
Logique OR, applicable aux expressions booléennes.
expr1 or expr2
RetoursValeur booléenne, ou série de valeurs booléennes.
Négation logique (NOT) applicable aux expressions booléennes.
not expr1
RetoursValeur booléenne, ou série de valeurs booléennes.
Mots clés utilisés pour déclarer explicitement le type
Exemple
// bool
bool b = true // Same as `b = true`
b := na
plot(b ? open : close)
Les commentairesMentionner explicitement le type dans une déclaration de variable est facultatif, sauf lorsqu'il est initialisé avec na. En savoir plus sur les types de script Pine dans la page du manuel de l'utilisateur sur le système de types.
Voir aussi
var
varip
int
float
color
string
true
false
Mot clé utilisé pour déclarer explicitement le type
Exemple
// int
int i = 14 // Same as `i = 14`
i := na
plot(i)
Les commentairesMentionner explicitement le type dans une déclaration de variable est facultatif, sauf lorsqu'il est initialisé avec na. En savoir plus sur les types de script Pine dans la page du manuel de l'utilisateur sur le système de types.
Voir aussi
var
varip
float
bool
color
string
Mots clés utilisés pour déclarer explicitement le type
Exemple
// float
float f = 3.14 // Same as `f = 3.14`
f := na
plot(f)
Les commentairesLa mention explicite du type dans une déclaration de variable est facultative, sauf lorsqu'elle est initialisée par na.
Voir aussi
var
varip
int
bool
color
string
Mot clé utilisé pour déclarer explicitement le type
Exemple
// string
string s = "Hello World!" // Same as `s = "Hello world!"`
// string s = na // same as ""
plot(na, title=s)
Les commentairesMentionner explicitement le type dans une déclaration de variable est facultatif, sauf lorsqu'il est initialisé avec na. En savoir plus sur les types de script Pine dans la page du manuel de l'utilisateur sur le système de types.
Voir aussi
var
varip
int
float
bool
str.tostring
str.format
Mot clé utilisé pour déclarer explicitement le type
Exemple
// color
color textColor = color.green
if barstate.islastconfirmedhistory
runtime.log("test", textcolor = textColor)
Les commentairesLes paires de lettres représentent des valeurs hexadécimales de 00 à FF (0 à 255 en décimal) où les paires RR, GG et BB sont les valeurs des composantes rouge, verte et bleue des couleurs. AA est une valeur optionnelle pour la transparence des couleurs (ou composante alpha) où 00 est invisible et FF opaque.
Mentionner explicitement le type dans une déclaration de variable est facultatif, sauf lorsqu'il est initialisé avec na. En savoir plus sur les types de script Pine dans la page du manuel de l'utilisateur sur le système de types.
Voir aussi
var
varip
int
float
string
color.rgb
color.new
Mots clés utilisés pour déclarer explicitement le type array.new<type>
, array.from
function.
Exemple
// array
array<float> a = na
a := array.new<float>(1, close)
plot(array.get(a, 0))
Les commentairesLes objets de matrice sont toujours de forme
Voir aussi
var
array.new
array.from
Les objets dans le langage PINE sont des instances de types définis par l'utilisateur (UDT), qui peuvent être compris comme des classes sans méthode qui permettent aux utilisateurs de créer des types personnalisés dans des stratégies pour organiser différentes valeurs dans une entité.
Définition des types
Définissons un type de commande pour stocker les informations de commande:
type order
float price
float amount
string symbol
type
keyword.Création d'objets
En utilisant le type déclaré, appeler lenew()
fonction pour créer un objet:
order1 = order.new()
order1 = order.new(100, 0.1, "BTC_USDT")
order1 = order.new(amount = 0.1, symbol = "BTC_USDT", price = 100)
Vous pouvez aussi créer des objets vides:
order order1 = na
Considérons un exemple pratique:
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"}
Dans cet exemple:
order1 = order.new(strategy.opentrades.entry_price(strategy.opentrades - 1), strategy.opentrades.size(strategy.opentrades - 1), syminfo.ticker)
On peut aussi l'écrire comme:
order order1 = na
order1 := order.new(strategy.opentrades.entry_price(strategy.opentrades - 1), strategy.opentrades.size(strategy.opentrades - 1), syminfo.ticker)
Type d'objet pour l'utilisation du mot clé 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")
Lorsque vous utilisez le mot clé var pour déclarer une variable affectée à un objet de type défini par l'utilisateur, le mot clé s'applique automatiquement à tous les champs de l'objet.
En traçant les champs d'index des deux objets, vous pouvez comparer les différences entre eux. firstBar.index maintiendra la valeur définie précédemment dans chaque itération, tandis que currentBar.index sera réinitialisé dans chaque itération à la valeur bar_index de l'entrée actuelle.
Types d'objets pour l'utilisation du mot clé 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)
Dans Pine, le mot-clé varip est utilisé pour indiquer que les champs d'un objet persistent tout au long de l'exécution du script et ne retournent pas sur les barres non confirmées. Dans la déclaration du type Counter, le champ bars n'utilise pas le mot-clé varip, il retourne donc sur chaque barre non confirmée. L'objet de compteur est déclaré en utilisant le mot clé var, il persiste donc tout au long de l'exécution du script. Dans chaque itération, le champ des barres et le champ des tiques sont augmentés de 1. Enfin, en traçant les champs counter.bars et counter.ticks, vous pouvez comparer la différence entre eux. La valeur de counter.bars retourne à chaque barre non confirmée, tandis que la valeur de counter.ticks continue d'augmenter jusqu'à la fin de l'exécution du script.
Les mendiantsPourquoi les stratégies de la place de la réplique de la stratégie de Pine ne peuvent pas être mises en œuvre
L'inventeur de la quantification - un petit rêveBien, nous allons vérifier.
Les mendiantsLe Traqueur de tendances optimisé de Zhang
L'inventeur de la quantification - un petit rêveBonjour, quelle est la stratégie spécifique?