Hello,
ci-dessous, une première “tentative de code” pour détecter un non-croisement entre deux séries de données (exemples: MMA7 vs MMA 23, %K vs %D (stochastique), …). Toute suggestion d’amélioration est la bienvenue.
JCP
// 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)"
Bonjour,
Merci pour ces liens, je vais y jeter un œil.
Hello,
un graphiques avec quelques non croisement (cf. “attachement”). Pour info, la stratégie de détection des non croisements implémentée est la suivante:
- recherche des lignes qui se seraient croisée à la barre suivante si elles avaient continué tout droit,
- si, à la barre suivante, les lignes ne se sont finalement pas croisées et que, en plus, elles divergent, alors un non classement a été détecté.
En toute rigueur (pas encore implémenté), il faudrait s’assurer que:
- au moment du non croisement, l’une des lignes est haussière et l’autre baissière,
- deux périodes après les non croisement, les lignes ne convergent toujours pas.
Ces deux dernières étapes pourraient supprimer pas mal de fausses détections.