Dites bonjour à Pine Script v5

Oct 7, 2021

Aujourd’hui, Pine passe à la v5 ! La nouvelle version de notre langage de programmation d’indicateurs et de stratégies apporte une foule de nouvelles fonctionnalités et d’améliorations passionnantes. Pine est maintenant plus puissant que jamais, et les changements de la v5 nous aideront à porter le langage à de nouveaux niveaux. Ce billet ne présente que quelques-unes des dernières fonctionnalités disponibles ; n’oubliez pas de lire nos Notes de publication et Guide de migration.

Convertisseur v4 vers v5

Les scripts Pine existants utilisant des versions antérieures de Pine continueront à fonctionner sans changement, mais nous avons fourni un outil de conversion dans l’éditeur Pine pour aider les codeurs à convertir leurs scripts v4 en v5. Les améliorations futures de Pine seront déployées pour la v5 exclusivement, nous vous recommandons donc de convertir vos indicateurs et stratégies si vous souhaitez bénéficier des nouvelles fonctionnalités. L’outil de conversion de la v4 à la v5 est disponible lorsqu’un script v4 est chargé dans l’éditeur, à partir du menu déroulant Plus :

Notez que tous les codes v4 ne peuvent pas être convertis automatiquement. Si vous rencontrez des problèmes de conversion ou si vous préférez convertir vos scripts manuellement, notre Guide de migration qui documente tous les changements entre la v4 et la v5 vous guidera.

Bibliothèques

Les bibliothèques sont l’un des principaux ajouts apportés à Pine avec la v5. Les bibliothèques sont un nouveau type de publication qui vous permet de créer des fonctions personnalisées à réutiliser dans d’autres scripts. Une fois qu’une bibliothèque est publiée, d’autres scripts (qu’il s’agisse d’indicateurs, de stratégies ou même d’autres bibliothèques) peuvent l’importer et utiliser ses fonctions. Vous pouvez utiliser les bibliothèques pour inclure des algorithmes complexes ou des fonctions fréquemment utilisées afin que vous, ou toute la communauté Pine, puissiez facilement les réutiliser.

Pour commencer à travailler avec les bibliothèques, consultez notre Page du manuel de l’utilisateur consacrée aux bibliothèques. À la fin de ce billet, vous trouverez des exemples de bibliothèques publiées par les membres de notre équipe PineCoders. Vous pouvez voir les bibliothèques publiées à partir du flux de script ici.

Valeurs par défaut pour les fonctions définies par l’utilisateur

Une amélioration qui va de pair avec les bibliothèques : une valeur par défaut peut être définie pour les paramètres des fonctions définies par l’utilisateur, ce qui les rend effectivement facultatifs. Dans l’exemple ci-dessous, nous déclarons une fonction personnalisée customPow() qui élève base à la puissance de exp. Si exp n’est pas spécifié lorsque la fonction est appelée, 2 est utilisé :

//@version=5
indicator("")
customPow(base, exp = 2) =>
    result = 1
    for i = 1 to exp
        result *= base
plot(customPow(11)) // 11^2
plot(customPow(11, 4)) // 11^4

Switch

La nouvelle instruction switch est une variante de l’instruction « if » bien connue. Si vous avez déjà dû créer un grand arbre d’instructions if-else, vous apprécierez à quel point il est plus pratique d’obtenir le résultat souhaité avec switch. Vous pouvez en apprendre davantage à ce sujet dans notre Manuel de référence. Voyez-le en action dans le code ci-dessous. Il s’agit de notre indicateur intégré Average True Range, qui utilise désormais une instruction switch pour fournir différents algorithmes de lissage dans ses calculs :

//@version=5
indicator(title="Average True Range", shorttitle="ATR", timeframe="")
lengthInput = input.int(title="Length", defval=14, minval=1)
smoothingInput = input.string(title="Smoothing", defval="RMA", options = ["RMA", "SMA", "EMA", "WMA"])

maFunction(source, length) =>
    switch smoothingInput
        "RMA" => ta.rma(source, length)
        "SMA" => ta.sma(source, length)
        "EMA" => ta.ema(source, length)
        => ta.wma(source, length)

plot(maFunction(ta.tr(true), lengthInput), title = "ATR", color=#B71C1C)

Collections de dessins

Une grande amélioration de la qualité de vie pour le travail avec les dessins Pine : les nouvelles variables de tableau intégrées line.all, label.all, box.all, et table.all contiennent toujours les ID de tous les dessins du type spécifié dessinés par votre script.

Vous pouvez les utiliser, par exemple, pour réduire le nombre de dessins affichés sur le graphique en fonction d’une valeur définie par l’utilisateur. Dans le script ci-dessous, nous dessinons une ligne sur chaque nouvelle ouverture quotidienne (jusqu’à une limite de ~50, basée sur la limite de ligne par défaut du script). Nous vérifions ensuite si le nombre de lignes autorisées par les entrées du script a été dépassé, et supprimons la ligne la plus ancienne si c’est le cas :

//@version=5
indicator("Daily Open", overlay = true)

qtyOfLinesInput = input.int(10, "Draw only last n lines", minval = 0, maxval = 50)

if ta.change(time("1D"))
    line.new(bar_index, open, bar_index + 1, open, extend = extend.right)
    if array.size(line.all) > qtyOfLinesInput
        line.delete(array.get(line.all, 0))

While

Les boucles « while » sont une autre fonctionnalité de Pine très attendue dans la v5. L’instruction while crée une boucle qui s’arrête lorsque la condition est fausse ou qu’une commande break est utilisée dans la boucle.

À titre d’exemple, voici un indicateur qui calcule la différence entre la distance moyenne à laquelle nous devons remonter pour trouver le volume à la hausse et à la baisse égale au volume total des n dernières barres. Plus il faut remonter dans le temps pour trouver le volume à la hausse ou à la baisse, plus sa valeur est baissière ou haussière :

//@version=5

var int MAX_BARS_BACK = 500
indicator("Volume bias", max_bars_back = MAX_BARS_BACK)

int lookBackInput = input.int(20, "Volume Look Back (bars)", minval = 2, maxval = int(MAX_BARS_BACK / 4))

// Stop the script if the chart does not contain volume data.
bool noVol = na(volume) and nz(math.sum(nz(volume), 200) == 0, true)
if noVol
    runtime.error("No volume data.")

volumeBias(lookBack, maxLookBack) =>
    bool  barUp = ta.rising(close, 1)
    bool  barDn = ta.falling(close, 1)
    float upVolume = 0.
    float dnVolume = 0.
    float avgVolume = math.sum(nz(volume), lookBack)
    int[] upBarNos = array.new_int(0)
    int[] dnBarNos = array.new_int(0)
    int   bar = 1
    bool  volumeFound = false
    while (not volumeFound) and bar < maxLookBack
        if barUp[bar] and upVolume < avgVolume
            upVolume += nz(volume[bar])
            array.push(upBarNos, bar)
        else if barDn[bar] and dnVolume < avgVolume
            dnVolume += nz(volume[bar])
            array.push(dnBarNos, bar)
        bar += 1
        volumeFound := upVolume >= avgVolume and dnVolume >= avgVolume
    float volumeBias = bar >= maxLookBack ? na : array.avg(dnBarNos) - array.avg(upBarNos)

float bias = volumeBias(lookBackInput, MAX_BARS_BACK)
plot(bias, "Volume Bias", bias > 0 ? color.lime : color.fuchsia)
hline(0)

La boucle while du script s’exécute jusqu’à ce que le volume requis soit trouvé à la fois dans le volume ascendant et descendant, et nous n’avons pas regardé en arrière au-delà du nombre maximum de barres autorisées. Le script présente également une autre fonctionnalité ajoutée à Pine v5 : runtime.error().

runtime.error()

La fonction runtime.error() permet désormais d’interrompre l’exécution d’un script et d’afficher un message d’erreur sur toute condition que vous pouvez définir dans Pine. Cette fonction sera utile aux créateurs de scripts qui veulent empêcher les utilisateurs d’utiliser leurs indicateurs de manière incorrecte. Elle peut également être utilisée comme un outil de débogage peu orthodoxe, pour arrêter l’exécution pendant une boucle ou à l’intérieur d’une fonction, par exemple.

Pour utiliser la nouvelle fonction, il suffit d’appeler la fonction runtime.error() lorsque vos conditions sont remplies. Lorsqu’elle sera exécutée, elle arrêtera le script et affichera le point d’exclamation familier à côté du nom de l’indicateur. Lorsque les utilisateurs cliquent sur l’icône du point d’exclamation, le message que vous avez utilisé dans l’appel de fonction s’affiche.

Le code ci-dessous est un indicateur VWAP simple avec deux erreurs personnalisées. La première apparaît lorsque le symbole n’a pas de données de volume : Le VWAP est calculé sur la base du volume, donc s’il n’y a pas de volume, le script ne peut pas fonctionner. La deuxième erreur apparaît lorsque l’horizon temporel du graphique est 1D ou supérieur. Les calculs de base du VWAP accumulent les données de moyenne mobile pondérée en fonction du volume sur chaque nouvelle barre et se réinitialisent au début d’une nouvelle journée, de sorte que l’indicateur n’est utile que sur les cadres temporels intrajournaliers.

//@version=5

indicator("VWAP with custom errors")
if na(volume) // Will be true on symbols with no volume data e.g. TVC:SPX
    runtime.error("There is no volume data for this symbol.")
else if timeframe.isdwm // Will be true on 1D and higher timeframes
    runtime.error("Session-based VWAP does not show meaningful data on timeframes >= 1D.
     Please switch to a lower timeframe.")
plot(ta.vwap)

Nouveaux paramètres de stratégie

Bonne nouvelle pour les codeurs de stratégies ! Nous avons ajouté tout un tas de nouvelles variables et fonctions qui vous donnent une visibilité sur les propriétés, les statistiques et les mesures des transactions. Leurs valeurs se mettent à jour au fur et à mesure que l’émulateur de courtier exécute vos ordres, de sorte que vous pouvez suivre les valeurs au fur et à mesure que votre stratégie progresse.

Cliquez ici pour consulter le manuel de référence de Pine pour plus de détails sur chacun d’eux

strategy.closedtrades.entry_price() / strategy.opentrades.entry_price()

strategy.closedtrades.entry_bar_index() / strategy.opentrades.entry_bar_index()

strategy.closedtrades.entry_time() / strategy.opentrades.entry_time()

strategy.closedtrades.size() / strategy.opentrades.size()

strategy.closedtrades.profit() / strategy.opentrades.profit()

strategy.closedtrades.commission() / strategy.opentrades.commission()

strategy.closedtrades.max_runup() / strategy.opentrades.max_runup()

strategy.closedtrades.max_drawdown() / strategy.opentrades.max_drawdown()

strategy.closedtrades.exit_price()

strategy.closedtrades.exit_bar_index()

strategy.closedtrades.exit_time()

strategy.convert_to_account()

strategy.convert_to_symbol()

strategy.account_currency

 

Nouveaux espaces de noms

Notre communauté de codeurs Pine nous dit qu’elle apprécie le rythme sans précédent des ajouts que nous avons faits à Pine au cours des dernières années, et nous avons l’intention de maintenir le même rythme à l’avenir. Cependant, cela crée un flux constant de nouvelles fonctions Pine et de variables intégrées. Pour supporter cette croissance folle, nous avions besoin de mieux organiser les ~600 noms actuels utilisés dans le langage. Pour ce faire, nous avons ajouté de nouveaux espaces de noms afin de regrouper les fonctions d’une manière qui reflète mieux leur utilisation. De nombreux noms de paramètres de fonctions ont également été renommés afin de les rendre plus faciles à comprendre.

Un exemple de nouvel espace de noms est ta., qui comprend désormais toutes les variables et fonctions liées à l’analyse technique. Il est ainsi plus facile pour vous de parcourir le Manuel de référence et de trouver toutes les variables et fonctions renvoyant les valeurs des indicateurs courants. Par conséquent, sma() est maintenant ta.sma(). Il n’est pas nécessaire de se souvenir des nouveaux espaces de noms ; si vous tapez l’ancien nom d’une fonction sans son espace de noms dans l’éditeur et que vous appuyez sur la touche de raccourci Autocomplete (Ctrl + Espace, ou Cmd + Espace sur MacOS), une fenêtre contextuelle affichant des suggestions correspondantes apparaît :

Il en va de même lors de la recherche dans le manuel de référence : si vous tapez le nom d’une fonction familière sans son espace de nom, vous obtiendrez son nouveau nom. Vous pouvez consulter la liste complète des changements apportés à la v5 dans notre section du Guide de migration.

Bibliothèques publiées

Les publications suivantes sont des exemples de bibliothèques publiées sur TradingView par les PineCoders qui nous aident à tester les nouvelles fonctionnalités de Pine :

ColorScheme by RicardoSantos

Matrix_Functions_Lib_JD by Duyck

Enchanced_ta by HeWhoMustNotBeNamed

Nous espérons que vous trouverez ces nouvelles fonctionnalités utiles. Et n’hésitez pas à nous faire part de vos commentaires et suggestions – nous construisons TradingView pour vous, et nous sommes toujours ravis de savoir ce que vous pensez des mises à jour de notre plateforme.

Look first Then leap

TradingView est conçu pour vous, assurez-vous donc de profiter au maximum de nos fonctionnalités exceptionnelles
Ouvrir le graphique