Aujourd’hui, nous sommes heureux d’annoncer la sortie de Pine Script® v6! Cette version améliorée de notre langage de programmation axé sur les traders comprend une variété d’optimisations et d’améliorations de fonctionnalités demandées depuis longtemps, offrant une plus grande efficacité et utilité aux programmeurs de Pine Script®, préparant le terrain pour amener le langage vers de nouveaux sommets.
Ce post présente quelques-unes des améliorations les plus notables de Pine v6. Consultez nos notes de publication pour en savoir plus sur les nouveautés de la v6 et pour vous tenir au courant des améliorations à venir.
Outil de conversion v6
Comme pour les changements de version précédents, les mises à jour incluses dans Pine v6 n’affectent pas les scripts personnels ou publiés écrits dans des versions antérieures de Pine. Toutes les nouvelles fonctionnalités à partir de maintenant seront implémentées exclusivement dans la dernière version de Pine, nous recommandons donc de convertir vos scripts à la v6 si vous voulez accéder aux nouvelles fonctionnalités. La méthode la plus simple est d’utiliser notre nouvel outil de conversion v6, que vous pouvez activer en sélectionnant «Convertir le code en v6» dans le menu «Gérer le script» de l’éditeur Pine.
Notez que tous les scripts ne peuvent pas être convertis automatiquement à la version 6 et que, dans certains cas, des modifications manuelles sont nécessaires pour s’assurer que le script converti fonctionne comme prévu. Si vous rencontrez des problèmes lors de la conversion automatique ou si vous préférez convertir manuellement vos scripts à la v6, consultez notre guide pratique sur la migration.
Requêtes dynamiques
TradingView donne accès à des dizaines de milliers de symboles d’instruments échangeables, de mesures financières et d’indicateurs économiques du monde entier. La famille de fonctions request.*() permet aux scripts Pine de récupérer des données pour n’importe quel symbole disponible sur différentes périodes, indépendamment du symbole et de la période utilisés par le graphique.
Ces fonctions sont des utilitaires puissants avec de nombreux cas d’utilisation. Cependant, elles présentaient auparavant une limitation importante: elles nécessitaient l’utilisation de valeurs de «chaînes simples» pour spécifier le symbole et l’horizon temporel de la requête, ce qui signifiait que le contexte devait être connu dès la première mesure et ne pouvait plus changer par la suite. En outre, tous les appels request.*() étaient contraints de s’exécuter strictement dans la portée globale du script. En d’autres termes, toute instance request.*() du code ne pouvait récupérer des données que pour un seul symbole et une seule période, et aucun appel request.*() n’était autorisé à l’intérieur de boucles, de structures conditionnelles ou de fonctions de bibliothèque exportées.
Dans Pine Script® v6, nous avons supprimé ces limitations. Désormais, les scripts peuvent utiliser les valeurs « series string » pour définir le contexte de tout appel request.*(). De plus, les appels request.*() sont désormais autorisés à l’intérieur des scopes locaux. Grâce à ces changements, vous pouvez calculer ou modifier des symboles sur n’importe quelle barre historique et demander leurs données de manière dynamique, créer des collections de symboles et récupérer leurs données dans des boucles, et faire beaucoup d’autres choses avec les fonctions request.*()qui n’étaient pas possibles auparavant. Pour en savoir plus, consultez la section Requêtes dynamiques de notre manuel d’utilisation.
Pour un exemple de ce que vous pouvez faire avec les requêtes dynamiques, regardez le fonctionnement interne de l’indicateur de performance intégré. Il divise des listes de chaînes de symboles et de périodes séparées par des virgules en tableaux, puis appelle request.security()dynamiquement à l’intérieur de boucles pour récupérer les valeurs de chaque ensemble de données. Auparavant, un script de ce type aurait nécessité plusieurs appels à input.symbol() et input.timeframe(), et chaque combinaison de symbole et de période aurait nécessité un appel à request.security()distinct dans le code:
Pour une référence supplémentaire, consultez ces scripts publiés par le compte TradingView, qui utilisent également des requêtes dynamiques pour récupérer des données à partir d’autres contextes.
- Forex Heatmap. Cet indicateur crée des ID de ticker pour les combinaisons de paires de devises sur la base d’une liste de codes de devises spécifiée par l’utilisateur. Il demande dynamiquement des données pour chaque combinaison de paires dans des boucles, puis il utilise les données pour remplir un tableau à code couleur.
- Ticker Tape. Cet indicateur crée un tableau d’ID de ticker à partir d’une liste de symboles définie par l’utilisateur. Il demande dynamiquement des informations sur les prix et les changements quotidiens pour chaque ID de ticker dans le tableau à l’intérieur d’une boucle, puis utilise les données pour mettre à jour un affichage de «ruban» rotatif.
- LibraryCOT. Auparavant, cette bibliothèque ne fournissait que des outils permettant de créer des ID de ticker pour demander des données CFTC Commitment of Traders (COT), car les bibliothèques ne pouvaient pas exporter de fonctions contenant des appels request.*(). Avec les requêtes dynamiques, cette limitation ne s’applique plus. La bibliothèque exporte désormais une fonction requestCommitmentOfTraders()qui appelle request.security() en interne pour récupérer directement les données COT, offrant ainsi plus de commodité et de polyvalence aux programmeurs.
En outre, tous les codes de rapport de la CFTC étaient auparavant conservés dans des instructions de commutation pour renvoyer des valeurs « simples », ce qui limitait considérablement le nombre de tickers disponibles pour les requêtes. Avec les requêtes dynamiques, les ID de ticker «simples» ne sont plus nécessaires, ce qui permet à la bibliothèque de stocker les codes de rapport dans une carte et de prendre en charge un plus grand nombre de symboles.
Optimisation booléenne
L’une des améliorations les plus notables de Pine Script® v6 peut ne pas être apparente à la surface, mais vous remarquerez probablement une différence dans l’efficacité du code. Nous avons retravaillé l’implémentation interne des valeurs « bool » dans Pine, et nous avons introduit l’évaluation par court-circuit (ou «paresseuse»), permettant aux opérations and et or d’arrêter l’évaluation d’autres expressions lorsqu’elles ne sont pas nécessaires pour déterminer le résultat.
Ces changements améliorent la performance de la plupart des scripts sur TradingView. La différence d’efficacité est particulièrement perceptible avec les scripts relativement importants qui s’appuient fortement sur des conditions et utilisent de nombreuses valeurs «bool», comme nous l’avons confirmé lors de nos tests sur certains des scripts communautaires open-source les plus populaires.
En prime, l’évaluation paresseuse des valeurs « bool » permet souvent d’obtenir un code plus propre et plus concis. Par exemple, si vous avez une condition qui s’appuie sur des éléments d’un tableau, vous pouvez avoir à vérifier la taille du tableau pour vous assurer que l’index de l’élément existe, car le script s’arrêtera et lèvera une erreur si l’index est hors limites. Pine v6, avec son évaluation paresseuse, vous permet de créer une seule expression conditionnelle qui vérifie le tableau avant d’essayer d’accéder à un élément, ce qui n’était pas possible dans la v5.
//@version=6 indicator("Lazy evaluation demo") //@variable A "bool" array without a fixed size. array<bool> myArray = array.new<bool>() // Push a new value into `myArray` when the `close` is above the `open`. if close > open myArray.push(true) // Line 13 causes an error in v5 because `myArray.first()` always executes, even if the first expression is `false`. // It works in v6 though because `myArray.first()` executes only if the first expression evaluates to `true`. if myArray.size() != 0 and myArray.first() label.new(bar_index, high, "Test")
Taille et formatage du texte
Tous les types de dessins affichant du texte (boîtes, étiquettes et tableaux) peuvent désormais utiliser des tailles de texte spécifiées en points typographiques – les mêmes points que ceux utilisés dans les éditeurs de texte standard. Auparavant, vous deviez choisir entre des constantes size.* arbitraires, telles que size.large (24) et size.huge (36). Désormais, grâce à la nouvelle spécification des points typographiques, vous pouvez vous assurer que la taille du texte est exactement celle que vous souhaitez. Vous pouvez même créer des tailles de texte massives qui étaient impossibles à réaliser dans les versions précédentes de Pine.
De plus, nous avons introduit un nouveau paramètre text_formatting pour ces types de dessins, que vous pouvez utiliser pour mettre le texte en italique, en gras, ou les deux.
//@version=6 indicator("Text size showcase", overlay = true) var t = table.new(position.bottom_center, 1, 2, bgcolor = color.yellow, frame_color = color.black, frame_width = 1) if barstate.islastconfirmedhistory t.cell(0, 0, "text_size = size.huge", text_size = size.huge) t.cell(0, 1, "text_size = 60, bold & italicized", text_size = 60, text_formatting = text.format_bold + text.format_italic)
Stratégie de rognage des ordres
Les utilisateurs actifs de scripts stratégiques savent peut-être que dans Pine v5, une stratégie peut simuler jusqu’à 9000 transactions avant d’interrompre ses calculs et d’afficher une erreur, sauf si vous utilisez le mode Deep Backtesting. Cette limitation est particulièrement gênante pour les stratégies qui simulent des transactions fréquentes et créent des déclencheurs d’alerte.
Dans Pine Script® v6, les stratégies ne s’arrêtent plus de calculer ou ne soulèvent plus d’erreur après avoir atteint la limite de 9000 trades. Au lieu de cela, la stratégie rogne les ordres les plus anciens pour faire de la place aux nouveaux. Les ordres rognés n’apparaissent pas dans le testeur de stratégie, mais la stratégie continue ses calculs sans problème. Pour vérifier l’indice de transaction de l’ordre le plus ancien non rogné, vous pouvez utiliser la nouvelle variable strategy.closedtrades.first_index. L’index est utilisable comme argument trade_num dans les appels de la fonction strategy.closedtrades.*().
Indices de tableau négatifs
Dans la version 6 de Pine, les fonctions array.get(), array.set(), array.insert(), et array.remove() peuvent désormais accepter des arguments index négatifs pour référencer des éléments à partir de la fin d’un tableau, offrant ainsi un moyen plus concis et plus pratique de référencer les éléments d’un tableau dans l’ordre inverse. Par exemple, l’appel array.get(myArray, -2) récupère l’avant-dernier élément de myArray, ce qui équivaut à array.get(myArray, array.size(myArray) – 2).
Pour rester au courant des dernières améliorations apportées à l’expérience Pine Script®, gardez un œil sur les notes de publication du Manuel de l’utilisateur – sa section v6 comprend même quelques changements supplémentaires qui n’ont pas été inclus dans ce billet de blog.
Nous espérons que vous trouverez ces fonctionnalités aussi utiles que nous le pensons, et continuez à nous envoyer vos commentaires et suggestions afin que nous puissions rendre la plateforme la meilleure possible. Nous construisons TradingView pour vous, et nous sommes toujours ravis d’entendre vos commentaires.
— Team TradingView