Bonjour,
Que 5 soit un minimum au lieu d’être une durée fixe introduit le besoin de gérer les congestions qui se chevauchent aussi bien sur la verticale que sur l’horizontale, ou qui sont l’une dans l’autre. Cela ne peut pas passer par une simple variable qui ne peut prendre qu’une seule valeur en fin de bougie, cela doit passer par des tableaux pour pouvoir traiter un nombre d’occurrences simultanées indéterminé.
Par rapport à la version avec tableaux de fin de semaine dernière, que j’avais enlevée vendredi car buguée sur le live, plutôt que de superposer à chaque nouvelle barre les rectangles d’une même congestion l’un sur l’autre, le choix est fait de juxtaposer les rectangles qui sont au-delà de 5, soit via un bloc d’un coup dans l’historique, soit en rallongeant juste d’une barre à chaque nouvelle barre en live. Ceci est fait au prix d’une légère concession esthétique à cause de la superposition des bords verticaux de rectangles qui crée de légers segments verticaux, mais concession graphiquement moins désagréable que d’obscurcir le fond en redessinant plusieurs fois la même congestion depuis son départ. De plus cela permet de garder visible une congestion dans une autre grâce au seul assombrissement des zones de fond communes à 2 congestions.
Désolé, c’était un peu lent à débuguer, mais avec les tableaux si un bug n’apparaît que dans le traitement du live plutôt que dans l’historique, il faut modifier et le retester sur du live, ce qui implique d’attendre que le cas se représente, vérifier si c’est résolu (ou pas… et modifier et recommencer…), c’est forcément plus lent que pour un problème à régler dans l’historique OHLC. En espérant que les modifs n’auront pas créé un autre bug du live qui m’aurait échappé…
J’ai rajouté une gestion de taille de boucle pour éviter d’avoir des tableaux à indice max énorme qui ralentiraient massivement le temps de calcul, en exploitant les temps sans aucune congestion en cours pour tout simplement réinitialiser les tableaux et garder une taille de boucle faible.
Enfin, il y a une option qui dessine un fond de rectangle orange en direct quand on est sur une sortie possible de congestion, il faut dé-commenter ( = enlever les // ) les lignes 32 à 34 pour l’ajouter.
ALPHAfond=100// ligne à mettre en commentaire si ALPHAfond utilisé en paramètre
once ind=0
once prem=0
count=0
tot=0
$memhaut[0]=0
$membas[0]=0
$memx[0]=0
$memy[0]=0
for i=0 to 4
ci= (open[i]>=low[5] and open[i]<=high[5]) or (close[i]>=low[5] and close[i]<=high[5])
tot=tot+ci
next
if tot=5 then
drawrectangle(barindex[5],low[5],barindex,high[5]) coloured(0,204,0,ALPHAfond) bordercolor(0,204,0,20)
endif
if tot[1]=5 and ((open>=low[6] and open<=high[6]) or (close>=low[6] and close<=high[6])) then
ind=ind+1
$memhaut[ind]=high[6]
$membas[ind]=low[6]
$memx[ind]=barindex[6]
$memy[ind]=1
endif
for i=0 to lastset($memy)
if $memy[i]=1 or $memy[i]=2 then
count=count+1
if ((open[1]>=$membas[i] and open[1]<=$memhaut[i]) or (close[1]>=$membas[i] and close[1]<=$memhaut[i])) then
if not ((open>=$membas[i] and open<=$memhaut[i]) or (close>=$membas[i] and close<=$memhaut[i])) then
$memy[i]=2
//if islastbarupdate then
//drawrectangle(barindex[1],$membas[i],barindex,$memhaut[i]) coloured(255,153,0,ALPHAfond) bordercolor(255,153,0,20)// Prolongement couleur orange en live si la bougie n'ouvre pas dans la congestion, qui peut repasser vert si la bougie live réintègre la congestion. Si la bougie finit orange, elle confirme la fin de la (ou de l'une des) congestion(s).
//endif
else
$memy[i]=1
if islastbarupdate then
if not prem then
drawrectangle($memx[i]+5,$membas[i],barindex,$memhaut[i]) coloured(0,204,0,ALPHAfond) bordercolor(0,204,0,20)
else
drawrectangle(barindex[1],$membas[i],barindex,$memhaut[i]) coloured(0,204,0,ALPHAfond) bordercolor(0,204,0,20)
endif
endif
endif
else
$memy[i]=0
if not islastbarupdate and ((open[2]>=$membas[i] and open[2]<=$memhaut[i]) or (close[2]>=$membas[i] and close[2]<=$memhaut[i])) then
drawrectangle($memx[i]+5,$membas[i],barindex[2],$memhaut[i]) coloured(0,204,0,ALPHAfond) bordercolor(0,204,0,20)
endif
endif
endif
next
if islastbarupdate then
prem=1
endif
if count=0 and count[1]=0 then
ind=0
unset($memhaut)
unset($membas)
unset($memx)
unset($memy)
endif
return