D’une situation à un événement : les croisements
Distinguez un cours au-dessus de la moyenne de l’instant où il passe au-dessus.
Si le cours reste au-dessus d’une moyenne pendant dix bougies, close > average peut être vrai dix fois. Pour marquer seulement l’instant où il passe du dessous au-dessus, vous avez aussi besoin de la relation à la bougie précédente.
Une situation et son début
Supposons que la moyenne vaille 100 à la bougie actuelle comme à la précédente. La clôture précédente vaut 99 et l’actuelle 101. Le cours est maintenant au-dessus de la moyenne et l’a aussi franchie depuis la bougie précédente.
Si la clôture suivante vaut 102, elle reste au-dessus de la moyenne. Il n’y a cependant pas de nouveau croisement haussier, puisqu’elle était déjà au-dessus à la bougie précédente.
ta.crossover(first, second) est vrai si la première valeur est maintenant supérieure à la seconde, alors qu’à l’exécution précédente elle lui était inférieure ou égale. ta.crossunder est son équivalent à la baisse.
Une égalité actuelle n’est pas encore un croisement. Si la première valeur rejoint seulement la seconde, > reste faux. En revanche, une égalité à la bougie précédente autorise un croisement si la valeur passe au-dessus maintenant.
Le croisement de deux moyennes mobiles
Nous reprenons les deux moyennes du chapitre Moyennes mobiles. La courte, plus rapide, sera bleue ; la longue, plus lente, orange. Le triangle vert marquera le croisement haussier de la rapide ; le rouge, son croisement baissier.
Créez cross_signals.py :
"""
@pyne edge
"""
from pynecore.lib import close, color, input, location, plot, plotshape, script, shape, ta
@script.indicator("Average Crossings", overlay=True)
def main(
fast_length: int = input.int(5, title="Fast length", minval=1, maxval=200),
slow_length: int = input.int(20, title="Slow length", minval=1, maxval=200),
):
fast_average = ta.sma(close, fast_length)
slow_average = ta.sma(close, slow_length)
crosses_up = ta.crossover(fast_average, slow_average)
crosses_down = ta.crossunder(fast_average, slow_average)
plot(fast_average, "Fast average", color=color.blue, linewidth=2)
plot(slow_average, "Slow average", color=color.orange, linewidth=2)
plotshape(crosses_up, "Cross up", style=shape.triangleup,
location=location.belowbar, color=color.green)
plotshape(crosses_down, "Cross down", style=shape.triangledown,
location=location.abovebar, color=color.red)Exécutez-le sur les données de démonstration avec les valeurs par défaut 5 et 20. Les repères apparaissent seulement sur les bougies de croisement. Une période prolongée où la ligne bleue reste au-dessus de l’orange ne produit pas un nouveau repère vert à chaque bougie.

Pourquoi calculer le croisement sur une ligne séparée ?
ta.crossover et ta.crossunder s’exécutent à chaque bougie. Leur exécution précédente correspond donc à la bougie précédemment traitée.
Si vous n’appeliez le croisement que lorsqu’une autre condition est remplie, l’état précédent de l’appel ne viendrait pas forcément de la bougie précédente. La ligne et le repère pourraient examiner des séries temporelles différentes.
Nous suivons donc la règle du chapitre précédent : calculer les résultats avec état à chaque bougie, puis décider à partir des valeurs obtenues.
L’initialisation reste visible
La SMA sur vingt bougies n’est valide qu’à partir de la vingtième. À sa première valeur valide, la SMA précédente manque encore : il n’y a donc pas deux bougies complètes permettant de conclure à un croisement.
La condition nécessite les valeurs actuelles et précédentes des deux moyennes.
Ne remplacez pas na par zéro pour obtenir un signal. Une moyenne nulle pourrait produire un croisement artificiel là où la vraie moyenne n’est pas encore calculable.
L’instant des données
Le livre exécute les programmes sur des bougies historiques clôturées. Un signal calculé avec la clôture d’une bougie journalière utilise les informations connues à sa clôture.
La clôture d’une bougie en formation peut encore changer. Un croisement observé pendant sa formation peut disparaître avant sa fin. Ne le confondez pas avec une vérification sur des bougies clôturées.
Un signal affiché sur un graphique historique ne signifie pas automatiquement une transaction exécutée sur cette même bougie. L’indicateur trace un signal ; nous définirons les ordres et leurs instants d’exécution avec les stratégies.
À vous de jouer
Créez une copie nommée price_crossings.py. Au lieu des croisements des deux moyennes, marquez les passages de la clôture au-dessus et au-dessous de la moyenne lente. Conservez cette dernière sur le graphique.
Solution de l’exercice
crosses_up = ta.crossover(close, slow_average)
crosses_down = ta.crossunder(close, slow_average)Les repères utilisent les deux variables logiques : les lignes plotshape peuvent rester identiques. Il est toutefois préférable de changer leurs titres en Price cross up et Price cross down.
Si vous n’utilisez plus la moyenne rapide, supprimez son calcul, son tracé et son input. L’interface ne proposera ainsi que les réglages utilisés.
Suivre un croisement pas à pas
Choisissez une bougie marquée en vert. Examinez les valeurs des deux lignes à cette bougie et à la précédente. Formulez les deux comparaisons qui rendent le signal vrai. Cette vérification sera aussi utile pour une stratégie.