May 21, 2021

Nouvelles fonctionnalités dans Pine Script : str.format() et array.from()

Cette mise à jour du langage Pine Script ajoute des fonctions permettant de travailler avec des chaînes et des matrices.

La fonction str.format() vous permet de convertir les arguments qui lui sont passés en une chaîne avec un format spécifié :

str.format(formatString, arg0, arg1, ...) -> string

Le formatString inclut un indice N entre parenthèses « {} » pour substituer les arguments formatés correspondants (arg0, arg1..argN, qui sont des chaînes ou des nombres), et certains des motifs discutés ci-dessous.

Ainsi, pour l’analyse syntaxique des chaînes, il n’est plus nécessaire de recourir à une construction utilisant la fonction str.replace_all() :

txt := "Time to {0} some {1}!"

txt := str.replace_all(txt, "{0}", close > open ? "buy" : "sell")

txt := str.replace_all(txt, "{1}", syminfo.ticker)

mais vous pouvez le faire d’une nouvelle manière, plus pratique et plus rapide :

txt = str.format("Time to {0} some {1}!", close > open ? "buy" : "sell", syminfo.ticker)

Les indices {0} et {1} entre parenthèses sont remplacés par les arguments ordinaux correspondants : {0} – le résultat de l’exécution de l’opérateur ternaire, la chaîne « acheter » ou « vendre », est retournée en fonction de l’inégalité des prix close et open, {1} – syminfo.ticker, le symbole actuel sur le graphique :

En utilisant le modèle number, le nombre converti en chaîne peut être converti en une représentation différente, par exemple, pour limiter le nombre de décimales.

str.format("{0,number,#.#}", 1.34) // returns: 1.3

Supprimez la partie fractionnaire du nombre :

str.format("{0,number,integer}", 1.34) // returns: 1

Obtenez des informations financières :

str.format("The cash turnover amounted to {0,number,currency}", 1340000) 

// “The cash turnover amounted to $1,340,000.00”.

Obtenez des pourcentages :

str.format("Expected return is {0,number,percent} - {1,number,percent}", 0.1, 0.2)  

// returns: Expected return is 10% - 20%. 

La fonction str.format() prend en charge le modèle de date pour le formatage de la date et de l’heure.

Ce script affiche le nombre de mois, de semaines et de jours depuis le début de l’année :

//@version=4
study("str_format_date")

//formatting string with date pattern
txt = str.format("Current bar date: {0,date, Y-MM-d'.' \n M 'months \n' F 'weeks \n' D 'days \n from the beginning of the year' }", timenow)

//printing label
var l1 = label.new(na, na, color = #FFFFFF00)
label.set_x(l1, bar_index)
label.set_yloc(l1, yloc.belowbar)
label.set_text(l1, txt)

plot(close)

Une seule variable timenow est transmise à la fonction str.format(), qui contient la représentation temporelle UNIX : la date, l’heure et le fuseau horaire actuels pour l’échange d’un symbole sur le graphique. La chaîne de caractères est formatée en utilisant les caractères Y, M, D, F (année, mois, jour, semaine du mois), le caractère spécial \n pour les sauts de ligne, et les guillemets simples  » pour insérer du texte entre les caractères.

Ce script produit des chaînes de caractères formatées sur l’étiquette et le résultat correspondant de la fonction str.format() avec divers caractères :

//@version=4
study("str_format_date_time")

// creating date-time variable: 2021.05.04. 14:30:59
t = timestamp("GMT+0", 2021, 05, 04, 14, 30, 59)

// function for left side of the label
f_print_left(_text)  => var _label = label.new(bar_index, na, _text, xloc.bar_index, yloc.price, color(na), label.style_label_right, color.green, size.large, text.align_right), label.set_xy(_label, bar_index, 0), label.set_text(_label, _text)

// function for right side of the label
f_print_right(_text) => var _label = label.new(bar_index, na, _text, xloc.bar_index, yloc.price, color(na), label.style_label_left, color.red, size.large, text.align_left), label.set_xy(_label, bar_index, 0), label.set_text(_label, _text)

var string format = 
  "{0,date,y.MM.dd hh:mm:ss}\n" +
  "{1,date,short}\n" +
  "{2,date,medium}\n" +
  "{3,date,long}\n" +
  "{4,date,full}\n" +
  "{5,date,h a z (zzzz)}\n" +
  "{6,time,short}\n" +
  "{7,time,medium}\n" +
  "{8,time,long}\n" +
  "{9,time,full}\n" + 
  "{10,time,hh:mm:ss}\n" +
  "{11,time,HH:mm:ss}\n"

// printing format string 
f_print_left(format)
//printing formatted string
f_print_right(str.format(format, t, t, t, t, t, t, t, t, t, t, t, t))

La colonne de gauche de l’étiquette contient les caractères entourés de {}, la colonne de droite est le résultat de la fonction str.format :

La variable t est transmise à la fonction str.format(), qui contient la représentation de l’heure UNIX : la date, l’heure et le fuseau horaire actuels.

L’innovation suivante est la fonction array.from(), qui prend un nombre variable d’arguments d’entrée de l’un des types suivants : float, int, bool, string, label, line, color et renvoie une matrice du type correspondant. Cette fonction vous permet de déclarer une matrice, de lui attribuer des valeurs initiales et d’affecter le résultat à une variable quelconque en une seule ligne de code.

Auparavant, pour créer un tableau et le remplir de valeurs initiales, vous deviez utiliser la fonction array.new() et les fonctions array.push() ou array.set() :

color[] plotColors = array.new_color(size=0)
array.push(plotColors, color.red)
array.push(plotColors, color.green)
array.push(plotColors, #0000FF)

Maintenant, pour créer une matrice qui contiendra les couleurs des graphiques, vous pouvez vous en sortir avec une seule ligne :

plotColors = array.from(color.red, color.green, #0000FF)

La fonction va automatiquement convertir le tableau plotColors en type color[] en fonction des arguments reçus :

//@version=4
study(title="array_from")

f_arr (series1, series2, color1, color2) =>
    [ array.from(series1, series2), array.from(color1, color2) ]

[lines, colors] = f_arr(close, open, color.red, color.green)    

plot ( array.get(lines, 0), color = array.get(colors, 0))
plot ( array.get(lines, 1), color = array.get(colors, 1))

Des informations au sujet de ces fonctions str.format() et array.from() sont toujours disponibles dans notre manuel de référence.

Si vous souhaitez être informé/e des mises à jour de Pine Script, consultez la section des Notes de publication. Le compte PineCoders diffuse également des mises à jour sur sa chaîne Telegram Squawk Box, Twitter et le chat public Pine Script sur TradingView.

Nous espérons que vous trouverez ces améliorations utiles, et nous vous invitons à continuer à nous faire part de votre opinion. Nous construisons TradingView pour nos utilisateurs, et nous aimons savoir ce que vous pensez de nos innovations.

Look first / Then leap

Ouvrir le graphique