// non croisement source 1 (s1) et source 2 (s2). Exemple avec des moyennes arithmétiques
// mais on peut remplacer l1 et s2 par le %K et le %D du stochastique, ou le MACD et son
// signal, ...
s1 = average[7](close)
s2 = average[23](close)
// calcul des pentes pour la barre précédente (p1) et la barre courante (source 1)
s1p1 = s1[1] - s1[2]
s1p0 = s1 - s1[1]
// calcul des pentes pour la barre précédente (p1) et la barre courante (source 2)
s2p1 = s2[1] - s2[2]
s2p0 = s2 - s2[1]
// abscisse de croisement entre les deux sources pour la barre précédente
if abs(s1p1 - s2p1) < 0.001 then
x1 = 200
else
x1 = min(100, max((s2[1] - s1[1]) / (s1p1 - s2p1), -100))
endif
// abscisse de croisement entre les deux sources pour la barre courante
if abs(s1p0 - s2p0) < 0.001 then
x0 = 200
else
x0 = min(100,max((s2 - s1) / (s1p0 - s2p0), -100))
endif
// non croisement => barre précédente: projection de croisement et barre courante: plus de croisement
// (et divergence de source 1 et source 2 après le non croisement)
// - non implémenté: les deux sources ont des tendances opposées après le non croisement
if x1 > 0 and x1 < 1 and x0 < 0 then
// calcul de la force du nom-croisement (angle en degrés entre les deux pentes, permet de s'affranchir
// des "mirages visuels" car tient compte du niveau de prix)
f = atan(abs((s1p0-s1p1)/(1 + s1p0 * s1p1)))
if s1[2] > s2[2] and s1[1] > s2[1] and s1 > s2 then
// vérification que les deux indicateurs ne se coisent pas (s1 > s2), non croisement à la hausse
DRAWARROWUP(barindex, s1) coloured(0, 255, 0)
DRAWTEXT("f=#f#°", barindex, s1, serif, bold)
elsif s1[2] < s2[2] and s1[1] < s2[1] and s1 < s2 then
// vérification que les deux indicateurs ne se coisent pas (s2 > s1), non croisement à la baisse
DRAWARROWDOWN(barindex, s1) coloured(255,0,0)
DRAWTEXT("f=#f#°", barindex, s1, serif, bold)
endif
endif
return s1 as "Source (1)", s2 as "Source (2)"