[TOC] Je vous en prie.
La structure générale du code dans Pine est la suivante:
<version>
<declaration_statement>
<code>
Symbole d'annotation supporté par FMZ dans la langue Pine: annotation en une seule ligne//
Le blogueur a écrit:/* */
Par exemple, dans les exemples suivants, les annotations sont écrites:
[macdLine, signalLine, histLine] = ta.macd(close, 12, 26, 9) // 计算MACD指标
/*
plot函数在图表上画出指标线
*/
plot(macdLine, color = color.blue, title='macdLine')
plot(signalLine, color = color.orange, title='signalLine')
plot(histLine, color = color.red, title='histLine')
Les instructions de compilation de la forme suivante indiquent au compilateur quelle version du script a été écrite avec Pine:
//@version=5
Par défaut, la version v5 peut être omise dans le code.//@version=5
。
indicator()
strategy()
Les déclarations définissent le type de script, ce qui détermine ce qu'il permet et comment il est utilisé et exécuté. Elles définissent les attributs clés du script, tels que son nom, où il apparaîtra lorsqu'il sera ajouté au graphique, la précision et le format des valeurs qu'il affichera, et certaines valeurs qui contrôlent ses actions à l'exécution, telles que le nombre maximal d'objets graphiques qu'il affichera dans le graphique. Pour les stratégies, les attributs comprennent des paramètres qui contrôlent la répétition, tels que les capitaux initiaux, les commissions, les points de défilement, etc. FMZ ne demande pas que Pine soit inclus dans le code d'une stratégie.indicator()
Ou alorsstrategy()
Il y a aussi des gens qui ont été tués.
Les lignes dans un script qui ne sont pas des annotations ou des instructions de compilateur sont des phrases qui mettent en œuvre l'algorithme du script. Une phrase peut être l'une de ces choses.
if
,for
,while
ouswitch
Structure équivalenteLes phrases peuvent être classées de plusieurs façons.
空格
ou制表符
(touche tab) commence. Leur premier caractère doit également être le premier caractère de la ligne. La ligne qui commence à la première position de la ligne est, par définition, une partie de la portée globale du script.local block
; un bloc local doit être condensé en un symbole ou en quatre espaces (sinon, il sera résolu en une ligne de code en série précédente, c'est-à-dire déterminé comme le contenu continu de la ligne précédente), et chaque bloc local définit une gamme locale différente.Par exemple, il y a trois blocs locaux, dont un dans une déclaration de fonction personnalisée et deux dans une déclaration de variable utilisant la structure if, avec le code suivant:
indicator("", "", true) // 声明语句(全局范围),可以省略不写
barIsUp() => // 函数声明(全局范围)
close > open // 本地块(本地范围)
plotColor = if barIsUp() // 变量声明 (全局范围)
color.green // 本地块 (本地范围)
else
color.red // 本地块 (本地范围)
runtime.log("color", color = plotColor) // 调用一个内置函数输出日志 (全局范围)
Les lignes longues peuvent être divisées en plusieurs lignes, ou être "enveloppées"; les lignes enveloppées doivent être condensées en n'importe quel nombre d'espaces, à moins qu'elles ne soient des multiples de 4 (les limites sont utilisées pour condenser les parties).
a = open + high + low + close
Le nombre d'espaces compressés par ligne n'est pas un multiple de 4):
a = open +
high +
low +
close
Un appel long plot (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((())))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))
close1 = request.security(syminfo.tickerid, "D", close) // syminfo.tickerid 当前交易对的日线级别收盘价数据系列
close2 = request.security(syminfo.tickerid, "240", close) // syminfo.tickerid 当前交易对的240分钟级别收盘价数据系列
plot(ta.correlation(close, open, 100), // 一行长的plot()调用可以被包装
color = color.new(color.purple, 40),
style = plot.style_area,
trackprice = true)
Les statements dans les déclarations de fonctions définies par l'utilisateur peuvent également être enveloppés. Cependant, comme le morceau local doit commencer par une contraction (quatre espaces ou un symbole), la suite de la phrase doit commencer par plus d'une contraction (pas plus d'un multiple de quatre espaces) lorsqu'elle est divisée en la ligne suivante. Par exemple:
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équence temporelle n'est pas un type ou un format de données, mais une notion de structure fondamentale dans le langage PINE. Elle est utilisée pour stocker des valeurs qui changent continuellement dans le temps, chaque valeur correspondant à un point de temps.
Variables intégréesopen
Par exemple:open
La variable par défaut enregistre le prix d'ouverture de chaque ligne KBAR si cetteopen
C'est la période de cinq minutes de la ligne K.open
Ce qui est enregistré dans la variable est le prix d'ouverture de la colonne BAR de la ligne K toutes les 5 minutes.open
C'est-à-dire en référence au prix d'ouverture de la ligne K BAR où elle se trouve actuellement. Pour citer la valeur précédente (la valeur passée) dans la séquence de temps, nous utilisons[]
L'opérateur d'historique, lorsque la stratégie est exécutée sur un certain K-line BAR.open[1]
Cela signifie qu'il s'agit du prix d'ouverture du premier K-Line BAR en référence au BAR actuel.
Bien queSéquence de tempsIl est facile de penser à une structure de données telle que "l'arithmétique", bien que le langage PINE ait aussi des types d'arithmétiques. Mais ce sont des concepts complètement différents de la séquence temporelle.
Les séquences de temps ainsi conçues dans le langage PINE permettent de calculer facilement la valeur cumulée du prix de clôture dans le code stratégique, sans avoir besoin d'utiliser des structures cycliques telles que for, et uniquement en utilisant des fonctions intégrées dans le langage PINE.ta.cum(close)
Dans un autre exemple, nous devons calculer la moyenne des différences entre le prix le plus élevé et le prix le plus bas des 14 dernières lignes K BAR (c'est-à-dire le prix le plus proche de 14 lignes K BAR) au moment où le code est exécuté.ta.sma(high - low, 14)
Le résultat d'un appel à une fonction sur une séquence de temps laisse également une trace sur la séquence de temps.[]
L'opérateur historique renvoie à la valeur précédente. Par exemple, lorsque le prix de clôture de la ligne K BAR actuelle est supérieur à la valeur maximale du prix le plus élevé des 10 dernières lignes K BAR (excluant la ligne K BAR actuelle), nous pouvons écrire:breach = close > ta.highest(close, 10)[1]
On peut aussi écrire:breach = close > ta.highest(close[1], 10)
Pourquoi?ta.highest(close, 10)[1]
etta.highest(close[1], 10)
Il y a aussi des gens qui ont été victimes de violences.
Vous pouvez vérifier avec 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 exécute les valeurs de a et b sur leur séquence de temps correspondante sur chaque BAR. On voit que les valeurs a et b sont toujours égales, donc les deux méthodes d'expression sont équivalentes.
Les paramètres du modèle intégré de la stratégie PINE, "Pine Language Exchange Library", sont définis.
定价货币精度
Les paramètres et ce paramètre déterminent le prix à la livraison lors de la commande. Par exemple, la précision de la devise est réglée sur 2, c'est-à-dire exacte jusqu'à la deuxième place des décimales et exacte jusqu'à 0.01 ; alors le nombre de points à la livraison représente 0.01 unité de prix.javascript
Appelez dans la stratégieSetMaxBarLen
La fonction fonctionne de la même façon.strategy(title = "open long example", pyramiding = 3) // pyramiding 允许的同方向下单的次数
strategy.entry("long1", strategy.long, 0.01) // 市价开多仓,指定分组标签为long1
strategy.entry("long2", strategy.long, 0.02, when = close > ta.ema(close, 10)) // 条件触发,执行下单,市价开多仓
strategy.entry("long3", strategy.long, 0.03, limit = 30000) // 指定(较低的)价格,计划下买单订单,等待成交开仓,限价开仓
strategy(title = "close long example", pyramiding = 2) // pyramiding 允许的同方向下单的次数
strategy.entry("long1", strategy.long, 0.1) // 市价开多仓,指定分组标签为long1
strategy.entry("long2", strategy.long, 0.1) // 市价开多仓,指定分组标签为long2
strategy.close("long1", when = strategy.position_size > 0.1, qty_percent = 50, comment = "close buy entry for 50%") // 平仓,指定平掉分组标签为long1的仓位的50%持仓
strategy.close("long2", when = strategy.position_size > 0.1, qty_percent = 80, comment = "close buy entry for 80%") // 平仓,指定平掉分组标签为long2的仓位的80%持仓
Le mécanisme de possession du langage PINE est similaire à celui de la possession unidirectionnelle. Par exemple, lorsqu'il y a une position multi-tête (" multi-tête "), l'ordre déclenché s'il y a des ordres de vente, des listes de plans, etc. (versus la direction de la possession) est exécuté en aplatissant d'abord la position multi-tête (" aplatissant toutes les multi-têtes ") avant d'exécuter l'ordre déclenché par rapport à la direction inverse de la possession avant la possession.
Lorsque vous utilisez la commande de sous-titres, la commande de marché est la commande par défaut si aucun prix n'est spécifié. En plus de la commande de marché, vous pouvez également commander par le biais du sous-titre de plan, qui n'est pas immédiatement opérationnel. Le sous-titre de plan peut être utilisé dans la file d'attente du programme qui n'existe pas lorsqu'il est déclenché.Disque réelL'information de l'état temporel (c'est-à-dire le panneau d'état de la stratégie en cours d'exécution) est visible dans la section "Ordres planifiés" du tableau. Le système n'effectue de véritables commandes que lorsque les conditions de prix du marché en temps réel sont remplies pour déclencher ces ordres.strategy.entry
On peut spécifier une fonction sous forme delimit
、stop
Paramètres.
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
Commande limitée
Le prix de l'offre est fixé à la limite de la commande, c'est-à-dire lorsque l'offre est payante (c'est-à-dire que la commande est payante).direction
Le paramètre eststrategy.long
L'ordre n'est déclenché que lorsque le prix actuel du marché est inférieur à ce prix.
Lorsque la commande est une vente (c'est-à-diredirection
Le paramètre eststrategy.short
L'ordre n'est déclenché que lorsque le prix actuel du marché est supérieur à ce prix.
Arrêtez la commande
Le prix d'arrêt d'une commande est fixé, lorsque l'ordre est un paiement, et que l'ordre n'est déclenché que lorsque le prix actuel du marché est supérieur à ce prix. Lorsqu'une commande est une vente, elle n'est déclenchée que lorsque le prix actuel du marché est inférieur à ce prix.
Commande stop-limit
Il est possible de configurer simultanémentlimit
、stop
Paramètres, les commandes sont déclenchées au premier prix qui répond aux conditions.
var est le mot clé utilisé pour l'attribution et l'initialisation de variables à usage unique. Généralement, la syntaxe d'attribution des variables qui ne contient pas le mot clé var entraîne la suppression de la valeur de la variable chaque fois que les données sont mises à jour. En revanche, lorsqu'on utilise le mot clé var pour attribuer des variables, même si les données sont mises à jour, elles peuvent être maintenues dans l'état d'état et ne changer que si les conditions dans les if-expressions sont remplies.
var variable_name = expression
Il a écrit:
variable_name
- N'importe quel nom de variable utilisateur autorisé dans Pine Script ((peut contenir des caractères latins en majuscules et en minuscules, des chiffres et des signes de bas de page ((_), mais ne peut pas commencer par un chiffre)).expression
- n'importe quelle expression arithmétique, comme définir une variable régulière.Exemples
// 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 existe deux modèles de prix en temps réel, le modèle de prix de clôture et le modèle de prix de vente au détail.var
、varip
Les variables déclarées sont testées avec le code suivant:
strategy("test pine", "test 1", true)
// 测试 var varip
var i = 0
varip ii = 0
// 将策略逻辑每轮改变的i、ii打印在图上
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)
// 每轮逻辑执行都给i、ii递增1
if true
i := i + 1
ii := ii + 1
Modèle de prix en temps réel
Le code de test ci-dessus est divisé en deux phases lors de l'exécution: la phase K historique; la phase K en temps réel.var
、varip
Les variables déclarées i、ii exécutent des opérations d'incrémentation à chaque fois que le code de stratégie est exécuté (parce queif true
On peut donc voir que les chiffres affichés sur la ligne BAR du résultat de la récupération augmentent de 1 chacun. Lorsque la phase de la ligne K historique se termine, la phase de la ligne K en temps réel commence.var
、varip
Les variables déclarées commencent à changer différemment. Parce que c'est un modèle de prix en temps réel, chaque changement de prix dans un K-line BAR est exécuté en code stratégique une fois.i := i + 1
etii := ii + 1
La différence est que ii est modifié à chaque fois. Bien que i soit modifié à chaque fois, la valeur précédente est restaurée lors de l'exécution de la logique de stratégie au prochain tour, jusqu'à ce que la ligne K actuelle BAR soit terminée.
Modèle de prix de clôture
Comme le modèle de prix de clôture n'exécute une seule stratégie logique que lorsque chaque ligne K BAR est terminée.var
、varip
Les variables déclarées sont parfaitement cohérentes dans l'exemple ci-dessus, avec une augmentation de 1 pour chaque ligne KBAR.
varip (var intrabar persist) est un mot-clé utilisé pour l'attribution et l'initialisation ponctuelle de variables. Il est similaire au mot-clé var, mais les variables déclarées avec varip conservent leur valeur entre les mises à jour en ligne K en temps réel.
varip variable_name = expression
Il a écrit:
variable_name
- N'importe quel nom de variable utilisateur autorisé dans le script Pine (qui peut contenir des caractères latins en majuscules et en minuscules, des chiffres et des signes de bas de page (_), mais ne peut pas commencer par un chiffre).expression
- n'importe quelle expression arithmétique, comme lors de la définition d'une variable régulière. Sur la première ligne K, l'expression est calculée une seule fois et attribuée à la variable une seule fois.Exemples
// varip
varip int v = -1
v := v + 1
plot(v)
En utilisant var, le graphique renvoie la valeur de bar_index. En utilisant varip, le même comportement se produit sur la ligne historique K, mais sur la ligne en temps réel K, le graphique renvoie une valeur qui augmente d'une pour chaque tick.
Nom de l'auteurNe peut être utilisé qu'avec des types simples, tels que float, int, boolean, string, et avec des tableaux de ces types.
Indique la valeur d'une variable de type Boole, ou lorsque l'expression est utiliséeComparaisonouLa logiqueLa valeur que l'opérateur peut calculer.
Nom de l'auteurVoir aussiComparaisonLes opérateurs etLa logiqueDescription de l'opérateur.
À bientôt
bool
Indique la valeur d'une variable de type Boole, ainsi que le résultat d'opérations de comparaison, d'opérations logiques.
Nom de l'auteurVoir aussiComparaisonLes opérateurs etLa logiqueDescription de l'opérateur.
À bientôt
bool
Les if-statements définissent les blocs de phrases qui doivent être exécutés lorsque les conditions de l'expression sont remplies. La 4e version du langage de script Pine vous permet d'utiliser la syntaxe if-else.
Le code générique provient 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
Nom de l'auteur
var_declarationX
- Cette variable obtient la valeur de la phrase ifcondition
- Si la condition est true, utilisez le bloc de phrasesthen
La logique est la suivante:var_decl_then0
,var_decl_then1
etc) ⇒ Si la condition est false, on utilise les blocs de phraseselse if
Ou alorselse
La logique est la suivante:var_decl_else0
,var_decl_else1
Je suis désolée.return_expression_then , return_expression_else
- La dernière expression dans le module ou l'expression du blocelse renvoie la valeur finale de la phrase. Si la variable est déclarée à la fin, sa valeur sera la valeur de résultat.
Le type de la valeur retournée de l'instruction if dépend dereturn_expression_then
etreturn_expression_else
Lorsqu'elles sont exécutées sur TradingView, leurs types doivent correspondre: il est impossible de retourner une valeur entière à partir du bloc de syntaxe then lorsque vous avez une valeur de chaîne dans le blocelse. Lorsqu'elles sont exécutées sur FMZ, les exemples suivants ne renvoient pas d'erreur, lorsque la valeur y est prise pour "open", la valeur du graphique de plot est n/a.
Exemples
// 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)
On peut omettreelse
bloc. Dans ce cas, si la condition est false, on attribue à la variable var_declarationX une valeur de seuil naempty ((na、false ou na):
Exemples
// if
x = if close > open
close
// If current close > current open, then x = close.
// Otherwise the x = na.
plot(x)
Il est possible d'utiliser plusieurs blocs ou de ne pas les utiliser du tout. Les blocs
Exemples
// if
x = if open > close
5
else if high > low
close
else
open
plot(x)
Je ne sais pas.if
La valeur de résultat d'une déclaration ((
Exemples
if (ta.crossover(high, low))
strategy.entry("BBandLE", strategy.long, stop=low)
else
strategy.cancel(id="BBandLE")
Les phrases if peuvent être mutuellement contenues:
Exemples
// if
float x = na
if close > open
if close > close[1]
x := close
else
x := close[1]
else
x := open
plot(x)
La structure for permet d'exécuter plusieurs phrases en répétition:
[var_declaration =] for counter = from_num to to_num [by step_num]
statements | continue | break
return_expression
var_declaration
- Une variable facultative déclarée, qui sera assignée comme valeur de l'expression return_expression de la boucle de retour.counter
- Stocke les variables de la valeur du compteur de la boucle de retour, augmentant/diminuant la valeur de 1 ou step_num à chaque fois que la boucle de retour est effectuée;from_num
- La valeur initiale du compteur. L'utilisation de l'expression int/float threshold/series est autorisée.to_num
- La valeur finale du compteur. Le cycle est interrompu lorsque le compteur est supérieur à to_num (ou inférieur à to_num dans le cas de from_num > to_num). L'utilisation de l'expression int/float threshold/series est autorisée, mais elle n'est évaluée que lors de la première itération du cycle.step_num
- la valeur d'augmentation/diminution du compteur. Elle est optionnelle. La valeur par défaut est +1 ou -1, selon la plus grande valeur de from_num ou de to_num.statements | continue | break
- N'importe quel nombre de phrases, ou les mots-clés "continue" ou "break", réduit à 4 espaces ou à un onglet.return_expression
- la valeur de retour du cycle, si elle existe, est attribuée à une variable dans la déclaration var_declaration. Si le cycle quitte à cause du mot clé "continue" ou "break", la valeur de retour du cycle est la valeur de retour de la dernière variable à laquelle la valeur a été attribuée avant de quitter le cycle.continue
- le mot-clé qui ne peut être utilisé que dans la boucle de retour. Il entraîne l'exécution de la prochaine itération de la boucle de retour.break
- Le mot clé pour sortir du cercle de retour.
Exemples
// 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))
À bientôt
for...in
while
for...in
La structure permet d'exécuter plusieurs déclarations en répétition pour chaque élément de l'array. Elle peut être utilisée avec n'importe quel paramètre:array_element
, ou en combinaison avec deux paramètres:[index, array_element]
La seconde forme n'affecte pas la fonction de la boucle. Elle suit l'index de l'itération en cours dans la première variable de l'élément.
[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 qui sera attribuée à la bouclereturn_expression
La valeur de l'image estindex
- Suivre les variables optionnelles de l'index de l'itération en cours. L'index commence à zéro. Les variables sont invariantes dans le corps de la boucle.array_element
Il y a une différence entre les deux.array_element
- contient les variables de chaque élément d'une matrice continue à traiter dans le cercle. Cette variable est invariable dans le cercle.array_id
- L'ID d'une matrice qui fait le tour de l'itinéraire.statements | continue | break
- N'importe quel nombre de phrases, ou les mots-clés "continue" ou "break", réduit à 4 espaces ou à un onglet.return_expression
- la valeur de retour du cycle est attribuée àvar_declaration
Les variables, si elles existent. Si le cercle se déconnecte en raison du mot clé "continue" ou "break", la valeur de retour du cercle est la dernière variable attribuée avant de se déconnecter.continue
- le mot-clé qui ne peut être utilisé que dans la boucle de retour. Il entraîne l'exécution de la prochaine itération de la boucle de retour.break
- Le mot clé pour sortir du cercle de retour.
Permet de modifier l'élément de l'array ou sa taille pendant le cycle.
Ici, nous utilisonsfor...in
La forme de l'option monogène pour déterminer combien de lignes K ont une valeur OHLC supérieure à la SMA de la valeur de l'angle proche sur chaque ligne K est:
Exemples
// 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 les deux formes de paramètres de for...in pour rendre notreisPos
La valeur de l'ensemble est définie commetrue
Ils sont dans notre pays.valuesArray
Les valeurs correspondantes dans l'arithmétique sont:
Exemples
// 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))
À bientôt
for
while
array.sum
array.min
array.max
while
Les statements permettent l'hypothèse de conditions dans les blocs de code locaux.
variable_declaration = while boolean_expression
...
continue
...
break
...
return_expression
Il a écrit:variable_declaration
- Déclaration de variable facultative.return expression
Une valeur d'initialisation peut être fournie pour cette variable.boolean_expression
- Exécuter si c'est vraiwhile
Le bloc local de l'instruction.while
Après la phrase, continuez à exécuter le script.continue
- continue
Les mots clés conduisent à la branche circulaire jusqu'à la prochaine itération.break
- break
Les mots clés entraînent la fin du cycle.while
Le texte est repris après la phrase.return_expression
- fourniwhile
La valeur de retour de la phrase est une ligne facultative.
Exemples
// 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)
Nom de l'auteurLes débutswhile
Le bloc de code local après la ligne doit être condensé en quatre espaces ou en un caractère.while
Le cyclewhile
L'expression de Boole suivante doit éventuellement devenir false ou doit être exécutée.break
。
L'opérateur switch transfère le contrôle vers l'une des statements en fonction de la valeur de la condition et 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
Le commutateur avec une expression:
Exemples
// 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)
Le commutateur sans expression:
Exemples
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)
Retourne la valeurLa valeur de la dernière expression dans le bloc d'instructions locale exécuté.
Nom de l'auteurIl suffit d'exécuterlocal_block
exemple oudefault_local_block
L'un d'eux est là.default_local_block
seulement avec=>
Les balises sont introduites en même temps et ne sont exécutées que si le bloc précédent n'est pas exécuté.switch
Le résultat de la phrase est attribué à une variable et n'est pas spécifiédefault_local_block
Si cela n'est pas fait,local_block
La phrase est retournée.na
Je vais.switch
Quand les résultats de la phrase sont attribués à une variable, tous les résultats sont attribués à une variable.local_block
L'instance doit retourner une valeur du même type.
À bientôt
if
?:
series est un mot-clé qui désigne le type de série de données.series
Les mots clés sont généralement inutiles.
Utilisé pour attribuer des valeurs à des variables, mais uniquement lorsque les variables sont déclarées (pour la première fois).
L'opérateur d'attribution donne une attribution à la variable de gauche.
Ce n'est pas équivalent à: ⇒ appliqué à n'importe quel type d'expression
expr1 != expr2
Retourne la valeurLes valeurs de Boole, ou une série de valeurs de Boole.
Les nombres modulaires (les nombres entiers positifs) ≠ sont utilisés pour les expressions numériques.
expr1 % expr2
Retourne la valeurLes nombres entiers ou les valeurs à virgule, ou une série de valeurs.
Nom de l'auteurDans le script Pine, le marchand est coupé lorsqu'il calcule le résultat d'un nombre entier; c'est-à-dire qu'il est coupé en quatre-quarts-cinq jusqu'à sa valeur absolue la plus faible. La valeur obtenue a le même symbole que le dividende.
Exemple: -1 % 9 = -1 - 9 * truncate ((-1/9) = -1 - 9 * truncate ((-0.111) = -1 - 9 * 0 = -1.
Désignation des nombres modulaires. Pour les expressions numériques.
expr1 %= expr2
Exemples
// Equals to expr1 = expr1 % expr2.
a = 3
b = 3
a %= b
// Result: a = 0.
plot(a)
Retourne la valeurLes nombres entiers ou les valeurs à virgule, ou une série de valeurs.
La multiplication. Elle s'applique aux expressions numériques.
expr1 * expr2
Retourne la valeurLes nombres entiers ou les valeurs à virgule, ou une série de valeurs.
Le terme "multiplication" est utilisé pour les expressions numériques.
expr1 *= expr2
Exemples
// Equals to expr1 = expr1 * expr2.
a = 2
b = 3
a *= b
// Result: a = 6.
plot(a)
Retourne la valeurLes nombres entiers ou les valeurs à virgule, ou une série de valeurs.
Ajout ou unité de chiffres. Pour une expression numérique ou une chaîne.
expr1 + expr2
+ expr
Retourne la valeurLe système binaire de la chaîne+
Retournez la combinaison d'expr1 et d'expr2.
Les chiffres renvoient des nombres entiers ou des valeurs à virgule, ou une série de valeurs:
Le binomial
Nom de l'auteurVous pouvez utiliser des opérateurs arithmétiques avec des chiffres ainsi que des colonnes de variables. Dans le cas où vous utilisez des colonnes de nombres, les opérateurs sont appliqués aux éléments.
Les désignations additionnelles sont utilisées pour les expressions numériques ou les chaînes de caractères.
expr1 += expr2
Exemples
// Equals to expr1 = expr1 + expr2.
a = 2
b = 3
a += b
// Result: a = 5.
plot(a)
Retourne la valeurPour les chaînes, retournez la séquence d'expr1 et d'expr2; pour les chiffres, retournez l'entier ou la valeur à flèche, ou une série de valeurs.
Nom de l'auteurVous pouvez utiliser des opérateurs arithmétiques avec des chiffres ainsi que des colonnes de variables. Dans le cas où vous utilisez des colonnes de nombres, les opérateurs sont appliqués aux éléments.
La loi de la subtraction ou le nombre unitaire négatif.
expr1 - expr2
- expr
Retourne la valeurRetourne un entier ou une valeur à virgule, ou une série de valeurs:
Le binomial -
Retournez la négation d'expr.
Nom de l'auteurVous pouvez utiliser des opérateurs arithmétiques avec des chiffres ainsi que des colonnes de variables. Dans le cas où vous utilisez des colonnes de nombres, les opérateurs sont appliqués aux éléments.
Désignation de la subtraction. Cette désignation s'applique aux expressions numériques.
expr1 -= expr2
Exemples
// Equals to expr1 = expr1 - expr2.
a = 2
b = 3
a -= b
// Result: a = -1.
plot(a)
Retourne la valeurLes nombres entiers ou les valeurs à virgule, ou une série de valeurs.
L'exception << s'applique à l'expression numérique <<.
expr1 / expr2
Retourne la valeurLes nombres entiers ou les valeurs à virgule, ou une série de valeurs.
En plus de la désignation.
expr1 /= expr2
Exemples
// Equals to expr1 = expr1 / expr2.
a = 3
b = 3
a /= b
// Result: a = 1.
plot(a)
Retourne la valeurLes nombres entiers ou les valeurs à virgule, ou une série de valeurs.
Moins que. s'applique à l'expression numérique.
expr1 < expr2
Retourne la valeurLes valeurs de Boole, ou une série de valeurs de Boole.
est inférieur ou égal à ; s'applique à l'expression numérique.
expr1 <= expr2
Retourne la valeurLes valeurs de Boole, ou une série de valeurs de Boole.
L'équivalent d'une expression peut être appliqué à n'importe quel type d'expression.
expr1 == expr2
Retourne la valeurLes valeurs de Boole, ou une série de valeurs de Boole.
L'opérateur '=>' est utilisé pour les déclarations de fonctions définies par l'utilisateur etswitch
Il y a des gens qui sont en colère.
La syntaxe de la déclaration de fonction est:
<identifier>([<parameter_name>[=<default_value>]], ...) =>
<local_block>
<function_result>
Une<local_block>
Il s'agit de zéro ou plusieurs phrases Pine.<function_result>
Une variable, une expression ou un élément.
Exemples
// 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))
Nom de l'auteurVous trouverez plus d'informations sur les fonctions définies par l'utilisateur dans la page Déclarations et bibliothèques de scripts du manuel utilisateur.
Plus grand que ─ s'applique à l'expression numérique ─
expr1 > expr2
Retourne la valeurLes valeurs de Boole, ou une série de valeurs de Boole.
est supérieur ou égal à.
expr1 >= expr2
Retourne la valeurLes valeurs de Boole, ou une série de valeurs de Boole.
L'opérateur à trois conditions.
expr1 ? expr2 : expr3
Exemples
// 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)
Retourne la valeurSi l'expr1 est évalué comme vrai, alors l'expr2 est évalué comme vrai, sinon l'expr3 est évalué comme vrai.
Nom de l'auteurSi vous n'en avez pas besoin, veuillez utiliser na comme branche de l'élanelse. Vous pouvez combiner deux ou plusieurs opérateurs?: pour réaliser des phrases similaires aux phrases de commutateur de commutateur (voir l'exemple ci-dessus). Vous pouvez utiliser des opérateurs arithmétiques avec des chiffres ainsi que des colonnes de variables. Dans le cas où vous utilisez des colonnes de nombres, les opérateurs sont appliqués aux éléments.
À bientôt
na
Les sous-titres de la série↑ donnent accès aux valeurs précédentes de la série expr1↑ expr2 est le nombre de lignes k passées et doit être un nombre↑ la flottabilité sera omise à la baisse↑
expr1[expr2]
Exemples
// [] 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)
Retourne la valeurUne série de valeurs.
À bientôt
math.floor
La logique AND ─ est appliquée à l'expression de Boole ─.
expr1 and expr2
Retourne la valeurLes valeurs de Boole, ou une série de valeurs de Boole.
La logique OR↑ est appliquée à l'expression de Boole↑
expr1 or expr2
Retourne la valeurLes valeurs de Boole, ou une série de valeurs de Boole.
La requête logique inverse ((NOT) ⇒ s'applique à l'expression de Boole.
not expr1
Retourne la valeurLes valeurs de Boole, ou une série de valeurs de Boole.
Mots-clés de type "Bool" utilisés pour déclarer explicitement une variable ou un paramètre. La valeur de la variable "Bool" peut être true, false ou na.
Exemples
// bool
bool b = true // Same as `b = true`
b := na
plot(b ? open : close)
Nom de l'auteurUne mention explicite du type dans la déclaration de la variable est facultative, sauf si elle est initialement initialisée avec na. En savoir plus sur le type Pine sur la page du manuel utilisateur du système de types.
À bientôt
var
varip
int
float
color
string
true
false
Mots-clés de type
Exemples
// int
int i = 14 // Same as `i = 14`
i := na
plot(i)
Nom de l'auteurUne mention explicite du type dans la déclaration de la variable est facultative, sauf si elle est initialement initialisée avec na. En savoir plus sur le type Pine sur la page du manuel utilisateur du système de types.
À bientôt
var
varip
float
bool
color
string
Mots-clés de type float ("point flottant") utilisés pour déclarer explicitement une variable ou un paramètre.
Exemples
// float
float f = 3.14 // Same as `f = 3.14`
f := na
plot(f)
Nom de l'auteurUne mention explicite du type dans la déclaration de la variable est facultative, à moins qu'il ne soit initialement en na.
À bientôt
var
varip
int
bool
color
string
Mots-clés de type "string" pour déclarer explicitement une variable ou un paramètre.
Exemples
// string
string s = "Hello World!" // Same as `s = "Hello world!"`
// string s = na // same as ""
plot(na, title=s)
Nom de l'auteurUne mention explicite du type dans la déclaration de la variable est facultative, sauf si elle est initialement initialisée avec na. En savoir plus sur le type Pine sur la page du manuel utilisateur du système de types.
À bientôt
var
varip
int
float
bool
str.tostring
str.format
Mots clés de type "color" pour déclarer explicitement une variable ou un paramètre.
Exemples
// color
color textColor = color.green
if barstate.islastconfirmedhistory
runtime.log("test", textcolor = textColor)
Nom de l'auteurLes caractères de couleur ont le format suivant: #RRGGBB ou #RRGGBBAA. Les lettres représentent les valeurs à seize chiffres de 00 à FF (de 0 à 255 décimales), où RR, GG et BB sont les valeurs des facteurs rouge, vert et bleu de la couleur. AA est la valeur optionnelle de la transparence des couleurs (ou du facteur alpha), où 00 est invisible et FF est opaque. Une mention explicite du type dans la déclaration de la variable est facultative, sauf si elle est initialement initialisée avec na. En savoir plus sur le type Pine sur la page du manuel utilisateur du système de types.
À bientôt
var
varip
int
float
string
color.rgb
color.new
Mots-clés pour le type de chaîne de chaîne de l'array qui déclare explicitement une variable ou un paramètre.array.new<type>
,array.from
La fonction crée des objets d'array ((ou ID)).
Exemples
// array
array<float> a = na
a := array.new<float>(1, close)
plot(array.get(a, 0))
Nom de l'auteurLes objets d'une matrice sont toujours en forme de chaîne en chaîne.
À bientôt
var
array.new
array.from
Les paramètres peuvent être passés lors de l'appel d'une fonction, une attribution de nom de paramètre peut être spécifiée, des variables peuvent être passées directement à la position du paramètre correspondant, et une utilisation mixte est également prise en charge. Par exemple:
plot(close, title="test plot") // 直接传参数 close ;指定参数 title ,赋值字符串"test plot"
Une fois l'attribution du nom de paramètre spécifiée, les variables ne peuvent plus être transmises directement en tant que paramètres. Les paramètres transmis par la suite doivent être écrits sous la forme de l'attribution du nom de paramètre.
// plot(close, title="test", color.red) // 虽然plot第三个参数是颜色值,但是这样写就会报错
plot(close, title="test", color=color.red) // 正确写法
plot(close, "test", color.red) // 正确写法
Il sera transmis àtimeframe
La période de temps des paramètres est convertie en secondes.
timeframe.in_seconds(timeframe)
Exemples
// Get chart timeframe:
i_tf = input.timeframe("1D")
// Convert timeframe to the int value (number of seconds in 1 Day):
tf = timeframe.in_seconds(i_tf)
plot(tf)
Retourne la valeur
timeframe
Le nombre de secondes d'une ligne K est indiqué sous la forme int.
Paramètres
timeframe
(simple string) Période de temps↑ optionnelle↑ valeur par défaut timeframe.period↑Nom de l'auteurPourtimeframe
>=
À bientôt
input.timeframe
timeframe.period
Créer un identifiant de code pour demander une valeur de ligne moyenne K.
ticker.heikinashi(symbol)
Exemples
heikinashi_close = request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, close)
heikinashi_aapl_60_close = request.security(ticker.heikinashi(syminfo.tickerid), "60", close)
plot(heikinashi_close)
plot(heikinashi_aapl_60_close)
Retourne la valeur 股票代码的字符串值,可以提供给request.security函数。
Paramètres
symbol
(simple string) Identifiant du code de la marchandise.À bientôt
syminfo.tickerid
syminfo.ticker
request.security
Nous avons besoin de données externes.
request.data(url, attribute)
Exemples
/*backtest
start: 2022-01-26 09:00:00
end: 2024-02-01 15:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_CTP","currency":"FUTURES"}]
*/
// 图表地址https://www.datadata.cn/queries/a10ea45c-1674-48ef-b414-cc17a7e4a548
var chart_data = "https://www.datadata.cn/api/v1/query/a10ea45c-1674-48ef-b414-cc17a7e4a548/data"
add_investor = request.data(chart_data, "$.add_investor")
idx_price = request.data(chart_data, "$.close_price")
plot(add_investor, "股市新增人口")
plot(idx_price, "股指价格")
// 反指交易
avg_investor = ta.ema(add_investor[1], 30)
if strategy.position_size == 0
if add_investor > avg_investor*1.1
runtime.log("新增人口:", add_investor, "近30天平均:", avg_investor, "#ff0000")
strategy.entry("Enter Short", strategy.short)
else if add_investor < avg_investor*0.9
runtime.log("新增人口:", add_investor, "近30天平均:", avg_investor, "#ff0000")
strategy.entry("Enter Long", strategy.long)
Retourne la valeurParamètresattribute
La série de données spécifiée.
Paramètres
url
(simple string) L'url de la source de données demandée, le format de données répondant à la source de données doit satisfaire aux exigences (incluant au moins l'attribut time、data):{"data": [], "schema": ["time", "data"]}
◦ Les formats de données suivants sont utilisés:{
"data": [
[1430438400000, "2015年04月", "{\"add_investor\" : 497.53, \"close_price\" : 4441.655}"],
[1433116800000, "2015年05月", "{\"add_investor\" : 415.87, \"close_price\" : 4611.744}"]
// ...
],
"schema": ["time", "date", "data"]
}
attribute
(simple string) Donne le nom de l'attribut et renvoie les données requises."$.add_investor"
, utilisation$.
En tant que préfixe, le nom de l'attribut correspond à l'attribut dans le champ de données dans les données qui ont répondu à la source de données demandée.Une autre variété/résolution est requise.
request.security(symbol, timeframe, expression, gaps, lookahead, ignore_invalid_symbol, currency)
Exemples
s = request.security(syminfo.tickerid, "D", close) // 1 Day
plot(s)
expr = ta.sma(close, 10)
s1 = request.security(syminfo.tickerid, "240", expr) // 240 Minutes
plot(s1)
// To avoid difference in calculation on history/realtime you can request not latest values and use merge strategy flags as follows:
s2 = request.security(syminfo.tickerid, "D", close[1], barmerge.gaps_off, barmerge.lookahead_on)
plot(s2)
f() => [open, high]
[o, h] = request.security(syminfo.tickerid, "D", f())
[l, c] = request.security(syminfo.tickerid, "D", [low, close])
plot((o + h + l + c) / 4)
Retourne la valeurSéries requises
Paramètres
symbol
(Simple string) Le code de la marchandise.timeframe
(simple string) Période de temps. La chaîne vide sera interprétée comme la période de temps actuelle du graphique.expression
(series int/float/bool/color) peut être appelé à partir de la requête.security et retourner une expression.gaps
(barmerge_gaps) Politique de fusion des données demandées (exige que les données soient automatiquement fusionnées avec les données de la série principale OHLC). Values possibles: barmerge.gaps_on, barmerge.gaps_off,.. barmerge.gaps_on - les données demandées sont fusionnées avec des écarts possibles (exige une valeur na),.. barmerge.gaps_off - les données demandées sont continuellement fusionnées sans interruption, toutes les écarts étant remplies par la valeur existante la plus récente précédente.lookahead
(barmerge_lookahead) Politique de fusion des données demandées. Values possibles: barmerge.lookahead_on, barmerge.lookahead_off. À partir de la version 3, la valeur par défaut est barmerge.lookahead_off.ignore_invalid_symbol
(const bool) Un paramètre optionnel. Si le produit spécifié n'est pas trouvé, il détermine l'action de la fonction: si false, le script s'arrête et retourne à l'erreur lors de son exécution. Si true, la fonction retourne na et continue à exécuter.currency
(simple string) Convertir la valeur de la devise (par exemple OHLC) du produit en devise; puis calculer le taux d'expression de la devise en fonction de la valeur convertie; le taux de conversion utilisé est basé sur le taux de change quotidien de la journée précédente de la paire FX_IDC (par rapport à la ligne K à calculer); optionnel. La valeur par défaut est syminfo.currency. Values possibles: une chaîne de trois lettres avec un code de devise au format ISO 4217 (par exemple, la devise USD) ou currency.* Une constante dans l'espace de nommage, par exemple, currency.USD.Nom de l'auteurLe code PineScript utilise cette fonctionnalité pour effectuer des calculs différents sur les historiques et les données en temps réel.Si vous souhaitez spécifier des paramètres supplémentaires pour les produits demandés, tels que les délais de transaction ou le type d'ajustement, vous pouvez utiliser les paramètres suivants:您可以使用ticker.newLa fonction () est la suivante:
Impossible de transmettre l'erreur de point à cette fonction avec la variable ticker. Vous pouvez utiliser ticker.ticker.newUne forme d'expression en chaîne pour une variable ou un code de stock, par exemple: AAPL + MSFT * TSLA chaîne.Actuellement, un scénario peut contenir jusqu'à 40 appels request.security.
Veuillez noter que l'utilisation de cette variable/fonction peut entraîner une redéfinition de l'indicateur.
Les paramètres de résolution permettent de:
1S, 5S, 15S, 30S - intervalle de secondes (le cycle du graphique doit être inférieur ou égal au cycle de la requête)
De 1 à 1440 minutes
De 1D à 365D
De 1 W à 52 W en quelques semaines
De 1M à 12M en quelques mois
À bientôt
syminfo.ticker
syminfo.tickerid
timeframe.period
ta.correlation
barmerge.lookahead_off
barmerge.lookahead_on
Sisource
Les chaînes contiennentstr
Une sous-stringue renvoie true, sinon false.
str.contains(source, str)
Exemples
// If the current chart is a continuous futures chart, e.g “BTC1!”, then the function will return true, false otherwise.
var isFutures = str.contains(syminfo.tickerid, "!")
plot(isFutures ? 1 : 0)
Retourne la valeurSi c'est danssource
Trouver dans une chaînestr
Si le message est vrai, il est faux.
Paramètres
source
(série de chaînes)str
(series string) La sous-stringue à rechercher.À bientôt
str.pos
str.match
Sisource
La chaîne de caractères eststr
La fin d'une sous-stringue spécifiée dans la base de données renvoie true, sinon false.
str.endswith(source, str)
Retourne la valeurSisource
La chaîne de caractères eststr
La fin d'une sous-stringue spécifiée est true, sinon false.
Paramètres
source
(série de chaînes)str
(series string) La sous-stringue à rechercher.À bientôt
str.startswith
Sisource
La chaîne de caractères eststr
Le début d'une sous-stringue spécifiée dans la base de données retourne true, sinon false.
str.startswith(source, str)
Retourne la valeurSisource
La chaîne de caractères eststr
Le début d'une sous-stringue spécifiée est true, sinon false.
Paramètres
source
(série de chaînes)str
(series string) La sous-stringue à rechercher.À bientôt
str.endswith
Il y a une autre chose que je veux faire, c'est retourner une nouvelle chaîne.source
Une sous-stringue d'une chaîne.begin_pos
Les caractères de l'index indiqué commencent et s'étendent jusqu'àsource
Le point de départ de la chaîne est end_pos - 1
str.substring(source, begin_pos)
str.substring(source, begin_pos, end_pos)
Exemples
sym= "EXCHANGE_NAME:SYMBOL_NAME"
pos = str.pos(sym, ":") // Get position of ":" character
tkr= str.substring(sym, pos+1) // "SYMBOL_NAME"
if barstate.islastconfirmedhistory
runtime.log(tkr)
Retourne la valeurUne sous-stringue extraite de la chaîne source.
Paramètres
source
(series string) Extraire la chaîne source de la sous-chaîne.begin_pos
(series int) est le point de départ d'une sous-chaîne extraite.end_pos
(series int) termination position. Elle est exclusive. (la chaîne extraite n'inclut pas les caractères de cette position). Optionnelle.source
La longueur de la chaîne.Nom de l'auteurL'index de la chaîne commence à zéro.begin_pos
est égal àend_pos
La fonction retourne une chaîne vide.
À bientôt
str.contains
str.pos
str.match
str.tonumber(string)
Retourne la valeurSi elle contient des chiffres valides, elle est le type de float de la chaîne, sinon elle est na.
Paramètres
string
(series string) forme d'expression de la chaîne int ou float.Convertissez les chaînes de format et les valeurs en chaînes de formatage. Les chaînes de formatage peuvent contenir un en-tête dans le texte et un en-tête dans les parenthèses {} pour chaque valeur à formater. Chaque en-tête comprend un indice qui remplacera ses paramètres nécessaires (à partir de 0), ainsi qu'un indicateur de formatage optionnel. L'index indique la position du paramètre dans la liste des paramètres str.format.
str.format(formatString, arg0, arg1, ...)
Exemples
// The format specifier inside the curly braces accepts certain modifiers:
// - Specify the number of decimals to display:
s1 = str.format("{0,number,#.#}", 1.34) // returns: 1.3
runtime.log(s1)
// - Round a float value to an integer:
s2 = str.format("{0,number,integer}", 1.34) // returns: 1
runtime.log(s2)
// - Display a number in currency:
s3 = str.format("{0,number,currency}", 1.34) // returns: $1.34
runtime.log(s3)
// - Display a number as a percentage:
s4 = str.format("{0,number,percent}", 0.5) // returns: 50%
runtime.log(s4)
// EXAMPLES WITH SEVERAL ARGUMENTS
// returns: Number 1 is not equal to 4
s5 = str.format("Number {0} is not {1} to {2}", 1, "equal", 4)
runtime.log(s5)
// returns: 1.34 != 1.3
s6 = str.format("{0} != {0, number, #.#}", 1.34)
runtime.log(s6)
// returns: 1 is equal to 1, but 2 is equal to 2
s7 = str.format("{0, number, integer} is equal to 1, but {1, number, integer} is equal to 2", 1.34, 1.52)
runtime.log(s7)
// returns: The cash turnover amounted to $1,340,000.00
s8 = str.format("The cash turnover amounted to {0, number, currency}", 1340000)
runtime.log(s8)
// returns: Expected return is 10% - 20%
s9 = str.format("Expected return is {0, number, percent} - {1, number, percent}", 0.1, 0.2)
runtime.log(s9)
Retourne la valeurUne chaîne de caractères formatée.
Paramètres
formatString
(series string) Une chaîne de format.arg0, arg1, ...
(series int/float/bool/string/na/int[]/float[]/bool[]/string[]) est une valeur à formater.Nom de l'auteurToutes les parenthèses dans le style non cité doivent être équilibrées. Par exemple, "ab {0} de" et "ab
Retourne l'entier correspondant au nombre de caractères dans la chaîne.
str.length(string)
Retourne la valeurLe nombre de caractères dans la chaîne source.
Paramètres
string
(série de chaînes)Retourne une nouvelle chaîne où toutes les lettres sont converties en minuscules.
str.lower(source)
Retourne la valeurToutes les lettres ont été converties en nouvelles chaînes en minuscules.
Paramètres
source
(series string) La chaîne à convertir.À bientôt
str.upper
Retourne une nouvelle chaîne où toutes les lettres sont converties en majuscules.
str.upper(source)
Retourne la valeurToutes les lettres sont converties en nouvelles chaînes en majuscules.
Paramètres
source
(series string) La chaîne à convertir.À bientôt
str.lower
Si elle correspondregex
L'expression régulière renvoiesource
La nouvelle sous-string de la chaîne, sinon elle retourne
str.match(source, regex)
Exemples
s = input.string("It's time to sell some EXCHANGE_NAME:SYMBOL_NAME!")
// finding first substring that matches regular expression "[\w]+:[\w]+"
var string tickerid = str.match(s, "[\\w]+:[\\w]+")
if barstate.islastconfirmedhistory
runtime.log(tickerid) // "EXCHAN
- Je suis désolé.Comment faire fonctionner plusieurs transactions en même temps?
Des nuages légersPourriez-vous m'expliquer si pine peut effectuer plusieurs transactions, comme JS?
Je vous en prie.Merci pour les détails.
l'artisteBonjour! Comment ce script pine utilise-t-il le disque de simulation d'okex sur la plateforme?
l'artisteC'est comme si les stratégies de tradingview étaient directement copiées sur la plateforme de l'inventeur pour être utilisées!
Le petit rêveLe langage PINE n'utilise que des stratégies mono-variées, les stratégies multivariées sont préférables ou sont conçues en python, javascript, c++.
Le petit rêveOh, oui, OKX est un peu spécial, leur environnement d'analogie et leur environnement de disque réel ont la même adresse, mais ils font une différence ailleurs.
Des nuages légersJe ne peux pas utiliser l'analogue okx.
Le petit rêveCe problème d'architecture multiforme n'est pas résolu, car chaque échange dispose d'une interface différente et de limites de fréquence différentes, ce qui pose de nombreux problèmes.
Le petit rêveBien, merci à Cloud pour les suggestions, et partagez-les ici.
Des nuages légersIl est préférable d'utiliser le JS pour une meilleure adaptation aux différents modes de transactions.
Les chasseurs de tendanceLe prix d'achat est le même pour chaque variété.
Le petit rêveJe suis désolée.
Des nuages légersBien, merci beaucoup.
Le petit rêveBonjour, la stratégie linguistique PINE ne fonctionne que pour une seule variété pour l'instant.
Le petit rêveMerci pour votre soutien. La documentation continuera d'être améliorée.
Le petit rêveJe ne sais pas si c'est vrai.
Le petit rêveLa bibliothèque de modèles PINE, dont les paramètres permettent de définir l'adresse de base de l'échange de commutation.