FMZ PINE Script est un fichier

Auteur:Le petit rêve, Créé: 2022-05-06 14:27:06, mis à jour: 2024-02-23 15:36:48

[TOC] Je vous en prie.

Les mots-clés, la grammaire, les paramètres et les résumés

Structure du code

La structure générale du code dans Pine est la suivante:

<version>
<declaration_statement>
<code>

Les notes

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')

Édition

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

Les déclarations

  • 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.

Le code

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.

  • Déclaration des variables
  • Réattribuer des valeurs aux variables
  • Déclaration de fonction
  • Appel de fonction intégré, appel de fonction défini par l'utilisateur
  • ifforwhileouswitchStructure équivalente

Les phrases peuvent être classées de plusieurs façons.

  • Certaines déclarations peuvent être exprimées en une seule ligne, comme la plupart des déclarations de variables, qui ne contiennent qu'une seule ligne d'appel à la fonction ou des déclarations de fonction en une seule ligne. D'autres, comme les structures, ont toujours besoin de plusieurs lignes car elles nécessitent un bloc local.
  • Les phrases à l'échelle globale du script (c'est-à-dire les parties qui n'appartiennent pas à un sous-ensemble) ne peuvent pas être utilisées comme des phrases dans le cadre d'un scénario.空格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.
  • Une déclaration de structure ou de fonction multi-lignes nécessite toujours unlocal 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.
  • Plusieurs phrases à une ligne peuvent être reliées en une seule ligne en utilisant le comma ((,) comme séparateur.
  • Une ligne peut contenir des annotations ou simplement des annotations.
  • Les lignes peuvent également être enveloppées (en continuant sur plusieurs lignes).

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)  // 调用一个内置函数输出日志 (全局范围)

Modifier le code

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")

Séquence de temps

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éesopenPar exemple:openLa variable par défaut enregistre le prix d'ouverture de chaque ligne KBAR si cetteopenC'est la période de cinq minutes de la ligne K.openCe qui est enregistré dans la variable est le prix d'ouverture de la colonne BAR de la ligne K toutes les 5 minutes.openC'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.

Paramètres du modèle de la bibliothèque de classes de transactions de la langue Pine

Les paramètres du modèle intégré de la stratégie PINE, "Pine Language Exchange Library", sont définis.

Les réglages des transactions

  • Comment le faire Modèle de prix de clôture: le modèle n'est exécuté qu'à l'expiration de la barre actuelle, et les transactions sont exécutées au début de la barre inférieure. Modèle de prix en temps réel: le modèle est exécuté à chaque variation de prix, avec des signaux pour exécuter immédiatement la transaction.
  • Nombre d'opérations par défaut: Si l'instruction de transaction ne spécifie pas le nombre de transactions, les transactions sont exécutées selon ce nombre de positions.
  • Volume maximal de transaction unique: en fonction de la transaction réelle, en combinaison avec ce paramètre, définissez le nombre maximal de transactions par transaction, afin d'éviter les chocs sur la surface de la transaction.
  • Nombre de points de vente: selon定价货币精度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.
  • Le nombre de cycles le plus long de la variable: affecte le nombre de lignes BAR du graphique K, avecjavascriptAppelez dans la stratégieSetMaxBarLenLa fonction fonctionne de la même façon.

Options à terme

  • Code de variété: code de contrat, qui n'est nécessaire que lorsque l'objet de l'échange est un objet de l'échange non sur le marché.
  • Nombre minimum de contrats: le nombre minimum de transactions du contrat au moment de la commande.

Options de disque

  • Autorecovery: Récupère automatiquement l'état avant l'arrêt de la dernière stratégie.
  • Nombre de tentatives de commande: l'ordre n'est pas transactionnel, l'ordre est annulé et la transaction est tentée à nouveau. Ce paramètre est utilisé pour limiter le nombre maximum de tentatives de commande.
  • Intervalle de consultation de réseau (millisecondes): uniquement valable pour le protocole REST, contrôlant l'intervalle de requête du réseau et évitant des requêtes trop fréquentes et dépassant les limites de l'échange.
  • Temps de synchronisation des comptes (secondes): la période de synchronisation des données des comptes.
  • Temps de synchronisation des positions après l'ouverture (millisecondes): pour les positions répétitives causées par un certain retard de données sur les échanges, un temps de synchronisation plus long peut atténuer ce problème.
  • Multiples d'effet de levier: régler le multiplicateur d'effet de levier.

Traitements instantanés, autres paramètres

  • Volume de transaction: le volume de transaction par défaut est le même et ne s'applique qu'aux transactions en espèces.
  • Le volume de transactions est le plus petit possible.
  • La précision de la monnaie: la précision des prix, c'est-à-dire les petites quantités de prix.
  • Précision de la variété de transaction: la précision de la dernière unité, c'est-à-dire le petit nombre de chiffres de la dernière unité.
  • Frais de service: pour calculer certaines données selon ce paramètre, 0.002 est 2 parts de millième.
  • L'écart entre les statistiques sur les gains et les pertes: les statistiques sur les gains et les pertes ne sont affichées que sur le disque.
  • Réessayer après un échec (millisecondes): intervalle de réessayage lorsque la demande réseau échoue.
  • Utiliser des agents: validé uniquement pour le protocole REST.
  • Masquer les erreurs courantes du réseau: Masquer les erreurs courantes du journal dans la zone des journaux.
  • Le changement d'adresse de base est valable uniquement pour le protocole REST.
  • Envoyez des notifications: envoyez des messages à votre boîte de réception.

Compte à rebours

Ouverture du marché

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)                          // 指定(较低的)价格,计划下买单订单,等待成交开仓,限价开仓

Plateau

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%持仓

Mécanisme de négociation

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.

Liste des projets

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.entryOn peut spécifier une fonction sous forme delimitstopParamè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).directionLe paramètre eststrategy.longL'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-à-diredirectionLe paramètre eststrategy.shortL'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émentlimitstopParamètres, les commandes sont déclenchées au premier prix qui répond aux conditions.

Déclaration, mot clé de structure logique

- Je ne sais pas.

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 a maintient le prix de clôture de la première ligne de chaque pilier de la série. La variante a maintenu le prix de clôture de la barre de prix de la première soupe de soupe verte de la série. La variable c est maintenue au cours de la clôture de la dixième série de bananes vertes.

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.varvaripLes 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.varvaripLes 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 trueOn 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.varvaripLes 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 + 1etii := ii + 1La 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.varvaripLes variables déclarées sont parfaitement cohérentes dans l'exemple ci-dessus, avec une augmentation de 1 pour chaque ligne KBAR.

variété

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.

vrai

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

faux

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

si

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 phrasesthenLa logique est la suivante:var_decl_then0var_decl_then1etc) ⇒ Si la condition est false, on utilise les blocs de phraseselse ifOu alorselseLa logique est la suivante:var_decl_else0var_decl_else1Je 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_thenetreturn_expression_elseLorsqu'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 omettreelsebloc. 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 then, else if, else if sont déplacés en quatre espaces:

Exemples

// if
x = if open > close
    5
else if high > low
    close
else
    open
plot(x)

Je ne sais pas.ifLa valeur de résultat d'une déclaration ((var_declarationX= peut être omise)). Elle peut être utile si vous avez besoin d'un côté-fonctionnement de l'expression, par exemple dans une transaction stratégique:

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)

pour

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

Pour... dans

for...inLa 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_expressionLa 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_elementIl 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_declarationLes 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...inLa 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 notreisPosLa valeur de l'ensemble est définie commetrueIls sont dans notre pays.valuesArrayLes 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

pendant que

whileLes 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 expressionUne valeur d'initialisation peut être fournie pour cette variable.boolean_expression- Exécuter si c'est vraiwhileLe bloc local de l'instruction.whileAprès la phrase, continuez à exécuter le script.continue - continueLes mots clés conduisent à la branche circulaire jusqu'à la prochaine itération.break - breakLes mots clés entraînent la fin du cycle.whileLe texte est repris après la phrase.return_expression- fourniwhileLa 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ébutswhileLe bloc de code local après la ligne doit être condensé en quatre espaces ou en un caractère.whileLe cyclewhileL'expression de Boole suivante doit éventuellement devenir false ou doit être exécutée.break

échangeur

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_blockexemple oudefault_local_blockL'un d'eux est là.default_local_blockseulement 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é.switchLe résultat de la phrase est attribué à une variable et n'est pas spécifiédefault_local_blockSi cela n'est pas fait,local_blockLa phrase est retournée.naJe vais.switchQuand les résultats de la phrase sont attribués à une variable, tous les résultats sont attribués à une variable.local_blockL'instance doit retourner une valeur du même type.

À bientôt if ?:

séries

series est un mot-clé qui désigne le type de série de données.seriesLes mots clés sont généralement inutiles.

Opérateur

=

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 +' retourne express1 plus express2 ≠. Une unité de valeur + une unité de valeur renvoie expr ((pas de contenu ajouté à la symétrie des unités d'opérateurs)).

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 +' retourne express1 moins express2 ≠. Un dollar-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 etswitchIl 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

et

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.

ou

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.

Je ne sais pas.

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 de données

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

int

Mots-clés de type int ((int) ), utilisés pour déclarer explicitement une variable ou un paramètre.

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

flottant

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

une chaîne

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

couleur

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

séquence

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.fromLa 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

Fonction intégrée

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)             // 正确写法

le délai

Temps.en_secondes

Il sera transmis àtimeframeLa 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 timeframeLe 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>= 1 M fonction calculée en fonction du nombre de secondes sur 30.4167 (365/12) jours d'un mois.

À bientôt input.timeframe timeframe.period

le ticker

ticker.heikinashi

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

une demande

request.data

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ètresattributeLa 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.

request.security

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

str

str.contains

SisourceLes chaînes contiennentstrUne 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 danssourceTrouver dans une chaînestrSi 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

str.endswith

SisourceLa chaîne de caractères eststrLa fin d'une sous-stringue spécifiée dans la base de données renvoie true, sinon false.

str.endswith(source, str)

Retourne la valeurSisourceLa chaîne de caractères eststrLa 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

str.startswith

SisourceLa chaîne de caractères eststrLe 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 valeurSisourceLa chaîne de caractères eststrLe 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

str.substring

Il y a une autre chose que je veux faire, c'est retourner une nouvelle chaîne.sourceUne sous-stringue d'une chaîne.begin_posLes caractères de l'index indiqué commencent et s'étendent jusqu'àsourceLe 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.sourceLa longueur de la chaîne.

Nom de l'auteurL'index de la chaîne commence à zéro.begin_posest égal àend_posLa fonction retourne une chaîne vide.

À bientôt str.contains str.pos str.match

str.tonumber

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.

str.format

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 } de" sont des styles valides, mais "ab {0} de, ab } de" et "{" ne sont pas des styles valides.

str.length

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)

str.lower

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

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

str.match

Si elle correspondregexL'expression régulière renvoiesourceLa nouvelle sous-string de la chaîne, sinon elle retourne na.

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

Plus de

- 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.