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.

À côté de manual_average.py, un panneau séparé de PyneIDE affiche la ligne de différence entre les deux moyennes.
La différence entre la moyenne calculée par la boucle et la SMA existante reste proche de zéro après l’initialisation.

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 :

  1. total prend la valeur zéro.
  2. La boucle ajoute la clôture actuelle et les quatre précédentes.
  3. La somme est divisée par cinq.
  4. La SMA existante est aussi calculée, puis la différence avec notre résultat est obtenue.
  5. 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.