Des boucles à l’intérieur d’une bougie
Calculez une moyenne mobile avec votre propre boucle et comparez-la à la fonction existante.
L’environnement d’exécution parcourt la suite des bougies. Mais vous pouvez avoir besoin d’une répétition au sein d’une seule bougie, pour additionner les cinq dernières clôtures, par exemple. Une boucle le permet.
for et range
for offset in range(5):
total += close[offset]Avec range(5), la boucle donne successivement à offset les valeurs 0, 1, 2, 3 et 4. Le 5 est exclu. La ligne indentée s’exécute une fois pour chaque valeur.
close[offset] désigne donc d’abord la clôture actuelle, puis celles d’une, deux, trois et quatre bougies auparavant. Nous additionnons exactement cinq valeurs.
Il faut initialiser total à zéro avant la boucle. C’est un résultat intermédiaire pour une bougie donnée, pas un compteur à conserver entre bougies.
range(1, 5) fournit une autre suite : 1, 2, 3, 4. La borne de départ est incluse, celle de fin exclue. Sans borne de départ, on commence à zéro.
Une moyenne mobile écrite à la main
Créez manual_average.py :
"""
@pyne edge
"""
from pynecore.lib import close, color, input, plot, script, ta
@script.indicator("Manual Average Check", overlay=False)
def main(
length: int = input.int(5, title="Length", minval=1, maxval=100),
):
total = 0.0
for offset in range(length):
total += close[offset]
manual_average = total / length
builtin_average = ta.sma(close, length)
difference = manual_average - builtin_average
plot(difference, "Difference", color=color.blue)Exécutez-le sur les données de démonstration. La ligne montre la différence entre votre moyenne et la SMA existante. Après l’initialisation, elle doit rester à zéro ou très près de zéro en raison de la représentation des nombres.

Deux lignes superposées rendraient les petits écarts difficiles à voir. Leur différence montre directement si les calculs concordent.
Que fait une exécution ?
Avec une longueur de cinq, les étapes sont :
totalprend la valeur zéro.- La boucle ajoute la clôture actuelle et les quatre précédentes.
- La somme est divisée par cinq.
- La SMA existante est aussi calculée, puis la différence avec notre résultat est obtenue.
- Un seul point est ajouté à la ligne de différence.
L’environnement d’exécution passe ensuite à la bougie suivante. total y repart de zéro et la boucle additionne les cinq valeurs de la nouvelle fenêtre.
Si vous transformiez total en variable Persistent, la bougie suivante reprendrait la somme précédente. Chaque bougie ajouterait encore cinq valeurs à l’ancien résultat : vous ne calculeriez plus la moyenne de la fenêtre actuelle.
L’historique manquant
Sur les quatre premières bougies, il manque au moins une clôture pour remplir la fenêtre de cinq. Le na dans la somme rend aussi votre moyenne manquante. La SMA existante sur cinq bougies ne devient valide qu’à la cinquième.
Toutes les clôtures des données de démonstration sont valides. Avec une source ayant aussi des valeurs manquantes au milieu, la gestion des absences de ta.sma peut différer d’une simple somme sur les décalages de bougies. Nous vérifions donc cet exemple sur les données indiquées ici.
Combien de répétitions demandez-vous ?
Une fenêtre de cent bougies nécessite cent additions par bougie. Sur deux mille bougies, cela représente deux cent mille itérations.
ta.sma est précisément conçue pour effectuer ce calcul fréquent avec le mécanisme prévu par l’environnement d’exécution. La boucle sert ici à comprendre et à comparer les résultats. Utilisez la fonction existante lorsqu’elle répond à votre besoin.
La fin d’une boucle doit être connue et limitée. La valeur maximale de l’input fixe aussi la quantité de travail que l’utilisateur peut demander pour une bougie.
break et continue
break interrompt la boucle. continue saute le reste de l’itération actuelle et passe à la suivante.
Utilisez-les avec prudence dans une fenêtre de moyenne. Si vous additionnez trois valeurs avant de vous arrêter, vous ne pouvez pas diviser la somme par cinq comme si elle en contenait cinq. Les omissions changent le sens du calcul.
À vous de jouer
Réglez la longueur sur trois. Pour une bougie, notez les décalages parcourus et les trois prix correspondants. Modifiez ensuite le programme pour afficher vos deux moyennes en superposition aux bougies, en plus de l’étude de leur différence.
Solution de l’exercice
Les décalages sont 0, 1 et 2. Réglez le décorateur sur overlay=True, puis après le calcul :
plot(manual_average, "Manual average", color=color.blue, linewidth=2)
plot(builtin_average, "Built-in average", color=color.orange)Retirez le tracé de la différence de cette vue. Une ligne proche de zéro et des moyennes au niveau des prix se lisent mal sur une même échelle. Vous pouvez garder le panneau de différence initial dans une autre version du programme pour les vérifications.
Repérer une fenêtre décalée
Réfléchissez à ce qui changerait avec range(1, length + 1). Il y aurait toujours cinq valeurs, mais la bougie actuelle serait exclue et celle de cinq bougies auparavant incluse. Ce serait la fenêtre de moyenne de la bougie précédente.