Bonjour Lucas,
Votre tentative d’utiliser barssince pour identifier la barre spécifique où le plus bas ou le plus haut a été atteint est intéressante, mais il semble y avoir une confusion sur l’utilisation de cette fonction. La fonction barssince(condition) est conçue pour retourner le nombre de barres depuis qu’une condition booléenne a été vraie pour la dernière fois. Cependant, l’utilisation de low = redbottom ou high = greentop comme condition n’est pas valide car ces expressions ne retournent pas une condition booléenne mais tentent d’assigner une valeur, ce qui n’est pas le comportement attendu dans ce contexte.
Pour corriger cela, vous devez reformuler la condition pour qu’elle retourne un booléen. Voici une approche possible en utilisant une comparaison directe dans la condition :
les expressions “low = redbottom” et “high = greentop” ne peuvent être considérées par prorealtime comme des tentatives d’assigner une valeur à Low ou High qui sont des constantes non modifiables par le code… Le code retournerait une erreur si prorealtime considérait cela comme une tentative d’assigner des valeurs à Low ou High. Il considère bien ces deux expressions comme des conditions.
Que ce soit “low = redbottom[1]” ou “low = redbottom”, cela ne change strictement rien…
Dans les deux cas, Barssince retourne -1 indiquant que la condition n’est jamais vrai.
En mettant en ligne 6 : DRAWSEGMENT(bartop, greentop, barbottom, redbottom) COLOURED(“red”)
et en ligne 12 : DRAWSEGMENT(barbottom, redbottom, bartop, greentop) COLOURED(“green”)
on se rend compte que l’indicateur trace les segments toujours une bar après que l’histogramme passe du positif au négatif ou vive versa.
On retrouve donc bien Barindex – (-1) = Barindex + 1
Je pense plutôt que le code prends les valeurs que Low et que redbottom avaient lors des bougies précédantes. Ce qui est bien pour le cas de Low, mais pas désiré dans le cas de redbottom, à qui on vient d’assigner une nouvelle valeur… Il faudrait avoir la possibilité d’assigner une valeur à une constante (qui n’existent pas dans ce langage).
Néanmoins il existe une solution… L’utilisation d’un tableau pour stocker les valeurs greentop et redbottom…
if MACD[12,26,9](close) crosses over 0 then
barcrossup=BarIndex
nbarres1=barindex-barcrossdown
$redbottom[0]=lowest[nbarres1](low[1])
barbottom=barindex-barssince(low=$redbottom[0])
DRAWSEGMENT(bartop, $greentop[0], barbottom, $redbottom[0]) COLOURED("red")
ELSIF MACD[12,26,9](close) crosses under 0 then
barcrossdown=BarIndex
nbarres1=barindex-barcrossup
$greentop[0]=highest[nbarres1](high[1])
bartop=barindex-barssince(high=$greentop[0])
DRAWSEGMENT(barbottom, $redbottom[0], bartop, $greentop[0]) COLOURED("green")
ENDIF
return